diff --git a/.generated/content.json b/.generated/content.json index 1ba2eae..3a25de7 100644 --- a/.generated/content.json +++ b/.generated/content.json @@ -1 +1 @@ -{"generatedAt":"2026-08-07T13:11:07.301Z","versions":{"app":"0.1.0","obsidian":"4.11.1"},"navigation":[{"label":"Start here","items":[{"title":"TaskNotes documentation","route":"/"},{"title":"TaskNotes app","route":"/app/"},{"title":"Obsidian plugin","route":"/obsidian/"},{"title":"Shared concepts","route":"/concepts/task-records/"}]},{"label":"TaskNotes app","items":[{"title":"Get started","route":"/app/getting-started/"},{"title":"Interactive demo","route":"/app/demo/"},{"title":"Choose a collection","route":"/app/collections/"},{"title":"What is mdbase?","route":"/app/mdbase/"},{"title":"Tasks","route":"/app/tasks/"},{"title":"Views and navigation","route":"/app/views/"},{"title":"Connection and availability","route":"/app/connection/"},{"title":"Reminders","route":"/app/reminders/"},{"title":"Troubleshooting","route":"/app/troubleshooting/"}]},{"label":"Obsidian plugin","items":[{"title":"Get started","route":"/obsidian/"},{"title":"Core concepts","route":"/obsidian/core-concepts/"},{"title":"Task management","route":"/obsidian/features/task-management/"},{"title":"Recurring tasks","route":"/obsidian/features/recurring-tasks/"},{"title":"Views","route":"/obsidian/views/"},{"title":"Settings","route":"/obsidian/settings/"},{"title":"APIs and automation","route":"/obsidian/HTTP_API/"},{"title":"Companion plugins","route":"/obsidian/companion-plugins/"},{"title":"Release notes","route":"/obsidian/releases/"},{"title":"Troubleshooting","route":"/obsidian/troubleshooting/"}]},{"label":"Developers","items":[{"title":"TaskNotes specification","route":"/developers/specification/"},{"title":"App integration manifest","route":"/app/reference/manifest/"},{"title":"Command reference","route":"/obsidian/reference/commands/"},{"title":"Settings source","route":"/obsidian/reference/settings-source/"},{"title":"HTTP route index","route":"/obsidian/reference/http-routes/"}]},{"label":"Policies","items":[{"title":"Privacy","route":"/privacy/"}]}],"redirects":{"/app/sync-and-conflicts/":"/app/connection/","/core-concepts/":"/obsidian/core-concepts/","/getting-started/existing-vault/":"/obsidian/getting-started/existing-vault/","/getting-started/mobile/":"/obsidian/getting-started/mobile/","/migration-v3-to-v4/":"/obsidian/migration-v3-to-v4/","/features/":"/obsidian/features/","/views/":"/obsidian/views/","/settings/":"/obsidian/settings/","/calendar-setup/":"/obsidian/calendar-setup/","/troubleshooting/":"/obsidian/troubleshooting/","/HTTP_API/":"/obsidian/HTTP_API/","/javascript-api/":"/obsidian/javascript-api/","/nlp-api/":"/obsidian/nlp-api/","/obsidian-cli/":"/obsidian/obsidian-cli/","/mdbase-tasknotes-cli/":"/obsidian/mdbase-tasknotes-cli/","/webhooks/":"/obsidian/webhooks/","/workflows/":"/obsidian/workflows/","/companion-plugins/":"/obsidian/companion-plugins/","/releases/":"/obsidian/releases/","/spec/":"/developers/specification/","/views/default-base-templates/":"/obsidian/reference/default-base-templates/","/settings/defaults/":"/obsidian/settings/task-properties/","/settings/task-defaults/":"/obsidian/settings/task-properties/","/settings/inline-task-settings/":"/obsidian/settings/features/","/settings/calendar-settings/":"/obsidian/settings/appearance/","/settings/misc-settings/":"/obsidian/settings/features/","/settings/advanced-settings/":"/obsidian/settings/features/","/companion-plugins/canvas-bases/":"/obsidian/companion-plugins/canvas-bases/","/companion-plugins/tasknotes-workflows/":"/obsidian/companion-plugins/tasknotes-workflows/","/features/calendar-integration/":"/obsidian/features/calendar-integration/","/features/ics-integration/":"/obsidian/features/ics-integration/","/features/inline-tasks/":"/obsidian/features/inline-tasks/","/features/integrations/":"/obsidian/features/integrations/","/features/recurring-tasks/":"/obsidian/features/recurring-tasks/","/features/reminders/":"/obsidian/features/reminders/","/features/task-management/":"/obsidian/features/task-management/","/features/template-variables/":"/obsidian/features/template-variables/","/features/time-management/":"/obsidian/features/time-management/","/features/user-fields/":"/obsidian/features/user-fields/","/guides/backup-recovery/":"/obsidian/guides/backup-recovery/","/guides/custom-bases/":"/obsidian/guides/custom-bases/","/settings/appearance/":"/obsidian/settings/appearance/","/settings/features/":"/obsidian/settings/features/","/settings/general/":"/obsidian/settings/general/","/settings/integrations/":"/obsidian/settings/integrations/","/settings/modal-fields/":"/obsidian/settings/modal-fields/","/settings/property-identification/":"/obsidian/settings/property-identification/","/settings/property-types-reference/":"/obsidian/settings/property-types-reference/","/settings/task-properties/":"/obsidian/settings/task-properties/","/views/agenda-view/":"/obsidian/views/agenda-view/","/views/calendar-views/":"/obsidian/views/calendar-views/","/views/kanban-view/":"/obsidian/views/kanban-view/","/views/pomodoro-view/":"/obsidian/views/pomodoro-view/","/views/task-list/":"/obsidian/views/task-list/","/releases/0.2.2/":"/obsidian/releases/0.2.2/","/releases/0.2.3/":"/obsidian/releases/0.2.3/","/releases/0.2.4/":"/obsidian/releases/0.2.4/","/releases/0.3.0/":"/obsidian/releases/0.3.0/","/releases/0.4.0/":"/obsidian/releases/0.4.0/","/releases/0.4.1/":"/obsidian/releases/0.4.1/","/releases/0.4.2/":"/obsidian/releases/0.4.2/","/releases/0.6.0/":"/obsidian/releases/0.6.0/","/releases/0.6.1/":"/obsidian/releases/0.6.1/","/releases/0.6.2/":"/obsidian/releases/0.6.2/","/releases/0.6.3/":"/obsidian/releases/0.6.3/","/releases/0.7.0/":"/obsidian/releases/0.7.0/","/releases/0.8.0/":"/obsidian/releases/0.8.0/","/releases/1.0.0/":"/obsidian/releases/1.0.0/","/releases/1.1.0/":"/obsidian/releases/1.1.0/","/releases/1.2.0/":"/obsidian/releases/1.2.0/","/releases/2.0.0/":"/obsidian/releases/2.0.0/","/releases/2.0.1/":"/obsidian/releases/2.0.1/","/releases/2.0.2/":"/obsidian/releases/2.0.2/","/releases/2.0.3/":"/obsidian/releases/2.0.3/","/releases/2.0.4/":"/obsidian/releases/2.0.4/","/releases/2.1.0/":"/obsidian/releases/2.1.0/","/releases/2.2.0/":"/obsidian/releases/2.2.0/","/releases/2.2.1/":"/obsidian/releases/2.2.1/","/releases/2.2.2/":"/obsidian/releases/2.2.2/","/releases/2.2.3/":"/obsidian/releases/2.2.3/","/releases/3.0.0/":"/obsidian/releases/3.0.0/","/releases/3.0.1/":"/obsidian/releases/3.0.1/","/releases/3.1.0/":"/obsidian/releases/3.1.0/","/releases/3.1.1/":"/obsidian/releases/3.1.1/","/releases/3.10.0/":"/obsidian/releases/3.10.0/","/releases/3.11.0/":"/obsidian/releases/3.11.0/","/releases/3.11.1/":"/obsidian/releases/3.11.1/","/releases/3.11.2/":"/obsidian/releases/3.11.2/","/releases/3.12.0/":"/obsidian/releases/3.12.0/","/releases/3.12.1/":"/obsidian/releases/3.12.1/","/releases/3.12.2/":"/obsidian/releases/3.12.2/","/releases/3.13.0/":"/obsidian/releases/3.13.0/","/releases/3.13.1/":"/obsidian/releases/3.13.1/","/releases/3.13.2/":"/obsidian/releases/3.13.2/","/releases/3.13.3/":"/obsidian/releases/3.13.3/","/releases/3.13.4/":"/obsidian/releases/3.13.4/","/releases/3.14.0/":"/obsidian/releases/3.14.0/","/releases/3.15.0/":"/obsidian/releases/3.15.0/","/releases/3.15.1/":"/obsidian/releases/3.15.1/","/releases/3.16.0/":"/obsidian/releases/3.16.0/","/releases/3.16.1/":"/obsidian/releases/3.16.1/","/releases/3.16.2/":"/obsidian/releases/3.16.2/","/releases/3.16.3/":"/obsidian/releases/3.16.3/","/releases/3.16.4/":"/obsidian/releases/3.16.4/","/releases/3.17.0/":"/obsidian/releases/3.17.0/","/releases/3.17.1/":"/obsidian/releases/3.17.1/","/releases/3.18.0/":"/obsidian/releases/3.18.0/","/releases/3.18.1/":"/obsidian/releases/3.18.1/","/releases/3.18.2/":"/obsidian/releases/3.18.2/","/releases/3.19.0/":"/obsidian/releases/3.19.0/","/releases/3.19.1/":"/obsidian/releases/3.19.1/","/releases/3.20.0/":"/obsidian/releases/3.20.0/","/releases/3.20.1/":"/obsidian/releases/3.20.1/","/releases/3.21.0/":"/obsidian/releases/3.21.0/","/releases/3.22.0/":"/obsidian/releases/3.22.0/","/releases/3.22.1/":"/obsidian/releases/3.22.1/","/releases/3.23.0/":"/obsidian/releases/3.23.0/","/releases/3.23.1/":"/obsidian/releases/3.23.1/","/releases/3.23.2/":"/obsidian/releases/3.23.2/","/releases/3.23.3/":"/obsidian/releases/3.23.3/","/releases/3.23.4/":"/obsidian/releases/3.23.4/","/releases/3.24.0/":"/obsidian/releases/3.24.0/","/releases/3.24.1/":"/obsidian/releases/3.24.1/","/releases/3.24.2/":"/obsidian/releases/3.24.2/","/releases/3.24.3/":"/obsidian/releases/3.24.3/","/releases/3.24.4/":"/obsidian/releases/3.24.4/","/releases/3.24.5/":"/obsidian/releases/3.24.5/","/releases/3.24.6/":"/obsidian/releases/3.24.6/","/releases/3.25.0/":"/obsidian/releases/3.25.0/","/releases/3.25.1/":"/obsidian/releases/3.25.1/","/releases/3.25.2/":"/obsidian/releases/3.25.2/","/releases/3.25.3/":"/obsidian/releases/3.25.3/","/releases/3.25.4/":"/obsidian/releases/3.25.4/","/releases/3.25.6/":"/obsidian/releases/3.25.6/","/releases/3.3.0/":"/obsidian/releases/3.3.0/","/releases/3.4.0/":"/obsidian/releases/3.4.0/","/releases/3.4.1/":"/obsidian/releases/3.4.1/","/releases/3.4.2/":"/obsidian/releases/3.4.2/","/releases/3.5.1/":"/obsidian/releases/3.5.1/","/releases/3.6.0/":"/obsidian/releases/3.6.0/","/releases/3.7.0/":"/obsidian/releases/3.7.0/","/releases/3.7.1/":"/obsidian/releases/3.7.1/","/releases/3.8.1/":"/obsidian/releases/3.8.1/","/releases/3.8.5/":"/obsidian/releases/3.8.5/","/releases/3.8.6/":"/obsidian/releases/3.8.6/","/releases/3.8.7/":"/obsidian/releases/3.8.7/","/releases/3.9.0/":"/obsidian/releases/3.9.0/","/releases/3.9.1/":"/obsidian/releases/3.9.1/","/releases/4.0.0-beta.0/":"/obsidian/releases/4.0.0-beta.0/","/releases/4.0.0-beta.1/":"/obsidian/releases/4.0.0-beta.1/","/releases/4.0.0-beta.2/":"/obsidian/releases/4.0.0-beta.2/","/releases/4.0.0-beta.3/":"/obsidian/releases/4.0.0-beta.3/","/releases/4.0.1/":"/obsidian/releases/4.0.1/","/releases/4.0.2/":"/obsidian/releases/4.0.2/","/releases/4.0.3/":"/obsidian/releases/4.0.3/","/releases/4.0.4/":"/obsidian/releases/4.0.4/","/releases/4.0.5/":"/obsidian/releases/4.0.5/","/releases/4.1.0/":"/obsidian/releases/4.1.0/","/releases/4.1.1/":"/obsidian/releases/4.1.1/","/releases/4.1.2/":"/obsidian/releases/4.1.2/","/releases/4.1.3/":"/obsidian/releases/4.1.3/","/releases/4.10.0/":"/obsidian/releases/4.10.0/","/releases/4.10.1/":"/obsidian/releases/4.10.1/","/releases/4.10.2/":"/obsidian/releases/4.10.2/","/releases/4.11.0/":"/obsidian/releases/4.11.0/","/releases/4.11.1/":"/obsidian/releases/4.11.1/","/releases/4.2.0/":"/obsidian/releases/4.2.0/","/releases/4.2.1/":"/obsidian/releases/4.2.1/","/releases/4.3.0/":"/obsidian/releases/4.3.0/","/releases/4.3.1/":"/obsidian/releases/4.3.1/","/releases/4.3.2/":"/obsidian/releases/4.3.2/","/releases/4.3.3/":"/obsidian/releases/4.3.3/","/releases/4.4.0/":"/obsidian/releases/4.4.0/","/releases/4.5.0/":"/obsidian/releases/4.5.0/","/releases/4.5.1/":"/obsidian/releases/4.5.1/","/releases/4.5.2/":"/obsidian/releases/4.5.2/","/releases/4.5.3/":"/obsidian/releases/4.5.3/","/releases/4.6.0/":"/obsidian/releases/4.6.0/","/releases/4.7.0/":"/obsidian/releases/4.7.0/","/releases/4.7.1/":"/obsidian/releases/4.7.1/","/releases/4.7.2/":"/obsidian/releases/4.7.2/","/releases/4.8.0/":"/obsidian/releases/4.8.0/","/releases/4.8.1/":"/obsidian/releases/4.8.1/","/releases/4.9.0/":"/obsidian/releases/4.9.0/","/releases/4.9.1/":"/obsidian/releases/4.9.1/","/releases/4.9.2/":"/obsidian/releases/4.9.2/","/releases/unreleased/":"/obsidian/releases/unreleased/","/reference/commands/":"/obsidian/reference/commands/","/reference/compatibility/":"/obsidian/reference/compatibility/","/reference/settings-source/":"/obsidian/reference/settings-source/","/reference/http-routes/":"/obsidian/reference/http-routes/","/reference/default-base-templates/":"/obsidian/reference/default-base-templates/","/spec/00-overview/":"/developers/specification/","/spec/01-terminology/":"/developers/specification/01-terminology/","/spec/02-model-and-mapping/":"/developers/specification/02-model-and-mapping/","/spec/03-temporal-semantics/":"/developers/specification/03-temporal-semantics/","/spec/04-recurrence/":"/developers/specification/04-recurrence/","/spec/05-operations/":"/developers/specification/05-operations/","/spec/06-validation/":"/developers/specification/06-validation/","/spec/07-conformance/":"/developers/specification/07-conformance/","/spec/08-compatibility-and-migrations/":"/developers/specification/08-compatibility-and-migrations/","/spec/09-configuration/":"/developers/specification/09-configuration/","/spec/10-dependencies-and-reminders/":"/developers/specification/10-dependencies-and-reminders/","/spec/11-links/":"/developers/specification/11-links/","/spec/12-mdbase-v0.3-binding/":"/developers/specification/12-mdbase-v0.3-binding/","/spec/CHANGELOG/":"/developers/specification/CHANGELOG/"},"pages":[{"route":"/","title":"TaskNotes documentation","description":"Guides and reference material for the TaskNotes app, the Obsidian plugin, and the portable task format they share.","product":"shared","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":true,"source":"tasknotes.dev:content/index.md","namespace":"index.md","relativePath":"","raw":"---\ntitle: TaskNotes documentation\ndescription: Guides and reference material for the TaskNotes app, the Obsidian plugin, and the portable task format they share.\nroute: /\nproduct: shared\nhide_toc: true\n---\n\n# TaskNotes documentation\n\nTaskNotes keeps structured task information in portable Markdown records. Use\nthe dedicated app on the web, Android, or iOS, or work inside Obsidian with the\nTaskNotes plugin.\n\n
\n \n Beta · Web · Android · iOS\n TaskNotes app\n Manage portable TaskNotes v5 collections on the web, Android, and iOS through mdbase.\n Open the app guide →\n \n \n Obsidian\n TaskNotes plugin\n Task and note management inside an Obsidian vault using Bases and Markdown.\n Open the plugin guide →\n \n
\n\n## One portable task model\n\nBoth clients understand the same TaskNotes concepts: status, priority, dates,\nprojects, contexts, recurrence, reminders, relationships, and custom fields.\nThe interface and available integrations differ, but your task records are not\nlocked to one screen or application.\n\n- Start with [portable task records](/concepts/task-records/) if you want to\n understand what the products share.\n- Read the [formal specification](/developers/specification/) when implementing\n or integrating with TaskNotes.\n- Review the [privacy overview](/privacy/) before choosing a hosted or\n computer-connected collection.\n","aliases":[],"toc":[{"level":2,"id":"one-portable-task-model","text":"One portable task model"}],"html":"

TaskNotes keeps structured task information in portable Markdown records. Use\nthe dedicated app on the web, Android, or iOS, or work inside Obsidian with the\nTaskNotes plugin.

\n
\n \n Beta · Web · Android · iOS\n TaskNotes app\n Manage portable TaskNotes v5 collections on the web, Android, and iOS through mdbase.\n Open the app guide →\n \n \n Obsidian\n TaskNotes plugin\n Task and note management inside an Obsidian vault using Bases and Markdown.\n Open the plugin guide →\n \n
\n\n

One portable task model#

\n

Both clients understand the same TaskNotes concepts: status, priority, dates,\nprojects, contexts, recurrence, reminders, relationships, and custom fields.\nThe interface and available integrations differ, but your task records are not\nlocked to one screen or application.

\n\n","text":"TaskNotes keeps structured task information in portable Markdown records. Use the dedicated app on the web, Android, or iOS, or work inside Obsidian with the TaskNotes plugin. Beta · Web · Android · iOS TaskNotes app Manage portable TaskNotes v5 collections on the web, Android, and iOS through mdbase. Open the app guide → Obsidian TaskNotes plugin Task and note management inside an Obsidian vault using Bases and Markdown. Open the plugin guide → One portable task model# Both clients understand the same TaskNotes concepts: status, priority, dates, projects, contexts, recurrence, reminders, relationships, and custom fields. The interface and available integrations differ, but your task records are not locked to one screen or application. Start with portable task records if you want to understand what the products share. Read the formal specification when implementing or integrating with TaskNotes. Review the privacy overview before choosing a hosted or computer-connected collection."},{"route":"/app/","title":"TaskNotes app","description":"Use TaskNotes on the web, Android, and iOS with portable Markdown through mdbase.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/index.md","namespace":"app","relativePath":"index.md","raw":"---\ntitle: TaskNotes app\ndescription: Use TaskNotes on the web, Android, and iOS with portable Markdown through mdbase.\nroute: /app/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# TaskNotes app\n\nThe TaskNotes app is currently in beta. It is a web-first client packaged for\nAndroid and iOS, designed for quick capture, daily review, editing, and\ncompletion while keeping task records portable.\n\nThe app is compatible with **TaskNotes v5 collections**, which use the\n**mdbase 0.3.0 specification**. The same collection can be used by other\ncompatible TaskNotes and mdbase tools.\n\nEvery TaskNotes session opens an mdbase collection. You can use a collection\nhosted online or connect to a Markdown collection on your computer through the\nencrypted mdbase relay. TaskNotes reads and writes that collection directly, so\nchanges require a connection.\n\n
\n \"TaskNotes\n
The Today workspace in the desktop layout.
\n
\n\n
\n Disposable sample collection\n Try TaskNotes before connecting your own collection.\n Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets.\n Open the interactive demo →\n
\n\n## Begin here\n\n1. [Try TaskNotes with sample tasks](/app/demo/) or [open or install TaskNotes](/app/getting-started/).\n2. [Learn how mdbase supports TaskNotes](/app/mdbase/).\n3. [Choose where your collection lives](/app/collections/).\n4. Create a task and open **Today**.\n5. Turn on reminders only if the collection and platform support delivery.\n\n## What the app includes\n\n- Today, Upcoming, Projects, lists, boards, and calendars\n- Capture, editing, completion, archive, and search\n- Projects, contexts, tags, priorities, relationships, and custom fields\n- Recurrence, materialized occurrence notes, reminders, and time tracking\n- Hosted mdbase and end-to-end encrypted relay connections\n- Browser, Android, and iOS packaging from the same application\n\nPlugin-only functionality such as inline Obsidian widgets, the command palette,\nexternal calendar integrations, HTTP APIs, and companion plugins is documented\nunder the [Obsidian plugin](/obsidian/).\n","aliases":[],"toc":[{"level":2,"id":"begin-here","text":"Begin here"},{"level":2,"id":"what-the-app-includes","text":"What the app includes"}],"html":"

The TaskNotes app is currently in beta. It is a web-first client packaged for\nAndroid and iOS, designed for quick capture, daily review, editing, and\ncompletion while keeping task records portable.

\n

The app is compatible with TaskNotes v5 collections, which use the\nmdbase 0.3.0 specification. The same collection can be used by other\ncompatible TaskNotes and mdbase tools.

\n

Every TaskNotes session opens an mdbase collection. You can use a collection\nhosted online or connect to a Markdown collection on your computer through the\nencrypted mdbase relay. TaskNotes reads and writes that collection directly, so\nchanges require a connection.

\n
\n \"TaskNotes\n
The Today workspace in the desktop layout.
\n
\n\n
\n Disposable sample collection\n Try TaskNotes before connecting your own collection.\n Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets.\n Open the interactive demo →\n
\n\n

Begin here#

\n
    \n
  1. Try TaskNotes with sample tasks or open or install TaskNotes.
  2. \n
  3. Learn how mdbase supports TaskNotes.
  4. \n
  5. Choose where your collection lives.
  6. \n
  7. Create a task and open Today.
  8. \n
  9. Turn on reminders only if the collection and platform support delivery.
  10. \n
\n

What the app includes#

\n\n

Plugin-only functionality such as inline Obsidian widgets, the command palette,\nexternal calendar integrations, HTTP APIs, and companion plugins is documented\nunder the Obsidian plugin.

\n","text":"The TaskNotes app is currently in beta. It is a web-first client packaged for Android and iOS, designed for quick capture, daily review, editing, and completion while keeping task records portable. The app is compatible with TaskNotes v5 collections, which use the mdbase 0.3.0 specification. The same collection can be used by other compatible TaskNotes and mdbase tools. Every TaskNotes session opens an mdbase collection. You can use a collection hosted online or connect to a Markdown collection on your computer through the encrypted mdbase relay. TaskNotes reads and writes that collection directly, so changes require a connection. The Today workspace in the desktop layout. Disposable sample collection Try TaskNotes before connecting your own collection. Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets. Open the interactive demo → Begin here# Try TaskNotes with sample tasks or open or install TaskNotes. Learn how mdbase supports TaskNotes. Choose where your collection lives. Create a task and open Today. Turn on reminders only if the collection and platform support delivery. What the app includes# Today, Upcoming, Projects, lists, boards, and calendars Capture, editing, completion, archive, and search Projects, contexts, tags, priorities, relationships, and custom fields Recurrence, materialized occurrence notes, reminders, and time tracking Hosted mdbase and end-to-end encrypted relay connections Browser, Android, and iOS packaging from the same application Plugin-only functionality such as inline Obsidian widgets, the command palette, external calendar integrations, HTTP APIs, and companion plugins is documented under the Obsidian plugin."},{"route":"/app/collections/","title":"Choose a collection","description":"Compare hosted mdbase with a collection connected from your own computer.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/collections.md","namespace":"app","relativePath":"collections.md","raw":"---\ntitle: Choose a collection\ndescription: Compare hosted mdbase with a collection connected from your own computer.\nroute: /app/collections/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Choose a collection\n\nTaskNotes opens every collection through mdbase. The choice is where the main\ncopy of your Markdown lives: hosted online or on your own computer.\n\nIf mdbase is new to you, start with [mdbase and TaskNotes](/app/mdbase/) for a\nplain-language explanation of the format, Connect desktop app, and hosting\nchoices.\n\n## Hosted mdbase\n\nHosted mdbase is the recommended choice for convenient access across the web,\nAndroid, and iOS. The provider keeps the main collection online, so it is\navailable from any TaskNotes device with a network connection and can deliver\nreminders while TaskNotes is closed.\n\nTaskNotes reads and writes the hosted collection directly. It does not keep a\nseparate offline copy, so you need a network connection to open the collection\nor make changes.\n\n## Connect to a computer\n\nmdbase Connect can make a Markdown collection on your computer available to\nTaskNotes. Requests and responses travel through an end-to-end encrypted relay;\nthe relay cannot read your task contents and you do not need to open a port on\nyour router.\n\nThe computer holds the main copy, so it must be awake, online, and running the\nmdbase Connect background service whenever you use TaskNotes. See how to\n[install mdbase Connect and use a computer collection](/app/mdbase/#use-a-collection-on-your-computer).\n\n## Change collections later\n\nOpen **More** and choose **Change collection**. Opening another collection does\nnot copy or move records from the collection you were using.\n","aliases":[],"toc":[{"level":2,"id":"hosted-mdbase","text":"Hosted mdbase"},{"level":2,"id":"connect-to-a-computer","text":"Connect to a computer"},{"level":2,"id":"change-collections-later","text":"Change collections later"}],"html":"

TaskNotes opens every collection through mdbase. The choice is where the main\ncopy of your Markdown lives: hosted online or on your own computer.

\n

If mdbase is new to you, start with mdbase and TaskNotes for a\nplain-language explanation of the format, Connect desktop app, and hosting\nchoices.

\n

Hosted mdbase#

\n

Hosted mdbase is the recommended choice for convenient access across the web,\nAndroid, and iOS. The provider keeps the main collection online, so it is\navailable from any TaskNotes device with a network connection and can deliver\nreminders while TaskNotes is closed.

\n

TaskNotes reads and writes the hosted collection directly. It does not keep a\nseparate offline copy, so you need a network connection to open the collection\nor make changes.

\n

Connect to a computer#

\n

mdbase Connect can make a Markdown collection on your computer available to\nTaskNotes. Requests and responses travel through an end-to-end encrypted relay;\nthe relay cannot read your task contents and you do not need to open a port on\nyour router.

\n

The computer holds the main copy, so it must be awake, online, and running the\nmdbase Connect background service whenever you use TaskNotes. See how to\ninstall mdbase Connect and use a computer collection.

\n

Change collections later#

\n

Open More and choose Change collection. Opening another collection does\nnot copy or move records from the collection you were using.

\n","text":"TaskNotes opens every collection through mdbase. The choice is where the main copy of your Markdown lives: hosted online or on your own computer. If mdbase is new to you, start with mdbase and TaskNotes for a plain-language explanation of the format, Connect desktop app, and hosting choices. Hosted mdbase# Hosted mdbase is the recommended choice for convenient access across the web, Android, and iOS. The provider keeps the main collection online, so it is available from any TaskNotes device with a network connection and can deliver reminders while TaskNotes is closed. TaskNotes reads and writes the hosted collection directly. It does not keep a separate offline copy, so you need a network connection to open the collection or make changes. Connect to a computer# mdbase Connect can make a Markdown collection on your computer available to TaskNotes. Requests and responses travel through an end-to-end encrypted relay; the relay cannot read your task contents and you do not need to open a port on your router. The computer holds the main copy, so it must be awake, online, and running the mdbase Connect background service whenever you use TaskNotes. See how to install mdbase Connect and use a computer collection. Change collections later# Open More and choose Change collection. Opening another collection does not copy or move records from the collection you were using."},{"route":"/app/connection/","title":"Connection and availability","description":"Understand when TaskNotes can reach hosted and computer-connected mdbase collections.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/connection.md","namespace":"app","relativePath":"connection.md","raw":"---\ntitle: Connection and availability\ndescription: Understand when TaskNotes can reach hosted and computer-connected mdbase collections.\nroute: /app/connection/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Connection and availability\n\nTaskNotes reads and writes the selected mdbase collection directly. It does not\nkeep a separate offline collection or a queue of changes waiting to sync.\n\n## What each status means\n\n| Status | Meaning |\n| --- | --- |\n| Connected | TaskNotes can read and change the selected collection |\n| Connecting | TaskNotes is checking the collection connection |\n| Collection unavailable | The hosted service or connected computer cannot be reached |\n\nOpen **More** to see the current status and use **Refresh now** to read the\nlatest collection state.\n\n## Hosted collections\n\nA hosted collection needs a network connection and an available hosted mdbase\nservice. If either is unavailable, TaskNotes cannot open the collection or save\nchanges. Reconnect the collection if its authorization has expired.\n\n## Collections on your computer\n\nA computer collection also needs the computer holding the Markdown to be\nawake, online, and running the mdbase Connect background service. TaskNotes\nreaches it through the end-to-end encrypted relay. If the computer becomes\nunavailable, access returns when the computer and connector return.\n\n## During a connection problem\n\nTasks already visible in the current session may remain on screen during a\nshort interruption, but TaskNotes cannot safely save new changes until mdbase\nis reachable. A failed action is not silently queued for later.\n\nIf the problem continues, open **More** and choose **Change collection** to use\nanother mdbase collection.\n","aliases":[],"toc":[{"level":2,"id":"what-each-status-means","text":"What each status means"},{"level":2,"id":"hosted-collections","text":"Hosted collections"},{"level":2,"id":"collections-on-your-computer","text":"Collections on your computer"},{"level":2,"id":"during-a-connection-problem","text":"During a connection problem"}],"html":"

TaskNotes reads and writes the selected mdbase collection directly. It does not\nkeep a separate offline collection or a queue of changes waiting to sync.

\n

What each status means#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusMeaning
ConnectedTaskNotes can read and change the selected collection
ConnectingTaskNotes is checking the collection connection
Collection unavailableThe hosted service or connected computer cannot be reached
\n

Open More to see the current status and use Refresh now to read the\nlatest collection state.

\n

Hosted collections#

\n

A hosted collection needs a network connection and an available hosted mdbase\nservice. If either is unavailable, TaskNotes cannot open the collection or save\nchanges. Reconnect the collection if its authorization has expired.

\n

Collections on your computer#

\n

A computer collection also needs the computer holding the Markdown to be\nawake, online, and running the mdbase Connect background service. TaskNotes\nreaches it through the end-to-end encrypted relay. If the computer becomes\nunavailable, access returns when the computer and connector return.

\n

During a connection problem#

\n

Tasks already visible in the current session may remain on screen during a\nshort interruption, but TaskNotes cannot safely save new changes until mdbase\nis reachable. A failed action is not silently queued for later.

\n

If the problem continues, open More and choose Change collection to use\nanother mdbase collection.

\n","text":"TaskNotes reads and writes the selected mdbase collection directly. It does not keep a separate offline collection or a queue of changes waiting to sync. What each status means# Status Meaning Connected TaskNotes can read and change the selected collection Connecting TaskNotes is checking the collection connection Collection unavailable The hosted service or connected computer cannot be reached Open More to see the current status and use Refresh now to read the latest collection state. Hosted collections# A hosted collection needs a network connection and an available hosted mdbase service. If either is unavailable, TaskNotes cannot open the collection or save changes. Reconnect the collection if its authorization has expired. Collections on your computer# A computer collection also needs the computer holding the Markdown to be awake, online, and running the mdbase Connect background service. TaskNotes reaches it through the end-to-end encrypted relay. If the computer becomes unavailable, access returns when the computer and connector return. During a connection problem# Tasks already visible in the current session may remain on screen during a short interruption, but TaskNotes cannot safely save new changes until mdbase is reachable. A failed action is not silently queued for later. If the problem continues, open More and choose Change collection to use another mdbase collection."},{"route":"/app/demo/","title":"Interactive demo","description":"Explore the TaskNotes app with disposable sample tasks before connecting a collection.","product":"app","platforms":["web"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":true,"source":"tasknotes.dev:content/app/demo.md","namespace":"app","relativePath":"demo.md","raw":"---\ntitle: Interactive demo\ndescription: Explore the TaskNotes app with disposable sample tasks before connecting a collection.\nroute: /app/demo/\nproduct: app\nplatforms: [web]\nhide_toc: true\n---\n\n# Interactive demo\n\nExplore the TaskNotes app using a disposable collection of sample tasks. You\ncan complete and edit tasks, use Scratchpad, search, and move between views\nwithout signing in or connecting a collection.\n\nThe demo keeps changes only for the current session. Reloading or resetting it\nstarts again with the original sample data.\n","aliases":[],"toc":[],"html":"

Explore the TaskNotes app using a disposable collection of sample tasks. You\ncan complete and edit tasks, use Scratchpad, search, and move between views\nwithout signing in or connecting a collection.

\n

The demo keeps changes only for the current session. Reloading or resetting it\nstarts again with the original sample data.

\n","text":"Explore the TaskNotes app using a disposable collection of sample tasks. You can complete and edit tasks, use Scratchpad, search, and move between views without signing in or connecting a collection. The demo keeps changes only for the current session. Reloading or resetting it starts again with the original sample data."},{"route":"/app/getting-started/","title":"Get started with the TaskNotes app","description":"Open TaskNotes, connect an mdbase collection, create a task, and find your way around the app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/getting-started.md","namespace":"app","relativePath":"getting-started.md","raw":"---\ntitle: Get started with the TaskNotes app\ndescription: Open TaskNotes, connect an mdbase collection, create a task, and find your way around the app.\nroute: /app/getting-started/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Get started with the TaskNotes app\n\nTaskNotes app is currently in beta. Features, availability, and setup steps may\nchange before the stable release.\n\nThe app supports TaskNotes v5 collections based on the mdbase 0.3.0\nspecification.\n\n## 1. Open TaskNotes\n\nUse [app.tasknotes.dev](https://app.tasknotes.dev/) in a supported browser or\ninstall the Android or iOS application when it is available through its store.\nThe web and native applications use the same task interface.\n\n## 2. Choose a collection\n\nTaskNotes opens every collection through mdbase. Choose **Hosted mdbase** for a\ncollection available anywhere with a network connection, or **Connect to a\ncomputer** to use a Markdown collection kept on your own computer through the\nencrypted relay. Read [What is mdbase?](/app/mdbase/) if this is new to you,\nthen [Choose a collection](/app/collections/) to compare the two options.\n\n## 3. Create a task\n\nUse **Add task**, enter a title, and save. Capture understands the collection's\nconfigured status, priority, project, context, and tag values.\n\n## 4. Review the starter views\n\nOpen **Today** for current work, **Upcoming** for scheduled tasks, and **Views**\nfor the complete collection of lists, boards, calendars, and project views.\nNavigation belongs to the current collection and can be reordered from Views.\n\n## 5. Check collection status\n\nOpen **More** to see the collection location, connection state, last refresh,\nnotification access, task model settings, and appearance preference.\n","aliases":[],"toc":[{"level":2,"id":"1-open-tasknotes","text":"1. Open TaskNotes"},{"level":2,"id":"2-choose-a-collection","text":"2. Choose a collection"},{"level":2,"id":"3-create-a-task","text":"3. Create a task"},{"level":2,"id":"4-review-the-starter-views","text":"4. Review the starter views"},{"level":2,"id":"5-check-collection-status","text":"5. Check collection status"}],"html":"

TaskNotes app is currently in beta. Features, availability, and setup steps may\nchange before the stable release.

\n

The app supports TaskNotes v5 collections based on the mdbase 0.3.0\nspecification.

\n

1. Open TaskNotes#

\n

Use app.tasknotes.dev in a supported browser or\ninstall the Android or iOS application when it is available through its store.\nThe web and native applications use the same task interface.

\n

2. Choose a collection#

\n

TaskNotes opens every collection through mdbase. Choose Hosted mdbase for a\ncollection available anywhere with a network connection, or Connect to a\ncomputer to use a Markdown collection kept on your own computer through the\nencrypted relay. Read What is mdbase? if this is new to you,\nthen Choose a collection to compare the two options.

\n

3. Create a task#

\n

Use Add task, enter a title, and save. Capture understands the collection's\nconfigured status, priority, project, context, and tag values.

\n

4. Review the starter views#

\n

Open Today for current work, Upcoming for scheduled tasks, and Views\nfor the complete collection of lists, boards, calendars, and project views.\nNavigation belongs to the current collection and can be reordered from Views.

\n

5. Check collection status#

\n

Open More to see the collection location, connection state, last refresh,\nnotification access, task model settings, and appearance preference.

\n","text":"TaskNotes app is currently in beta. Features, availability, and setup steps may change before the stable release. The app supports TaskNotes v5 collections based on the mdbase 0.3.0 specification. 1. Open TaskNotes# Use app.tasknotes.dev in a supported browser or install the Android or iOS application when it is available through its store. The web and native applications use the same task interface. 2. Choose a collection# TaskNotes opens every collection through mdbase. Choose Hosted mdbase for a collection available anywhere with a network connection, or Connect to a computer to use a Markdown collection kept on your own computer through the encrypted relay. Read What is mdbase? if this is new to you, then Choose a collection to compare the two options. 3. Create a task# Use Add task, enter a title, and save. Capture understands the collection's configured status, priority, project, context, and tag values. 4. Review the starter views# Open Today for current work, Upcoming for scheduled tasks, and Views for the complete collection of lists, boards, calendars, and project views. Navigation belongs to the current collection and can be reordered from Views. 5. Check collection status# Open More to see the collection location, connection state, last refresh, notification access, task model settings, and appearance preference."},{"route":"/app/mdbase/","title":"mdbase and TaskNotes","description":"Understand how TaskNotes uses hosted mdbase or the encrypted relay to reach a collection on your computer.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/mdbase.md","namespace":"app","relativePath":"mdbase.md","raw":"---\ntitle: mdbase and TaskNotes\ndescription: Understand how TaskNotes uses hosted mdbase or the encrypted relay to reach a collection on your computer.\nroute: /app/mdbase/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# mdbase and TaskNotes\n\nmdbase lets TaskNotes work with a portable Markdown collection instead of\nhiding your tasks in a TaskNotes-only database. Every TaskNotes session opens\none mdbase collection: either a collection hosted online or one kept on your\ncomputer and reached through the encrypted relay.\n\n## What is mdbase?\n\nTwo related names appear in TaskNotes:\n\n- **mdbase** is the open collection format and specification. A collection is\n a folder of Markdown files plus a small description of what those files mean.\n- **mdbase Connect** is the access service TaskNotes uses to ask for permission\n and connect to a hosted collection or a collection on your computer.\n\nRead the [mdbase introduction](https://mdbase.dev/) for a visual explanation of\nthe wider ecosystem.\n\n## What it gives TaskNotes\n\nTaskNotes understands what a task looks like inside an mdbase collection. That\ncompatibility is defined by the TaskNotes v5 collection format and its mdbase\n0.3.0 binding. That means TaskNotes can:\n\n- use the same task fields, projects, tags, saved views, and settings on the\n web, Android, and iOS;\n- ask for access to one collection without seeing your other folders; and\n- keep reminders running while TaskNotes is closed when your collection\n supports them.\n\nBehind the scenes, mdbase checks that each change is valid and writes it to the\nmain collection. You still own readable Markdown files rather than a database\nthat only TaskNotes can open.\n\n## How the connection works\n\nThe mdbase collection is the source of truth. TaskNotes reads and writes it\ndirectly and does not keep a separate offline collection, so opening tasks and\nsaving changes require a connection.\n\n| Choice | Where the Markdown lives | What must be available |\n| --- | --- | --- |\n| Hosted mdbase | With the hosted provider | Your device must have a network connection |\n| Connect to your computer | In a folder on your computer | Both devices must be online, and your computer must be running mdbase Connect |\n\n[Choose a collection](/app/collections/) compares the TaskNotes behavior of\nthese options in more detail.\n\n## Use a collection on your computer\n\nInstall the Electron-based mdbase Connect desktop app to make a folder on your\ncomputer available to TaskNotes. It runs a small background service that keeps\nTaskNotes connected to the Markdown folder. The download also includes command\nline tools. The mdbase editor is online and is not part of the desktop app.\n\n1. Open the [mdbase Connect download page](https://mdbase.dev/downloads/) and\n choose the package for macOS, Windows, or Linux.\n2. Install and open mdbase Connect. Follow any platform-specific beta\n installation notes shown on the download page.\n3. Add an existing mdbase folder on the computer, or create a collection.\n4. In TaskNotes, choose **Connect to a computer** and select that collection.\n5. Review the requested actions and approve the connection.\n\nTaskNotes requests and responses travel through an end-to-end encrypted relay.\nThe relay passes the encrypted data along but cannot read your task contents.\nYou do not need to open an inbound port on your router.\n\nThe background service on your computer checks that TaskNotes has permission,\nthen reads or changes the Markdown files. It does not create another hosted or\noffline copy of the collection.\n\n## Do I need to leave my computer on?\n\nYes. Your computer holds the main copy, so it is part of the connection:\n\n- It must be awake, connected to the internet, and running the mdbase Connect\n background service whenever TaskNotes needs remote access.\n- Sleep, shutdown, a network outage, or a stopped connector makes the\n collection unavailable until the computer returns.\n- Reminder delivery also depends on the computer remaining available.\n- You are responsible for the computer's security, disk health, and backups.\n\nThis works well for an always-on desktop or home server. It is less convenient\nfor a laptop that sleeps or travels regularly. Hosted mdbase removes the\nalways-on-computer requirement, but it moves the main copy to a provider you\nmust trust. Both choices require a network connection while you use TaskNotes.\n\nFor more detail about how Connect protects and routes your data, read\n[How mdbase Connect works](https://mdbase.dev/connect/).\n\n## A practical recommendation\n\nChoose **Hosted mdbase** if dependable access across several devices and\nreminder delivery matter most. Choose **Connect to a computer** if keeping the\nmain Markdown folder on your own machine matters more and that machine can\nremain available.\n","aliases":[],"toc":[{"level":2,"id":"what-is-mdbase","text":"What is mdbase?"},{"level":2,"id":"what-it-gives-tasknotes","text":"What it gives TaskNotes"},{"level":2,"id":"how-the-connection-works","text":"How the connection works"},{"level":2,"id":"use-a-collection-on-your-computer","text":"Use a collection on your computer"},{"level":2,"id":"do-i-need-to-leave-my-computer-on","text":"Do I need to leave my computer on?"},{"level":2,"id":"a-practical-recommendation","text":"A practical recommendation"}],"html":"

mdbase lets TaskNotes work with a portable Markdown collection instead of\nhiding your tasks in a TaskNotes-only database. Every TaskNotes session opens\none mdbase collection: either a collection hosted online or one kept on your\ncomputer and reached through the encrypted relay.

\n

What is mdbase?#

\n

Two related names appear in TaskNotes:

\n\n

Read the mdbase introduction for a visual explanation of\nthe wider ecosystem.

\n

What it gives TaskNotes#

\n

TaskNotes understands what a task looks like inside an mdbase collection. That\ncompatibility is defined by the TaskNotes v5 collection format and its mdbase\n0.3.0 binding. That means TaskNotes can:

\n\n

Behind the scenes, mdbase checks that each change is valid and writes it to the\nmain collection. You still own readable Markdown files rather than a database\nthat only TaskNotes can open.

\n

How the connection works#

\n

The mdbase collection is the source of truth. TaskNotes reads and writes it\ndirectly and does not keep a separate offline collection, so opening tasks and\nsaving changes require a connection.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ChoiceWhere the Markdown livesWhat must be available
Hosted mdbaseWith the hosted providerYour device must have a network connection
Connect to your computerIn a folder on your computerBoth devices must be online, and your computer must be running mdbase Connect
\n

Choose a collection compares the TaskNotes behavior of\nthese options in more detail.

\n

Use a collection on your computer#

\n

Install the Electron-based mdbase Connect desktop app to make a folder on your\ncomputer available to TaskNotes. It runs a small background service that keeps\nTaskNotes connected to the Markdown folder. The download also includes command\nline tools. The mdbase editor is online and is not part of the desktop app.

\n
    \n
  1. Open the mdbase Connect download page and\nchoose the package for macOS, Windows, or Linux.
  2. \n
  3. Install and open mdbase Connect. Follow any platform-specific beta\ninstallation notes shown on the download page.
  4. \n
  5. Add an existing mdbase folder on the computer, or create a collection.
  6. \n
  7. In TaskNotes, choose Connect to a computer and select that collection.
  8. \n
  9. Review the requested actions and approve the connection.
  10. \n
\n

TaskNotes requests and responses travel through an end-to-end encrypted relay.\nThe relay passes the encrypted data along but cannot read your task contents.\nYou do not need to open an inbound port on your router.

\n

The background service on your computer checks that TaskNotes has permission,\nthen reads or changes the Markdown files. It does not create another hosted or\noffline copy of the collection.

\n

Do I need to leave my computer on?#

\n

Yes. Your computer holds the main copy, so it is part of the connection:

\n\n

This works well for an always-on desktop or home server. It is less convenient\nfor a laptop that sleeps or travels regularly. Hosted mdbase removes the\nalways-on-computer requirement, but it moves the main copy to a provider you\nmust trust. Both choices require a network connection while you use TaskNotes.

\n

For more detail about how Connect protects and routes your data, read\nHow mdbase Connect works.

\n

A practical recommendation#

\n

Choose Hosted mdbase if dependable access across several devices and\nreminder delivery matter most. Choose Connect to a computer if keeping the\nmain Markdown folder on your own machine matters more and that machine can\nremain available.

\n","text":"mdbase lets TaskNotes work with a portable Markdown collection instead of hiding your tasks in a TaskNotes-only database. Every TaskNotes session opens one mdbase collection: either a collection hosted online or one kept on your computer and reached through the encrypted relay. What is mdbase?# Two related names appear in TaskNotes: mdbase is the open collection format and specification. A collection is a folder of Markdown files plus a small description of what those files mean. mdbase Connect is the access service TaskNotes uses to ask for permission and connect to a hosted collection or a collection on your computer. Read the mdbase introduction for a visual explanation of the wider ecosystem. What it gives TaskNotes# TaskNotes understands what a task looks like inside an mdbase collection. That compatibility is defined by the TaskNotes v5 collection format and its mdbase 0.3.0 binding. That means TaskNotes can: use the same task fields, projects, tags, saved views, and settings on the web, Android, and iOS; ask for access to one collection without seeing your other folders; and keep reminders running while TaskNotes is closed when your collection supports them. Behind the scenes, mdbase checks that each change is valid and writes it to the main collection. You still own readable Markdown files rather than a database that only TaskNotes can open. How the connection works# The mdbase collection is the source of truth. TaskNotes reads and writes it directly and does not keep a separate offline collection, so opening tasks and saving changes require a connection. Choice Where the Markdown lives What must be available Hosted mdbase With the hosted provider Your device must have a network connection Connect to your computer In a folder on your computer Both devices must be online, and your computer must be running mdbase Connect Choose a collection compares the TaskNotes behavior of these options in more detail. Use a collection on your computer# Install the Electron-based mdbase Connect desktop app to make a folder on your computer available to TaskNotes. It runs a small background service that keeps TaskNotes connected to the Markdown folder. The download also includes command line tools. The mdbase editor is online and is not part of the desktop app. Open the mdbase Connect download page and choose the package for macOS, Windows, or Linux. Install and open mdbase Connect. Follow any platform-specific beta installation notes shown on the download page. Add an existing mdbase folder on the computer, or create a collection. In TaskNotes, choose Connect to a computer and select that collection. Review the requested actions and approve the connection. TaskNotes requests and responses travel through an end-to-end encrypted relay. The relay passes the encrypted data along but cannot read your task contents. You do not need to open an inbound port on your router. The background service on your computer checks that TaskNotes has permission, then reads or changes the Markdown files. It does not create another hosted or offline copy of the collection. Do I need to leave my computer on?# Yes. Your computer holds the main copy, so it is part of the connection: It must be awake, connected to the internet, and running the mdbase Connect background service whenever TaskNotes needs remote access. Sleep, shutdown, a network outage, or a stopped connector makes the collection unavailable until the computer returns. Reminder delivery also depends on the computer remaining available. You are responsible for the computer's security, disk health, and backups. This works well for an always-on desktop or home server. It is less convenient for a laptop that sleeps or travels regularly. Hosted mdbase removes the always-on-computer requirement, but it moves the main copy to a provider you must trust. Both choices require a network connection while you use TaskNotes. For more detail about how Connect protects and routes your data, read How mdbase Connect works. A practical recommendation# Choose Hosted mdbase if dependable access across several devices and reminder delivery matter most. Choose Connect to a computer if keeping the main Markdown folder on your own machine matters more and that machine can remain available."},{"route":"/app/reference/manifest/","title":"App integration manifest","description":"Generated reference for the TaskNotes app's mdbase integration requirements and capabilities.","product":"app","platforms":[],"version":"0.1.0","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes-app:src/generated/mdbase-app.json","namespace":"app","relativePath":"reference/manifest.md","raw":"---\ntitle: App integration manifest\ndescription: Generated reference for the TaskNotes app's mdbase integration requirements and capabilities.\n---\n\n# App integration manifest\n\nThis page is generated from the integration manifest shipped by TaskNotes app 0.1.0.\n\n| Field | Value |\n| --- | --- |\n| Application ID | `dev.tasknotes.app` |\n| Manifest version | `1` |\n| Homepage | [https://app.tasknotes.dev/](https://app.tasknotes.dev/) |\n| Collection access | `full_collection` |\n\n## Required contracts\n\n- `tasknotes.task` version `0.3.0-rc.3`\n\n## File capabilities\n\n- `list`\n- `read`\n- `add`\n- `replace`\n- `move`\n- `delete`\n\n## Notification criteria\n\n- `task.reminder` listens for `mdbase.runtime.timer.fired` version `1.0.0`.\n","aliases":[],"toc":[{"level":2,"id":"required-contracts","text":"Required contracts"},{"level":2,"id":"file-capabilities","text":"File capabilities"},{"level":2,"id":"notification-criteria","text":"Notification criteria"}],"html":"

This page is generated from the integration manifest shipped by TaskNotes app 0.1.0.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldValue
Application IDdev.tasknotes.app
Manifest version1
Homepagehttps://app.tasknotes.dev/
Collection accessfull_collection
\n

Required contracts#

\n\n

File capabilities#

\n\n

Notification criteria#

\n\n","text":"This page is generated from the integration manifest shipped by TaskNotes app 0.1.0. Field Value Application ID dev.tasknotes.app Manifest version 1 Homepage https://app.tasknotes.dev/ Collection access full_collection Required contracts# tasknotes.task version 0.3.0-rc.3 File capabilities# list read add replace move delete Notification criteria# task.reminder listens for mdbase.runtime.timer.fired version 1.0.0."},{"route":"/app/reminders/","title":"Reminders in the TaskNotes app","description":"Understand reminder data, notification delivery, permissions, and collection requirements.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/reminders.md","namespace":"app","relativePath":"reminders.md","raw":"---\ntitle: Reminders in the TaskNotes app\ndescription: Understand reminder data, notification delivery, permissions, and collection requirements.\nroute: /app/reminders/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Reminders in the TaskNotes app\n\nTask records can contain relative reminders anchored to scheduled or due dates,\nor absolute reminders fixed to a particular time. Saving reminder data does not\nby itself guarantee notification delivery.\n\n## Delivery by collection\n\n| Collection | Reminder data | Notification delivery |\n| --- | --- | --- |\n| Hosted mdbase | Saved in the collection | Available after opt-in |\n| Computer through the relay | Saved in the collection | Available while the computer and connector remain available |\n\nFor mdbase collections, the authority schedules reminder events so delivery\ndoes not depend on one TaskNotes screen remaining open. Notification payloads\nare content-free; selecting one refreshes authorized collection state in the\napp.\n\n## Turn on reminders\n\nOpen **More**, select **Turn on reminders**, and approve the browser or operating\nsystem permission. Some existing mdbase grants require **Review notification\naccess** before the channel can be enabled.\n\nAn unsupported or insecure browser reports that notification delivery is not\navailable. The reminder definitions remain in the task record.\n","aliases":[],"toc":[{"level":2,"id":"delivery-by-collection","text":"Delivery by collection"},{"level":2,"id":"turn-on-reminders","text":"Turn on reminders"}],"html":"

Task records can contain relative reminders anchored to scheduled or due dates,\nor absolute reminders fixed to a particular time. Saving reminder data does not\nby itself guarantee notification delivery.

\n

Delivery by collection#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CollectionReminder dataNotification delivery
Hosted mdbaseSaved in the collectionAvailable after opt-in
Computer through the relaySaved in the collectionAvailable while the computer and connector remain available
\n

For mdbase collections, the authority schedules reminder events so delivery\ndoes not depend on one TaskNotes screen remaining open. Notification payloads\nare content-free; selecting one refreshes authorized collection state in the\napp.

\n

Turn on reminders#

\n

Open More, select Turn on reminders, and approve the browser or operating\nsystem permission. Some existing mdbase grants require Review notification\naccess before the channel can be enabled.

\n

An unsupported or insecure browser reports that notification delivery is not\navailable. The reminder definitions remain in the task record.

\n","text":"Task records can contain relative reminders anchored to scheduled or due dates, or absolute reminders fixed to a particular time. Saving reminder data does not by itself guarantee notification delivery. Delivery by collection# Collection Reminder data Notification delivery Hosted mdbase Saved in the collection Available after opt-in Computer through the relay Saved in the collection Available while the computer and connector remain available For mdbase collections, the authority schedules reminder events so delivery does not depend on one TaskNotes screen remaining open. Notification payloads are content-free; selecting one refreshes authorized collection state in the app. Turn on reminders# Open More, select Turn on reminders, and approve the browser or operating system permission. Some existing mdbase grants require Review notification access before the channel can be enabled. An unsupported or insecure browser reports that notification delivery is not available. The reminder definitions remain in the task record."},{"route":"/app/tasks/","title":"Work with tasks","description":"Capture, edit, organize, complete, archive, and search tasks in the TaskNotes app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/tasks.md","namespace":"app","relativePath":"tasks.md","raw":"---\ntitle: Work with tasks\ndescription: Capture, edit, organize, complete, archive, and search tasks in the TaskNotes app.\nroute: /app/tasks/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Work with tasks\n\n
\n \"TaskNotes\n
A task opens beside its source view on wider screens.
\n
\n\n## Capture\n\nUse **Add task** from navigation or from a saved view. When a view has safe\ncreation defaults, TaskNotes applies them automatically so the new task remains\nin that view.\n\n## Edit\n\nA task can contain:\n\n- Status and priority\n- Scheduled and due dates\n- Markdown notes\n- Projects, contexts, and tags\n- Dependencies and subtasks\n- Collection-defined custom properties\n- Time estimates and tracked sessions\n- Recurrence and occurrence-note policies\n- Relative and absolute reminder definitions\n\nBackground saves remain ordered if you navigate away while a write is still in\nprogress.\n\n## Complete, archive, and delete\n\nComplete a task from its row or detail screen. Archive retains the record and\nmay move its Markdown file according to collection settings. Delete offers a\nshort undo period before committing the removal.\n\n## Search\n\nSearch runs across the current collection and matches titles, notes, projects,\ncontexts, and tags. Use **Refresh now** under **More** if a change made by\nanother tool does not appear yet.\n","aliases":[],"toc":[{"level":2,"id":"capture","text":"Capture"},{"level":2,"id":"edit","text":"Edit"},{"level":2,"id":"complete-archive-and-delete","text":"Complete, archive, and delete"},{"level":2,"id":"search","text":"Search"}],"html":"
\n \"TaskNotes\n
A task opens beside its source view on wider screens.
\n
\n\n

Capture#

\n

Use Add task from navigation or from a saved view. When a view has safe\ncreation defaults, TaskNotes applies them automatically so the new task remains\nin that view.

\n

Edit#

\n

A task can contain:

\n\n

Background saves remain ordered if you navigate away while a write is still in\nprogress.

\n

Complete, archive, and delete#

\n

Complete a task from its row or detail screen. Archive retains the record and\nmay move its Markdown file according to collection settings. Delete offers a\nshort undo period before committing the removal.

\n

Search#

\n

Search runs across the current collection and matches titles, notes, projects,\ncontexts, and tags. Use Refresh now under More if a change made by\nanother tool does not appear yet.

\n","text":"A task opens beside its source view on wider screens. Capture# Use Add task from navigation or from a saved view. When a view has safe creation defaults, TaskNotes applies them automatically so the new task remains in that view. Edit# A task can contain: Status and priority Scheduled and due dates Markdown notes Projects, contexts, and tags Dependencies and subtasks Collection-defined custom properties Time estimates and tracked sessions Recurrence and occurrence-note policies Relative and absolute reminder definitions Background saves remain ordered if you navigate away while a write is still in progress. Complete, archive, and delete# Complete a task from its row or detail screen. Archive retains the record and may move its Markdown file according to collection settings. Delete offers a short undo period before committing the removal. Search# Search runs across the current collection and matches titles, notes, projects, contexts, and tags. Use Refresh now under More if a change made by another tool does not appear yet."},{"route":"/app/troubleshooting/","title":"Troubleshoot the TaskNotes app","description":"Diagnose mdbase connection, authorization, refresh, and notification problems in the app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/troubleshooting.md","namespace":"app","relativePath":"troubleshooting.md","raw":"---\ntitle: Troubleshoot the TaskNotes app\ndescription: Diagnose mdbase connection, authorization, refresh, and notification problems in the app.\nroute: /app/troubleshooting/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Troubleshoot the TaskNotes app\n\nStart by recording the app version, platform, collection type, collection\nstatus shown under **More**, and the smallest sequence that reproduces the\nproblem.\n\n## The collection is unavailable\n\nFor a hosted collection, confirm that the device is online and try **Reconnect\nthis collection**. For a computer collection, also confirm that the computer\nholding the Markdown is awake, online, and running mdbase Connect.\n\n## An authorization error appears\n\nUse the reconnect action for the current collection and review the access that\nmdbase requests. If you no longer want to use that collection, open **More** and\nchoose **Change collection**.\n\n## A change did not save\n\nTaskNotes writes directly to mdbase and does not queue failed changes for later.\nRestore the connection, then retry the action. Capture and editing screens keep\nrecoverable input visible when they can do so safely.\n\n## A change from another tool is missing\n\nOpen **More** and choose **Refresh now**. If the record still does not appear,\nconfirm that the other tool wrote to the same mdbase collection and that the\nrecord uses a compatible TaskNotes task definition.\n\n## Notifications do not arrive\n\nConfirm that the current collection is an mdbase collection, reminders are\nenabled in **More**, the browser or operating system permission is granted, and\nthe task contains a valid future reminder. For a computer collection, the\ncomputer and mdbase Connect must remain available.\n","aliases":[],"toc":[{"level":2,"id":"the-collection-is-unavailable","text":"The collection is unavailable"},{"level":2,"id":"an-authorization-error-appears","text":"An authorization error appears"},{"level":2,"id":"a-change-did-not-save","text":"A change did not save"},{"level":2,"id":"a-change-from-another-tool-is-missing","text":"A change from another tool is missing"},{"level":2,"id":"notifications-do-not-arrive","text":"Notifications do not arrive"}],"html":"

Start by recording the app version, platform, collection type, collection\nstatus shown under More, and the smallest sequence that reproduces the\nproblem.

\n

The collection is unavailable#

\n

For a hosted collection, confirm that the device is online and try Reconnect\nthis collection. For a computer collection, also confirm that the computer\nholding the Markdown is awake, online, and running mdbase Connect.

\n

An authorization error appears#

\n

Use the reconnect action for the current collection and review the access that\nmdbase requests. If you no longer want to use that collection, open More and\nchoose Change collection.

\n

A change did not save#

\n

TaskNotes writes directly to mdbase and does not queue failed changes for later.\nRestore the connection, then retry the action. Capture and editing screens keep\nrecoverable input visible when they can do so safely.

\n

A change from another tool is missing#

\n

Open More and choose Refresh now. If the record still does not appear,\nconfirm that the other tool wrote to the same mdbase collection and that the\nrecord uses a compatible TaskNotes task definition.

\n

Notifications do not arrive#

\n

Confirm that the current collection is an mdbase collection, reminders are\nenabled in More, the browser or operating system permission is granted, and\nthe task contains a valid future reminder. For a computer collection, the\ncomputer and mdbase Connect must remain available.

\n","text":"Start by recording the app version, platform, collection type, collection status shown under More, and the smallest sequence that reproduces the problem. The collection is unavailable# For a hosted collection, confirm that the device is online and try Reconnect this collection. For a computer collection, also confirm that the computer holding the Markdown is awake, online, and running mdbase Connect. An authorization error appears# Use the reconnect action for the current collection and review the access that mdbase requests. If you no longer want to use that collection, open More and choose Change collection. A change did not save# TaskNotes writes directly to mdbase and does not queue failed changes for later. Restore the connection, then retry the action. Capture and editing screens keep recoverable input visible when they can do so safely. A change from another tool is missing# Open More and choose Refresh now. If the record still does not appear, confirm that the other tool wrote to the same mdbase collection and that the record uses a compatible TaskNotes task definition. Notifications do not arrive# Confirm that the current collection is an mdbase collection, reminders are enabled in More, the browser or operating system permission is granted, and the task contains a valid future reminder. For a computer collection, the computer and mdbase Connect must remain available."},{"route":"/app/views/","title":"Views and navigation","description":"Use and arrange lists, boards, calendars, projects, and saved views in the TaskNotes app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/views.md","namespace":"app","relativePath":"views.md","raw":"---\ntitle: Views and navigation\ndescription: Use and arrange lists, boards, calendars, projects, and saved views in the TaskNotes app.\nroute: /app/views/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Views and navigation\n\nViews are saved ways of selecting, sorting, grouping, and presenting records in\na collection. They travel with the collection; the set pinned to navigation is\na preference on each device.\n\n
\n \"TaskNotes\n
The Views manager controls navigation order and saved view definitions.
\n
\n\n## Starter views\n\nTaskNotes creates managed starter views such as Today, Upcoming, Calendar, and\nProjects. They use the same saved-view catalog as user-created views while\nproviding focused presentations for common work.\n\n## Presentations\n\n- **Task list** supports grouping, visible properties, section moves, and manual ordering.\n- **Kanban** groups tasks into columns and can update the grouped property when a task moves.\n- **Calendar** shows task dates in month, week, day, and list layouts.\n- **Mini calendar** combines a month picker with tasks for the selected day.\n- **Projects** finds project records referenced by active tasks.\n\n## Navigation\n\nOpen **Views** to add or remove a view from navigation and to change its order.\nThe first navigation item is the collection's home. Mobile displays the first\nthree views directly and keeps the rest in the Views destination.\n\n## Create and edit views\n\nThe view editor controls the name, presentation, query, grouping, sort order,\nvisible properties, and safe defaults for tasks created from the view. View\ndocuments remain ordinary collection resources rather than being stored only\ninside the TaskNotes app.\n","aliases":[],"toc":[{"level":2,"id":"starter-views","text":"Starter views"},{"level":2,"id":"presentations","text":"Presentations"},{"level":2,"id":"navigation","text":"Navigation"},{"level":2,"id":"create-and-edit-views","text":"Create and edit views"}],"html":"

Views are saved ways of selecting, sorting, grouping, and presenting records in\na collection. They travel with the collection; the set pinned to navigation is\na preference on each device.

\n
\n \"TaskNotes\n
The Views manager controls navigation order and saved view definitions.
\n
\n\n

Starter views#

\n

TaskNotes creates managed starter views such as Today, Upcoming, Calendar, and\nProjects. They use the same saved-view catalog as user-created views while\nproviding focused presentations for common work.

\n

Presentations#

\n\n

Navigation#

\n

Open Views to add or remove a view from navigation and to change its order.\nThe first navigation item is the collection's home. Mobile displays the first\nthree views directly and keeps the rest in the Views destination.

\n

Create and edit views#

\n

The view editor controls the name, presentation, query, grouping, sort order,\nvisible properties, and safe defaults for tasks created from the view. View\ndocuments remain ordinary collection resources rather than being stored only\ninside the TaskNotes app.

\n","text":"Views are saved ways of selecting, sorting, grouping, and presenting records in a collection. They travel with the collection; the set pinned to navigation is a preference on each device. The Views manager controls navigation order and saved view definitions. Starter views# TaskNotes creates managed starter views such as Today, Upcoming, Calendar, and Projects. They use the same saved-view catalog as user-created views while providing focused presentations for common work. Presentations# Task list supports grouping, visible properties, section moves, and manual ordering. Kanban groups tasks into columns and can update the grouped property when a task moves. Calendar shows task dates in month, week, day, and list layouts. Mini calendar combines a month picker with tasks for the selected day. Projects finds project records referenced by active tasks. Navigation# Open Views to add or remove a view from navigation and to change its order. The first navigation item is the collection's home. Mobile displays the first three views directly and keeps the rest in the Views destination. Create and edit views# The view editor controls the name, presentation, query, grouping, sort order, visible properties, and safe defaults for tasks created from the view. View documents remain ordinary collection resources rather than being stored only inside the TaskNotes app."},{"route":"/concepts/task-records/","title":"Portable task records","description":"The Markdown records, collection configuration, and task concepts shared by TaskNotes clients.","product":"shared","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/shared/task-records.md","namespace":"shared","relativePath":"task-records.md","raw":"---\ntitle: Portable task records\ndescription: The Markdown records, collection configuration, and task concepts shared by TaskNotes clients.\nroute: /concepts/task-records/\nproduct: shared\n---\n\n# Portable task records\n\nA TaskNotes task is an ordinary Markdown record with structured properties.\nThose properties describe the task; the Markdown body remains available for\nnotes, checklists, links, and supporting detail.\n\n## Collections\n\nA collection is a group of records plus the configuration that explains how to\ninterpret them. The configuration defines field names, statuses, priorities,\ncustom properties, record locations, and saved views.\n\nThe TaskNotes app uses **collection** throughout. The Obsidian plugin usually\ndescribes the containing folder as a **vault** and presents saved views through\nObsidian Bases.\n\n## Source of truth\n\nWhere the authoritative copy lives depends on the client and connection:\n\n| Client and collection | Source of truth | Availability |\n| --- | --- | --- |\n| TaskNotes app · hosted mdbase | Hosted collection | Requires a network connection |\n| TaskNotes app · computer through relay | Collection on that computer | Requires the network, computer, and connector |\n| Obsidian vault | Markdown files in the vault | Controlled by Obsidian and your sync choice |\n\n## Portability and compatibility\n\nPortable does not mean every client exposes every feature. Inline task widgets,\nObsidian commands, external calendar integrations, and companion plugins belong\nto the Obsidian client. mdbase collection access and background reminder\ndelivery belong to the TaskNotes app.\n\nUse the client-specific guide for interface instructions and the\n[specification](/developers/specification/) for normative data semantics.\n","aliases":[],"toc":[{"level":2,"id":"collections","text":"Collections"},{"level":2,"id":"source-of-truth","text":"Source of truth"},{"level":2,"id":"portability-and-compatibility","text":"Portability and compatibility"}],"html":"

A TaskNotes task is an ordinary Markdown record with structured properties.\nThose properties describe the task; the Markdown body remains available for\nnotes, checklists, links, and supporting detail.

\n

Collections#

\n

A collection is a group of records plus the configuration that explains how to\ninterpret them. The configuration defines field names, statuses, priorities,\ncustom properties, record locations, and saved views.

\n

The TaskNotes app uses collection throughout. The Obsidian plugin usually\ndescribes the containing folder as a vault and presents saved views through\nObsidian Bases.

\n

Source of truth#

\n

Where the authoritative copy lives depends on the client and connection:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Client and collectionSource of truthAvailability
TaskNotes app · hosted mdbaseHosted collectionRequires a network connection
TaskNotes app · computer through relayCollection on that computerRequires the network, computer, and connector
Obsidian vaultMarkdown files in the vaultControlled by Obsidian and your sync choice
\n

Portability and compatibility#

\n

Portable does not mean every client exposes every feature. Inline task widgets,\nObsidian commands, external calendar integrations, and companion plugins belong\nto the Obsidian client. mdbase collection access and background reminder\ndelivery belong to the TaskNotes app.

\n

Use the client-specific guide for interface instructions and the\nspecification for normative data semantics.

\n","text":"A TaskNotes task is an ordinary Markdown record with structured properties. Those properties describe the task; the Markdown body remains available for notes, checklists, links, and supporting detail. Collections# A collection is a group of records plus the configuration that explains how to interpret them. The configuration defines field names, statuses, priorities, custom properties, record locations, and saved views. The TaskNotes app uses collection throughout. The Obsidian plugin usually describes the containing folder as a vault and presents saved views through Obsidian Bases. Source of truth# Where the authoritative copy lives depends on the client and connection: Client and collection Source of truth Availability TaskNotes app · hosted mdbase Hosted collection Requires a network connection TaskNotes app · computer through relay Collection on that computer Requires the network, computer, and connector Obsidian vault Markdown files in the vault Controlled by Obsidian and your sync choice Portability and compatibility# Portable does not mean every client exposes every feature. Inline task widgets, Obsidian commands, external calendar integrations, and companion plugins belong to the Obsidian client. mdbase collection access and background reminder delivery belong to the TaskNotes app. Use the client-specific guide for interface instructions and the specification for normative data semantics."},{"route":"/developers/specification/","title":"0. Overview","description":"TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editabl...","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:00-overview.md","namespace":"specification","relativePath":"00-overview.md","raw":"# 0. Overview\n\n## 0.0 About tasknotes\n\n**TaskNotes** is an [Obsidian](https://obsidian.md) plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling.\n\nA minimal task file looks like this:\n\n```markdown\n---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n```\n\nTasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. `#task` in body or frontmatter). The plugin stores its configuration in `.obsidian/plugins/tasknotes/data.json` within the vault root.\n\n**This specification** was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for:\n\n- CLI tools and scripts that process task files outside Obsidian,\n- any application that wants to interoperate with a tasknotes vault.\n\nThe spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in `conformance/`) can be driven by an adapter written in any language.\n\nThe tasknotes plugin is the primary reference for how this spec was derived, but **the specification is normative** — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5).\n\n## 0.1 Status and authority\n\nThis document is part of `tasknotes-spec` version `0.3.0-rc.1`.\n\nThis specification is normative for implementations that claim conformance.\nNo single implementation is normative; implementations are expected to conform to the specification.\n\n## 0.2 Motivation\n\nTaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages:\n\n- Task records are plain files that can be inspected and edited without proprietary tooling.\n- Data remains portable across environments.\n- Files are suitable for version control and collaboration workflows.\n\nAs soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas:\n\n1. Field semantics and naming drift.\n2. Date and timezone interpretation differences.\n3. Recurring-task state transitions that are handled differently by different clients.\n\nWhen these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned.\n\n## 0.3 Objectives\n\nThis specification defines a stable contract for:\n\n- Representing task records in markdown frontmatter.\n- Mapping storage keys to canonical semantic roles.\n- Defining effective collection configuration via provider model (for example `tasknotes.yaml` and/or TaskNotes `data.json`).\n- Interpreting date and datetime values consistently.\n- Applying recurrence, per-instance completion/skip behavior, and optional materialized occurrence notes.\n- Managing time tracking sessions and `time_entries` lifecycle behavior.\n- Parsing and resolving links consistently across task fields.\n- Defining dependency and reminder behavior.\n- Optionally applying deterministic create-time templating behavior.\n- Executing write operations with predictable side-effects.\n- Validating task records and reporting issues.\n\n## 0.4 Non-objectives\n\nThis specification does not standardize:\n\n- UI layout, styling, command palettes, or interaction design.\n- Internal caching architecture or rendering pipelines.\n- Transport protocols (HTTP, IPC, etc.) except where they affect persisted task semantics.\n- Rich template-language features beyond the portable create-time templating contract in §5/§7/§9.\n\n## 0.5 Scope\n\nThis specification is standalone. It does not require conformance to any other specification.\n\nImplementations MAY internally reuse other libraries or specifications, but conformance claims under `tasknotes-spec` are evaluated only against this document.\nTemplating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support.\nReferences to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative.\n\n## 0.6 Design principles\n\n### 0.6.1 File-first persistence\n\nTask state is represented in user-visible files. Derived indexes and caches are non-canonical.\n\n### 0.6.2 Deterministic semantics\n\nEquivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone.\n\n### 0.6.3 Explicit mapping\n\nSemantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly.\n\n### 0.6.4 Backward evolution\n\nThe specification supports migration from legacy keys and historical behaviors through explicit compatibility rules.\n\n## 0.7 Conformance\n\nConformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations.\n\n## 0.8 Normative language\n\nThe key words **MUST**, **MUST NOT**, **SHOULD**, **SHOULD NOT**, and **MAY** are to be interpreted as described in RFC 2119.\n\n## 0.9 Example collection\n\nA default tasknotes vault looks like this:\n\n```text\nMyVault/\n├── TaskNotes/\n│ ├── Tasks/\n│ │ ├── buy-groceries.md ← task file (title-derived filename by default)\n│ │ └── weekly-review.md\n│ └── Archive/ ← archive folder (if moveArchivedTasks=true)\n├── .obsidian/\n│ └── plugins/\n│ └── tasknotes/\n│ └── data.json ← plugin settings (primary config provider)\n└── tasknotes.yaml ← optional spec-level config (secondary provider)\n```\n\nTask files are identified by the `#task` tag by default (configurable). The full default collection state is described in §9.21.\n\nConfiguration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy.\n\nA task file example (using default field mapping):\n\n```markdown\n---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task, errands]\ncontexts: [\"town\"]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n```\n\n## 0.10 Versioning policy\n\nThis specification uses semantic versioning.\n\n- A **major** version introduces breaking semantic changes.\n- A **minor** version introduces additive behavior or optional features.\n- A **patch** version clarifies wording or fixes non-breaking defects.\n\nImplementations MUST reject unsupported major versions when strict mode is enabled.\n\n## 0.11 Change governance\n\nSpecification changes SHOULD be accompanied by:\n\n- a motivation statement,\n- precise normative edits,\n- migration notes when behavior changes,\n- updated examples.\n","aliases":["/spec/00-overview/"],"toc":[{"level":2,"id":"00-about-tasknotes","text":"0.0 About tasknotes"},{"level":2,"id":"01-status-and-authority","text":"0.1 Status and authority"},{"level":2,"id":"02-motivation","text":"0.2 Motivation"},{"level":2,"id":"03-objectives","text":"0.3 Objectives"},{"level":2,"id":"04-non-objectives","text":"0.4 Non-objectives"},{"level":2,"id":"05-scope","text":"0.5 Scope"},{"level":2,"id":"06-design-principles","text":"0.6 Design principles"},{"level":3,"id":"061-file-first-persistence","text":"0.6.1 File-first persistence"},{"level":3,"id":"062-deterministic-semantics","text":"0.6.2 Deterministic semantics"},{"level":3,"id":"063-explicit-mapping","text":"0.6.3 Explicit mapping"},{"level":3,"id":"064-backward-evolution","text":"0.6.4 Backward evolution"},{"level":2,"id":"07-conformance","text":"0.7 Conformance"},{"level":2,"id":"08-normative-language","text":"0.8 Normative language"},{"level":2,"id":"09-example-collection","text":"0.9 Example collection"},{"level":2,"id":"010-versioning-policy","text":"0.10 Versioning policy"},{"level":2,"id":"011-change-governance","text":"0.11 Change governance"}],"html":"

0.0 About tasknotes#

\n

TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling.

\n

A minimal task file looks like this:

\n
---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n

Tasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. #task in body or frontmatter). The plugin stores its configuration in .obsidian/plugins/tasknotes/data.json within the vault root.

\n

This specification was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for:

\n\n

The spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in conformance/) can be driven by an adapter written in any language.

\n

The tasknotes plugin is the primary reference for how this spec was derived, but the specification is normative — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5).

\n

0.1 Status and authority#

\n

This document is part of tasknotes-spec version 0.3.0-rc.1.

\n

This specification is normative for implementations that claim conformance.\nNo single implementation is normative; implementations are expected to conform to the specification.

\n

0.2 Motivation#

\n

TaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages:

\n\n

As soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas:

\n
    \n
  1. Field semantics and naming drift.
  2. \n
  3. Date and timezone interpretation differences.
  4. \n
  5. Recurring-task state transitions that are handled differently by different clients.
  6. \n
\n

When these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned.

\n

0.3 Objectives#

\n

This specification defines a stable contract for:

\n\n

0.4 Non-objectives#

\n

This specification does not standardize:

\n\n

0.5 Scope#

\n

This specification is standalone. It does not require conformance to any other specification.

\n

Implementations MAY internally reuse other libraries or specifications, but conformance claims under tasknotes-spec are evaluated only against this document.\nTemplating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support.\nReferences to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative.

\n

0.6 Design principles#

\n

0.6.1 File-first persistence#

\n

Task state is represented in user-visible files. Derived indexes and caches are non-canonical.

\n

0.6.2 Deterministic semantics#

\n

Equivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone.

\n

0.6.3 Explicit mapping#

\n

Semantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly.

\n

0.6.4 Backward evolution#

\n

The specification supports migration from legacy keys and historical behaviors through explicit compatibility rules.

\n

0.7 Conformance#

\n

Conformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations.

\n

0.8 Normative language#

\n

The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are to be interpreted as described in RFC 2119.

\n

0.9 Example collection#

\n

A default tasknotes vault looks like this:

\n
MyVault/\n├── TaskNotes/\n│   ├── Tasks/\n│   │   ├── buy-groceries.md    ← task file (title-derived filename by default)\n│   │   └── weekly-review.md\n│   └── Archive/                ← archive folder (if moveArchivedTasks=true)\n├── .obsidian/\n│   └── plugins/\n│       └── tasknotes/\n│           └── data.json       ← plugin settings (primary config provider)\n└── tasknotes.yaml              ← optional spec-level config (secondary provider)\n

Task files are identified by the #task tag by default (configurable). The full default collection state is described in §9.21.

\n

Configuration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy.

\n

A task file example (using default field mapping):

\n
---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task, errands]\ncontexts: ["town"]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n

0.10 Versioning policy#

\n

This specification uses semantic versioning.

\n\n

Implementations MUST reject unsupported major versions when strict mode is enabled.

\n

0.11 Change governance#

\n

Specification changes SHOULD be accompanied by:

\n\n","text":"0.0 About tasknotes# TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling. A minimal task file looks like this: --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. Tasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. #task in body or frontmatter). The plugin stores its configuration in .obsidian/plugins/tasknotes/data.json within the vault root. This specification was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for: CLI tools and scripts that process task files outside Obsidian, any application that wants to interoperate with a tasknotes vault. The spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in conformance/) can be driven by an adapter written in any language. The tasknotes plugin is the primary reference for how this spec was derived, but the specification is normative — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5). 0.1 Status and authority# This document is part of tasknotes-spec version 0.3.0-rc.1. This specification is normative for implementations that claim conformance. No single implementation is normative; implementations are expected to conform to the specification. 0.2 Motivation# TaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages: Task records are plain files that can be inspected and edited without proprietary tooling. Data remains portable across environments. Files are suitable for version control and collaboration workflows. As soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas: Field semantics and naming drift. Date and timezone interpretation differences. Recurring-task state transitions that are handled differently by different clients. When these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned. 0.3 Objectives# This specification defines a stable contract for: Representing task records in markdown frontmatter. Mapping storage keys to canonical semantic roles. Defining effective collection configuration via provider model (for example tasknotes.yaml and/or TaskNotes data.json). Interpreting date and datetime values consistently. Applying recurrence, per-instance completion/skip behavior, and optional materialized occurrence notes. Managing time tracking sessions and time_entries lifecycle behavior. Parsing and resolving links consistently across task fields. Defining dependency and reminder behavior. Optionally applying deterministic create-time templating behavior. Executing write operations with predictable side-effects. Validating task records and reporting issues. 0.4 Non-objectives# This specification does not standardize: UI layout, styling, command palettes, or interaction design. Internal caching architecture or rendering pipelines. Transport protocols (HTTP, IPC, etc.) except where they affect persisted task semantics. Rich template-language features beyond the portable create-time templating contract in §5/§7/§9. 0.5 Scope# This specification is standalone. It does not require conformance to any other specification. Implementations MAY internally reuse other libraries or specifications, but conformance claims under tasknotes-spec are evaluated only against this document. Templating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support. References to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative. 0.6 Design principles# 0.6.1 File-first persistence# Task state is represented in user-visible files. Derived indexes and caches are non-canonical. 0.6.2 Deterministic semantics# Equivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone. 0.6.3 Explicit mapping# Semantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly. 0.6.4 Backward evolution# The specification supports migration from legacy keys and historical behaviors through explicit compatibility rules. 0.7 Conformance# Conformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations. 0.8 Normative language# The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are to be interpreted as described in RFC 2119. 0.9 Example collection# A default tasknotes vault looks like this: MyVault/ ├── TaskNotes/ │ ├── Tasks/ │ │ ├── buy-groceries.md ← task file (title-derived filename by default) │ │ └── weekly-review.md │ └── Archive/ ← archive folder (if moveArchivedTasks=true) ├── .obsidian/ │ └── plugins/ │ └── tasknotes/ │ └── data.json ← plugin settings (primary config provider) └── tasknotes.yaml ← optional spec-level config (secondary provider) Task files are identified by the #task tag by default (configurable). The full default collection state is described in §9.21. Configuration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy. A task file example (using default field mapping): --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task, errands] contexts: [\"town\"] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. 0.10 Versioning policy# This specification uses semantic versioning. A major version introduces breaking semantic changes. A minor version introduces additive behavior or optional features. A patch version clarifies wording or fixes non-breaking defects. Implementations MUST reject unsupported major versions when strict mode is enabled. 0.11 Change governance# Specification changes SHOULD be accompanied by: a motivation statement, precise normative edits, migration notes when behavior changes, updated examples."},{"route":"/developers/specification/01-terminology/","title":"1. Terminology","description":"This section defines terms used normatively in this specification.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:01-terminology.md","namespace":"specification","relativePath":"01-terminology.md","raw":"# 1. Terminology\n\nThis section defines terms used normatively in this specification.\n\n## 1.1 Collection\n\nA **collection** is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration.\n\n## 1.2 Task file\n\nA **task file** is a markdown file identified as a task record by collection rules.\n\n## 1.3 Frontmatter\n\n**Frontmatter** is the YAML block at the start of a markdown file delimited by `---` markers.\n\n## 1.4 Task record\n\nA **task record** is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata).\n\n## 1.5 Semantic role\n\nA **semantic role** is a canonical meaning defined by this specification, independent of storage key names.\n\nExamples: `title`, `status`, `date_created`, `complete_instances`.\n\n## 1.6 Storage key\n\nA **storage key** is the YAML property name used in frontmatter.\n\nExamples: `dateCreated`, `date_created`, `completedDate`.\n\n## 1.7 Field mapping\n\n**Field mapping** is the configuration that maps semantic roles to storage keys for reads and writes.\n\n## 1.8 Alias\n\nAn **alias** is a non-canonical storage key accepted for compatibility during reads.\n\n## 1.9 Canonical write key\n\nThe **canonical write key** is the configured storage key that conforming writers use for persisted output.\n\n## 1.10 Date value\n\nA **date value** represents a calendar day with no time-of-day and no timezone.\n\nCanonical form: `YYYY-MM-DD`.\n\n## 1.11 Datetime value\n\nA **datetime value** represents an instant in time.\n\nCanonical form: ISO 8601 UTC with trailing `Z`.\n\n## 1.12 Target date\n\nA **target date** is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20).\n\n## 1.13 Recurrence rule\n\nA **recurrence rule** is a tasknotes recurrence string stored in the recurrence semantic role.\nIt uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline `DTSTART` prefix segment as defined in §4.3.\n\n## 1.14 Recurrence anchor\n\n**Recurrence anchor** defines how next-instance progression is computed. Allowed values:\n\n- `scheduled`\n- `completion`\n\n## 1.15 Complete instances\n\n**Complete instances** is the set/list of target dates marked completed for a recurring task.\n\n## 1.16 Skipped instances\n\n**Skipped instances** is the set/list of target dates marked skipped for a recurring task.\n\n## 1.17 Materialized occurrence note\n\nA **materialized occurrence note** is a task file created for one target date of a recurring parent task.\nIt stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date.\n\n## 1.18 Recurrence parent\n\nA **recurrence parent** is the recurring task record referenced by a materialized occurrence note.\nThe reference is stored in semantic role `recurrence_parent` and resolved as a link according to §11.\n\n## 1.19 Occurrence materialization\n\n**Occurrence materialization** is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20.\n\n## 1.20 Effective status\n\n**Effective status** is the status presented for a given date context after applying recurrence instance state.\n\n## 1.21 Completed-status list\n\nThe **completed-status list** is the configured ordered list of status values treated as completed for non-recurring completion semantics.\nWhen a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it.\n\n## 1.22 Idempotent operation\n\nAn operation is **idempotent** if applying it multiple times with the same input produces the same persisted state as applying it once.\n\n## 1.23 Unknown field\n\nAn **unknown field** is a frontmatter property not mapped to a semantic role in current configuration.\n\n## 1.24 Validation issue\n\nA **validation issue** is a structured report containing at least:\n\n- machine-readable code,\n- severity,\n- optional path/field context,\n- human-readable message.\n\n## 1.25 Strict validation mode\n\n**Strict validation mode** is a mode where invalid required semantics are treated as hard errors and write operations fail.\n\n## 1.26 Legacy compatibility mode\n\n**Legacy compatibility mode** is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes.\n\n## 1.27 Configuration provider\n\nA **configuration provider** is an adapter that loads configuration from a source (for example `tasknotes.yaml` or `.obsidian/plugins/tasknotes/data.json`) and normalizes it to the schema in §9.\n\n## 1.28 Effective configuration\n\nThe **effective configuration** is the final resolved configuration after applying provider precedence and fallback rules.\n\n## 1.29 Template file\n\nA **template file** is a markdown document used at create time to generate frontmatter and/or body content through variable expansion.\nWhen templating is enabled, template behavior is defined by §5.3.5 and §9.14.\n\n## 1.30 Template expansion\n\n**Template expansion** is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules.\n\n## 1.31 Time entry\n\nA **time entry** is a structured record in `time_entries` containing `startTime`, optional `endTime`, and optional `description`.\n\n## 1.32 Active time entry\n\nAn **active time entry** is a time entry with `startTime` present and `endTime` absent.\n\n## 1.33 Time tracking management\n\n**Time tracking management** is the set of operations that start, stop, edit, and remove `time_entries`, including completion-triggered auto-stop behavior when configured.\n","aliases":["/spec/01-terminology/"],"toc":[{"level":2,"id":"11-collection","text":"1.1 Collection"},{"level":2,"id":"12-task-file","text":"1.2 Task file"},{"level":2,"id":"13-frontmatter","text":"1.3 Frontmatter"},{"level":2,"id":"14-task-record","text":"1.4 Task record"},{"level":2,"id":"15-semantic-role","text":"1.5 Semantic role"},{"level":2,"id":"16-storage-key","text":"1.6 Storage key"},{"level":2,"id":"17-field-mapping","text":"1.7 Field mapping"},{"level":2,"id":"18-alias","text":"1.8 Alias"},{"level":2,"id":"19-canonical-write-key","text":"1.9 Canonical write key"},{"level":2,"id":"110-date-value","text":"1.10 Date value"},{"level":2,"id":"111-datetime-value","text":"1.11 Datetime value"},{"level":2,"id":"112-target-date","text":"1.12 Target date"},{"level":2,"id":"113-recurrence-rule","text":"1.13 Recurrence rule"},{"level":2,"id":"114-recurrence-anchor","text":"1.14 Recurrence anchor"},{"level":2,"id":"115-complete-instances","text":"1.15 Complete instances"},{"level":2,"id":"116-skipped-instances","text":"1.16 Skipped instances"},{"level":2,"id":"117-materialized-occurrence-note","text":"1.17 Materialized occurrence note"},{"level":2,"id":"118-recurrence-parent","text":"1.18 Recurrence parent"},{"level":2,"id":"119-occurrence-materialization","text":"1.19 Occurrence materialization"},{"level":2,"id":"120-effective-status","text":"1.20 Effective status"},{"level":2,"id":"121-completed-status-list","text":"1.21 Completed-status list"},{"level":2,"id":"122-idempotent-operation","text":"1.22 Idempotent operation"},{"level":2,"id":"123-unknown-field","text":"1.23 Unknown field"},{"level":2,"id":"124-validation-issue","text":"1.24 Validation issue"},{"level":2,"id":"125-strict-validation-mode","text":"1.25 Strict validation mode"},{"level":2,"id":"126-legacy-compatibility-mode","text":"1.26 Legacy compatibility mode"},{"level":2,"id":"127-configuration-provider","text":"1.27 Configuration provider"},{"level":2,"id":"128-effective-configuration","text":"1.28 Effective configuration"},{"level":2,"id":"129-template-file","text":"1.29 Template file"},{"level":2,"id":"130-template-expansion","text":"1.30 Template expansion"},{"level":2,"id":"131-time-entry","text":"1.31 Time entry"},{"level":2,"id":"132-active-time-entry","text":"1.32 Active time entry"},{"level":2,"id":"133-time-tracking-management","text":"1.33 Time tracking management"}],"html":"

This section defines terms used normatively in this specification.

\n

1.1 Collection#

\n

A collection is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration.

\n

1.2 Task file#

\n

A task file is a markdown file identified as a task record by collection rules.

\n

1.3 Frontmatter#

\n

Frontmatter is the YAML block at the start of a markdown file delimited by --- markers.

\n

1.4 Task record#

\n

A task record is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata).

\n

1.5 Semantic role#

\n

A semantic role is a canonical meaning defined by this specification, independent of storage key names.

\n

Examples: title, status, date_created, complete_instances.

\n

1.6 Storage key#

\n

A storage key is the YAML property name used in frontmatter.

\n

Examples: dateCreated, date_created, completedDate.

\n

1.7 Field mapping#

\n

Field mapping is the configuration that maps semantic roles to storage keys for reads and writes.

\n

1.8 Alias#

\n

An alias is a non-canonical storage key accepted for compatibility during reads.

\n

1.9 Canonical write key#

\n

The canonical write key is the configured storage key that conforming writers use for persisted output.

\n

1.10 Date value#

\n

A date value represents a calendar day with no time-of-day and no timezone.

\n

Canonical form: YYYY-MM-DD.

\n

1.11 Datetime value#

\n

A datetime value represents an instant in time.

\n

Canonical form: ISO 8601 UTC with trailing Z.

\n

1.12 Target date#

\n

A target date is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20).

\n

1.13 Recurrence rule#

\n

A recurrence rule is a tasknotes recurrence string stored in the recurrence semantic role.\nIt uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline DTSTART prefix segment as defined in §4.3.

\n

1.14 Recurrence anchor#

\n

Recurrence anchor defines how next-instance progression is computed. Allowed values:

\n\n

1.15 Complete instances#

\n

Complete instances is the set/list of target dates marked completed for a recurring task.

\n

1.16 Skipped instances#

\n

Skipped instances is the set/list of target dates marked skipped for a recurring task.

\n

1.17 Materialized occurrence note#

\n

A materialized occurrence note is a task file created for one target date of a recurring parent task.\nIt stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date.

\n

1.18 Recurrence parent#

\n

A recurrence parent is the recurring task record referenced by a materialized occurrence note.\nThe reference is stored in semantic role recurrence_parent and resolved as a link according to §11.

\n

1.19 Occurrence materialization#

\n

Occurrence materialization is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20.

\n

1.20 Effective status#

\n

Effective status is the status presented for a given date context after applying recurrence instance state.

\n

1.21 Completed-status list#

\n

The completed-status list is the configured ordered list of status values treated as completed for non-recurring completion semantics.\nWhen a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it.

\n

1.22 Idempotent operation#

\n

An operation is idempotent if applying it multiple times with the same input produces the same persisted state as applying it once.

\n

1.23 Unknown field#

\n

An unknown field is a frontmatter property not mapped to a semantic role in current configuration.

\n

1.24 Validation issue#

\n

A validation issue is a structured report containing at least:

\n\n

1.25 Strict validation mode#

\n

Strict validation mode is a mode where invalid required semantics are treated as hard errors and write operations fail.

\n

1.26 Legacy compatibility mode#

\n

Legacy compatibility mode is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes.

\n

1.27 Configuration provider#

\n

A configuration provider is an adapter that loads configuration from a source (for example tasknotes.yaml or .obsidian/plugins/tasknotes/data.json) and normalizes it to the schema in §9.

\n

1.28 Effective configuration#

\n

The effective configuration is the final resolved configuration after applying provider precedence and fallback rules.

\n

1.29 Template file#

\n

A template file is a markdown document used at create time to generate frontmatter and/or body content through variable expansion.\nWhen templating is enabled, template behavior is defined by §5.3.5 and §9.14.

\n

1.30 Template expansion#

\n

Template expansion is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules.

\n

1.31 Time entry#

\n

A time entry is a structured record in time_entries containing startTime, optional endTime, and optional description.

\n

1.32 Active time entry#

\n

An active time entry is a time entry with startTime present and endTime absent.

\n

1.33 Time tracking management#

\n

Time tracking management is the set of operations that start, stop, edit, and remove time_entries, including completion-triggered auto-stop behavior when configured.

\n","text":"This section defines terms used normatively in this specification. 1.1 Collection# A collection is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration. 1.2 Task file# A task file is a markdown file identified as a task record by collection rules. 1.3 Frontmatter# Frontmatter is the YAML block at the start of a markdown file delimited by --- markers. 1.4 Task record# A task record is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata). 1.5 Semantic role# A semantic role is a canonical meaning defined by this specification, independent of storage key names. Examples: title, status, date_created, complete_instances. 1.6 Storage key# A storage key is the YAML property name used in frontmatter. Examples: dateCreated, date_created, completedDate. 1.7 Field mapping# Field mapping is the configuration that maps semantic roles to storage keys for reads and writes. 1.8 Alias# An alias is a non-canonical storage key accepted for compatibility during reads. 1.9 Canonical write key# The canonical write key is the configured storage key that conforming writers use for persisted output. 1.10 Date value# A date value represents a calendar day with no time-of-day and no timezone. Canonical form: YYYY-MM-DD. 1.11 Datetime value# A datetime value represents an instant in time. Canonical form: ISO 8601 UTC with trailing Z. 1.12 Target date# A target date is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20). 1.13 Recurrence rule# A recurrence rule is a tasknotes recurrence string stored in the recurrence semantic role. It uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline DTSTART prefix segment as defined in §4.3. 1.14 Recurrence anchor# Recurrence anchor defines how next-instance progression is computed. Allowed values: scheduled completion 1.15 Complete instances# Complete instances is the set/list of target dates marked completed for a recurring task. 1.16 Skipped instances# Skipped instances is the set/list of target dates marked skipped for a recurring task. 1.17 Materialized occurrence note# A materialized occurrence note is a task file created for one target date of a recurring parent task. It stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date. 1.18 Recurrence parent# A recurrence parent is the recurring task record referenced by a materialized occurrence note. The reference is stored in semantic role recurrence_parent and resolved as a link according to §11. 1.19 Occurrence materialization# Occurrence materialization is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20. 1.20 Effective status# Effective status is the status presented for a given date context after applying recurrence instance state. 1.21 Completed-status list# The completed-status list is the configured ordered list of status values treated as completed for non-recurring completion semantics. When a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it. 1.22 Idempotent operation# An operation is idempotent if applying it multiple times with the same input produces the same persisted state as applying it once. 1.23 Unknown field# An unknown field is a frontmatter property not mapped to a semantic role in current configuration. 1.24 Validation issue# A validation issue is a structured report containing at least: machine-readable code, severity, optional path/field context, human-readable message. 1.25 Strict validation mode# Strict validation mode is a mode where invalid required semantics are treated as hard errors and write operations fail. 1.26 Legacy compatibility mode# Legacy compatibility mode is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes. 1.27 Configuration provider# A configuration provider is an adapter that loads configuration from a source (for example tasknotes.yaml or .obsidian/plugins/tasknotes/data.json) and normalizes it to the schema in §9. 1.28 Effective configuration# The effective configuration is the final resolved configuration after applying provider precedence and fallback rules. 1.29 Template file# A template file is a markdown document used at create time to generate frontmatter and/or body content through variable expansion. When templating is enabled, template behavior is defined by §5.3.5 and §9.14. 1.30 Template expansion# Template expansion is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules. 1.31 Time entry# A time entry is a structured record in time_entries containing startTime, optional endTime, and optional description. 1.32 Active time entry# An active time entry is a time entry with startTime present and endTime absent. 1.33 Time tracking management# Time tracking management is the set of operations that start, stop, edit, and remove time_entries, including completion-triggered auto-stop behavior when configured."},{"route":"/developers/specification/02-model-and-mapping/","title":"2. Model and Field Mapping","description":"A task record consists of:","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:02-model-and-mapping.md","namespace":"specification","relativePath":"02-model-and-mapping.md","raw":"# 2. Model and Field Mapping\n\n## 2.1 Task record model\n\nA task record consists of:\n\n- frontmatter object (structured fields),\n- markdown body (freeform text),\n- file metadata (path, created/modified time) where available.\n\nFrontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features.\n\n## 2.2 Required semantic roles\n\nConforming implementations MUST support these semantic roles:\n\n| Semantic role | Type | Required |\n|---|---|---|\n| `title` | string | support required (value required via configured title source, see §2.2.2) |\n| `status` | string/enum | yes |\n| `completed_date` | date | support required (conditionally required, see §2.2.1) |\n| `date_created` | datetime | yes |\n| `date_modified` | datetime | yes |\n\nIf storage omits a role marked `yes`, validation MUST report an error (see §6).\nFor operation-required roles, validation and operation rules in §5 and §6 apply.\n\n### 2.2.1 Conditional requiredness (`completed_date`)\n\n`completed_date` support is mandatory, but presence is conditional:\n\n- For non-recurring tasks with `status` in configured `status.completed_values`, `completed_date` MUST be present.\n- For non-recurring tasks with non-completed status, `completed_date` MAY be absent.\n- For recurring tasks, `completed_date` is not required by recurrence completion semantics and MAY be absent.\n\nValidators MUST apply this conditional rule and MUST NOT treat `completed_date` as unconditionally required.\n\n### 2.2.2 Conditional requiredness (`title`)\n\nSemantic `title` is always required, with deterministic read resolution and storage-mode-dependent read/write behavior:\n\n- Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13):\n 1. when `title.storage=frontmatter`: mapped `title` key when present and non-empty, then file basename fallback;\n 2. when `title.storage=filename`: file basename first, then mapped `title` fallback when basename is unavailable.\n- If mapped title and filename-derived title both exist and differ, the source authoritative for active `title.storage` MUST win and implementations SHOULD emit `title_source_conflict`.\n- When `title.storage=filename`, implementations MAY keep mapped `title` as a synchronized compatibility mirror, but filename-derived title remains authoritative.\n- Title storage mode controls canonical writes (§9.13): `frontmatter` favors mapped-key writes; `filename` favors filename-derived title with rename-on-title-change behavior.\n\nValidators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone.\n\n## 2.3 Common semantic roles\n\nImplementations conforming beyond minimal scope SHOULD support:\n\n| Semantic role | Type | Notes |\n|---|---|---|\n| `id` | string | stable task identity token; see §2.6.5 |\n| `priority` | string/enum | configurable values |\n| `due` | date or datetime | see §3 |\n| `scheduled` | date or datetime | see §3 |\n| `tags` | list | free tags |\n| `contexts` | list | commonly prefixed with `@` |\n| `projects` | list | project references, see §11 |\n| `time_estimate` | integer >= 0 | minutes |\n| `time_entries` | list | see §2.6 |\n| `recurrence` | string | tasknotes recurrence string; see §4 |\n| `recurrence_anchor` | enum | `scheduled` or `completion` |\n| `complete_instances` | list | recurring completion state |\n| `skipped_instances` | list | recurring skip state |\n| `recurrence_parent` | link-or-string | parent recurring task reference for materialized occurrence notes; see §4.18 |\n| `occurrence_date` | date | target date represented by a materialized occurrence note |\n| `occurrence_materialization` | enum | parent task materialization mode: `manual`, `on_completion`, or `rolling` |\n| `occurrence_next_trigger` | enum | parent task next-note trigger: `completion` or `completion_or_skip` |\n| `occurrence_template` | link-or-string | optional template used when creating materialized occurrence notes |\n| `occurrence_past_horizon` | duration | optional rolling materialization lookbehind bound |\n| `occurrence_future_horizon` | duration | optional rolling materialization lookahead bound |\n| `blocked_by` | list | dependency records, see §10 and §11 |\n| `reminders` | list | reminder records, see §10 |\n\nOptional extended roles are defined in §7 profiles.\n\n## 2.4 Field mapping requirements\n\n### 2.4.1 Mapping presence\n\nAn implementation MUST have an effective mapping from each supported semantic role to a canonical write key.\nMapping configuration is defined in §9.\nIf semantic role `id` is supported, it MUST also have a canonical write key.\n\n### 2.4.2 Read behavior\n\nReaders MUST:\n\n1. Read the canonical mapped key if present.\n2. Support configured aliases where enabled.\n3. Resolve conflicts deterministically when canonical and alias keys coexist.\n4. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win.\n5. When canonical key wins over alias, validator/loader SHOULD emit warning `alias_conflict_ignored`.\n\n### 2.4.3 Write behavior\n\nWriters MUST:\n\n- write only canonical keys,\n- avoid introducing alias keys in new writes,\n- preserve unknown fields unless the operation explicitly opts into normalization.\n\n## 2.5 Legacy alias compatibility\n\nImplementations SHOULD accept these aliases on read for interoperability:\n\n| Semantic role | Canonical example | Alias examples |\n|---|---|---|\n| `recurrence_anchor` | `recurrence_anchor` | `recurrenceAnchor` |\n| `complete_instances` | `complete_instances` | `completeInstances` |\n| `skipped_instances` | `skipped_instances` | `skippedInstances` |\n| `recurrence_parent` | `recurrence_parent` | `recurrenceParent` |\n| `occurrence_date` | `occurrence_date` | `occurrenceDate` |\n| `occurrence_materialization` | `occurrence_materialization` | `occurrenceMaterialization` |\n| `occurrence_next_trigger` | `occurrence_next_trigger` | `occurrenceNextTrigger` |\n| `occurrence_template` | `occurrence_template` | `occurrenceTemplate` |\n| `occurrence_past_horizon` | `occurrence_past_horizon` | `occurrencePastHorizon` |\n| `occurrence_future_horizon` | `occurrence_future_horizon` | `occurrenceFutureHorizon` |\n| `date_created` | `dateCreated` | `date_created` |\n| `date_modified` | `dateModified` | `date_modified` |\n| `completed_date` | `completedDate` | `completed_date` |\n| `time_entries` | `timeEntries` | `time_entries` |\n| `time_estimate` | `timeEstimate` | `time_estimate` |\n| `blocked_by` | `blockedBy` | `blocked_by` |\n\nThis table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical.\n\n## 2.6 Structured role schemas\n\n### 2.6.1 time_entries\n\n`time_entries` items MUST be objects with:\n\n- `startTime` datetime (required)\n- `endTime` datetime (optional)\n- `description` string (optional)\n\nAdditional constraints:\n\n- a task MUST NOT contain more than one active time entry (entry with `startTime` and no `endTime`) at commit time.\n- an entry with missing `endTime` is interpreted as an active/running session.\n- an implementation MAY accept `duration` on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes.\n\nNested key names in `time_entries` are fixed by this specification and are not independently configurable in `mapping`.\n\n### 2.6.2 projects\n\n`projects` SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted.\nWhen interpreted as links, parsing and resolution MUST follow §11.\n\n### 2.6.3 blocked_by\n\n`blocked_by` items MUST be objects with:\n\n- `uid` link-or-string task reference (required)\n- `reltype` enum (required; default allowed by §10 when omitted)\n- `gap` ISO 8601 duration string (optional)\n\nDetailed semantics are defined in §10. `uid` parsing and resolution MUST follow §11.\n\n### 2.6.4 reminders\n\n`reminders` items MUST be objects with:\n\n- `id` string (required)\n- `type` enum `absolute|relative` (required)\n- relative-only fields: `relatedTo`, `offset`\n- absolute-only fields: `absoluteTime`\n- `description` string (optional)\n\nDetailed semantics are defined in §10.\n\n### 2.6.5 id (stable task identity)\n\nWhen semantic role `id` is present:\n\n- value MUST be a non-empty string.\n- value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations.\n- readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3).\n- implementations SHOULD keep `id` unique within a collection; duplicate IDs SHOULD produce a validation issue.\n\n### 2.6.6 Materialized occurrence roles\n\nThe roles in this subsection are required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\nParent recurring task roles:\n\n- `occurrence_materialization`: enum `manual|on_completion|rolling`; controls when occurrence notes are created (§4.18.5).\n- `occurrence_next_trigger`: enum `completion|completion_or_skip`; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6).\n- `occurrence_template`: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported.\n- `occurrence_past_horizon` and `occurrence_future_horizon`: ISO 8601 durations used by rolling materialization (§4.18.7).\n\nMaterialized occurrence note roles:\n\n- `recurrence_parent`: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections.\n- `occurrence_date`: date value identifying the target date this occurrence note represents.\n\nImplementations claiming `materialized-occurrences` MUST treat `recurrence_parent` and `occurrence_date` together as the occurrence identity key.\nWithin a resolved parent task, at most one materialized occurrence note SHOULD exist for each `occurrence_date`; duplicate notes MUST be reported when detected (§6.4).\n\nMaterialized occurrence notes MAY also use normal task roles such as `status`, `completed_date`, `scheduled`, `due`, `time_entries`, `reminders`, `contexts`, `projects`, and body content.\nFor dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3.\n\n## 2.7 Unknown fields\n\nUnknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations.\n\nUnknown fields MAY be removed only when:\n\n- explicit normalization/migration is requested, or\n- strict schema replacement is explicitly requested.\n\n## 2.8 Example mapping\n\nExample effective mapping:\n\n```yaml\nmapping:\n id: id\n title: title\n status: status\n date_created: dateCreated\n date_modified: dateModified\n completed_date: completedDate\n recurrence: recurrence\n recurrence_anchor: recurrence_anchor\n complete_instances: complete_instances\n skipped_instances: skipped_instances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_estimate: timeEstimate\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\n```\n\n## 2.9 Example task record\n\n```markdown\n---\nid: task-2026-01-10-weekly-review\ntitle: Weekly review\nstatus: open\npriority: high\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrence_anchor: scheduled\ncomplete_instances: [2026-02-13]\nskipped_instances: []\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n gap: P1D\nreminders:\n - id: rem_day_before\n type: relative\n relatedTo: due\n offset: -P1D\n - id: rem_start\n type: absolute\n absoluteTime: 2026-02-20T09:00:00Z\ndateCreated: 2026-01-10T09:30:00Z\ndateModified: 2026-02-20T08:02:11Z\n---\n\nReview completed work and plan next week.\n```\n\n## 2.10 Deterministic load example\n\nGiven frontmatter:\n\n```yaml\nrecurrence_anchor: scheduled\nrecurrenceAnchor: completion\n```\n\nIf canonical key is `recurrence_anchor`, a conforming loader using canonical-precedence policy MUST resolve semantic `recurrence_anchor` as `scheduled` and SHOULD emit a compatibility warning.\n","aliases":["/spec/02-model-and-mapping/"],"toc":[{"level":2,"id":"21-task-record-model","text":"2.1 Task record model"},{"level":2,"id":"22-required-semantic-roles","text":"2.2 Required semantic roles"},{"level":3,"id":"221-conditional-requiredness-completeddate","text":"2.2.1 Conditional requiredness (completed_date)"},{"level":3,"id":"222-conditional-requiredness-title","text":"2.2.2 Conditional requiredness (title)"},{"level":2,"id":"23-common-semantic-roles","text":"2.3 Common semantic roles"},{"level":2,"id":"24-field-mapping-requirements","text":"2.4 Field mapping requirements"},{"level":3,"id":"241-mapping-presence","text":"2.4.1 Mapping presence"},{"level":3,"id":"242-read-behavior","text":"2.4.2 Read behavior"},{"level":3,"id":"243-write-behavior","text":"2.4.3 Write behavior"},{"level":2,"id":"25-legacy-alias-compatibility","text":"2.5 Legacy alias compatibility"},{"level":2,"id":"26-structured-role-schemas","text":"2.6 Structured role schemas"},{"level":3,"id":"261-timeentries","text":"2.6.1 time_entries"},{"level":3,"id":"262-projects","text":"2.6.2 projects"},{"level":3,"id":"263-blockedby","text":"2.6.3 blocked_by"},{"level":3,"id":"264-reminders","text":"2.6.4 reminders"},{"level":3,"id":"265-id-stable-task-identity","text":"2.6.5 id (stable task identity)"},{"level":3,"id":"266-materialized-occurrence-roles","text":"2.6.6 Materialized occurrence roles"},{"level":2,"id":"27-unknown-fields","text":"2.7 Unknown fields"},{"level":2,"id":"28-example-mapping","text":"2.8 Example mapping"},{"level":2,"id":"29-example-task-record","text":"2.9 Example task record"},{"level":2,"id":"210-deterministic-load-example","text":"2.10 Deterministic load example"}],"html":"

2.1 Task record model#

\n

A task record consists of:

\n
    \n
  • frontmatter object (structured fields),
  • \n
  • markdown body (freeform text),
  • \n
  • file metadata (path, created/modified time) where available.
  • \n
\n

Frontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features.

\n

2.2 Required semantic roles#

\n

Conforming implementations MUST support these semantic roles:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleTypeRequired
titlestringsupport required (value required via configured title source, see §2.2.2)
statusstring/enumyes
completed_datedatesupport required (conditionally required, see §2.2.1)
date_createddatetimeyes
date_modifieddatetimeyes
\n

If storage omits a role marked yes, validation MUST report an error (see §6).\nFor operation-required roles, validation and operation rules in §5 and §6 apply.

\n

2.2.1 Conditional requiredness (completed_date)#

\n

completed_date support is mandatory, but presence is conditional:

\n
    \n
  • For non-recurring tasks with status in configured status.completed_values, completed_date MUST be present.
  • \n
  • For non-recurring tasks with non-completed status, completed_date MAY be absent.
  • \n
  • For recurring tasks, completed_date is not required by recurrence completion semantics and MAY be absent.
  • \n
\n

Validators MUST apply this conditional rule and MUST NOT treat completed_date as unconditionally required.

\n

2.2.2 Conditional requiredness (title)#

\n

Semantic title is always required, with deterministic read resolution and storage-mode-dependent read/write behavior:

\n
    \n
  • Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13):
      \n
    1. when title.storage=frontmatter: mapped title key when present and non-empty, then file basename fallback;
    2. \n
    3. when title.storage=filename: file basename first, then mapped title fallback when basename is unavailable.
    4. \n
    \n
  • \n
  • If mapped title and filename-derived title both exist and differ, the source authoritative for active title.storage MUST win and implementations SHOULD emit title_source_conflict.
  • \n
  • When title.storage=filename, implementations MAY keep mapped title as a synchronized compatibility mirror, but filename-derived title remains authoritative.
  • \n
  • Title storage mode controls canonical writes (§9.13): frontmatter favors mapped-key writes; filename favors filename-derived title with rename-on-title-change behavior.
  • \n
\n

Validators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone.

\n

2.3 Common semantic roles#

\n

Implementations conforming beyond minimal scope SHOULD support:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleTypeNotes
idstringstable task identity token; see §2.6.5
prioritystring/enumconfigurable values
duedate or datetimesee §3
scheduleddate or datetimesee §3
tagslistfree tags
contextslistcommonly prefixed with @
projectslistproject references, see §11
time_estimateinteger >= 0minutes
time_entrieslistsee §2.6
recurrencestringtasknotes recurrence string; see §4
recurrence_anchorenumscheduled or completion
complete_instanceslistrecurring completion state
skipped_instanceslistrecurring skip state
recurrence_parentlink-or-stringparent recurring task reference for materialized occurrence notes; see §4.18
occurrence_datedatetarget date represented by a materialized occurrence note
occurrence_materializationenumparent task materialization mode: manual, on_completion, or rolling
occurrence_next_triggerenumparent task next-note trigger: completion or completion_or_skip
occurrence_templatelink-or-stringoptional template used when creating materialized occurrence notes
occurrence_past_horizondurationoptional rolling materialization lookbehind bound
occurrence_future_horizondurationoptional rolling materialization lookahead bound
blocked_bylistdependency records, see §10 and §11
reminderslistreminder records, see §10
\n

Optional extended roles are defined in §7 profiles.

\n

2.4 Field mapping requirements#

\n

2.4.1 Mapping presence#

\n

An implementation MUST have an effective mapping from each supported semantic role to a canonical write key.\nMapping configuration is defined in §9.\nIf semantic role id is supported, it MUST also have a canonical write key.

\n

2.4.2 Read behavior#

\n

Readers MUST:

\n
    \n
  1. Read the canonical mapped key if present.
  2. \n
  3. Support configured aliases where enabled.
  4. \n
  5. Resolve conflicts deterministically when canonical and alias keys coexist.
  6. \n
  7. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win.
  8. \n
  9. When canonical key wins over alias, validator/loader SHOULD emit warning alias_conflict_ignored.
  10. \n
\n

2.4.3 Write behavior#

\n

Writers MUST:

\n
    \n
  • write only canonical keys,
  • \n
  • avoid introducing alias keys in new writes,
  • \n
  • preserve unknown fields unless the operation explicitly opts into normalization.
  • \n
\n

2.5 Legacy alias compatibility#

\n

Implementations SHOULD accept these aliases on read for interoperability:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleCanonical exampleAlias examples
recurrence_anchorrecurrence_anchorrecurrenceAnchor
complete_instancescomplete_instancescompleteInstances
skipped_instancesskipped_instancesskippedInstances
recurrence_parentrecurrence_parentrecurrenceParent
occurrence_dateoccurrence_dateoccurrenceDate
occurrence_materializationoccurrence_materializationoccurrenceMaterialization
occurrence_next_triggeroccurrence_next_triggeroccurrenceNextTrigger
occurrence_templateoccurrence_templateoccurrenceTemplate
occurrence_past_horizonoccurrence_past_horizonoccurrencePastHorizon
occurrence_future_horizonoccurrence_future_horizonoccurrenceFutureHorizon
date_createddateCreateddate_created
date_modifieddateModifieddate_modified
completed_datecompletedDatecompleted_date
time_entriestimeEntriestime_entries
time_estimatetimeEstimatetime_estimate
blocked_byblockedByblocked_by
\n

This table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical.

\n

2.6 Structured role schemas#

\n

2.6.1 time_entries#

\n

time_entries items MUST be objects with:

\n
    \n
  • startTime datetime (required)
  • \n
  • endTime datetime (optional)
  • \n
  • description string (optional)
  • \n
\n

Additional constraints:

\n
    \n
  • a task MUST NOT contain more than one active time entry (entry with startTime and no endTime) at commit time.
  • \n
  • an entry with missing endTime is interpreted as an active/running session.
  • \n
  • an implementation MAY accept duration on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes.
  • \n
\n

Nested key names in time_entries are fixed by this specification and are not independently configurable in mapping.

\n

2.6.2 projects#

\n

projects SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted.\nWhen interpreted as links, parsing and resolution MUST follow §11.

\n

2.6.3 blocked_by#

\n

blocked_by items MUST be objects with:

\n
    \n
  • uid link-or-string task reference (required)
  • \n
  • reltype enum (required; default allowed by §10 when omitted)
  • \n
  • gap ISO 8601 duration string (optional)
  • \n
\n

Detailed semantics are defined in §10. uid parsing and resolution MUST follow §11.

\n

2.6.4 reminders#

\n

reminders items MUST be objects with:

\n
    \n
  • id string (required)
  • \n
  • type enum absolute|relative (required)
  • \n
  • relative-only fields: relatedTo, offset
  • \n
  • absolute-only fields: absoluteTime
  • \n
  • description string (optional)
  • \n
\n

Detailed semantics are defined in §10.

\n

2.6.5 id (stable task identity)#

\n

When semantic role id is present:

\n
    \n
  • value MUST be a non-empty string.
  • \n
  • value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations.
  • \n
  • readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3).
  • \n
  • implementations SHOULD keep id unique within a collection; duplicate IDs SHOULD produce a validation issue.
  • \n
\n

2.6.6 Materialized occurrence roles#

\n

The roles in this subsection are required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

Parent recurring task roles:

\n
    \n
  • occurrence_materialization: enum manual|on_completion|rolling; controls when occurrence notes are created (§4.18.5).
  • \n
  • occurrence_next_trigger: enum completion|completion_or_skip; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6).
  • \n
  • occurrence_template: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported.
  • \n
  • occurrence_past_horizon and occurrence_future_horizon: ISO 8601 durations used by rolling materialization (§4.18.7).
  • \n
\n

Materialized occurrence note roles:

\n
    \n
  • recurrence_parent: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections.
  • \n
  • occurrence_date: date value identifying the target date this occurrence note represents.
  • \n
\n

Implementations claiming materialized-occurrences MUST treat recurrence_parent and occurrence_date together as the occurrence identity key.\nWithin a resolved parent task, at most one materialized occurrence note SHOULD exist for each occurrence_date; duplicate notes MUST be reported when detected (§6.4).

\n

Materialized occurrence notes MAY also use normal task roles such as status, completed_date, scheduled, due, time_entries, reminders, contexts, projects, and body content.\nFor dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3.

\n

2.7 Unknown fields#

\n

Unknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations.

\n

Unknown fields MAY be removed only when:

\n
    \n
  • explicit normalization/migration is requested, or
  • \n
  • strict schema replacement is explicitly requested.
  • \n
\n

2.8 Example mapping#

\n

Example effective mapping:

\n
mapping:\n  id: id\n  title: title\n  status: status\n  date_created: dateCreated\n  date_modified: dateModified\n  completed_date: completedDate\n  recurrence: recurrence\n  recurrence_anchor: recurrence_anchor\n  complete_instances: complete_instances\n  skipped_instances: skipped_instances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_estimate: timeEstimate\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\n

2.9 Example task record#

\n
---\nid: task-2026-01-10-weekly-review\ntitle: Weekly review\nstatus: open\npriority: high\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrence_anchor: scheduled\ncomplete_instances: [2026-02-13]\nskipped_instances: []\nblockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n    gap: P1D\nreminders:\n  - id: rem_day_before\n    type: relative\n    relatedTo: due\n    offset: -P1D\n  - id: rem_start\n    type: absolute\n    absoluteTime: 2026-02-20T09:00:00Z\ndateCreated: 2026-01-10T09:30:00Z\ndateModified: 2026-02-20T08:02:11Z\n---\n\nReview completed work and plan next week.\n

2.10 Deterministic load example#

\n

Given frontmatter:

\n
recurrence_anchor: scheduled\nrecurrenceAnchor: completion\n

If canonical key is recurrence_anchor, a conforming loader using canonical-precedence policy MUST resolve semantic recurrence_anchor as scheduled and SHOULD emit a compatibility warning.

\n","text":"2.1 Task record model# A task record consists of: frontmatter object (structured fields), markdown body (freeform text), file metadata (path, created/modified time) where available. Frontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features. 2.2 Required semantic roles# Conforming implementations MUST support these semantic roles: Semantic role Type Required title string support required (value required via configured title source, see §2.2.2) status string/enum yes completed_date date support required (conditionally required, see §2.2.1) date_created datetime yes date_modified datetime yes If storage omits a role marked yes, validation MUST report an error (see §6). For operation-required roles, validation and operation rules in §5 and §6 apply. 2.2.1 Conditional requiredness (completed_date)# completed_date support is mandatory, but presence is conditional: For non-recurring tasks with status in configured status.completed_values, completed_date MUST be present. For non-recurring tasks with non-completed status, completed_date MAY be absent. For recurring tasks, completed_date is not required by recurrence completion semantics and MAY be absent. Validators MUST apply this conditional rule and MUST NOT treat completed_date as unconditionally required. 2.2.2 Conditional requiredness (title)# Semantic title is always required, with deterministic read resolution and storage-mode-dependent read/write behavior: Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13): when title.storage=frontmatter: mapped title key when present and non-empty, then file basename fallback; when title.storage=filename: file basename first, then mapped title fallback when basename is unavailable. If mapped title and filename-derived title both exist and differ, the source authoritative for active title.storage MUST win and implementations SHOULD emit title_source_conflict. When title.storage=filename, implementations MAY keep mapped title as a synchronized compatibility mirror, but filename-derived title remains authoritative. Title storage mode controls canonical writes (§9.13): frontmatter favors mapped-key writes; filename favors filename-derived title with rename-on-title-change behavior. Validators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone. 2.3 Common semantic roles# Implementations conforming beyond minimal scope SHOULD support: Semantic role Type Notes id string stable task identity token; see §2.6.5 priority string/enum configurable values due date or datetime see §3 scheduled date or datetime see §3 tags list free tags contexts list commonly prefixed with @ projects list project references, see §11 time_estimate integer >= 0 minutes time_entries list see §2.6 recurrence string tasknotes recurrence string; see §4 recurrence_anchor enum scheduled or completion complete_instances list recurring completion state skipped_instances list recurring skip state recurrence_parent link-or-string parent recurring task reference for materialized occurrence notes; see §4.18 occurrence_date date target date represented by a materialized occurrence note occurrence_materialization enum parent task materialization mode: manual, on_completion, or rolling occurrence_next_trigger enum parent task next-note trigger: completion or completion_or_skip occurrence_template link-or-string optional template used when creating materialized occurrence notes occurrence_past_horizon duration optional rolling materialization lookbehind bound occurrence_future_horizon duration optional rolling materialization lookahead bound blocked_by list dependency records, see §10 and §11 reminders list reminder records, see §10 Optional extended roles are defined in §7 profiles. 2.4 Field mapping requirements# 2.4.1 Mapping presence# An implementation MUST have an effective mapping from each supported semantic role to a canonical write key. Mapping configuration is defined in §9. If semantic role id is supported, it MUST also have a canonical write key. 2.4.2 Read behavior# Readers MUST: Read the canonical mapped key if present. Support configured aliases where enabled. Resolve conflicts deterministically when canonical and alias keys coexist. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win. When canonical key wins over alias, validator/loader SHOULD emit warning alias_conflict_ignored. 2.4.3 Write behavior# Writers MUST: write only canonical keys, avoid introducing alias keys in new writes, preserve unknown fields unless the operation explicitly opts into normalization. 2.5 Legacy alias compatibility# Implementations SHOULD accept these aliases on read for interoperability: Semantic role Canonical example Alias examples recurrence_anchor recurrence_anchor recurrenceAnchor complete_instances complete_instances completeInstances skipped_instances skipped_instances skippedInstances recurrence_parent recurrence_parent recurrenceParent occurrence_date occurrence_date occurrenceDate occurrence_materialization occurrence_materialization occurrenceMaterialization occurrence_next_trigger occurrence_next_trigger occurrenceNextTrigger occurrence_template occurrence_template occurrenceTemplate occurrence_past_horizon occurrence_past_horizon occurrencePastHorizon occurrence_future_horizon occurrence_future_horizon occurrenceFutureHorizon date_created dateCreated date_created date_modified dateModified date_modified completed_date completedDate completed_date time_entries timeEntries time_entries time_estimate timeEstimate time_estimate blocked_by blockedBy blocked_by This table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical. 2.6 Structured role schemas# 2.6.1 time_entries# time_entries items MUST be objects with: startTime datetime (required) endTime datetime (optional) description string (optional) Additional constraints: a task MUST NOT contain more than one active time entry (entry with startTime and no endTime) at commit time. an entry with missing endTime is interpreted as an active/running session. an implementation MAY accept duration on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes. Nested key names in time_entries are fixed by this specification and are not independently configurable in mapping. 2.6.2 projects# projects SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted. When interpreted as links, parsing and resolution MUST follow §11. 2.6.3 blocked_by# blocked_by items MUST be objects with: uid link-or-string task reference (required) reltype enum (required; default allowed by §10 when omitted) gap ISO 8601 duration string (optional) Detailed semantics are defined in §10. uid parsing and resolution MUST follow §11. 2.6.4 reminders# reminders items MUST be objects with: id string (required) type enum absolute|relative (required) relative-only fields: relatedTo, offset absolute-only fields: absoluteTime description string (optional) Detailed semantics are defined in §10. 2.6.5 id (stable task identity)# When semantic role id is present: value MUST be a non-empty string. value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations. readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3). implementations SHOULD keep id unique within a collection; duplicate IDs SHOULD produce a validation issue. 2.6.6 Materialized occurrence roles# The roles in this subsection are required only for implementations claiming profile materialized-occurrences (§7.3.4). Parent recurring task roles: occurrence_materialization: enum manual|on_completion|rolling; controls when occurrence notes are created (§4.18.5). occurrence_next_trigger: enum completion|completion_or_skip; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6). occurrence_template: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported. occurrence_past_horizon and occurrence_future_horizon: ISO 8601 durations used by rolling materialization (§4.18.7). Materialized occurrence note roles: recurrence_parent: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections. occurrence_date: date value identifying the target date this occurrence note represents. Implementations claiming materialized-occurrences MUST treat recurrence_parent and occurrence_date together as the occurrence identity key. Within a resolved parent task, at most one materialized occurrence note SHOULD exist for each occurrence_date; duplicate notes MUST be reported when detected (§6.4). Materialized occurrence notes MAY also use normal task roles such as status, completed_date, scheduled, due, time_entries, reminders, contexts, projects, and body content. For dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3. 2.7 Unknown fields# Unknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations. Unknown fields MAY be removed only when: explicit normalization/migration is requested, or strict schema replacement is explicitly requested. 2.8 Example mapping# Example effective mapping: mapping: id: id title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrence_anchor complete_instances: complete_instances skipped_instances: skipped_instances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_estimate: timeEstimate time_entries: timeEntries blocked_by: blockedBy reminders: reminders 2.9 Example task record# --- id: task-2026-01-10-weekly-review title: Weekly review status: open priority: high scheduled: 2026-02-20 recurrence: FREQ=WEEKLY;BYDAY=FR recurrence_anchor: scheduled complete_instances: [2026-02-13] skipped_instances: [] blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: P1D reminders: - id: rem_day_before type: relative relatedTo: due offset: -P1D - id: rem_start type: absolute absoluteTime: 2026-02-20T09:00:00Z dateCreated: 2026-01-10T09:30:00Z dateModified: 2026-02-20T08:02:11Z --- Review completed work and plan next week. 2.10 Deterministic load example# Given frontmatter: recurrence_anchor: scheduled recurrenceAnchor: completion If canonical key is recurrence_anchor, a conforming loader using canonical-precedence policy MUST resolve semantic recurrence_anchor as scheduled and SHOULD emit a compatibility warning."},{"route":"/developers/specification/03-temporal-semantics/","title":"3. Temporal Semantics","description":"This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:03-temporal-semantics.md","namespace":"specification","relativePath":"03-temporal-semantics.md","raw":"# 3. Temporal Semantics\n\n## 3.1 Purpose\n\nThis section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.\n\n## 3.2 Supported temporal value classes\n\nImplementations MUST support:\n\n1. **Date values**: calendar day without time or timezone.\n2. **Datetime values**: instant in time.\n\n## 3.3 Canonical serialization\n\n### 3.3.1 Date\n\nCanonical date serialization is:\n\n```text\nYYYY-MM-DD\n```\n\n### 3.3.2 Datetime\n\nCanonical datetime serialization is UTC ISO 8601 with `Z`, for example:\n\n```text\n2026-02-20T13:45:00Z\n```\n\nCanonical datetime writes MUST use second precision (`YYYY-MM-DDTHH:MM:SSZ`) and MUST NOT include fractional seconds.\nImplementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes.\nIf an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds.\n\n## 3.4 Parsing requirements\n\n### 3.4.1 Date parsing\n\nDate parsing MUST reject invalid calendar dates.\n\n- valid: `2026-02-28`\n- invalid: `2026-02-30`\n\n### 3.4.2 Datetime parsing\n\nDatetime parsing MUST reject malformed values.\nIn strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example `2026-02-20T09:00:00` with no timezone offset).\nIn permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning.\n\n### 3.4.3 Mixed input tolerance\n\nImplementations MAY accept both date and datetime values for roles like `due` and `scheduled` if configured to do so. The accepted form MUST be documented.\n\n### 3.4.4 Inbound acceptance matrix\n\nTo avoid ambiguity, conforming parsers MUST follow this matrix.\n\nDate forms:\n\n| Form | Example | Strict | Permissive |\n|---|---|---|---|\n| Canonical date | `2026-02-20` | accept | accept |\n| Basic date (no separators) | `20260220` | reject (`invalid_date_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n\nDatetime forms:\n\n| Form | Example | Strict | Permissive |\n|---|---|---|---|\n| Canonical UTC | `2026-02-20T09:00:00Z` | accept | accept |\n| ISO with explicit offset | `2026-02-20T09:00:00+10:00` | accept | accept |\n| ISO with fractional seconds | `2026-02-20T09:00:00.250Z` | accept (normalize to second precision on write) | accept (normalize to second precision on write) |\n| Offset-less local datetime | `2026-02-20T09:00:00` | reject (`invalid_datetime_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n| Space-separated datetime | `2026-02-20 09:00:00` | reject (`invalid_datetime_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n| Basic datetime (no separators) | `20260220T090000Z` | reject (`invalid_datetime_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n\nWhen permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3.\n\n## 3.5 Day semantics vs instant semantics\n\n### 3.5.1 Date roles\n\nDate roles represent days, not instants, and MUST NOT be timezone-shifted.\n\n### 3.5.2 Datetime roles\n\nDatetime roles represent instants and MUST preserve instant equality through normalization.\n\nExample:\n\n- input `2026-02-20T08:00:00-05:00`\n- canonical write `2026-02-20T13:00:00Z`\n\n### 3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)\n\nBecause date-only fields are human-readable (`YYYY-MM-DD`) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals.\n\nRecommended approach:\n\n1. Parse date-only values to a UTC-midnight anchor instant for internal computations.\n2. Format date-only values from UTC calendar components when writing `YYYY-MM-DD`.\n3. Keep date-only roles as date-only on write unless an explicit conversion operation is requested.\n4. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6.\n\nImplementations MAY use different internal representations as long as all normative requirements in this section are preserved.\n\n## 3.6 Local calendar-day evaluation\n\n### 3.6.1 Active runtime timezone\n\nFor day-level semantics, the active runtime timezone is:\n\n1. configured collection `runtime_timezone` if provided, otherwise\n2. the process/system local timezone.\n\nImplementations MUST make the effective timezone discoverable.\n\n### 3.6.2 Local calendar-day rules\n\nWhen calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone.\n\nThis requirement prevents off-by-one day drift in positive and negative UTC offsets.\n\n## 3.7 Comparison rules\n\n### 3.7.1 Date-to-date\n\nCompare by calendar day ordering.\n\n### 3.7.2 Datetime-to-datetime\n\nCompare by instant ordering.\n\n### 3.7.3 Date-to-datetime\n\nIf compared, implementations MUST document coercion policy. Recommended policy:\n\n- convert date to local start-of-day for day-level comparisons,\n- avoid implicit coercion for instant-level comparisons.\n\n## 3.8 due and scheduled semantics\n\n`due` and `scheduled` MAY be either date or datetime by configuration.\n\nImplementations MUST:\n\n- preserve stored granularity unless explicit conversion is requested,\n- avoid silently converting date to datetime during unrelated writes,\n- require documented explicit policy for date-to-datetime conversion operations,\n- apply consistent coercion policy in filters and status calculations.\n\n## 3.9 Completion date semantics\n\n`completed_date` is a date role.\n\nFor non-recurring completion, writers MUST set `completed_date` using §5 semantics:\n\n- explicit completion-day input when provided,\n- otherwise current local day in active runtime timezone.\n\n## 3.10 Created/modified timestamps\n\n`date_created` and `date_modified` are datetime roles.\n\nWriters MUST:\n\n- set both on create,\n- update `date_modified` on successful mutating operations that change persisted state,\n- preserve `date_created` unless explicit migration/edit operation changes it.\n\n## 3.11 time_entries semantics\n\n### 3.11.1 Timestamp format\n\n`time_entries.startTime` and `time_entries.endTime` MUST be datetime instants in canonical form on write.\n\n### 3.11.2 Range validity\n\nIf both times exist, `endTime` MUST be greater than or equal to `startTime`.\n\n### 3.11.3 Duration handling\n\nIf duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization.\n\n### 3.11.4 Active session semantics\n\nAn entry with `startTime` and no `endTime` represents an active/running session.\n\nImplementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time.\n\n### 3.11.5 Derived time calculations\n\nFor interoperability, implementations SHOULD expose both derived views when reporting tracked time:\n\n- `closed_minutes`: sum of entries where both `startTime` and `endTime` exist.\n- `live_minutes`: `closed_minutes` plus elapsed minutes of active entries (if any).\n\nImplementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs).\n\n## 3.12 reminder temporal semantics\n\nReminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section.\n\nRules:\n\n- `reminders[].absoluteTime` MUST be a canonical datetime on write.\n- `reminders[].offset` MUST be a valid ISO 8601 duration string.\n- relative reminder base conversion for date-only values MUST use `reminders.date_only_anchor_time` from §9, or `00:00` local time if unset.\n\n## 3.13 Example: local-day overdue evaluation\n\nAssume local timezone `America/Los_Angeles` and local date `2026-02-20`.\n\nTask A:\n\n```yaml\ndue: 2026-02-19\nstatus: open\n```\n\nTask A is overdue.\n\nTask B:\n\n```yaml\ndue: 2026-02-20\nstatus: open\n```\n\nTask B is not overdue at start of day; it becomes overdue on `2026-02-21` local day.\n\n## 3.14 Example: preserving granularity\n\nBefore update:\n\n```yaml\ndue: 2026-02-20\npriority: normal\n```\n\nOperation: update priority only.\n\nAfter update (conforming):\n\n```yaml\ndue: 2026-02-20\npriority: high\n```\n\nNon-conforming behavior would silently rewrite `due` to a datetime.\n\n## 3.15 Example: canonical datetime write\n\nInput:\n\n```yaml\ntimeEntries:\n - startTime: 2026-02-20T09:30:00+01:00\n endTime: 2026-02-20T10:00:00+01:00\n```\n\nCanonical write:\n\n```yaml\ntimeEntries:\n - startTime: 2026-02-20T08:30:00Z\n endTime: 2026-02-20T09:00:00Z\n```\n\n## 3.16 Example: UTC-anchor roundtrip for date-only field\n\nInput:\n\n```yaml\ndue: 2026-02-20\n```\n\nInternal computation anchor:\n\n```text\n2026-02-20T00:00:00Z\n```\n\nAfter unrelated update, conforming write:\n\n```yaml\ndue: 2026-02-20\n```\n\nNon-conforming behavior would rewrite `due` as a datetime or shift it to another day based on local offset.\n","aliases":["/spec/03-temporal-semantics/"],"toc":[{"level":2,"id":"31-purpose","text":"3.1 Purpose"},{"level":2,"id":"32-supported-temporal-value-classes","text":"3.2 Supported temporal value classes"},{"level":2,"id":"33-canonical-serialization","text":"3.3 Canonical serialization"},{"level":3,"id":"331-date","text":"3.3.1 Date"},{"level":3,"id":"332-datetime","text":"3.3.2 Datetime"},{"level":2,"id":"34-parsing-requirements","text":"3.4 Parsing requirements"},{"level":3,"id":"341-date-parsing","text":"3.4.1 Date parsing"},{"level":3,"id":"342-datetime-parsing","text":"3.4.2 Datetime parsing"},{"level":3,"id":"343-mixed-input-tolerance","text":"3.4.3 Mixed input tolerance"},{"level":3,"id":"344-inbound-acceptance-matrix","text":"3.4.4 Inbound acceptance matrix"},{"level":2,"id":"35-day-semantics-vs-instant-semantics","text":"3.5 Day semantics vs instant semantics"},{"level":3,"id":"351-date-roles","text":"3.5.1 Date roles"},{"level":3,"id":"352-datetime-roles","text":"3.5.2 Datetime roles"},{"level":3,"id":"353-implementation-guidance-utc-anchor-strategy-non-normative","text":"3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)"},{"level":2,"id":"36-local-calendar-day-evaluation","text":"3.6 Local calendar-day evaluation"},{"level":3,"id":"361-active-runtime-timezone","text":"3.6.1 Active runtime timezone"},{"level":3,"id":"362-local-calendar-day-rules","text":"3.6.2 Local calendar-day rules"},{"level":2,"id":"37-comparison-rules","text":"3.7 Comparison rules"},{"level":3,"id":"371-date-to-date","text":"3.7.1 Date-to-date"},{"level":3,"id":"372-datetime-to-datetime","text":"3.7.2 Datetime-to-datetime"},{"level":3,"id":"373-date-to-datetime","text":"3.7.3 Date-to-datetime"},{"level":2,"id":"38-due-and-scheduled-semantics","text":"3.8 due and scheduled semantics"},{"level":2,"id":"39-completion-date-semantics","text":"3.9 Completion date semantics"},{"level":2,"id":"310-createdmodified-timestamps","text":"3.10 Created/modified timestamps"},{"level":2,"id":"311-timeentries-semantics","text":"3.11 time_entries semantics"},{"level":3,"id":"3111-timestamp-format","text":"3.11.1 Timestamp format"},{"level":3,"id":"3112-range-validity","text":"3.11.2 Range validity"},{"level":3,"id":"3113-duration-handling","text":"3.11.3 Duration handling"},{"level":3,"id":"3114-active-session-semantics","text":"3.11.4 Active session semantics"},{"level":3,"id":"3115-derived-time-calculations","text":"3.11.5 Derived time calculations"},{"level":2,"id":"312-reminder-temporal-semantics","text":"3.12 reminder temporal semantics"},{"level":2,"id":"313-example-local-day-overdue-evaluation","text":"3.13 Example: local-day overdue evaluation"},{"level":2,"id":"314-example-preserving-granularity","text":"3.14 Example: preserving granularity"},{"level":2,"id":"315-example-canonical-datetime-write","text":"3.15 Example: canonical datetime write"},{"level":2,"id":"316-example-utc-anchor-roundtrip-for-date-only-field","text":"3.16 Example: UTC-anchor roundtrip for date-only field"}],"html":"

3.1 Purpose#

\n

This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.

\n

3.2 Supported temporal value classes#

\n

Implementations MUST support:

\n
    \n
  1. Date values: calendar day without time or timezone.
  2. \n
  3. Datetime values: instant in time.
  4. \n
\n

3.3 Canonical serialization#

\n

3.3.1 Date#

\n

Canonical date serialization is:

\n
YYYY-MM-DD\n

3.3.2 Datetime#

\n

Canonical datetime serialization is UTC ISO 8601 with Z, for example:

\n
2026-02-20T13:45:00Z\n

Canonical datetime writes MUST use second precision (YYYY-MM-DDTHH:MM:SSZ) and MUST NOT include fractional seconds.\nImplementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes.\nIf an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds.

\n

3.4 Parsing requirements#

\n

3.4.1 Date parsing#

\n

Date parsing MUST reject invalid calendar dates.

\n
    \n
  • valid: 2026-02-28
  • \n
  • invalid: 2026-02-30
  • \n
\n

3.4.2 Datetime parsing#

\n

Datetime parsing MUST reject malformed values.\nIn strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example 2026-02-20T09:00:00 with no timezone offset).\nIn permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning.

\n

3.4.3 Mixed input tolerance#

\n

Implementations MAY accept both date and datetime values for roles like due and scheduled if configured to do so. The accepted form MUST be documented.

\n

3.4.4 Inbound acceptance matrix#

\n

To avoid ambiguity, conforming parsers MUST follow this matrix.

\n

Date forms:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FormExampleStrictPermissive
Canonical date2026-02-20acceptaccept
Basic date (no separators)20260220reject (invalid_date_value)MAY accept only under documented compatibility policy; SHOULD emit warning
\n

Datetime forms:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FormExampleStrictPermissive
Canonical UTC2026-02-20T09:00:00Zacceptaccept
ISO with explicit offset2026-02-20T09:00:00+10:00acceptaccept
ISO with fractional seconds2026-02-20T09:00:00.250Zaccept (normalize to second precision on write)accept (normalize to second precision on write)
Offset-less local datetime2026-02-20T09:00:00reject (invalid_datetime_value)MAY accept only under documented compatibility policy; SHOULD emit warning
Space-separated datetime2026-02-20 09:00:00reject (invalid_datetime_value)MAY accept only under documented compatibility policy; SHOULD emit warning
Basic datetime (no separators)20260220T090000Zreject (invalid_datetime_value)MAY accept only under documented compatibility policy; SHOULD emit warning
\n

When permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3.

\n

3.5 Day semantics vs instant semantics#

\n

3.5.1 Date roles#

\n

Date roles represent days, not instants, and MUST NOT be timezone-shifted.

\n

3.5.2 Datetime roles#

\n

Datetime roles represent instants and MUST preserve instant equality through normalization.

\n

Example:

\n
    \n
  • input 2026-02-20T08:00:00-05:00
  • \n
  • canonical write 2026-02-20T13:00:00Z
  • \n
\n

3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)#

\n

Because date-only fields are human-readable (YYYY-MM-DD) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals.

\n

Recommended approach:

\n
    \n
  1. Parse date-only values to a UTC-midnight anchor instant for internal computations.
  2. \n
  3. Format date-only values from UTC calendar components when writing YYYY-MM-DD.
  4. \n
  5. Keep date-only roles as date-only on write unless an explicit conversion operation is requested.
  6. \n
  7. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6.
  8. \n
\n

Implementations MAY use different internal representations as long as all normative requirements in this section are preserved.

\n

3.6 Local calendar-day evaluation#

\n

3.6.1 Active runtime timezone#

\n

For day-level semantics, the active runtime timezone is:

\n
    \n
  1. configured collection runtime_timezone if provided, otherwise
  2. \n
  3. the process/system local timezone.
  4. \n
\n

Implementations MUST make the effective timezone discoverable.

\n

3.6.2 Local calendar-day rules#

\n

When calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone.

\n

This requirement prevents off-by-one day drift in positive and negative UTC offsets.

\n

3.7 Comparison rules#

\n

3.7.1 Date-to-date#

\n

Compare by calendar day ordering.

\n

3.7.2 Datetime-to-datetime#

\n

Compare by instant ordering.

\n

3.7.3 Date-to-datetime#

\n

If compared, implementations MUST document coercion policy. Recommended policy:

\n
    \n
  • convert date to local start-of-day for day-level comparisons,
  • \n
  • avoid implicit coercion for instant-level comparisons.
  • \n
\n

3.8 due and scheduled semantics#

\n

due and scheduled MAY be either date or datetime by configuration.

\n

Implementations MUST:

\n
    \n
  • preserve stored granularity unless explicit conversion is requested,
  • \n
  • avoid silently converting date to datetime during unrelated writes,
  • \n
  • require documented explicit policy for date-to-datetime conversion operations,
  • \n
  • apply consistent coercion policy in filters and status calculations.
  • \n
\n

3.9 Completion date semantics#

\n

completed_date is a date role.

\n

For non-recurring completion, writers MUST set completed_date using §5 semantics:

\n
    \n
  • explicit completion-day input when provided,
  • \n
  • otherwise current local day in active runtime timezone.
  • \n
\n

3.10 Created/modified timestamps#

\n

date_created and date_modified are datetime roles.

\n

Writers MUST:

\n
    \n
  • set both on create,
  • \n
  • update date_modified on successful mutating operations that change persisted state,
  • \n
  • preserve date_created unless explicit migration/edit operation changes it.
  • \n
\n

3.11 time_entries semantics#

\n

3.11.1 Timestamp format#

\n

time_entries.startTime and time_entries.endTime MUST be datetime instants in canonical form on write.

\n

3.11.2 Range validity#

\n

If both times exist, endTime MUST be greater than or equal to startTime.

\n

3.11.3 Duration handling#

\n

If duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization.

\n

3.11.4 Active session semantics#

\n

An entry with startTime and no endTime represents an active/running session.

\n

Implementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time.

\n

3.11.5 Derived time calculations#

\n

For interoperability, implementations SHOULD expose both derived views when reporting tracked time:

\n
    \n
  • closed_minutes: sum of entries where both startTime and endTime exist.
  • \n
  • live_minutes: closed_minutes plus elapsed minutes of active entries (if any).
  • \n
\n

Implementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs).

\n

3.12 reminder temporal semantics#

\n

Reminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section.

\n

Rules:

\n
    \n
  • reminders[].absoluteTime MUST be a canonical datetime on write.
  • \n
  • reminders[].offset MUST be a valid ISO 8601 duration string.
  • \n
  • relative reminder base conversion for date-only values MUST use reminders.date_only_anchor_time from §9, or 00:00 local time if unset.
  • \n
\n

3.13 Example: local-day overdue evaluation#

\n

Assume local timezone America/Los_Angeles and local date 2026-02-20.

\n

Task A:

\n
due: 2026-02-19\nstatus: open\n

Task A is overdue.

\n

Task B:

\n
due: 2026-02-20\nstatus: open\n

Task B is not overdue at start of day; it becomes overdue on 2026-02-21 local day.

\n

3.14 Example: preserving granularity#

\n

Before update:

\n
due: 2026-02-20\npriority: normal\n

Operation: update priority only.

\n

After update (conforming):

\n
due: 2026-02-20\npriority: high\n

Non-conforming behavior would silently rewrite due to a datetime.

\n

3.15 Example: canonical datetime write#

\n

Input:

\n
timeEntries:\n  - startTime: 2026-02-20T09:30:00+01:00\n    endTime: 2026-02-20T10:00:00+01:00\n

Canonical write:

\n
timeEntries:\n  - startTime: 2026-02-20T08:30:00Z\n    endTime: 2026-02-20T09:00:00Z\n

3.16 Example: UTC-anchor roundtrip for date-only field#

\n

Input:

\n
due: 2026-02-20\n

Internal computation anchor:

\n
2026-02-20T00:00:00Z\n

After unrelated update, conforming write:

\n
due: 2026-02-20\n

Non-conforming behavior would rewrite due as a datetime or shift it to another day based on local offset.

\n","text":"3.1 Purpose# This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values. 3.2 Supported temporal value classes# Implementations MUST support: Date values: calendar day without time or timezone. Datetime values: instant in time. 3.3 Canonical serialization# 3.3.1 Date# Canonical date serialization is: YYYY-MM-DD 3.3.2 Datetime# Canonical datetime serialization is UTC ISO 8601 with Z, for example: 2026-02-20T13:45:00Z Canonical datetime writes MUST use second precision (YYYY-MM-DDTHH:MM:SSZ) and MUST NOT include fractional seconds. Implementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes. If an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds. 3.4 Parsing requirements# 3.4.1 Date parsing# Date parsing MUST reject invalid calendar dates. valid: 2026-02-28 invalid: 2026-02-30 3.4.2 Datetime parsing# Datetime parsing MUST reject malformed values. In strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example 2026-02-20T09:00:00 with no timezone offset). In permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning. 3.4.3 Mixed input tolerance# Implementations MAY accept both date and datetime values for roles like due and scheduled if configured to do so. The accepted form MUST be documented. 3.4.4 Inbound acceptance matrix# To avoid ambiguity, conforming parsers MUST follow this matrix. Date forms: Form Example Strict Permissive Canonical date 2026-02-20 accept accept Basic date (no separators) 20260220 reject (invalid_date_value) MAY accept only under documented compatibility policy; SHOULD emit warning Datetime forms: Form Example Strict Permissive Canonical UTC 2026-02-20T09:00:00Z accept accept ISO with explicit offset 2026-02-20T09:00:00+10:00 accept accept ISO with fractional seconds 2026-02-20T09:00:00.250Z accept (normalize to second precision on write) accept (normalize to second precision on write) Offset-less local datetime 2026-02-20T09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Space-separated datetime 2026-02-20 09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Basic datetime (no separators) 20260220T090000Z reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning When permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3. 3.5 Day semantics vs instant semantics# 3.5.1 Date roles# Date roles represent days, not instants, and MUST NOT be timezone-shifted. 3.5.2 Datetime roles# Datetime roles represent instants and MUST preserve instant equality through normalization. Example: input 2026-02-20T08:00:00-05:00 canonical write 2026-02-20T13:00:00Z 3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)# Because date-only fields are human-readable (YYYY-MM-DD) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals. Recommended approach: Parse date-only values to a UTC-midnight anchor instant for internal computations. Format date-only values from UTC calendar components when writing YYYY-MM-DD. Keep date-only roles as date-only on write unless an explicit conversion operation is requested. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6. Implementations MAY use different internal representations as long as all normative requirements in this section are preserved. 3.6 Local calendar-day evaluation# 3.6.1 Active runtime timezone# For day-level semantics, the active runtime timezone is: configured collection runtime_timezone if provided, otherwise the process/system local timezone. Implementations MUST make the effective timezone discoverable. 3.6.2 Local calendar-day rules# When calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone. This requirement prevents off-by-one day drift in positive and negative UTC offsets. 3.7 Comparison rules# 3.7.1 Date-to-date# Compare by calendar day ordering. 3.7.2 Datetime-to-datetime# Compare by instant ordering. 3.7.3 Date-to-datetime# If compared, implementations MUST document coercion policy. Recommended policy: convert date to local start-of-day for day-level comparisons, avoid implicit coercion for instant-level comparisons. 3.8 due and scheduled semantics# due and scheduled MAY be either date or datetime by configuration. Implementations MUST: preserve stored granularity unless explicit conversion is requested, avoid silently converting date to datetime during unrelated writes, require documented explicit policy for date-to-datetime conversion operations, apply consistent coercion policy in filters and status calculations. 3.9 Completion date semantics# completed_date is a date role. For non-recurring completion, writers MUST set completed_date using §5 semantics: explicit completion-day input when provided, otherwise current local day in active runtime timezone. 3.10 Created/modified timestamps# date_created and date_modified are datetime roles. Writers MUST: set both on create, update date_modified on successful mutating operations that change persisted state, preserve date_created unless explicit migration/edit operation changes it. 3.11 time_entries semantics# 3.11.1 Timestamp format# time_entries.startTime and time_entries.endTime MUST be datetime instants in canonical form on write. 3.11.2 Range validity# If both times exist, endTime MUST be greater than or equal to startTime. 3.11.3 Duration handling# If duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization. 3.11.4 Active session semantics# An entry with startTime and no endTime represents an active/running session. Implementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time. 3.11.5 Derived time calculations# For interoperability, implementations SHOULD expose both derived views when reporting tracked time: closed_minutes: sum of entries where both startTime and endTime exist. live_minutes: closed_minutes plus elapsed minutes of active entries (if any). Implementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs). 3.12 reminder temporal semantics# Reminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section. Rules: reminders[].absoluteTime MUST be a canonical datetime on write. reminders[].offset MUST be a valid ISO 8601 duration string. relative reminder base conversion for date-only values MUST use reminders.date_only_anchor_time from §9, or 00:00 local time if unset. 3.13 Example: local-day overdue evaluation# Assume local timezone America/Los_Angeles and local date 2026-02-20. Task A: due: 2026-02-19 status: open Task A is overdue. Task B: due: 2026-02-20 status: open Task B is not overdue at start of day; it becomes overdue on 2026-02-21 local day. 3.14 Example: preserving granularity# Before update: due: 2026-02-20 priority: normal Operation: update priority only. After update (conforming): due: 2026-02-20 priority: high Non-conforming behavior would silently rewrite due to a datetime. 3.15 Example: canonical datetime write# Input: timeEntries: - startTime: 2026-02-20T09:30:00+01:00 endTime: 2026-02-20T10:00:00+01:00 Canonical write: timeEntries: - startTime: 2026-02-20T08:30:00Z endTime: 2026-02-20T09:00:00Z 3.16 Example: UTC-anchor roundtrip for date-only field# Input: due: 2026-02-20 Internal computation anchor: 2026-02-20T00:00:00Z After unrelated update, conforming write: due: 2026-02-20 Non-conforming behavior would rewrite due as a datetime or shift it to another day based on local offset."},{"route":"/developers/specification/04-recurrence/","title":"4. Recurrence","description":"This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:04-recurrence.md","namespace":"specification","relativePath":"04-recurrence.md","raw":"# 4. Recurrence\n\n## 4.1 Purpose\n\nThis section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.\n\n## 4.2 Recurrence applicability\n\nA task is recurring when semantic role `recurrence` contains a valid tasknotes recurrence string.\n\nIf `recurrence` is absent or empty, the task is non-recurring.\n\n## 4.3 Rule format\n\n### 4.3.1 Required format\n\n`recurrence` MUST be a tasknotes recurrence string.\nThis syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment.\nThe RRULE parameter portion MUST use RFC 5545 RRULE property syntax.\nIt MAY include a leading inline `DTSTART` segment.\n\nIf `DTSTART` is present, it MUST use one of:\n\n- `DTSTART:YYYYMMDD` (date-only)\n- `DTSTART:YYYYMMDDTHHMMSSZ` (UTC datetime)\n\nCanonical combined form is:\n\n- `DTSTART:...;FREQ=...`\n\nImplementations MAY accept inbound `RRULE:` prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above.\n\nExamples:\n\n- `FREQ=DAILY`\n- `FREQ=WEEKLY;BYDAY=MO,WE,FR`\n- `FREQ=MONTHLY;BYMONTHDAY=1`\n- `DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR`\n\n### 4.3.2 Invalid rule handling\n\nInvalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode.\n\n## 4.4 Recurrence anchor\n\n`recurrence_anchor` controls progression semantics and MUST be one of:\n\n- `scheduled`\n- `completion`\n\nIf missing, implementations SHOULD default to `scheduled` unless collection configuration defines another default.\n\n### 4.4.1 Recurrence seed precedence\n\nWhen recurrence generation requires a seed/start date, implementations MUST resolve it in this order:\n\n1. `DTSTART` embedded in `recurrence`,\n2. semantic `scheduled`,\n3. semantic `date_created`.\n\nIf no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error.\n\n### 4.4.2 Anchor progression behavior\n\nFor `recurrence_anchor=scheduled`, progression is based on the scheduled chain and `DTSTART` MUST remain fixed after it is set.\n\nFor `recurrence_anchor=completion`, complete-instance operations MUST advance progression by updating `DTSTART` to the completion target (date or datetime per §4.4.3).\n\n### 4.4.3 `DTSTART` update semantics\n\nWhen `recurrence_anchor=completion` and instance completion succeeds for resolved target day `D`:\n\n1. Instance-list state (`complete_instances`, `skipped_instances`) MUST always use day `D`.\n2. If the caller provided an explicit datetime target, `DTSTART` MUST be rewritten as `DTSTART:YYYYMMDDTHHMMSSZ` using that target instant normalized to UTC.\n3. Otherwise, `DTSTART` MUST be rewritten as `DTSTART:YYYYMMDD` for day `D`.\n4. RRULE components other than `DTSTART` MUST be preserved unless an explicit recurrence-edit operation changes them.\n5. If `DTSTART` is absent, completion-anchor progression MUST insert it before RRULE parameters.\n\n### 4.4.4 Recalculation semantics for `recurrence_anchor=completion`\n\nWhen calculating the next candidate occurrence for `recurrence_anchor=completion`:\n\n1. Implementations MUST treat `DTSTART` progression as the consumed-history mechanism.\n2. `complete_instances` MUST NOT be used as an exclusion set for future occurrence selection in this mode.\n3. `skipped_instances` MUST still exclude matching candidate dates.\n4. Candidate selection MUST choose the first RRULE occurrence strictly after the current `DTSTART` anchor (or resolved seed if `DTSTART` is absent).\n\nThis matches the completion-anchor progression model where each completion advances the chain by rewriting `DTSTART`.\nThis model is intentionally not fully reversible via ordinary `uncomplete instance`; progression history lives in `DTSTART`, not only in `complete_instances`.\n\n### 4.4.5 `DTSTART` canonicalization on recurring writes\n\nTo ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure `DTSTART` is present after create or successful recurring-instance completion.\n\nRules:\n\n1. If persisted `recurrence` already contains `DTSTART`, keep it unless an explicit operation updates it per §4.4.3.\n2. If persisted `recurrence` omits `DTSTART`, writers MUST resolve a seed using §4.4.1 and insert `DTSTART` before RRULE parameters.\n3. For `recurrence_anchor=scheduled`, inserted `DTSTART` becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions.\n4. If seed resolution fails, operation MUST fail deterministically and emit `missing_recurrence_seed`.\n\n## 4.5 Instance state fields\n\nPer-instance state is represented by:\n\n- `complete_instances`: list of date values\n- `skipped_instances`: list of date values\n\nThese lists represent day-level instance outcomes.\n\n## 4.6 Invariants\n\nImplementations MUST enforce:\n\n1. Items in instance lists are valid date values.\n2. No date appears in both lists simultaneously.\n3. Duplicate dates are normalized (set semantics) or rejected deterministically.\n4. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence.\n\n## 4.7 Instance completion semantics\n\nOperation: `complete instance` for target date `D`.\n\nConforming behavior:\n\n1. Add `D` to `complete_instances`.\n2. Remove `D` from `skipped_instances` if present.\n3. Leave base task status unchanged unless explicit policy states otherwise.\n4. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.8 Instance uncompletion semantics\n\nOperation: `uncomplete instance` for target date `D`.\n\nConforming behavior:\n\n1. Remove `D` from `complete_instances` if present.\n2. Do not add `D` to `skipped_instances` implicitly.\n3. For `recurrence_anchor=completion`, uncomplete MUST NOT rewrite or roll back `DTSTART`; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation.\n4. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.9 Instance skip semantics\n\nOperation: `skip instance` for target date `D`.\n\nConforming behavior:\n\n1. Add `D` to `skipped_instances`.\n2. Remove `D` from `complete_instances` if present.\n3. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.10 Instance unskip semantics\n\nOperation: `unskip instance` for target date `D`.\n\nConforming behavior:\n\n1. Remove `D` from `skipped_instances` if present.\n2. Do not add to `complete_instances` implicitly.\n3. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.11 Effective instance state\n\nFor target date `D`, effective state MUST be resolved in this order:\n\n1. If `D` in `complete_instances`: state is `completed`.\n2. Else if `D` in `skipped_instances`: state is `skipped`.\n3. Else: state is unresolved/default for that instance.\n\nBecause overlap is invalid, this ordering is deterministic.\n\n## 4.12 Interaction with base status\n\nFor recurring tasks:\n\n- Base `status` is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured.\n- Instance state determines completion for recurrence-aware views and operations.\n- Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy.\n\nFor non-recurring tasks, completion uses base status semantics (§5).\n\n## 4.13 Completed-status configuration\n\nImplementations MUST define which status values are treated as complete for non-recurring tasks.\n\nThe completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal.\n\n## 4.14 Example: complete then skip same day\n\nInitial:\n\n```yaml\nrecurrence: FREQ=DAILY\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n```\n\nSkip target date `2026-02-20`:\n\n```yaml\nrecurrence: FREQ=DAILY\ncompleteInstances: []\nskippedInstances: [2026-02-20]\n```\n\n## 4.15 Example: idempotent complete\n\nInitial:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n```\n\nComplete `2026-02-20` again:\n\n- persisted instance lists remain unchanged,\n- operation succeeds without duplicate entries.\n\n## 4.16 Example: anchor semantics\n\nTask:\n\n```yaml\nrecurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrenceAnchor: completion\n```\n\nIf implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is `completion`, not solely by scheduled chain.\nImplementations using `DTSTART` progression MUST update `DTSTART` to the completion date for this mode.\n\nWorked example (`recurrence_anchor=completion`):\n\n```yaml\nrecurrence: DTSTART:20260220;FREQ=DAILY\nrecurrence_anchor: completion\ncomplete_instances: [2026-02-20, 2026-02-21]\nskipped_instances: [2026-02-23]\n```\n\nConforming recalculation:\n\n- does **not** exclude `2026-02-22` because it is absent from `skipped_instances`,\n- does exclude `2026-02-23` because it is skipped,\n- ignores `complete_instances` for future exclusion in this mode (§4.4.4).\n\n## 4.17 Validation examples\n\nInvalid overlap:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n```\n\nResult: validation error `instance_state_overlap`.\n\nInvalid date in list:\n\n```yaml\ncompleteInstances: [2026-02-30]\n```\n\nResult: validation error `invalid_date_value`.\n\n## 4.18 Recurrence materialization\n\nThis subsection is required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\nRecurrence materialization creates ordinary task files for specific target dates of a recurring parent task.\nIt is additive behavior: implementations that do not claim `materialized-occurrences` continue to use the instance-list model in §4.5-§4.12.\nMaterialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7).\n\n### 4.18.1 Parent and occurrence ownership\n\nThe parent recurring task owns series-level semantics:\n\n- `recurrence`\n- `recurrence_anchor`\n- recurrence generation and `DTSTART` progression\n- parent instance-list compatibility state (`complete_instances`, `skipped_instances`)\n- materialization policy fields (`occurrence_materialization`, `occurrence_next_trigger`, `occurrence_template`, `occurrence_past_horizon`, `occurrence_future_horizon`)\n\nA materialized occurrence note owns per-date task semantics for its `occurrence_date`, including:\n\n- `status`\n- `completed_date`\n- body content and checklists\n- `time_entries`\n- per-occurrence `due`, `scheduled`, `reminders`, `contexts`, `projects`, and unknown fields\n\n### 4.18.2 Occurrence identity and parent reference\n\nA materialized occurrence note MUST store:\n\n- `recurrence_parent`: a link-or-string reference to the parent recurring task\n- `occurrence_date`: the target date represented by the occurrence note\n\nThe preferred Obsidian-compatible representation for `recurrence_parent` is a wikilink, for example:\n\n```yaml\nrecurrence_parent: \"[[Weekly Review]]\"\noccurrence_date: 2026-02-27\n```\n\nImplementations claiming `materialized-occurrences` MUST resolve `recurrence_parent` using §11 link semantics for this role, even if they do not claim full `extended`.\nIf the parent cannot be resolved, validation SHOULD report `invalid_recurrence_parent`.\n\nFor one resolved parent, there SHOULD be at most one materialized occurrence note per `occurrence_date`.\nDuplicate detected occurrence notes SHOULD report `duplicate_occurrence_note` and MUST NOT be chosen nondeterministically for writes.\n\n### 4.18.3 Effective state precedence\n\nFor target date `D`, recurrence-aware effective state MUST be resolved in this order:\n\n1. If a materialized occurrence note exists for `(parent, D)`, derive state from that note's own task state:\n - `completed` when its `status` is in `status.completed_values`;\n - `skipped` when its `status` is in `status.skipped_values`;\n - otherwise unresolved/default for that instance.\n2. Else if `D` is in parent `complete_instances`: state is `completed`.\n3. Else if `D` is in parent `skipped_instances`: state is `skipped`.\n4. Else: state is unresolved/default for that instance.\n\nIf a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for `D`.\nValidators SHOULD report `occurrence_state_conflict`, and repair/normalization operations MAY update parent lists to match occurrence notes.\n\n### 4.18.4 Parent instance lists as compatibility state\n\nWhen materialized occurrence notes are supported, parent `complete_instances` and `skipped_instances` remain part of canonical persisted state.\nThey serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes.\n\nConforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip:\n\n- completed child state: add `D` to `complete_instances`, remove `D` from `skipped_instances`;\n- skipped child state: add `D` to `skipped_instances`, remove `D` from `complete_instances`;\n- active/unresolved child state after uncompletion/unskip: remove `D` from the relevant parent list.\n\nReconciliation failure MUST NOT silently change the occurrence note state.\nImplementations SHOULD surface a recoverable error or warning.\n\n### 4.18.5 Materialization modes\n\n`occurrence_materialization` controls when materialized occurrence notes are created.\nAllowed values:\n\n- `manual`: occurrence notes are created only by explicit user or API action.\n- `on_completion`: completing a materialized occurrence note creates the next occurrence note.\n- `rolling`: the implementation maintains a bounded materialized window, such as today through the next 14 days.\n\nIf absent, `occurrence_materialization` MUST default to `manual`.\n\n`on_completion` does not by itself create the first occurrence note in a series.\nThe first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option.\n\nConforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing.\n\n### 4.18.6 Next-occurrence trigger\n\n`occurrence_next_trigger` controls whether skip/cancel transitions also create the next occurrence note when `occurrence_materialization=on_completion`.\nAllowed values:\n\n- `completion`: only completion creates the next occurrence note.\n- `completion_or_skip`: completion and skip/cancel create the next occurrence note.\n\nIf absent, `occurrence_next_trigger` MUST default to `completion`.\n\nThe next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics.\nMaterializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate.\n\n### 4.18.7 Rolling materialization bounds\n\nFor `occurrence_materialization=rolling`, implementations MUST enforce finite bounds.\nUnbounded future materialization is non-conformant.\n\nBounds SHOULD be expressed with ISO 8601 durations such as:\n\n```yaml\noccurrence_past_horizon: P0D\noccurrence_future_horizon: P14D\n```\n\nIf bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults.\n\n### 4.18.8 Recurrence edits and historical notes\n\nMaterialized occurrence notes are durable task files.\nEditing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes.\n\nIf an existing occurrence note's `occurrence_date` is no longer generated by the current parent recurrence rule, validators MAY report `materialization_target_not_generated` as a warning.\nThis condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated.\n","aliases":["/spec/04-recurrence/"],"toc":[{"level":2,"id":"41-purpose","text":"4.1 Purpose"},{"level":2,"id":"42-recurrence-applicability","text":"4.2 Recurrence applicability"},{"level":2,"id":"43-rule-format","text":"4.3 Rule format"},{"level":3,"id":"431-required-format","text":"4.3.1 Required format"},{"level":3,"id":"432-invalid-rule-handling","text":"4.3.2 Invalid rule handling"},{"level":2,"id":"44-recurrence-anchor","text":"4.4 Recurrence anchor"},{"level":3,"id":"441-recurrence-seed-precedence","text":"4.4.1 Recurrence seed precedence"},{"level":3,"id":"442-anchor-progression-behavior","text":"4.4.2 Anchor progression behavior"},{"level":3,"id":"443-dtstart-update-semantics","text":"4.4.3 DTSTART update semantics"},{"level":3,"id":"444-recalculation-semantics-for-recurrenceanchorcompletion","text":"4.4.4 Recalculation semantics for recurrence_anchor=completion"},{"level":3,"id":"445-dtstart-canonicalization-on-recurring-writes","text":"4.4.5 DTSTART canonicalization on recurring writes"},{"level":2,"id":"45-instance-state-fields","text":"4.5 Instance state fields"},{"level":2,"id":"46-invariants","text":"4.6 Invariants"},{"level":2,"id":"47-instance-completion-semantics","text":"4.7 Instance completion semantics"},{"level":2,"id":"48-instance-uncompletion-semantics","text":"4.8 Instance uncompletion semantics"},{"level":2,"id":"49-instance-skip-semantics","text":"4.9 Instance skip semantics"},{"level":2,"id":"410-instance-unskip-semantics","text":"4.10 Instance unskip semantics"},{"level":2,"id":"411-effective-instance-state","text":"4.11 Effective instance state"},{"level":2,"id":"412-interaction-with-base-status","text":"4.12 Interaction with base status"},{"level":2,"id":"413-completed-status-configuration","text":"4.13 Completed-status configuration"},{"level":2,"id":"414-example-complete-then-skip-same-day","text":"4.14 Example: complete then skip same day"},{"level":2,"id":"415-example-idempotent-complete","text":"4.15 Example: idempotent complete"},{"level":2,"id":"416-example-anchor-semantics","text":"4.16 Example: anchor semantics"},{"level":2,"id":"417-validation-examples","text":"4.17 Validation examples"},{"level":2,"id":"418-recurrence-materialization","text":"4.18 Recurrence materialization"},{"level":3,"id":"4181-parent-and-occurrence-ownership","text":"4.18.1 Parent and occurrence ownership"},{"level":3,"id":"4182-occurrence-identity-and-parent-reference","text":"4.18.2 Occurrence identity and parent reference"},{"level":3,"id":"4183-effective-state-precedence","text":"4.18.3 Effective state precedence"},{"level":3,"id":"4184-parent-instance-lists-as-compatibility-state","text":"4.18.4 Parent instance lists as compatibility state"},{"level":3,"id":"4185-materialization-modes","text":"4.18.5 Materialization modes"},{"level":3,"id":"4186-next-occurrence-trigger","text":"4.18.6 Next-occurrence trigger"},{"level":3,"id":"4187-rolling-materialization-bounds","text":"4.18.7 Rolling materialization bounds"},{"level":3,"id":"4188-recurrence-edits-and-historical-notes","text":"4.18.8 Recurrence edits and historical notes"}],"html":"

4.1 Purpose#

\n

This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.

\n

4.2 Recurrence applicability#

\n

A task is recurring when semantic role recurrence contains a valid tasknotes recurrence string.

\n

If recurrence is absent or empty, the task is non-recurring.

\n

4.3 Rule format#

\n

4.3.1 Required format#

\n

recurrence MUST be a tasknotes recurrence string.\nThis syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment.\nThe RRULE parameter portion MUST use RFC 5545 RRULE property syntax.\nIt MAY include a leading inline DTSTART segment.

\n

If DTSTART is present, it MUST use one of:

\n
    \n
  • DTSTART:YYYYMMDD (date-only)
  • \n
  • DTSTART:YYYYMMDDTHHMMSSZ (UTC datetime)
  • \n
\n

Canonical combined form is:

\n
    \n
  • DTSTART:...;FREQ=...
  • \n
\n

Implementations MAY accept inbound RRULE: prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above.

\n

Examples:

\n
    \n
  • FREQ=DAILY
  • \n
  • FREQ=WEEKLY;BYDAY=MO,WE,FR
  • \n
  • FREQ=MONTHLY;BYMONTHDAY=1
  • \n
  • DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR
  • \n
\n

4.3.2 Invalid rule handling#

\n

Invalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode.

\n

4.4 Recurrence anchor#

\n

recurrence_anchor controls progression semantics and MUST be one of:

\n
    \n
  • scheduled
  • \n
  • completion
  • \n
\n

If missing, implementations SHOULD default to scheduled unless collection configuration defines another default.

\n

4.4.1 Recurrence seed precedence#

\n

When recurrence generation requires a seed/start date, implementations MUST resolve it in this order:

\n
    \n
  1. DTSTART embedded in recurrence,
  2. \n
  3. semantic scheduled,
  4. \n
  5. semantic date_created.
  6. \n
\n

If no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error.

\n

4.4.2 Anchor progression behavior#

\n

For recurrence_anchor=scheduled, progression is based on the scheduled chain and DTSTART MUST remain fixed after it is set.

\n

For recurrence_anchor=completion, complete-instance operations MUST advance progression by updating DTSTART to the completion target (date or datetime per §4.4.3).

\n

4.4.3 DTSTART update semantics#

\n

When recurrence_anchor=completion and instance completion succeeds for resolved target day D:

\n
    \n
  1. Instance-list state (complete_instances, skipped_instances) MUST always use day D.
  2. \n
  3. If the caller provided an explicit datetime target, DTSTART MUST be rewritten as DTSTART:YYYYMMDDTHHMMSSZ using that target instant normalized to UTC.
  4. \n
  5. Otherwise, DTSTART MUST be rewritten as DTSTART:YYYYMMDD for day D.
  6. \n
  7. RRULE components other than DTSTART MUST be preserved unless an explicit recurrence-edit operation changes them.
  8. \n
  9. If DTSTART is absent, completion-anchor progression MUST insert it before RRULE parameters.
  10. \n
\n

4.4.4 Recalculation semantics for recurrence_anchor=completion#

\n

When calculating the next candidate occurrence for recurrence_anchor=completion:

\n
    \n
  1. Implementations MUST treat DTSTART progression as the consumed-history mechanism.
  2. \n
  3. complete_instances MUST NOT be used as an exclusion set for future occurrence selection in this mode.
  4. \n
  5. skipped_instances MUST still exclude matching candidate dates.
  6. \n
  7. Candidate selection MUST choose the first RRULE occurrence strictly after the current DTSTART anchor (or resolved seed if DTSTART is absent).
  8. \n
\n

This matches the completion-anchor progression model where each completion advances the chain by rewriting DTSTART.\nThis model is intentionally not fully reversible via ordinary uncomplete instance; progression history lives in DTSTART, not only in complete_instances.

\n

4.4.5 DTSTART canonicalization on recurring writes#

\n

To ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure DTSTART is present after create or successful recurring-instance completion.

\n

Rules:

\n
    \n
  1. If persisted recurrence already contains DTSTART, keep it unless an explicit operation updates it per §4.4.3.
  2. \n
  3. If persisted recurrence omits DTSTART, writers MUST resolve a seed using §4.4.1 and insert DTSTART before RRULE parameters.
  4. \n
  5. For recurrence_anchor=scheduled, inserted DTSTART becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions.
  6. \n
  7. If seed resolution fails, operation MUST fail deterministically and emit missing_recurrence_seed.
  8. \n
\n

4.5 Instance state fields#

\n

Per-instance state is represented by:

\n
    \n
  • complete_instances: list of date values
  • \n
  • skipped_instances: list of date values
  • \n
\n

These lists represent day-level instance outcomes.

\n

4.6 Invariants#

\n

Implementations MUST enforce:

\n
    \n
  1. Items in instance lists are valid date values.
  2. \n
  3. No date appears in both lists simultaneously.
  4. \n
  5. Duplicate dates are normalized (set semantics) or rejected deterministically.
  6. \n
  7. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence.
  8. \n
\n

4.7 Instance completion semantics#

\n

Operation: complete instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Add D to complete_instances.
  2. \n
  3. Remove D from skipped_instances if present.
  4. \n
  5. Leave base task status unchanged unless explicit policy states otherwise.
  6. \n
  7. Update date_modified when state changes.
  8. \n
\n

Operation MUST be idempotent.

\n

4.8 Instance uncompletion semantics#

\n

Operation: uncomplete instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Remove D from complete_instances if present.
  2. \n
  3. Do not add D to skipped_instances implicitly.
  4. \n
  5. For recurrence_anchor=completion, uncomplete MUST NOT rewrite or roll back DTSTART; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation.
  6. \n
  7. Update date_modified when state changes.
  8. \n
\n

Operation MUST be idempotent.

\n

4.9 Instance skip semantics#

\n

Operation: skip instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Add D to skipped_instances.
  2. \n
  3. Remove D from complete_instances if present.
  4. \n
  5. Update date_modified when state changes.
  6. \n
\n

Operation MUST be idempotent.

\n

4.10 Instance unskip semantics#

\n

Operation: unskip instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Remove D from skipped_instances if present.
  2. \n
  3. Do not add to complete_instances implicitly.
  4. \n
  5. Update date_modified when state changes.
  6. \n
\n

Operation MUST be idempotent.

\n

4.11 Effective instance state#

\n

For target date D, effective state MUST be resolved in this order:

\n
    \n
  1. If D in complete_instances: state is completed.
  2. \n
  3. Else if D in skipped_instances: state is skipped.
  4. \n
  5. Else: state is unresolved/default for that instance.
  6. \n
\n

Because overlap is invalid, this ordering is deterministic.

\n

4.12 Interaction with base status#

\n

For recurring tasks:

\n
    \n
  • Base status is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured.
  • \n
  • Instance state determines completion for recurrence-aware views and operations.
  • \n
  • Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy.
  • \n
\n

For non-recurring tasks, completion uses base status semantics (§5).

\n

4.13 Completed-status configuration#

\n

Implementations MUST define which status values are treated as complete for non-recurring tasks.

\n

The completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal.

\n

4.14 Example: complete then skip same day#

\n

Initial:

\n
recurrence: FREQ=DAILY\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n

Skip target date 2026-02-20:

\n
recurrence: FREQ=DAILY\ncompleteInstances: []\nskippedInstances: [2026-02-20]\n

4.15 Example: idempotent complete#

\n

Initial:

\n
completeInstances: [2026-02-20]\nskippedInstances: []\n

Complete 2026-02-20 again:

\n
    \n
  • persisted instance lists remain unchanged,
  • \n
  • operation succeeds without duplicate entries.
  • \n
\n

4.16 Example: anchor semantics#

\n

Task:

\n
recurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrenceAnchor: completion\n

If implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is completion, not solely by scheduled chain.\nImplementations using DTSTART progression MUST update DTSTART to the completion date for this mode.

\n

Worked example (recurrence_anchor=completion):

\n
recurrence: DTSTART:20260220;FREQ=DAILY\nrecurrence_anchor: completion\ncomplete_instances: [2026-02-20, 2026-02-21]\nskipped_instances: [2026-02-23]\n

Conforming recalculation:

\n
    \n
  • does not exclude 2026-02-22 because it is absent from skipped_instances,
  • \n
  • does exclude 2026-02-23 because it is skipped,
  • \n
  • ignores complete_instances for future exclusion in this mode (§4.4.4).
  • \n
\n

4.17 Validation examples#

\n

Invalid overlap:

\n
completeInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n

Result: validation error instance_state_overlap.

\n

Invalid date in list:

\n
completeInstances: [2026-02-30]\n

Result: validation error invalid_date_value.

\n

4.18 Recurrence materialization#

\n

This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

Recurrence materialization creates ordinary task files for specific target dates of a recurring parent task.\nIt is additive behavior: implementations that do not claim materialized-occurrences continue to use the instance-list model in §4.5-§4.12.\nMaterialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7).

\n

4.18.1 Parent and occurrence ownership#

\n

The parent recurring task owns series-level semantics:

\n
    \n
  • recurrence
  • \n
  • recurrence_anchor
  • \n
  • recurrence generation and DTSTART progression
  • \n
  • parent instance-list compatibility state (complete_instances, skipped_instances)
  • \n
  • materialization policy fields (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon)
  • \n
\n

A materialized occurrence note owns per-date task semantics for its occurrence_date, including:

\n
    \n
  • status
  • \n
  • completed_date
  • \n
  • body content and checklists
  • \n
  • time_entries
  • \n
  • per-occurrence due, scheduled, reminders, contexts, projects, and unknown fields
  • \n
\n

4.18.2 Occurrence identity and parent reference#

\n

A materialized occurrence note MUST store:

\n
    \n
  • recurrence_parent: a link-or-string reference to the parent recurring task
  • \n
  • occurrence_date: the target date represented by the occurrence note
  • \n
\n

The preferred Obsidian-compatible representation for recurrence_parent is a wikilink, for example:

\n
recurrence_parent: "[[Weekly Review]]"\noccurrence_date: 2026-02-27\n

Implementations claiming materialized-occurrences MUST resolve recurrence_parent using §11 link semantics for this role, even if they do not claim full extended.\nIf the parent cannot be resolved, validation SHOULD report invalid_recurrence_parent.

\n

For one resolved parent, there SHOULD be at most one materialized occurrence note per occurrence_date.\nDuplicate detected occurrence notes SHOULD report duplicate_occurrence_note and MUST NOT be chosen nondeterministically for writes.

\n

4.18.3 Effective state precedence#

\n

For target date D, recurrence-aware effective state MUST be resolved in this order:

\n
    \n
  1. If a materialized occurrence note exists for (parent, D), derive state from that note's own task state:
      \n
    • completed when its status is in status.completed_values;
    • \n
    • skipped when its status is in status.skipped_values;
    • \n
    • otherwise unresolved/default for that instance.
    • \n
    \n
  2. \n
  3. Else if D is in parent complete_instances: state is completed.
  4. \n
  5. Else if D is in parent skipped_instances: state is skipped.
  6. \n
  7. Else: state is unresolved/default for that instance.
  8. \n
\n

If a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for D.\nValidators SHOULD report occurrence_state_conflict, and repair/normalization operations MAY update parent lists to match occurrence notes.

\n

4.18.4 Parent instance lists as compatibility state#

\n

When materialized occurrence notes are supported, parent complete_instances and skipped_instances remain part of canonical persisted state.\nThey serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes.

\n

Conforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip:

\n
    \n
  • completed child state: add D to complete_instances, remove D from skipped_instances;
  • \n
  • skipped child state: add D to skipped_instances, remove D from complete_instances;
  • \n
  • active/unresolved child state after uncompletion/unskip: remove D from the relevant parent list.
  • \n
\n

Reconciliation failure MUST NOT silently change the occurrence note state.\nImplementations SHOULD surface a recoverable error or warning.

\n

4.18.5 Materialization modes#

\n

occurrence_materialization controls when materialized occurrence notes are created.\nAllowed values:

\n
    \n
  • manual: occurrence notes are created only by explicit user or API action.
  • \n
  • on_completion: completing a materialized occurrence note creates the next occurrence note.
  • \n
  • rolling: the implementation maintains a bounded materialized window, such as today through the next 14 days.
  • \n
\n

If absent, occurrence_materialization MUST default to manual.

\n

on_completion does not by itself create the first occurrence note in a series.\nThe first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option.

\n

Conforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing.

\n

4.18.6 Next-occurrence trigger#

\n

occurrence_next_trigger controls whether skip/cancel transitions also create the next occurrence note when occurrence_materialization=on_completion.\nAllowed values:

\n
    \n
  • completion: only completion creates the next occurrence note.
  • \n
  • completion_or_skip: completion and skip/cancel create the next occurrence note.
  • \n
\n

If absent, occurrence_next_trigger MUST default to completion.

\n

The next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics.\nMaterializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate.

\n

4.18.7 Rolling materialization bounds#

\n

For occurrence_materialization=rolling, implementations MUST enforce finite bounds.\nUnbounded future materialization is non-conformant.

\n

Bounds SHOULD be expressed with ISO 8601 durations such as:

\n
occurrence_past_horizon: P0D\noccurrence_future_horizon: P14D\n

If bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults.

\n

4.18.8 Recurrence edits and historical notes#

\n

Materialized occurrence notes are durable task files.\nEditing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes.

\n

If an existing occurrence note's occurrence_date is no longer generated by the current parent recurrence rule, validators MAY report materialization_target_not_generated as a warning.\nThis condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated.

\n","text":"4.1 Purpose# This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state. 4.2 Recurrence applicability# A task is recurring when semantic role recurrence contains a valid tasknotes recurrence string. If recurrence is absent or empty, the task is non-recurring. 4.3 Rule format# 4.3.1 Required format# recurrence MUST be a tasknotes recurrence string. This syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment. The RRULE parameter portion MUST use RFC 5545 RRULE property syntax. It MAY include a leading inline DTSTART segment. If DTSTART is present, it MUST use one of: DTSTART:YYYYMMDD (date-only) DTSTART:YYYYMMDDTHHMMSSZ (UTC datetime) Canonical combined form is: DTSTART:...;FREQ=... Implementations MAY accept inbound RRULE: prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above. Examples: FREQ=DAILY FREQ=WEEKLY;BYDAY=MO,WE,FR FREQ=MONTHLY;BYMONTHDAY=1 DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR 4.3.2 Invalid rule handling# Invalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode. 4.4 Recurrence anchor# recurrence_anchor controls progression semantics and MUST be one of: scheduled completion If missing, implementations SHOULD default to scheduled unless collection configuration defines another default. 4.4.1 Recurrence seed precedence# When recurrence generation requires a seed/start date, implementations MUST resolve it in this order: DTSTART embedded in recurrence, semantic scheduled, semantic date_created. If no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error. 4.4.2 Anchor progression behavior# For recurrence_anchor=scheduled, progression is based on the scheduled chain and DTSTART MUST remain fixed after it is set. For recurrence_anchor=completion, complete-instance operations MUST advance progression by updating DTSTART to the completion target (date or datetime per §4.4.3). 4.4.3 DTSTART update semantics# When recurrence_anchor=completion and instance completion succeeds for resolved target day D: Instance-list state (complete_instances, skipped_instances) MUST always use day D. If the caller provided an explicit datetime target, DTSTART MUST be rewritten as DTSTART:YYYYMMDDTHHMMSSZ using that target instant normalized to UTC. Otherwise, DTSTART MUST be rewritten as DTSTART:YYYYMMDD for day D. RRULE components other than DTSTART MUST be preserved unless an explicit recurrence-edit operation changes them. If DTSTART is absent, completion-anchor progression MUST insert it before RRULE parameters. 4.4.4 Recalculation semantics for recurrence_anchor=completion# When calculating the next candidate occurrence for recurrence_anchor=completion: Implementations MUST treat DTSTART progression as the consumed-history mechanism. complete_instances MUST NOT be used as an exclusion set for future occurrence selection in this mode. skipped_instances MUST still exclude matching candidate dates. Candidate selection MUST choose the first RRULE occurrence strictly after the current DTSTART anchor (or resolved seed if DTSTART is absent). This matches the completion-anchor progression model where each completion advances the chain by rewriting DTSTART. This model is intentionally not fully reversible via ordinary uncomplete instance; progression history lives in DTSTART, not only in complete_instances. 4.4.5 DTSTART canonicalization on recurring writes# To ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure DTSTART is present after create or successful recurring-instance completion. Rules: If persisted recurrence already contains DTSTART, keep it unless an explicit operation updates it per §4.4.3. If persisted recurrence omits DTSTART, writers MUST resolve a seed using §4.4.1 and insert DTSTART before RRULE parameters. For recurrence_anchor=scheduled, inserted DTSTART becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions. If seed resolution fails, operation MUST fail deterministically and emit missing_recurrence_seed. 4.5 Instance state fields# Per-instance state is represented by: complete_instances: list of date values skipped_instances: list of date values These lists represent day-level instance outcomes. 4.6 Invariants# Implementations MUST enforce: Items in instance lists are valid date values. No date appears in both lists simultaneously. Duplicate dates are normalized (set semantics) or rejected deterministically. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence. 4.7 Instance completion semantics# Operation: complete instance for target date D. Conforming behavior: Add D to complete_instances. Remove D from skipped_instances if present. Leave base task status unchanged unless explicit policy states otherwise. Update date_modified when state changes. Operation MUST be idempotent. 4.8 Instance uncompletion semantics# Operation: uncomplete instance for target date D. Conforming behavior: Remove D from complete_instances if present. Do not add D to skipped_instances implicitly. For recurrence_anchor=completion, uncomplete MUST NOT rewrite or roll back DTSTART; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation. Update date_modified when state changes. Operation MUST be idempotent. 4.9 Instance skip semantics# Operation: skip instance for target date D. Conforming behavior: Add D to skipped_instances. Remove D from complete_instances if present. Update date_modified when state changes. Operation MUST be idempotent. 4.10 Instance unskip semantics# Operation: unskip instance for target date D. Conforming behavior: Remove D from skipped_instances if present. Do not add to complete_instances implicitly. Update date_modified when state changes. Operation MUST be idempotent. 4.11 Effective instance state# For target date D, effective state MUST be resolved in this order: If D in complete_instances: state is completed. Else if D in skipped_instances: state is skipped. Else: state is unresolved/default for that instance. Because overlap is invalid, this ordering is deterministic. 4.12 Interaction with base status# For recurring tasks: Base status is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured. Instance state determines completion for recurrence-aware views and operations. Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy. For non-recurring tasks, completion uses base status semantics (§5). 4.13 Completed-status configuration# Implementations MUST define which status values are treated as complete for non-recurring tasks. The completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal. 4.14 Example: complete then skip same day# Initial: recurrence: FREQ=DAILY completeInstances: [2026-02-20] skippedInstances: [] Skip target date 2026-02-20: recurrence: FREQ=DAILY completeInstances: [] skippedInstances: [2026-02-20] 4.15 Example: idempotent complete# Initial: completeInstances: [2026-02-20] skippedInstances: [] Complete 2026-02-20 again: persisted instance lists remain unchanged, operation succeeds without duplicate entries. 4.16 Example: anchor semantics# Task: recurrence: FREQ=WEEKLY;BYDAY=FR recurrenceAnchor: completion If implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is completion, not solely by scheduled chain. Implementations using DTSTART progression MUST update DTSTART to the completion date for this mode. Worked example (recurrence_anchor=completion): recurrence: DTSTART:20260220;FREQ=DAILY recurrence_anchor: completion complete_instances: [2026-02-20, 2026-02-21] skipped_instances: [2026-02-23] Conforming recalculation: does not exclude 2026-02-22 because it is absent from skipped_instances, does exclude 2026-02-23 because it is skipped, ignores complete_instances for future exclusion in this mode (§4.4.4). 4.17 Validation examples# Invalid overlap: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Result: validation error instance_state_overlap. Invalid date in list: completeInstances: [2026-02-30] Result: validation error invalid_date_value. 4.18 Recurrence materialization# This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4). Recurrence materialization creates ordinary task files for specific target dates of a recurring parent task. It is additive behavior: implementations that do not claim materialized-occurrences continue to use the instance-list model in §4.5-§4.12. Materialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7). 4.18.1 Parent and occurrence ownership# The parent recurring task owns series-level semantics: recurrence recurrence_anchor recurrence generation and DTSTART progression parent instance-list compatibility state (complete_instances, skipped_instances) materialization policy fields (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon) A materialized occurrence note owns per-date task semantics for its occurrence_date, including: status completed_date body content and checklists time_entries per-occurrence due, scheduled, reminders, contexts, projects, and unknown fields 4.18.2 Occurrence identity and parent reference# A materialized occurrence note MUST store: recurrence_parent: a link-or-string reference to the parent recurring task occurrence_date: the target date represented by the occurrence note The preferred Obsidian-compatible representation for recurrence_parent is a wikilink, for example: recurrence_parent: \"[[Weekly Review]]\" occurrence_date: 2026-02-27 Implementations claiming materialized-occurrences MUST resolve recurrence_parent using §11 link semantics for this role, even if they do not claim full extended. If the parent cannot be resolved, validation SHOULD report invalid_recurrence_parent. For one resolved parent, there SHOULD be at most one materialized occurrence note per occurrence_date. Duplicate detected occurrence notes SHOULD report duplicate_occurrence_note and MUST NOT be chosen nondeterministically for writes. 4.18.3 Effective state precedence# For target date D, recurrence-aware effective state MUST be resolved in this order: If a materialized occurrence note exists for (parent, D), derive state from that note's own task state: completed when its status is in status.completed_values; skipped when its status is in status.skipped_values; otherwise unresolved/default for that instance. Else if D is in parent complete_instances: state is completed. Else if D is in parent skipped_instances: state is skipped. Else: state is unresolved/default for that instance. If a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for D. Validators SHOULD report occurrence_state_conflict, and repair/normalization operations MAY update parent lists to match occurrence notes. 4.18.4 Parent instance lists as compatibility state# When materialized occurrence notes are supported, parent complete_instances and skipped_instances remain part of canonical persisted state. They serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes. Conforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip: completed child state: add D to complete_instances, remove D from skipped_instances; skipped child state: add D to skipped_instances, remove D from complete_instances; active/unresolved child state after uncompletion/unskip: remove D from the relevant parent list. Reconciliation failure MUST NOT silently change the occurrence note state. Implementations SHOULD surface a recoverable error or warning. 4.18.5 Materialization modes# occurrence_materialization controls when materialized occurrence notes are created. Allowed values: manual: occurrence notes are created only by explicit user or API action. on_completion: completing a materialized occurrence note creates the next occurrence note. rolling: the implementation maintains a bounded materialized window, such as today through the next 14 days. If absent, occurrence_materialization MUST default to manual. on_completion does not by itself create the first occurrence note in a series. The first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option. Conforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing. 4.18.6 Next-occurrence trigger# occurrence_next_trigger controls whether skip/cancel transitions also create the next occurrence note when occurrence_materialization=on_completion. Allowed values: completion: only completion creates the next occurrence note. completion_or_skip: completion and skip/cancel create the next occurrence note. If absent, occurrence_next_trigger MUST default to completion. The next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics. Materializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate. 4.18.7 Rolling materialization bounds# For occurrence_materialization=rolling, implementations MUST enforce finite bounds. Unbounded future materialization is non-conformant. Bounds SHOULD be expressed with ISO 8601 durations such as: occurrence_past_horizon: P0D occurrence_future_horizon: P14D If bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults. 4.18.8 Recurrence edits and historical notes# Materialized occurrence notes are durable task files. Editing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes. If an existing occurrence note's occurrence_date is no longer generated by the current parent recurrence rule, validators MAY report materialization_target_not_generated as a warning. This condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated."},{"route":"/developers/specification/05-operations/","title":"5. Operations","description":"This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:05-operations.md","namespace":"specification","relativePath":"05-operations.md","raw":"# 5. Operations\n\n## 5.1 Purpose\n\nThis section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.\n\n## 5.2 General operation rules\n\nFor all mutating operations:\n\n1. Validation MUST run before commit in strict mode.\n2. Writes MUST be atomic at file level (all-or-nothing per file).\n3. `date_modified` MUST be updated on successful state change.\n4. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations.\n5. Operations identified as idempotent MUST remain safe under repetition.\n\n### 5.2.1 Target day/date resolution\n\nRecurring instance operations act on a target day/date (`complete instance`, `uncomplete instance`, `skip`, `unskip`).\nNon-recurring `complete` uses completion-day semantics for `completed_date`.\n\nResolution MUST be deterministic:\n\n1. If caller provides an explicit target date/datetime, that value is authoritative.\n2. If caller omits target for recurring instance operations, implementations MUST resolve in this order:\n - task `scheduled`, if present and target-day-resolvable,\n - else task `due`, if present and target-day-resolvable,\n - else current local day in active runtime timezone (§3.6).\n3. Target-day resolution for fallback task fields (`scheduled` / `due`) MUST use this extraction policy:\n - if stored value is canonical date (`YYYY-MM-DD`), use it as-is;\n - if stored value is datetime, use the literal date token before `T` (`YYYY-MM-DD`) without timezone shifting;\n - if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning;\n - if a candidate value is unusable, continue to the next fallback source.\n4. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone.\n\nWhen an explicit target is datetime:\n\n- operations that require day semantics MUST use its calendar date part in active runtime timezone,\n- for recurring `complete instance` with `recurrence_anchor=completion`, the same explicit datetime target MUST also drive `DTSTART` rewrite semantics in §4.4.3.\n\nThis explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above.\n\n### 5.2.2 Idempotency and `date_modified`\n\nFor operations marked idempotent:\n\n- first application MAY change state and `date_modified`,\n- repeated application with semantically equivalent input MUST leave persisted state unchanged.\n\nWhen a repeated idempotent operation is a no-op, `date_modified` MUST remain unchanged.\n\n## 5.3 Create\n\n### 5.3.1 Input requirements\n\nCreate MUST provide at minimum semantic roles required by §2, directly or via defaults.\n\n### 5.3.2 Required behavior\n\nCreate MUST:\n\n- apply default values,\n- generate `date_created` and `date_modified` when absent,\n- resolve semantic `title` and filename/path behavior according to §9.13,\n- apply create-time templating when enabled and supported (§5.3.5, §9.14, §7),\n- serialize canonical keys and canonical temporal formats,\n- when `recurrence` is present, canonicalize `DTSTART` per §4.4.5,\n- preserve caller-provided semantic `id` when present,\n- fail with validation errors if required constraints are unmet,\n- apply default reminders according to §10.3.9 when configured.\n\n### 5.3.3 Title and filename resolution on create\n\nCreate MUST produce a deterministic initial filename/path.\n\nRules:\n\n- Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames.\n- If `title.storage=filename`:\n - basename MUST derive from semantic title,\n - title changes after create are handled by update semantics (§5.4.4),\n - implementations MAY also persist mapped `title` as a synchronized compatibility mirror,\n - `title.filename_format` and `title.custom_filename_template` MUST be ignored.\n- If `title.storage=frontmatter`, create-time basename MUST follow `title.filename_format`:\n - `title`: sanitized semantic title,\n - `zettel`: implementation-defined zettel pattern (MUST be documented),\n - `timestamp`: implementation-defined timestamp pattern (MUST be documented),\n - `custom`: `title.custom_filename_template` expansion.\n- If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing).\n\n### 5.3.4 Example\n\nInput intent:\n\n```yaml\ntitle: \"Pay electricity bill\"\n```\n\nAssume defaults:\n\n- status default `open`\n- priority default `normal`\n\nPersisted frontmatter (example):\n\n```yaml\ntitle: Pay electricity bill\nstatus: open\npriority: normal\ndateCreated: 2026-02-20T14:00:00Z\ndateModified: 2026-02-20T14:00:00Z\n```\n\n### 5.3.5 Optional create-time templating\n\nThis subsection is required only for implementations claiming profile `templating` (§7.3.3).\n\nCreate-time templating pipeline MUST be deterministic:\n\n1. Compute base create payload from explicit input, defaults (§9.8), and generated/system values (`date_created`, `date_modified`, resolved title policy).\n2. Expand template variables using that base payload and active runtime date/time context.\n3. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict).\n4. Resolve body output:\n - if expanded template body is non-empty, use it;\n - otherwise use caller-provided body/details (if any).\n\nTemplate parse rules:\n\n- If template content begins with `---`, implementations MUST treat the first `--- ... ---` block as template frontmatter and the remainder as template body.\n- Frontmatter variable expansion MUST run before YAML parsing of template frontmatter.\n\nPortable variable support:\n\nImplementations claiming `templating` MUST support all variables in the **Required** column of the table below. Implementations MAY support any variable in the **Extended** column.\n\n**Required task-data variables:**\n\n| Variable | Value | Format / separator |\n|---|---|---|\n| `{{title}}` | Semantic title | string; YAML-quoted if needed |\n| `{{status}}` | Task status value | string |\n| `{{priority}}` | Task priority value | string |\n| `{{dueDate}}` | Due date if set | `YYYY-MM-DD` or empty |\n| `{{scheduledDate}}` | Scheduled date if set | `YYYY-MM-DD` or empty |\n| `{{details}}` | Caller-provided body/description | string |\n| `{{contexts}}` | Contexts list | comma-separated, e.g. `\"work, home\"` |\n| `{{tags}}` | Tags list | comma-separated, e.g. `\"task, errands\"` |\n| `{{hashtags}}` | Tags list as hashtags | space-separated, e.g. `\"#task #errands\"` |\n| `{{timeEstimate}}` | Time estimate in minutes | integer string or empty |\n| `{{parentNote}}` | Parent note name/path | string; YAML-quoted if needed |\n\n**Required date/time variables (expansion time):**\n\n| Variable | Value | Format |\n|---|---|---|\n| `{{date}}` | Current date | `yyyy-MM-dd` |\n| `{{time}}` | Current time (24h) | `HH:mm` |\n| `{{year}}` | Full year | `yyyy` |\n| `{{month}}` | Month number | `MM` |\n| `{{day}}` | Day of month | `dd` |\n\n**Extended variables (optional):**\n\n| Variable | Value | Format |\n|---|---|---|\n| `{{dateTime}}` | Date + time | `yyyy-MM-dd-HHmm` |\n| `{{timestamp}}` | Full timestamp | `yyyy-MM-dd-HHmmss` |\n| `{{shortDate}}` | Short date | `yyMMdd` |\n| `{{shortYear}}` | Two-digit year | `yy` |\n| `{{monthName}}` | Month full name | e.g. `February` |\n| `{{monthNameShort}}` | Month short name | e.g. `Feb` |\n| `{{dayName}}` | Weekday full name | e.g. `Monday` |\n| `{{dayNameShort}}` | Weekday short name | e.g. `Mon` |\n| `{{week}}` | ISO week number | `ww` |\n| `{{quarter}}` | Quarter number | `1`–`4` |\n| `{{hour}}` | Hour (24h) | `HH` |\n| `{{minute}}` | Minute | `mm` |\n| `{{second}}` | Second | `ss` |\n| `{{time12}}` | Time with AM/PM | `hh:mm a` |\n| `{{time24}}` | Time (24h) | `HH:mm` |\n| `{{timezone}}` | UTC offset long | e.g. `+05:30` |\n| `{{utcOffset}}` | UTC offset long | e.g. `+05:30` |\n| `{{unix}}` | Unix timestamp (seconds) | integer string |\n| `{{unixMs}}` | Unix timestamp (ms) | integer string |\n| `{{zettel}}` | Zettelkasten ID | date + seconds-since-midnight base-36 |\n| `{{titleLower}}` | Title lowercase | string |\n| `{{titleUpper}}` | Title uppercase | string |\n| `{{titleSnake}}` | Title snake_case | string |\n| `{{titleKebab}}` | Title kebab-case | string |\n| `{{titleCamel}}` | Title camelCase | string |\n| `{{titlePascal}}` | Title PascalCase | string |\n| `{{priorityShort}}` | First letter of priority | uppercase char |\n| `{{statusShort}}` | First letter of status | uppercase char |\n\nUnknown variables (not in the above lists) MUST be handled per `templating.unknown_variable_policy` (§9.14):\n- `preserve`: leave the `{{...}}` placeholder as-is.\n- `empty`: replace with an empty string.\n\nDeterministic expansion context:\n\n- date/time variable expansion MUST use the active runtime timezone from §3.6.\n- locale-sensitive variables (`monthName`, `monthNameShort`, `dayName`, `dayNameShort`, `time12`) MUST use English locale outputs for portability (`January`, `Jan`, `Monday`, `Mon`, `AM`/`PM`).\n- template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2).\n\nFailure behavior:\n\n- `templating.failure_mode=error`: template read/parse failures MUST abort create.\n- `templating.failure_mode=warning_fallback`: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (`template_missing` or `template_parse_failed`).\n\n### 5.3.6 Identity handling on create\n\nIf semantic `id` is provided on create, writers MUST preserve it.\nIf implementation supports auto-generation of semantic `id`, generation policy MUST be documented and resulting `id` MUST remain stable after create.\n\n## 5.4 Update\n\n### 5.4.1 Patch semantics\n\nUpdate MUST be patch-by-default: only targeted semantic roles are changed.\n\n### 5.4.2 Preservation rules\n\nUpdate MUST preserve:\n\n- unrelated known roles,\n- unknown fields,\n- original date/datetime granularity for untouched fields.\n\n### 5.4.3 Example\n\nBefore:\n\n```yaml\ntitle: Weekly review\nscheduled: 2026-02-20\npriority: normal\ncustomClient: ACME\n```\n\nOperation: set priority to `high`.\n\nAfter:\n\n```yaml\ntitle: Weekly review\nscheduled: 2026-02-20\npriority: high\ncustomClient: ACME\n```\n\n### 5.4.4 Title updates and filename updates\n\nIf an update changes semantic `title`, behavior MUST follow `title.storage`:\n\n- `title.storage=filename`: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move.\n- `title.storage=frontmatter`: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested.\n\nIf implementation keeps frontmatter title for compatibility while `title.storage=filename`, it MUST keep stored title synchronized with effective filename-derived title.\n\n## 5.5 Complete (non-recurring)\n\nFor non-recurring tasks, complete MUST:\n\n1. Set `status` to a configured completed value, unless already completed.\n If multiple completed values are configured, implementation MUST choose deterministically (default: first entry in `status.completed_values`).\n2. Set `completed_date` to completion day:\n - explicit completion-day input when provided,\n - otherwise current local day in active runtime timezone (§5.2.1).\n3. Apply overwrite policy deterministically (`overwrite` or `preserve_if_present`).\n4. Update `date_modified` on state change.\n\nImplementations MUST document completion-day input handling and `completed_date` overwrite policy.\n\nOperation MUST be idempotent.\n\n## 5.6 Uncomplete (non-recurring)\n\nFor non-recurring tasks, uncomplete MUST:\n\n1. Set `status` to configured active/default status according to policy (default: `status.default`).\n2. Clear or retain `completed_date` according to policy.\n3. Update `date_modified` on state change.\n\nPolicy MUST be documented and deterministic.\n\nOperation MUST be idempotent.\n\n## 5.7 Complete instance (recurring)\n\nFor recurring tasks, complete with resolved target date `D` (§5.2.1) MUST follow §4.7.\n\nWriters MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it.\nWhen `recurrence_anchor=completion` and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime `DTSTART` rewrite behavior.\nWhen `recurrence_anchor=scheduled` and `DTSTART` is absent, implementations MUST insert `DTSTART` deterministically per §4.4.5.\nNext-occurrence recalculation in this mode MUST follow §4.4.4.\n\n## 5.8 Uncomplete instance (recurring)\n\nFor recurring tasks, uncomplete with resolved target date `D` (§5.2.1) MUST follow §4.8.\nFor `recurrence_anchor=completion`, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back `DTSTART`.\n\n## 5.9 Skip and unskip instance\n\nSkip/unskip for recurring tasks with resolved target date `D` (§5.2.1) MUST follow §4.9 and §4.10.\n\n## 5.10 Dependency operations\n\nDependency operations MUST follow §10.2.\n\n### 5.10.1 Add dependency\n\nAdd dependency MUST:\n\n- validate dependency entry schema,\n- parse and resolve `uid` per §11,\n- enforce duplicate and self-reference rules,\n- preserve existing non-target dependency entries,\n- update `date_modified` on change.\n\n### 5.10.2 Remove dependency\n\nRemove dependency by `uid` MUST be idempotent.\n\n### 5.10.3 Replace dependency list\n\nReplace dependency list MUST be explicit (not default patch behavior).\n\n## 5.11 Reminder operations\n\nReminder operations MUST follow §10.3.\n\n### 5.11.1 Add reminder\n\nAdd reminder MUST:\n\n- validate reminder schema,\n- enforce unique `id` within task,\n- update `date_modified` on change.\n\n### 5.11.2 Update reminder\n\nUpdate reminder MUST target a reminder by `id` and be patch-by-default.\n\n### 5.11.3 Remove reminder\n\nRemove reminder by `id` MUST be idempotent.\n\n## 5.12 Archive\n\nImplementations MAY support archive semantics through:\n\n- archive tag,\n- archive status,\n- dedicated boolean/archive field.\n\nArchive behavior MUST be documented.\n\nArchive MUST NOT implicitly delete the task.\n\n## 5.13 Delete\n\nDelete MUST remove the task file.\n\nOptional safety behavior:\n\n- Implementations MAY perform backlink/dependency checks.\n- If checks are enabled, implementation MUST provide a bypass option for explicit force delete.\n\n## 5.14 Rename\n\nRename operation changes file path/filename while preserving semantic record identity.\n\n### 5.14.1 Rename interaction with title storage mode\n\n- If `title.storage=filename`, basename changes from rename MUST update effective semantic title.\n- If `title.storage=frontmatter`, rename MUST NOT implicitly rewrite mapped `title` unless explicitly requested.\n- Implementations that persist frontmatter title in `title.storage=filename` mode MUST either update that field on rename or remove it to prevent divergence.\n- If semantic `id` is present, rename/move MUST preserve its value unchanged.\n\nIf implementation supports link/reference updating, it MUST:\n\n- update resolvable references deterministically,\n- report unresolved or ambiguous updates,\n- update dependency `uid` and `projects` references consistently with normal links.\n\nIf implementation does not support reference updates, this limitation MUST be disclosed in conformance claim.\n\n## 5.15 Batch operations\n\nBatch operations MAY be supported.\n\nIf supported, implementation MUST report per-item outcomes and summary counts:\n\n- total\n- succeeded\n- failed\n\nPartial success behavior MUST be documented.\n\n## 5.16 Concurrency\n\nImplementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash).\n\nWhen conflict is detected, operation MUST fail safely unless explicit overwrite is requested.\n\n## 5.17 Dry run\n\nIf dry run mode is supported, operation MUST:\n\n- execute validation and transformation logic,\n- report intended changes,\n- perform no file write.\n\n## 5.18 Error model\n\nImplementation-native operation failures MUST provide structured error information with:\n\n- operation name,\n- error code,\n- message,\n- optional field/path context.\n\nFor conformance adapter envelopes (§5.22), failures MAY be represented as a compact `error` string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via `error_details`).\n\n## 5.19 Time tracking management\n\nThis subsection applies to implementations that support `time_entries`.\n\n### 5.19.1 Start time tracking\n\nStart on task `T` MUST:\n\n- fail when `T` already has an active time entry,\n- append a new entry with canonical `startTime` and no `endTime`,\n- MAY set a default `description`,\n- update `date_modified`,\n- persist canonical `time_entries` shape (including removal of legacy/stale `duration` fields when normalizing).\n\nRecommended error code when already active: `time_tracking_already_active`.\n\n### 5.19.2 Stop time tracking\n\nStop on task `T` MUST:\n\n- fail when `T` has no active time entry,\n- set `endTime` on the active entry to canonical current datetime,\n- update `date_modified`,\n- preserve non-target entries and unknown frontmatter fields.\n\nRecommended error code when no active session exists: `no_active_time_entry`.\n\n### 5.19.3 Edit or replace time entries\n\nWhen replacing/editing `time_entries` explicitly, implementations MUST:\n\n- validate each entry per §2.6.1 and §3.11,\n- persist canonical datetime formats,\n- treat `duration` as derived compatibility input and SHOULD remove it from canonical writes,\n- update `date_modified` when persisted state changes.\n\n### 5.19.4 Remove a time entry\n\nRemove MUST target one deterministic entry (for example by index or stable selector) and update `date_modified` on change.\nSelector semantics MUST be documented.\n\n### 5.19.5 Completion-triggered auto-stop\n\nIf `time_tracking.auto_stop_on_complete=true` (§9.16), completion transitions MUST trigger stop behavior for the same task only.\n\nRules:\n\n- non-recurring tasks: trigger when status transitions from non-completed to completed status.\n- recurring tasks: trigger when `complete_instances` grows.\n- materialized occurrence notes: trigger on the occurrence note's own status transition to completed; parent reconciliation SHOULD NOT trigger a second stop on the parent unless the parent itself has an active time entry and the implementation documents that policy.\n- implementations MUST NOT stop active sessions on unrelated tasks.\n- if `time_tracking.auto_stop_notification=true`, implementations MAY emit a user-visible notice.\n\n### 5.19.6 Reporting tracked time\n\nFor reporting surfaces (for example task summaries or stats), implementations MUST document whether totals use `closed_minutes` or `live_minutes` semantics from §3.11.5.\n\n## 5.20 Recurrence materialization operations\n\nThis subsection is required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\n### 5.20.1 Materialize occurrence\n\nOperation: `materialize occurrence` for parent recurring task `P` and target date `D`.\n\nConforming behavior:\n\n1. Resolve `P` and confirm it is recurring.\n2. If an occurrence note for `(P, D)` already exists, return that note without creating a duplicate.\n3. Create a task note using `occurrence_template` when configured, otherwise using normal create behavior.\n4. Persist `recurrence_parent` as a link to `P` and `occurrence_date` as `D`.\n5. Set `scheduled` to `D` unless caller input or template output explicitly supplies another per-occurrence scheduled value.\n6. Set initial `status` using normal create defaults unless caller input or template output explicitly supplies a status.\n7. Preserve template/body output as occurrence-owned content after creation.\n8. Update `date_created` and `date_modified` according to create semantics.\n\nThe operation MUST be idempotent for `(P, D)`.\n\nIf `D` is not generated by the current recurrence rule, implementations MAY allow materialization as an explicit user action but SHOULD report `materialization_target_not_generated`.\n\n### 5.20.2 Complete materialized occurrence\n\nCompleting a materialized occurrence note MUST:\n\n1. Complete the occurrence note using normal non-recurring completion semantics (§5.5).\n2. Reconcile the parent by adding `D` to `complete_instances` and removing `D` from `skipped_instances`.\n3. If the parent has `recurrence_anchor=completion`, advance parent progression according to §4.4.3 and §4.4.4.\n4. If `occurrence_materialization=on_completion`, compute the next occurrence from the parent after the completion transition and materialize that next occurrence note idempotently.\n\nThe occurrence note's successful completion MUST NOT be rolled back solely because next-occurrence materialization fails.\nWhen the next note cannot be created, implementations SHOULD report `next_occurrence_materialization_failed`.\n\n### 5.20.3 Skip materialized occurrence\n\nSkipping a materialized occurrence note MUST preserve the note.\nSkip is a state transition, not deletion.\n\nConforming behavior:\n\n1. Set the occurrence note to the configured skipped status (`status.default_skipped`, or the first `status.skipped_values` entry when `default_skipped` is absent).\n2. Clear or retain `completed_date` according to the same documented policy used for uncompletion unless the implementation documents a skip-specific policy.\n3. Reconcile the parent by adding `D` to `skipped_instances` and removing `D` from `complete_instances`.\n4. If `occurrence_materialization=on_completion` and `occurrence_next_trigger=completion_or_skip`, compute and materialize the next occurrence note idempotently.\n\nIf no skipped status is configured, skip of a materialized occurrence MUST fail deterministically in strict mode and SHOULD report `missing_skipped_status`.\n\n### 5.20.4 Uncomplete and unskip materialized occurrence\n\nUncomplete of a materialized occurrence note MUST:\n\n1. Reopen the occurrence note using normal uncomplete semantics (§5.6).\n2. Remove `D` from parent `complete_instances`.\n3. For `recurrence_anchor=completion`, MUST NOT roll back parent `DTSTART`, matching §4.8.\n4. MUST NOT delete any later materialized occurrence note.\n\nUnskip of a materialized occurrence note MUST:\n\n1. Reopen the occurrence note to configured active/default status.\n2. Remove `D` from parent `skipped_instances`.\n3. MUST NOT add `D` to parent `complete_instances` implicitly.\n4. MUST NOT delete any later materialized occurrence note.\n\n### 5.20.5 Delete and unmaterialize occurrence\n\nDeleting a materialized occurrence note removes the task file and MUST NOT be interpreted as skip.\n\nImplementations MAY provide an explicit `unmaterialize occurrence` operation.\nIf supported, it MUST document whether parent state is preserved, cleared, or reconciled.\nIn all cases, deleting or unmaterializing an occurrence MUST NOT silently delete the parent recurring task.\n\nIf parent instance lists still refer to a deleted occurrence note's date, validators MAY report an orphan/cache warning such as `orphan_occurrence_note`.\n\n## 5.21 Operation examples\n\n### 5.21.1 Non-recurring complete\n\nBefore:\n\n```yaml\ntitle: Buy groceries\nstatus: open\ncompletedDate:\ndateModified: 2026-02-20T09:00:00Z\n```\n\nAfter complete on `2026-02-20`:\n\n```yaml\ntitle: Buy groceries\nstatus: done\ncompletedDate: 2026-02-20\ndateModified: 2026-02-20T09:05:00Z\n```\n\n### 5.21.2 Recurring complete instance\n\nBefore:\n\n```yaml\ntitle: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: []\nskippedInstances: []\ndateModified: 2026-02-20T08:00:00Z\n```\n\nAfter complete instance on `2026-02-20`:\n\n```yaml\ntitle: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: [2026-02-20]\nskippedInstances: []\ndateModified: 2026-02-20T08:10:00Z\n```\n\n### 5.21.3 Recurring skip instance overriding completion\n\nBefore:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n```\n\nAfter skip `2026-02-20`:\n\n```yaml\ncompleteInstances: []\nskippedInstances: [2026-02-20]\n```\n\n### 5.21.4 Preserve unknown fields on update\n\nBefore:\n\n```yaml\ntitle: Plan Q2\nstatus: open\nvendorTicket: ZX-42\n```\n\nUpdate status to `in-progress`.\n\nAfter:\n\n```yaml\ntitle: Plan Q2\nstatus: in-progress\nvendorTicket: ZX-42\n```\n\n### 5.21.5 Add dependency\n\nBefore:\n\n```yaml\nblockedBy: []\n```\n\nAdd dependency:\n\n```yaml\nuid: \"[[prepare-metrics]]\"\nreltype: FINISHTOSTART\n```\n\nAfter:\n\n```yaml\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n```\n\n### 5.21.6 Add reminder\n\nBefore:\n\n```yaml\nreminders: []\n```\n\nAdd reminder:\n\n```yaml\nid: due_minus_1h\ntype: relative\nrelatedTo: due\noffset: -PT1H\n```\n\nAfter:\n\n```yaml\nreminders:\n - id: due_minus_1h\n type: relative\n relatedTo: due\n offset: -PT1H\n```\n\n## 5.22 Conformance operation interface\n\nThe conformance suite exercises operations via the `execute(operation, input) → envelope` interface defined in the adapter contract. This section specifies the input/output contracts for each conformance-testable operation name.\n\nUnless otherwise noted, all operations return `{ ok: true, result: {...} }` on success and `{ ok: false, error: \"...\" }` on failure. Adapters MAY additionally return `error_details` with structured fields from §5.18.\n\n### General operations\n\n#### `op.mutate_with_validation`\n\nTests §5.2 rule 1: validation runs before commit.\n\nInput:\n```json\n{ \"strict\": true, \"frontmatter\": { ... } }\n```\n\nBehavior: validate `frontmatter` as a task record. In strict mode (`strict=true`), any validation error MUST produce `ok=false`.\n\nOutput on validation error:\n```json\n{ \"ok\": false, \"error\": \"validation|invalid_type|...\" }\n```\n\n---\n\n#### `op.atomic_write`\n\nTests §5.2 rule 2: writes are all-or-nothing.\n\nInput:\n```json\n{\n \"original\": { ... },\n \"patch\": { ... },\n \"simulateFailureAfterWrite\": true\n}\n```\n\nBehavior: apply `patch` to `original`, then simulate a post-write failure. The adapter MUST report whether the write was committed and what state the record is in after recovery.\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"committed\": false,\n \"persisted\": { ... }\n }\n}\n```\n\n`committed=false` means the write was rolled back. `persisted` reflects the actual frontmatter after recovery — it MUST match `original` (not the patched version) when `simulateFailureAfterWrite=true`.\n\n---\n\n#### `op.idempotency_check`\n\nTests §5.2 rule 5: operations are safe under repetition.\n\nInput:\n```json\n{\n \"operation\": \"complete_nonrecurring\",\n \"first\": { \"status\": \"open\", \"completedDate\": null },\n \"second\": { \"status\": \"done\", \"completedDate\": \"2026-02-20\" }\n}\n```\n\nBehavior: applying the named operation to `first` state and then again to `second` state MUST produce identical persisted results (including unchanged `dateModified` on the second no-op application). The adapter checks whether this holds.\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"idempotent\": true } }\n```\n\n---\n\n#### `op.update_patch`\n\nTests §5.4 patch semantics and unknown-field preservation.\n\nInput:\n```json\n{\n \"original\": { \"title\": \"...\", \"vendorTicket\": \"ZX-42\", ... },\n \"patch\": { \"priority\": \"high\" },\n \"changed\": true\n}\n```\n\nBehavior: apply `patch` to `original`. Return the merged frontmatter.\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"changed\": true,\n \"frontmatter\": { \"title\": \"...\", \"priority\": \"high\", \"vendorTicket\": \"ZX-42\", ... }\n }\n}\n```\n\n- `changed` indicates whether any field actually changed value.\n- `frontmatter` MUST include all unknown fields from `original` unchanged.\n\n---\n\n#### `op.complete_nonrecurring`\n\nTests §5.5 non-recurring completion.\n\nInput:\n```json\n{\n \"frontmatter\": { \"title\": \"...\", \"status\": \"open\" },\n \"completedValues\": [\"done\", \"cancelled\"],\n \"explicitDate\": \"2026-02-20\"\n}\n```\n\nBehavior: apply a complete operation to `frontmatter` using `completedValues` (ordered list) and `explicitDate` as the completion day (omit to use current local day).\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"status\": \"done\", \"completedDate\": \"2026-02-20\" } }\n```\n\n- `status` MUST be the first entry in `completedValues`.\n- `completedDate` MUST be `explicitDate` if provided; otherwise a valid `YYYY-MM-DD` date.\n- If `frontmatter.status` is already a completed value, the operation MUST still succeed (idempotent).\n\n---\n\n#### `op.uncomplete_nonrecurring`\n\nTests §5.6 non-recurring uncompletion.\n\nInput:\n```json\n{\n \"frontmatter\": { \"title\": \"...\", \"status\": \"done\", \"completedDate\": \"2026-02-20\" },\n \"defaultStatus\": \"open\",\n \"clearCompletedDate\": true\n}\n```\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"status\": \"open\", \"completedDate\": null } }\n```\n\n- `status` MUST be `defaultStatus`.\n- If `clearCompletedDate=true`, `completedDate` MUST be `null` in the result.\n- If `clearCompletedDate=false`, `completedDate` MUST be preserved.\n\n---\n\n#### `op.error_shape`\n\nTests §5.18 error model.\n\nInput:\n```json\n{ \"operation\": \"update\", \"code\": \"invalid_type\", \"message\": \"bad value\", \"field\": \"status\" }\n```\n\nBehavior: construct and return a structured error object.\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"operation\": \"update\",\n \"code\": \"invalid_type\",\n \"message\": \"...\"\n }\n}\n```\n\nThe `message` field MUST be a non-empty string. The `operation` and `code` fields MUST match the input.\n\n---\n\n#### `op.detect_conflict`\n\nTests §5.16 write-conflict detection.\n\nInput:\n```json\n{ \"expectedVersion\": \"a\", \"actualVersion\": \"b\", \"overwrite\": false }\n```\n\nBehavior: when `expectedVersion != actualVersion` and `overwrite=false`, the operation MUST fail.\n\nOutput on conflict:\n```json\n{ \"ok\": false, \"error\": \"conflict|write_conflict|...\" }\n```\n\n---\n\n#### `op.dry_run`\n\nTests §5.17 dry-run mode.\n\nInput:\n```json\n{ \"operation\": \"update\", \"patch\": { \"status\": \"done\" } }\n```\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"wrote\": false,\n \"plannedChanges\": [\"status\", ...]\n }\n}\n```\n\n`wrote` MUST be `false`. `plannedChanges` MUST list the field names that would have changed.\n\n---\n\n### Recurrence operations\n\nFor `recurrence.complete`, `recurrence.uncomplete_instance`, `recurrence.skip_instance`, `recurrence.unskip_instance`, and `recurrence.effective_state`, the input and output contracts are defined by the respective sections of §4 and §5.7–5.9.\n\nCommon input fields for recurrence operations:\n- `targetDate` or `completionDate`: `YYYY-MM-DD` target day\n- `completeInstances`: current list of completed dates\n- `skippedInstances`: current list of skipped dates\n\n`recurrence.effective_state` output:\n```json\n{ \"ok\": true, \"result\": { \"value\": \"completed|skipped|open\" } }\n```\n\n---\n\n### Materialized occurrence operations\n\nFor `occurrence.materialize`, `occurrence.complete`, `occurrence.skip`, `occurrence.uncomplete`, `occurrence.unskip`, and `occurrence.unmaterialize`, input and output contracts are defined by §4.18 and §5.20.\n\nCommon input fields for materialized occurrence operations:\n- `parent`: frontmatter/path/link object for the recurring parent task\n- `occurrence`: frontmatter/path/link object for an existing occurrence note when applicable\n- `targetDate`: `YYYY-MM-DD` target day\n- `config`: effective occurrence/status configuration needed by the operation\n\n`occurrence.materialize` output:\n```json\n{ \"ok\": true, \"result\": { \"created\": true, \"occurrence\": { \"...\": \"...\" } } }\n```\n\n`created` MUST be `false` when the operation returns an already-existing occurrence note for the same parent/date.\n\n---\n\n### Time-tracking operations\n\nFor `time.start`, `time.stop`, `time.replace_entries`, `time.remove_entry`, `time.auto_stop_on_complete`, and `time.report_totals`, the contracts are defined by §5.19.\n\nCommon input patterns:\n- `entries`: current `time_entries` array\n- `now`: ISO 8601 datetime representing current instant\n- `dateModified`: current `date_modified` value\n\n`time.report_totals` output:\n```json\n{ \"ok\": true, \"result\": { \"closed_minutes\": N, \"live_minutes\": M } }\n```\n\n`live_minutes` is only present when an active (no `endTime`) entry exists.\n","aliases":["/spec/05-operations/"],"toc":[{"level":2,"id":"51-purpose","text":"5.1 Purpose"},{"level":2,"id":"52-general-operation-rules","text":"5.2 General operation rules"},{"level":3,"id":"521-target-daydate-resolution","text":"5.2.1 Target day/date resolution"},{"level":3,"id":"522-idempotency-and-datemodified","text":"5.2.2 Idempotency and date_modified"},{"level":2,"id":"53-create","text":"5.3 Create"},{"level":3,"id":"531-input-requirements","text":"5.3.1 Input requirements"},{"level":3,"id":"532-required-behavior","text":"5.3.2 Required behavior"},{"level":3,"id":"533-title-and-filename-resolution-on-create","text":"5.3.3 Title and filename resolution on create"},{"level":3,"id":"534-example","text":"5.3.4 Example"},{"level":3,"id":"535-optional-create-time-templating","text":"5.3.5 Optional create-time templating"},{"level":3,"id":"536-identity-handling-on-create","text":"5.3.6 Identity handling on create"},{"level":2,"id":"54-update","text":"5.4 Update"},{"level":3,"id":"541-patch-semantics","text":"5.4.1 Patch semantics"},{"level":3,"id":"542-preservation-rules","text":"5.4.2 Preservation rules"},{"level":3,"id":"543-example","text":"5.4.3 Example"},{"level":3,"id":"544-title-updates-and-filename-updates","text":"5.4.4 Title updates and filename updates"},{"level":2,"id":"55-complete-non-recurring","text":"5.5 Complete (non-recurring)"},{"level":2,"id":"56-uncomplete-non-recurring","text":"5.6 Uncomplete (non-recurring)"},{"level":2,"id":"57-complete-instance-recurring","text":"5.7 Complete instance (recurring)"},{"level":2,"id":"58-uncomplete-instance-recurring","text":"5.8 Uncomplete instance (recurring)"},{"level":2,"id":"59-skip-and-unskip-instance","text":"5.9 Skip and unskip instance"},{"level":2,"id":"510-dependency-operations","text":"5.10 Dependency operations"},{"level":3,"id":"5101-add-dependency","text":"5.10.1 Add dependency"},{"level":3,"id":"5102-remove-dependency","text":"5.10.2 Remove dependency"},{"level":3,"id":"5103-replace-dependency-list","text":"5.10.3 Replace dependency list"},{"level":2,"id":"511-reminder-operations","text":"5.11 Reminder operations"},{"level":3,"id":"5111-add-reminder","text":"5.11.1 Add reminder"},{"level":3,"id":"5112-update-reminder","text":"5.11.2 Update reminder"},{"level":3,"id":"5113-remove-reminder","text":"5.11.3 Remove reminder"},{"level":2,"id":"512-archive","text":"5.12 Archive"},{"level":2,"id":"513-delete","text":"5.13 Delete"},{"level":2,"id":"514-rename","text":"5.14 Rename"},{"level":3,"id":"5141-rename-interaction-with-title-storage-mode","text":"5.14.1 Rename interaction with title storage mode"},{"level":2,"id":"515-batch-operations","text":"5.15 Batch operations"},{"level":2,"id":"516-concurrency","text":"5.16 Concurrency"},{"level":2,"id":"517-dry-run","text":"5.17 Dry run"},{"level":2,"id":"518-error-model","text":"5.18 Error model"},{"level":2,"id":"519-time-tracking-management","text":"5.19 Time tracking management"},{"level":3,"id":"5191-start-time-tracking","text":"5.19.1 Start time tracking"},{"level":3,"id":"5192-stop-time-tracking","text":"5.19.2 Stop time tracking"},{"level":3,"id":"5193-edit-or-replace-time-entries","text":"5.19.3 Edit or replace time entries"},{"level":3,"id":"5194-remove-a-time-entry","text":"5.19.4 Remove a time entry"},{"level":3,"id":"5195-completion-triggered-auto-stop","text":"5.19.5 Completion-triggered auto-stop"},{"level":3,"id":"5196-reporting-tracked-time","text":"5.19.6 Reporting tracked time"},{"level":2,"id":"520-recurrence-materialization-operations","text":"5.20 Recurrence materialization operations"},{"level":3,"id":"5201-materialize-occurrence","text":"5.20.1 Materialize occurrence"},{"level":3,"id":"5202-complete-materialized-occurrence","text":"5.20.2 Complete materialized occurrence"},{"level":3,"id":"5203-skip-materialized-occurrence","text":"5.20.3 Skip materialized occurrence"},{"level":3,"id":"5204-uncomplete-and-unskip-materialized-occurrence","text":"5.20.4 Uncomplete and unskip materialized occurrence"},{"level":3,"id":"5205-delete-and-unmaterialize-occurrence","text":"5.20.5 Delete and unmaterialize occurrence"},{"level":2,"id":"521-operation-examples","text":"5.21 Operation examples"},{"level":3,"id":"5211-non-recurring-complete","text":"5.21.1 Non-recurring complete"},{"level":3,"id":"5212-recurring-complete-instance","text":"5.21.2 Recurring complete instance"},{"level":3,"id":"5213-recurring-skip-instance-overriding-completion","text":"5.21.3 Recurring skip instance overriding completion"},{"level":3,"id":"5214-preserve-unknown-fields-on-update","text":"5.21.4 Preserve unknown fields on update"},{"level":3,"id":"5215-add-dependency","text":"5.21.5 Add dependency"},{"level":3,"id":"5216-add-reminder","text":"5.21.6 Add reminder"},{"level":2,"id":"522-conformance-operation-interface","text":"5.22 Conformance operation interface"},{"level":3,"id":"general-operations","text":"General operations"},{"level":3,"id":"recurrence-operations","text":"Recurrence operations"},{"level":3,"id":"materialized-occurrence-operations","text":"Materialized occurrence operations"},{"level":3,"id":"time-tracking-operations","text":"Time-tracking operations"}],"html":"

5.1 Purpose#

\n

This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.

\n

5.2 General operation rules#

\n

For all mutating operations:

\n
    \n
  1. Validation MUST run before commit in strict mode.
  2. \n
  3. Writes MUST be atomic at file level (all-or-nothing per file).
  4. \n
  5. date_modified MUST be updated on successful state change.
  6. \n
  7. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations.
  8. \n
  9. Operations identified as idempotent MUST remain safe under repetition.
  10. \n
\n

5.2.1 Target day/date resolution#

\n

Recurring instance operations act on a target day/date (complete instance, uncomplete instance, skip, unskip).\nNon-recurring complete uses completion-day semantics for completed_date.

\n

Resolution MUST be deterministic:

\n
    \n
  1. If caller provides an explicit target date/datetime, that value is authoritative.
  2. \n
  3. If caller omits target for recurring instance operations, implementations MUST resolve in this order:
      \n
    • task scheduled, if present and target-day-resolvable,
    • \n
    • else task due, if present and target-day-resolvable,
    • \n
    • else current local day in active runtime timezone (§3.6).
    • \n
    \n
  4. \n
  5. Target-day resolution for fallback task fields (scheduled / due) MUST use this extraction policy:
      \n
    • if stored value is canonical date (YYYY-MM-DD), use it as-is;
    • \n
    • if stored value is datetime, use the literal date token before T (YYYY-MM-DD) without timezone shifting;
    • \n
    • if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning;
    • \n
    • if a candidate value is unusable, continue to the next fallback source.
    • \n
    \n
  6. \n
  7. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone.
  8. \n
\n

When an explicit target is datetime:

\n
    \n
  • operations that require day semantics MUST use its calendar date part in active runtime timezone,
  • \n
  • for recurring complete instance with recurrence_anchor=completion, the same explicit datetime target MUST also drive DTSTART rewrite semantics in §4.4.3.
  • \n
\n

This explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above.

\n

5.2.2 Idempotency and date_modified#

\n

For operations marked idempotent:

\n
    \n
  • first application MAY change state and date_modified,
  • \n
  • repeated application with semantically equivalent input MUST leave persisted state unchanged.
  • \n
\n

When a repeated idempotent operation is a no-op, date_modified MUST remain unchanged.

\n

5.3 Create#

\n

5.3.1 Input requirements#

\n

Create MUST provide at minimum semantic roles required by §2, directly or via defaults.

\n

5.3.2 Required behavior#

\n

Create MUST:

\n
    \n
  • apply default values,
  • \n
  • generate date_created and date_modified when absent,
  • \n
  • resolve semantic title and filename/path behavior according to §9.13,
  • \n
  • apply create-time templating when enabled and supported (§5.3.5, §9.14, §7),
  • \n
  • serialize canonical keys and canonical temporal formats,
  • \n
  • when recurrence is present, canonicalize DTSTART per §4.4.5,
  • \n
  • preserve caller-provided semantic id when present,
  • \n
  • fail with validation errors if required constraints are unmet,
  • \n
  • apply default reminders according to §10.3.9 when configured.
  • \n
\n

5.3.3 Title and filename resolution on create#

\n

Create MUST produce a deterministic initial filename/path.

\n

Rules:

\n
    \n
  • Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames.
  • \n
  • If title.storage=filename:
      \n
    • basename MUST derive from semantic title,
    • \n
    • title changes after create are handled by update semantics (§5.4.4),
    • \n
    • implementations MAY also persist mapped title as a synchronized compatibility mirror,
    • \n
    • title.filename_format and title.custom_filename_template MUST be ignored.
    • \n
    \n
  • \n
  • If title.storage=frontmatter, create-time basename MUST follow title.filename_format:
      \n
    • title: sanitized semantic title,
    • \n
    • zettel: implementation-defined zettel pattern (MUST be documented),
    • \n
    • timestamp: implementation-defined timestamp pattern (MUST be documented),
    • \n
    • custom: title.custom_filename_template expansion.
    • \n
    \n
  • \n
  • If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing).
  • \n
\n

5.3.4 Example#

\n

Input intent:

\n
title: "Pay electricity bill"\n

Assume defaults:

\n
    \n
  • status default open
  • \n
  • priority default normal
  • \n
\n

Persisted frontmatter (example):

\n
title: Pay electricity bill\nstatus: open\npriority: normal\ndateCreated: 2026-02-20T14:00:00Z\ndateModified: 2026-02-20T14:00:00Z\n

5.3.5 Optional create-time templating#

\n

This subsection is required only for implementations claiming profile templating (§7.3.3).

\n

Create-time templating pipeline MUST be deterministic:

\n
    \n
  1. Compute base create payload from explicit input, defaults (§9.8), and generated/system values (date_created, date_modified, resolved title policy).
  2. \n
  3. Expand template variables using that base payload and active runtime date/time context.
  4. \n
  5. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict).
  6. \n
  7. Resolve body output:
      \n
    • if expanded template body is non-empty, use it;
    • \n
    • otherwise use caller-provided body/details (if any).
    • \n
    \n
  8. \n
\n

Template parse rules:

\n
    \n
  • If template content begins with ---, implementations MUST treat the first --- ... --- block as template frontmatter and the remainder as template body.
  • \n
  • Frontmatter variable expansion MUST run before YAML parsing of template frontmatter.
  • \n
\n

Portable variable support:

\n

Implementations claiming templating MUST support all variables in the Required column of the table below. Implementations MAY support any variable in the Extended column.

\n

Required task-data variables:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableValueFormat / separator
{{title}}Semantic titlestring; YAML-quoted if needed
{{status}}Task status valuestring
{{priority}}Task priority valuestring
{{dueDate}}Due date if setYYYY-MM-DD or empty
{{scheduledDate}}Scheduled date if setYYYY-MM-DD or empty
{{details}}Caller-provided body/descriptionstring
{{contexts}}Contexts listcomma-separated, e.g. "work, home"
{{tags}}Tags listcomma-separated, e.g. "task, errands"
{{hashtags}}Tags list as hashtagsspace-separated, e.g. "#task #errands"
{{timeEstimate}}Time estimate in minutesinteger string or empty
{{parentNote}}Parent note name/pathstring; YAML-quoted if needed
\n

Required date/time variables (expansion time):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableValueFormat
{{date}}Current dateyyyy-MM-dd
{{time}}Current time (24h)HH:mm
{{year}}Full yearyyyy
{{month}}Month numberMM
{{day}}Day of monthdd
\n

Extended variables (optional):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableValueFormat
{{dateTime}}Date + timeyyyy-MM-dd-HHmm
{{timestamp}}Full timestampyyyy-MM-dd-HHmmss
{{shortDate}}Short dateyyMMdd
{{shortYear}}Two-digit yearyy
{{monthName}}Month full namee.g. February
{{monthNameShort}}Month short namee.g. Feb
{{dayName}}Weekday full namee.g. Monday
{{dayNameShort}}Weekday short namee.g. Mon
{{week}}ISO week numberww
{{quarter}}Quarter number1–4
{{hour}}Hour (24h)HH
{{minute}}Minutemm
{{second}}Secondss
{{time12}}Time with AM/PMhh:mm a
{{time24}}Time (24h)HH:mm
{{timezone}}UTC offset longe.g. +05:30
{{utcOffset}}UTC offset longe.g. +05:30
{{unix}}Unix timestamp (seconds)integer string
{{unixMs}}Unix timestamp (ms)integer string
{{zettel}}Zettelkasten IDdate + seconds-since-midnight base-36
{{titleLower}}Title lowercasestring
{{titleUpper}}Title uppercasestring
{{titleSnake}}Title snake_casestring
{{titleKebab}}Title kebab-casestring
{{titleCamel}}Title camelCasestring
{{titlePascal}}Title PascalCasestring
{{priorityShort}}First letter of priorityuppercase char
{{statusShort}}First letter of statusuppercase char
\n

Unknown variables (not in the above lists) MUST be handled per templating.unknown_variable_policy (§9.14):

\n
    \n
  • preserve: leave the {{...}} placeholder as-is.
  • \n
  • empty: replace with an empty string.
  • \n
\n

Deterministic expansion context:

\n
    \n
  • date/time variable expansion MUST use the active runtime timezone from §3.6.
  • \n
  • locale-sensitive variables (monthName, monthNameShort, dayName, dayNameShort, time12) MUST use English locale outputs for portability (January, Jan, Monday, Mon, AM/PM).
  • \n
  • template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2).
  • \n
\n

Failure behavior:

\n
    \n
  • templating.failure_mode=error: template read/parse failures MUST abort create.
  • \n
  • templating.failure_mode=warning_fallback: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (template_missing or template_parse_failed).
  • \n
\n

5.3.6 Identity handling on create#

\n

If semantic id is provided on create, writers MUST preserve it.\nIf implementation supports auto-generation of semantic id, generation policy MUST be documented and resulting id MUST remain stable after create.

\n

5.4 Update#

\n

5.4.1 Patch semantics#

\n

Update MUST be patch-by-default: only targeted semantic roles are changed.

\n

5.4.2 Preservation rules#

\n

Update MUST preserve:

\n
    \n
  • unrelated known roles,
  • \n
  • unknown fields,
  • \n
  • original date/datetime granularity for untouched fields.
  • \n
\n

5.4.3 Example#

\n

Before:

\n
title: Weekly review\nscheduled: 2026-02-20\npriority: normal\ncustomClient: ACME\n

Operation: set priority to high.

\n

After:

\n
title: Weekly review\nscheduled: 2026-02-20\npriority: high\ncustomClient: ACME\n

5.4.4 Title updates and filename updates#

\n

If an update changes semantic title, behavior MUST follow title.storage:

\n
    \n
  • title.storage=filename: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move.
  • \n
  • title.storage=frontmatter: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested.
  • \n
\n

If implementation keeps frontmatter title for compatibility while title.storage=filename, it MUST keep stored title synchronized with effective filename-derived title.

\n

5.5 Complete (non-recurring)#

\n

For non-recurring tasks, complete MUST:

\n
    \n
  1. Set status to a configured completed value, unless already completed.\nIf multiple completed values are configured, implementation MUST choose deterministically (default: first entry in status.completed_values).
  2. \n
  3. Set completed_date to completion day:
      \n
    • explicit completion-day input when provided,
    • \n
    • otherwise current local day in active runtime timezone (§5.2.1).
    • \n
    \n
  4. \n
  5. Apply overwrite policy deterministically (overwrite or preserve_if_present).
  6. \n
  7. Update date_modified on state change.
  8. \n
\n

Implementations MUST document completion-day input handling and completed_date overwrite policy.

\n

Operation MUST be idempotent.

\n

5.6 Uncomplete (non-recurring)#

\n

For non-recurring tasks, uncomplete MUST:

\n
    \n
  1. Set status to configured active/default status according to policy (default: status.default).
  2. \n
  3. Clear or retain completed_date according to policy.
  4. \n
  5. Update date_modified on state change.
  6. \n
\n

Policy MUST be documented and deterministic.

\n

Operation MUST be idempotent.

\n

5.7 Complete instance (recurring)#

\n

For recurring tasks, complete with resolved target date D (§5.2.1) MUST follow §4.7.

\n

Writers MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it.\nWhen recurrence_anchor=completion and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime DTSTART rewrite behavior.\nWhen recurrence_anchor=scheduled and DTSTART is absent, implementations MUST insert DTSTART deterministically per §4.4.5.\nNext-occurrence recalculation in this mode MUST follow §4.4.4.

\n

5.8 Uncomplete instance (recurring)#

\n

For recurring tasks, uncomplete with resolved target date D (§5.2.1) MUST follow §4.8.\nFor recurrence_anchor=completion, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back DTSTART.

\n

5.9 Skip and unskip instance#

\n

Skip/unskip for recurring tasks with resolved target date D (§5.2.1) MUST follow §4.9 and §4.10.

\n

5.10 Dependency operations#

\n

Dependency operations MUST follow §10.2.

\n

5.10.1 Add dependency#

\n

Add dependency MUST:

\n
    \n
  • validate dependency entry schema,
  • \n
  • parse and resolve uid per §11,
  • \n
  • enforce duplicate and self-reference rules,
  • \n
  • preserve existing non-target dependency entries,
  • \n
  • update date_modified on change.
  • \n
\n

5.10.2 Remove dependency#

\n

Remove dependency by uid MUST be idempotent.

\n

5.10.3 Replace dependency list#

\n

Replace dependency list MUST be explicit (not default patch behavior).

\n

5.11 Reminder operations#

\n

Reminder operations MUST follow §10.3.

\n

5.11.1 Add reminder#

\n

Add reminder MUST:

\n
    \n
  • validate reminder schema,
  • \n
  • enforce unique id within task,
  • \n
  • update date_modified on change.
  • \n
\n

5.11.2 Update reminder#

\n

Update reminder MUST target a reminder by id and be patch-by-default.

\n

5.11.3 Remove reminder#

\n

Remove reminder by id MUST be idempotent.

\n

5.12 Archive#

\n

Implementations MAY support archive semantics through:

\n
    \n
  • archive tag,
  • \n
  • archive status,
  • \n
  • dedicated boolean/archive field.
  • \n
\n

Archive behavior MUST be documented.

\n

Archive MUST NOT implicitly delete the task.

\n

5.13 Delete#

\n

Delete MUST remove the task file.

\n

Optional safety behavior:

\n
    \n
  • Implementations MAY perform backlink/dependency checks.
  • \n
  • If checks are enabled, implementation MUST provide a bypass option for explicit force delete.
  • \n
\n

5.14 Rename#

\n

Rename operation changes file path/filename while preserving semantic record identity.

\n

5.14.1 Rename interaction with title storage mode#

\n
    \n
  • If title.storage=filename, basename changes from rename MUST update effective semantic title.
  • \n
  • If title.storage=frontmatter, rename MUST NOT implicitly rewrite mapped title unless explicitly requested.
  • \n
  • Implementations that persist frontmatter title in title.storage=filename mode MUST either update that field on rename or remove it to prevent divergence.
  • \n
  • If semantic id is present, rename/move MUST preserve its value unchanged.
  • \n
\n

If implementation supports link/reference updating, it MUST:

\n
    \n
  • update resolvable references deterministically,
  • \n
  • report unresolved or ambiguous updates,
  • \n
  • update dependency uid and projects references consistently with normal links.
  • \n
\n

If implementation does not support reference updates, this limitation MUST be disclosed in conformance claim.

\n

5.15 Batch operations#

\n

Batch operations MAY be supported.

\n

If supported, implementation MUST report per-item outcomes and summary counts:

\n
    \n
  • total
  • \n
  • succeeded
  • \n
  • failed
  • \n
\n

Partial success behavior MUST be documented.

\n

5.16 Concurrency#

\n

Implementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash).

\n

When conflict is detected, operation MUST fail safely unless explicit overwrite is requested.

\n

5.17 Dry run#

\n

If dry run mode is supported, operation MUST:

\n
    \n
  • execute validation and transformation logic,
  • \n
  • report intended changes,
  • \n
  • perform no file write.
  • \n
\n

5.18 Error model#

\n

Implementation-native operation failures MUST provide structured error information with:

\n
    \n
  • operation name,
  • \n
  • error code,
  • \n
  • message,
  • \n
  • optional field/path context.
  • \n
\n

For conformance adapter envelopes (§5.22), failures MAY be represented as a compact error string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via error_details).

\n

5.19 Time tracking management#

\n

This subsection applies to implementations that support time_entries.

\n

5.19.1 Start time tracking#

\n

Start on task T MUST:

\n
    \n
  • fail when T already has an active time entry,
  • \n
  • append a new entry with canonical startTime and no endTime,
  • \n
  • MAY set a default description,
  • \n
  • update date_modified,
  • \n
  • persist canonical time_entries shape (including removal of legacy/stale duration fields when normalizing).
  • \n
\n

Recommended error code when already active: time_tracking_already_active.

\n

5.19.2 Stop time tracking#

\n

Stop on task T MUST:

\n
    \n
  • fail when T has no active time entry,
  • \n
  • set endTime on the active entry to canonical current datetime,
  • \n
  • update date_modified,
  • \n
  • preserve non-target entries and unknown frontmatter fields.
  • \n
\n

Recommended error code when no active session exists: no_active_time_entry.

\n

5.19.3 Edit or replace time entries#

\n

When replacing/editing time_entries explicitly, implementations MUST:

\n
    \n
  • validate each entry per §2.6.1 and §3.11,
  • \n
  • persist canonical datetime formats,
  • \n
  • treat duration as derived compatibility input and SHOULD remove it from canonical writes,
  • \n
  • update date_modified when persisted state changes.
  • \n
\n

5.19.4 Remove a time entry#

\n

Remove MUST target one deterministic entry (for example by index or stable selector) and update date_modified on change.\nSelector semantics MUST be documented.

\n

5.19.5 Completion-triggered auto-stop#

\n

If time_tracking.auto_stop_on_complete=true (§9.16), completion transitions MUST trigger stop behavior for the same task only.

\n

Rules:

\n
    \n
  • non-recurring tasks: trigger when status transitions from non-completed to completed status.
  • \n
  • recurring tasks: trigger when complete_instances grows.
  • \n
  • materialized occurrence notes: trigger on the occurrence note's own status transition to completed; parent reconciliation SHOULD NOT trigger a second stop on the parent unless the parent itself has an active time entry and the implementation documents that policy.
  • \n
  • implementations MUST NOT stop active sessions on unrelated tasks.
  • \n
  • if time_tracking.auto_stop_notification=true, implementations MAY emit a user-visible notice.
  • \n
\n

5.19.6 Reporting tracked time#

\n

For reporting surfaces (for example task summaries or stats), implementations MUST document whether totals use closed_minutes or live_minutes semantics from §3.11.5.

\n

5.20 Recurrence materialization operations#

\n

This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

5.20.1 Materialize occurrence#

\n

Operation: materialize occurrence for parent recurring task P and target date D.

\n

Conforming behavior:

\n
    \n
  1. Resolve P and confirm it is recurring.
  2. \n
  3. If an occurrence note for (P, D) already exists, return that note without creating a duplicate.
  4. \n
  5. Create a task note using occurrence_template when configured, otherwise using normal create behavior.
  6. \n
  7. Persist recurrence_parent as a link to P and occurrence_date as D.
  8. \n
  9. Set scheduled to D unless caller input or template output explicitly supplies another per-occurrence scheduled value.
  10. \n
  11. Set initial status using normal create defaults unless caller input or template output explicitly supplies a status.
  12. \n
  13. Preserve template/body output as occurrence-owned content after creation.
  14. \n
  15. Update date_created and date_modified according to create semantics.
  16. \n
\n

The operation MUST be idempotent for (P, D).

\n

If D is not generated by the current recurrence rule, implementations MAY allow materialization as an explicit user action but SHOULD report materialization_target_not_generated.

\n

5.20.2 Complete materialized occurrence#

\n

Completing a materialized occurrence note MUST:

\n
    \n
  1. Complete the occurrence note using normal non-recurring completion semantics (§5.5).
  2. \n
  3. Reconcile the parent by adding D to complete_instances and removing D from skipped_instances.
  4. \n
  5. If the parent has recurrence_anchor=completion, advance parent progression according to §4.4.3 and §4.4.4.
  6. \n
  7. If occurrence_materialization=on_completion, compute the next occurrence from the parent after the completion transition and materialize that next occurrence note idempotently.
  8. \n
\n

The occurrence note's successful completion MUST NOT be rolled back solely because next-occurrence materialization fails.\nWhen the next note cannot be created, implementations SHOULD report next_occurrence_materialization_failed.

\n

5.20.3 Skip materialized occurrence#

\n

Skipping a materialized occurrence note MUST preserve the note.\nSkip is a state transition, not deletion.

\n

Conforming behavior:

\n
    \n
  1. Set the occurrence note to the configured skipped status (status.default_skipped, or the first status.skipped_values entry when default_skipped is absent).
  2. \n
  3. Clear or retain completed_date according to the same documented policy used for uncompletion unless the implementation documents a skip-specific policy.
  4. \n
  5. Reconcile the parent by adding D to skipped_instances and removing D from complete_instances.
  6. \n
  7. If occurrence_materialization=on_completion and occurrence_next_trigger=completion_or_skip, compute and materialize the next occurrence note idempotently.
  8. \n
\n

If no skipped status is configured, skip of a materialized occurrence MUST fail deterministically in strict mode and SHOULD report missing_skipped_status.

\n

5.20.4 Uncomplete and unskip materialized occurrence#

\n

Uncomplete of a materialized occurrence note MUST:

\n
    \n
  1. Reopen the occurrence note using normal uncomplete semantics (§5.6).
  2. \n
  3. Remove D from parent complete_instances.
  4. \n
  5. For recurrence_anchor=completion, MUST NOT roll back parent DTSTART, matching §4.8.
  6. \n
  7. MUST NOT delete any later materialized occurrence note.
  8. \n
\n

Unskip of a materialized occurrence note MUST:

\n
    \n
  1. Reopen the occurrence note to configured active/default status.
  2. \n
  3. Remove D from parent skipped_instances.
  4. \n
  5. MUST NOT add D to parent complete_instances implicitly.
  6. \n
  7. MUST NOT delete any later materialized occurrence note.
  8. \n
\n

5.20.5 Delete and unmaterialize occurrence#

\n

Deleting a materialized occurrence note removes the task file and MUST NOT be interpreted as skip.

\n

Implementations MAY provide an explicit unmaterialize occurrence operation.\nIf supported, it MUST document whether parent state is preserved, cleared, or reconciled.\nIn all cases, deleting or unmaterializing an occurrence MUST NOT silently delete the parent recurring task.

\n

If parent instance lists still refer to a deleted occurrence note's date, validators MAY report an orphan/cache warning such as orphan_occurrence_note.

\n

5.21 Operation examples#

\n

5.21.1 Non-recurring complete#

\n

Before:

\n
title: Buy groceries\nstatus: open\ncompletedDate:\ndateModified: 2026-02-20T09:00:00Z\n

After complete on 2026-02-20:

\n
title: Buy groceries\nstatus: done\ncompletedDate: 2026-02-20\ndateModified: 2026-02-20T09:05:00Z\n

5.21.2 Recurring complete instance#

\n

Before:

\n
title: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: []\nskippedInstances: []\ndateModified: 2026-02-20T08:00:00Z\n

After complete instance on 2026-02-20:

\n
title: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: [2026-02-20]\nskippedInstances: []\ndateModified: 2026-02-20T08:10:00Z\n

5.21.3 Recurring skip instance overriding completion#

\n

Before:

\n
completeInstances: [2026-02-20]\nskippedInstances: []\n

After skip 2026-02-20:

\n
completeInstances: []\nskippedInstances: [2026-02-20]\n

5.21.4 Preserve unknown fields on update#

\n

Before:

\n
title: Plan Q2\nstatus: open\nvendorTicket: ZX-42\n

Update status to in-progress.

\n

After:

\n
title: Plan Q2\nstatus: in-progress\nvendorTicket: ZX-42\n

5.21.5 Add dependency#

\n

Before:

\n
blockedBy: []\n

Add dependency:

\n
uid: "[[prepare-metrics]]"\nreltype: FINISHTOSTART\n

After:

\n
blockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n

5.21.6 Add reminder#

\n

Before:

\n
reminders: []\n

Add reminder:

\n
id: due_minus_1h\ntype: relative\nrelatedTo: due\noffset: -PT1H\n

After:

\n
reminders:\n  - id: due_minus_1h\n    type: relative\n    relatedTo: due\n    offset: -PT1H\n

5.22 Conformance operation interface#

\n

The conformance suite exercises operations via the execute(operation, input) → envelope interface defined in the adapter contract. This section specifies the input/output contracts for each conformance-testable operation name.

\n

Unless otherwise noted, all operations return { ok: true, result: {...} } on success and { ok: false, error: "..." } on failure. Adapters MAY additionally return error_details with structured fields from §5.18.

\n

General operations#

\n

op.mutate_with_validation#

\n

Tests §5.2 rule 1: validation runs before commit.

\n

Input:

\n
{ "strict": true, "frontmatter": { ... } }\n

Behavior: validate frontmatter as a task record. In strict mode (strict=true), any validation error MUST produce ok=false.

\n

Output on validation error:

\n
{ "ok": false, "error": "validation|invalid_type|..." }\n

\n

op.atomic_write#

\n

Tests §5.2 rule 2: writes are all-or-nothing.

\n

Input:

\n
{\n  "original": { ... },\n  "patch": { ... },\n  "simulateFailureAfterWrite": true\n}\n

Behavior: apply patch to original, then simulate a post-write failure. The adapter MUST report whether the write was committed and what state the record is in after recovery.

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "committed": false,\n    "persisted": { ... }\n  }\n}\n

committed=false means the write was rolled back. persisted reflects the actual frontmatter after recovery — it MUST match original (not the patched version) when simulateFailureAfterWrite=true.

\n
\n

op.idempotency_check#

\n

Tests §5.2 rule 5: operations are safe under repetition.

\n

Input:

\n
{\n  "operation": "complete_nonrecurring",\n  "first": { "status": "open", "completedDate": null },\n  "second": { "status": "done", "completedDate": "2026-02-20" }\n}\n

Behavior: applying the named operation to first state and then again to second state MUST produce identical persisted results (including unchanged dateModified on the second no-op application). The adapter checks whether this holds.

\n

Output:

\n
{ "ok": true, "result": { "idempotent": true } }\n

\n

op.update_patch#

\n

Tests §5.4 patch semantics and unknown-field preservation.

\n

Input:

\n
{\n  "original": { "title": "...", "vendorTicket": "ZX-42", ... },\n  "patch": { "priority": "high" },\n  "changed": true\n}\n

Behavior: apply patch to original. Return the merged frontmatter.

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "changed": true,\n    "frontmatter": { "title": "...", "priority": "high", "vendorTicket": "ZX-42", ... }\n  }\n}\n
    \n
  • changed indicates whether any field actually changed value.
  • \n
  • frontmatter MUST include all unknown fields from original unchanged.
  • \n
\n
\n

op.complete_nonrecurring#

\n

Tests §5.5 non-recurring completion.

\n

Input:

\n
{\n  "frontmatter": { "title": "...", "status": "open" },\n  "completedValues": ["done", "cancelled"],\n  "explicitDate": "2026-02-20"\n}\n

Behavior: apply a complete operation to frontmatter using completedValues (ordered list) and explicitDate as the completion day (omit to use current local day).

\n

Output:

\n
{ "ok": true, "result": { "status": "done", "completedDate": "2026-02-20" } }\n
    \n
  • status MUST be the first entry in completedValues.
  • \n
  • completedDate MUST be explicitDate if provided; otherwise a valid YYYY-MM-DD date.
  • \n
  • If frontmatter.status is already a completed value, the operation MUST still succeed (idempotent).
  • \n
\n
\n

op.uncomplete_nonrecurring#

\n

Tests §5.6 non-recurring uncompletion.

\n

Input:

\n
{\n  "frontmatter": { "title": "...", "status": "done", "completedDate": "2026-02-20" },\n  "defaultStatus": "open",\n  "clearCompletedDate": true\n}\n

Output:

\n
{ "ok": true, "result": { "status": "open", "completedDate": null } }\n
    \n
  • status MUST be defaultStatus.
  • \n
  • If clearCompletedDate=true, completedDate MUST be null in the result.
  • \n
  • If clearCompletedDate=false, completedDate MUST be preserved.
  • \n
\n
\n

op.error_shape#

\n

Tests §5.18 error model.

\n

Input:

\n
{ "operation": "update", "code": "invalid_type", "message": "bad value", "field": "status" }\n

Behavior: construct and return a structured error object.

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "operation": "update",\n    "code": "invalid_type",\n    "message": "..."\n  }\n}\n

The message field MUST be a non-empty string. The operation and code fields MUST match the input.

\n
\n

op.detect_conflict#

\n

Tests §5.16 write-conflict detection.

\n

Input:

\n
{ "expectedVersion": "a", "actualVersion": "b", "overwrite": false }\n

Behavior: when expectedVersion != actualVersion and overwrite=false, the operation MUST fail.

\n

Output on conflict:

\n
{ "ok": false, "error": "conflict|write_conflict|..." }\n

\n

op.dry_run#

\n

Tests §5.17 dry-run mode.

\n

Input:

\n
{ "operation": "update", "patch": { "status": "done" } }\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "wrote": false,\n    "plannedChanges": ["status", ...]\n  }\n}\n

wrote MUST be false. plannedChanges MUST list the field names that would have changed.

\n
\n

Recurrence operations#

\n

For recurrence.complete, recurrence.uncomplete_instance, recurrence.skip_instance, recurrence.unskip_instance, and recurrence.effective_state, the input and output contracts are defined by the respective sections of §4 and §5.7–5.9.

\n

Common input fields for recurrence operations:

\n
    \n
  • targetDate or completionDate: YYYY-MM-DD target day
  • \n
  • completeInstances: current list of completed dates
  • \n
  • skippedInstances: current list of skipped dates
  • \n
\n

recurrence.effective_state output:

\n
{ "ok": true, "result": { "value": "completed|skipped|open" } }\n

\n

Materialized occurrence operations#

\n

For occurrence.materialize, occurrence.complete, occurrence.skip, occurrence.uncomplete, occurrence.unskip, and occurrence.unmaterialize, input and output contracts are defined by §4.18 and §5.20.

\n

Common input fields for materialized occurrence operations:

\n
    \n
  • parent: frontmatter/path/link object for the recurring parent task
  • \n
  • occurrence: frontmatter/path/link object for an existing occurrence note when applicable
  • \n
  • targetDate: YYYY-MM-DD target day
  • \n
  • config: effective occurrence/status configuration needed by the operation
  • \n
\n

occurrence.materialize output:

\n
{ "ok": true, "result": { "created": true, "occurrence": { "...": "..." } } }\n

created MUST be false when the operation returns an already-existing occurrence note for the same parent/date.

\n
\n

Time-tracking operations#

\n

For time.start, time.stop, time.replace_entries, time.remove_entry, time.auto_stop_on_complete, and time.report_totals, the contracts are defined by §5.19.

\n

Common input patterns:

\n
    \n
  • entries: current time_entries array
  • \n
  • now: ISO 8601 datetime representing current instant
  • \n
  • dateModified: current date_modified value
  • \n
\n

time.report_totals output:

\n
{ "ok": true, "result": { "closed_minutes": N, "live_minutes": M } }\n

live_minutes is only present when an active (no endTime) entry exists.

\n","text":"5.1 Purpose# This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state. 5.2 General operation rules# For all mutating operations: Validation MUST run before commit in strict mode. Writes MUST be atomic at file level (all-or-nothing per file). date_modified MUST be updated on successful state change. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations. Operations identified as idempotent MUST remain safe under repetition. 5.2.1 Target day/date resolution# Recurring instance operations act on a target day/date (complete instance, uncomplete instance, skip, unskip). Non-recurring complete uses completion-day semantics for completed_date. Resolution MUST be deterministic: If caller provides an explicit target date/datetime, that value is authoritative. If caller omits target for recurring instance operations, implementations MUST resolve in this order: task scheduled, if present and target-day-resolvable, else task due, if present and target-day-resolvable, else current local day in active runtime timezone (§3.6). Target-day resolution for fallback task fields (scheduled / due) MUST use this extraction policy: if stored value is canonical date (YYYY-MM-DD), use it as-is; if stored value is datetime, use the literal date token before T (YYYY-MM-DD) without timezone shifting; if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning; if a candidate value is unusable, continue to the next fallback source. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone. When an explicit target is datetime: operations that require day semantics MUST use its calendar date part in active runtime timezone, for recurring complete instance with recurrence_anchor=completion, the same explicit datetime target MUST also drive DTSTART rewrite semantics in §4.4.3. This explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above. 5.2.2 Idempotency and date_modified# For operations marked idempotent: first application MAY change state and date_modified, repeated application with semantically equivalent input MUST leave persisted state unchanged. When a repeated idempotent operation is a no-op, date_modified MUST remain unchanged. 5.3 Create# 5.3.1 Input requirements# Create MUST provide at minimum semantic roles required by §2, directly or via defaults. 5.3.2 Required behavior# Create MUST: apply default values, generate date_created and date_modified when absent, resolve semantic title and filename/path behavior according to §9.13, apply create-time templating when enabled and supported (§5.3.5, §9.14, §7), serialize canonical keys and canonical temporal formats, when recurrence is present, canonicalize DTSTART per §4.4.5, preserve caller-provided semantic id when present, fail with validation errors if required constraints are unmet, apply default reminders according to §10.3.9 when configured. 5.3.3 Title and filename resolution on create# Create MUST produce a deterministic initial filename/path. Rules: Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames. If title.storage=filename: basename MUST derive from semantic title, title changes after create are handled by update semantics (§5.4.4), implementations MAY also persist mapped title as a synchronized compatibility mirror, title.filename_format and title.custom_filename_template MUST be ignored. If title.storage=frontmatter, create-time basename MUST follow title.filename_format: title: sanitized semantic title, zettel: implementation-defined zettel pattern (MUST be documented), timestamp: implementation-defined timestamp pattern (MUST be documented), custom: title.custom_filename_template expansion. If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing). 5.3.4 Example# Input intent: title: \"Pay electricity bill\" Assume defaults: status default open priority default normal Persisted frontmatter (example): title: Pay electricity bill status: open priority: normal dateCreated: 2026-02-20T14:00:00Z dateModified: 2026-02-20T14:00:00Z 5.3.5 Optional create-time templating# This subsection is required only for implementations claiming profile templating (§7.3.3). Create-time templating pipeline MUST be deterministic: Compute base create payload from explicit input, defaults (§9.8), and generated/system values (date_created, date_modified, resolved title policy). Expand template variables using that base payload and active runtime date/time context. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict). Resolve body output: if expanded template body is non-empty, use it; otherwise use caller-provided body/details (if any). Template parse rules: If template content begins with ---, implementations MUST treat the first --- ... --- block as template frontmatter and the remainder as template body. Frontmatter variable expansion MUST run before YAML parsing of template frontmatter. Portable variable support: Implementations claiming templating MUST support all variables in the Required column of the table below. Implementations MAY support any variable in the Extended column. Required task-data variables: Variable Value Format / separator {{title}} Semantic title string; YAML-quoted if needed {{status}} Task status value string {{priority}} Task priority value string {{dueDate}} Due date if set YYYY-MM-DD or empty {{scheduledDate}} Scheduled date if set YYYY-MM-DD or empty {{details}} Caller-provided body/description string {{contexts}} Contexts list comma-separated, e.g. \"work, home\" {{tags}} Tags list comma-separated, e.g. \"task, errands\" {{hashtags}} Tags list as hashtags space-separated, e.g. \"#task #errands\" {{timeEstimate}} Time estimate in minutes integer string or empty {{parentNote}} Parent note name/path string; YAML-quoted if needed Required date/time variables (expansion time): Variable Value Format {{date}} Current date yyyy-MM-dd {{time}} Current time (24h) HH:mm {{year}} Full year yyyy {{month}} Month number MM {{day}} Day of month dd Extended variables (optional): Variable Value Format {{dateTime}} Date + time yyyy-MM-dd-HHmm {{timestamp}} Full timestamp yyyy-MM-dd-HHmmss {{shortDate}} Short date yyMMdd {{shortYear}} Two-digit year yy {{monthName}} Month full name e.g. February {{monthNameShort}} Month short name e.g. Feb {{dayName}} Weekday full name e.g. Monday {{dayNameShort}} Weekday short name e.g. Mon {{week}} ISO week number ww {{quarter}} Quarter number 1–4 {{hour}} Hour (24h) HH {{minute}} Minute mm {{second}} Second ss {{time12}} Time with AM/PM hh:mm a {{time24}} Time (24h) HH:mm {{timezone}} UTC offset long e.g. +05:30 {{utcOffset}} UTC offset long e.g. +05:30 {{unix}} Unix timestamp (seconds) integer string {{unixMs}} Unix timestamp (ms) integer string {{zettel}} Zettelkasten ID date + seconds-since-midnight base-36 {{titleLower}} Title lowercase string {{titleUpper}} Title uppercase string {{titleSnake}} Title snake_case string {{titleKebab}} Title kebab-case string {{titleCamel}} Title camelCase string {{titlePascal}} Title PascalCase string {{priorityShort}} First letter of priority uppercase char {{statusShort}} First letter of status uppercase char Unknown variables (not in the above lists) MUST be handled per templating.unknown_variable_policy (§9.14): preserve: leave the {{...}} placeholder as-is. empty: replace with an empty string. Deterministic expansion context: date/time variable expansion MUST use the active runtime timezone from §3.6. locale-sensitive variables (monthName, monthNameShort, dayName, dayNameShort, time12) MUST use English locale outputs for portability (January, Jan, Monday, Mon, AM/PM). template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2). Failure behavior: templating.failure_mode=error: template read/parse failures MUST abort create. templating.failure_mode=warning_fallback: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (template_missing or template_parse_failed). 5.3.6 Identity handling on create# If semantic id is provided on create, writers MUST preserve it. If implementation supports auto-generation of semantic id, generation policy MUST be documented and resulting id MUST remain stable after create. 5.4 Update# 5.4.1 Patch semantics# Update MUST be patch-by-default: only targeted semantic roles are changed. 5.4.2 Preservation rules# Update MUST preserve: unrelated known roles, unknown fields, original date/datetime granularity for untouched fields. 5.4.3 Example# Before: title: Weekly review scheduled: 2026-02-20 priority: normal customClient: ACME Operation: set priority to high. After: title: Weekly review scheduled: 2026-02-20 priority: high customClient: ACME 5.4.4 Title updates and filename updates# If an update changes semantic title, behavior MUST follow title.storage: title.storage=filename: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move. title.storage=frontmatter: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested. If implementation keeps frontmatter title for compatibility while title.storage=filename, it MUST keep stored title synchronized with effective filename-derived title. 5.5 Complete (non-recurring)# For non-recurring tasks, complete MUST: Set status to a configured completed value, unless already completed. If multiple completed values are configured, implementation MUST choose deterministically (default: first entry in status.completed_values). Set completed_date to completion day: explicit completion-day input when provided, otherwise current local day in active runtime timezone (§5.2.1). Apply overwrite policy deterministically (overwrite or preserve_if_present). Update date_modified on state change. Implementations MUST document completion-day input handling and completed_date overwrite policy. Operation MUST be idempotent. 5.6 Uncomplete (non-recurring)# For non-recurring tasks, uncomplete MUST: Set status to configured active/default status according to policy (default: status.default). Clear or retain completed_date according to policy. Update date_modified on state change. Policy MUST be documented and deterministic. Operation MUST be idempotent. 5.7 Complete instance (recurring)# For recurring tasks, complete with resolved target date D (§5.2.1) MUST follow §4.7. Writers MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it. When recurrence_anchor=completion and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime DTSTART rewrite behavior. When recurrence_anchor=scheduled and DTSTART is absent, implementations MUST insert DTSTART deterministically per §4.4.5. Next-occurrence recalculation in this mode MUST follow §4.4.4. 5.8 Uncomplete instance (recurring)# For recurring tasks, uncomplete with resolved target date D (§5.2.1) MUST follow §4.8. For recurrence_anchor=completion, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back DTSTART. 5.9 Skip and unskip instance# Skip/unskip for recurring tasks with resolved target date D (§5.2.1) MUST follow §4.9 and §4.10. 5.10 Dependency operations# Dependency operations MUST follow §10.2. 5.10.1 Add dependency# Add dependency MUST: validate dependency entry schema, parse and resolve uid per §11, enforce duplicate and self-reference rules, preserve existing non-target dependency entries, update date_modified on change. 5.10.2 Remove dependency# Remove dependency by uid MUST be idempotent. 5.10.3 Replace dependency list# Replace dependency list MUST be explicit (not default patch behavior). 5.11 Reminder operations# Reminder operations MUST follow §10.3. 5.11.1 Add reminder# Add reminder MUST: validate reminder schema, enforce unique id within task, update date_modified on change. 5.11.2 Update reminder# Update reminder MUST target a reminder by id and be patch-by-default. 5.11.3 Remove reminder# Remove reminder by id MUST be idempotent. 5.12 Archive# Implementations MAY support archive semantics through: archive tag, archive status, dedicated boolean/archive field. Archive behavior MUST be documented. Archive MUST NOT implicitly delete the task. 5.13 Delete# Delete MUST remove the task file. Optional safety behavior: Implementations MAY perform backlink/dependency checks. If checks are enabled, implementation MUST provide a bypass option for explicit force delete. 5.14 Rename# Rename operation changes file path/filename while preserving semantic record identity. 5.14.1 Rename interaction with title storage mode# If title.storage=filename, basename changes from rename MUST update effective semantic title. If title.storage=frontmatter, rename MUST NOT implicitly rewrite mapped title unless explicitly requested. Implementations that persist frontmatter title in title.storage=filename mode MUST either update that field on rename or remove it to prevent divergence. If semantic id is present, rename/move MUST preserve its value unchanged. If implementation supports link/reference updating, it MUST: update resolvable references deterministically, report unresolved or ambiguous updates, update dependency uid and projects references consistently with normal links. If implementation does not support reference updates, this limitation MUST be disclosed in conformance claim. 5.15 Batch operations# Batch operations MAY be supported. If supported, implementation MUST report per-item outcomes and summary counts: total succeeded failed Partial success behavior MUST be documented. 5.16 Concurrency# Implementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash). When conflict is detected, operation MUST fail safely unless explicit overwrite is requested. 5.17 Dry run# If dry run mode is supported, operation MUST: execute validation and transformation logic, report intended changes, perform no file write. 5.18 Error model# Implementation-native operation failures MUST provide structured error information with: operation name, error code, message, optional field/path context. For conformance adapter envelopes (§5.22), failures MAY be represented as a compact error string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via error_details). 5.19 Time tracking management# This subsection applies to implementations that support time_entries. 5.19.1 Start time tracking# Start on task T MUST: fail when T already has an active time entry, append a new entry with canonical startTime and no endTime, MAY set a default description, update date_modified, persist canonical time_entries shape (including removal of legacy/stale duration fields when normalizing). Recommended error code when already active: time_tracking_already_active. 5.19.2 Stop time tracking# Stop on task T MUST: fail when T has no active time entry, set endTime on the active entry to canonical current datetime, update date_modified, preserve non-target entries and unknown frontmatter fields. Recommended error code when no active session exists: no_active_time_entry. 5.19.3 Edit or replace time entries# When replacing/editing time_entries explicitly, implementations MUST: valid"},{"route":"/developers/specification/06-validation/","title":"6. Validation","description":"Validation ensures persisted task records conform to this specification and collection configuration.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:06-validation.md","namespace":"specification","relativePath":"06-validation.md","raw":"# 6. Validation\n\n## 6.1 Purpose\n\nValidation ensures persisted task records conform to this specification and collection configuration.\n\n## 6.2 Validation phases\n\nImplementations SHOULD validate in these phases:\n\n1. Parse validation (YAML/frontmatter structure)\n2. Schema validation (types and role constraints)\n3. Semantic validation (cross-field invariants)\n\n## 6.3 Validation modes\n\nConforming implementations MUST support:\n\n- `strict`: errors block writes.\n\nImplementations MAY additionally support:\n\n- `permissive`: writes may continue with warnings.\n\nCurrent mode MUST be discoverable.\n\n## 6.4 Required checks\n\nA conforming validator MUST implement checks required by the claimed profile(s):\n\n| Check ID | Requirement | Required for |\n|---|---|---|\n| 1 | Unconditionally required semantic roles are present (`status`, `date_created`, `date_modified`). | `core-lite` and above |\n| 1a | `completed_date` conditional requiredness is enforced per §2.2.1. | `core-lite` and above |\n| 1b | `title` resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback. | `core-lite` and above |\n| 2 | Field values match role type requirements. | `core-lite` and above |\n| 3 | Temporal values conform to §3. | `core-lite` and above |\n| 4 | Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules). | `recurrence` and above |\n| 5 | Per-instance lists contain valid dates with no overlap. | `recurrence` and above |\n| 6 | `date_modified` is not earlier than `date_created` when both exist. | `core-lite` and above |\n| 7 | `time_estimate` is non-negative when present. | any profile that supports `time_estimate` |\n| 8 | `time_entries` entries include required `startTime`, ranges are valid when `endTime` exists, and at most one active entry exists per task. | any profile that supports `time_entries` |\n| 9 | `blocked_by` entries conform to §10.2 (shape, enum, duplicates, self-reference). | `extended` |\n| 10 | `reminders` entries conform to §10.3 (shape, type-specific fields, unique ids). | `extended` |\n| 11 | relative reminders have resolvable base fields or produce configured error/warning behavior. | `extended` |\n| 12 | link-bearing fields (`projects`, `blocked_by.uid`) conform to §11 parsing/resolution and traversal safety. | `extended` |\n| 13 | templating configuration is valid when provided (`templating` schema and enums). | `templating` |\n| 14 | create-time template failures obey configured failure mode (`error` vs fallback). | `templating` |\n| 15 | semantic `id` (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable. | any profile that supports semantic `id` |\n| 16 | materialized occurrence notes contain valid `recurrence_parent` and `occurrence_date` roles. | `materialized-occurrences` |\n| 17 | no duplicate materialized occurrence notes exist for the same resolved `(recurrence_parent, occurrence_date)` pair. | `materialized-occurrences` |\n| 18 | materialization policy values and rolling horizons conform to §4.18 and §9.17. | `materialized-occurrences` |\n\n## 6.5 Unknown field policy\n\nUnknown fields:\n\n- MUST NOT fail validation by default unless collection is configured for strict schema closure.\n- SHOULD generate informational warnings when strict schema closure is desired but not enabled.\n\n## 6.6 Issue structure\n\nValidation issues MUST include:\n\n- `code` (machine-readable)\n- `severity` (`error`, `warning`, or `info`)\n- `message` (human-readable)\n\nIssues SHOULD include:\n\n- `field` or path\n- `expected` and `actual` details where useful\n\n## 6.7 Recommended issue codes\n\n| Code | Severity (default) | Meaning |\n|---|---|---|\n| `missing_required` | error | required role missing |\n| `invalid_type` | error | value type mismatch |\n| `invalid_enum_value` | error | value not in configured set |\n| `invalid_date_value` | error | malformed or impossible date |\n| `invalid_datetime_value` | error | malformed datetime |\n| `invalid_recurrence_rule` | error | recurrence not valid tasknotes recurrence syntax |\n| `missing_recurrence_seed` | error | recurrence has no resolvable seed/start date |\n| `invalid_recurrence_anchor` | error | anchor not allowed |\n| `instance_state_overlap` | error | same date in complete and skipped lists |\n| `invalid_time_range` | error | end before start in time entry |\n| `missing_time_entry_start` | error | time entry is missing required startTime |\n| `multiple_active_time_entries` | error | more than one active time entry exists in one task |\n| `invalid_dependency_entry` | error | dependency object missing required fields |\n| `invalid_dependency_reltype` | error | dependency reltype not allowed |\n| `invalid_dependency_gap` | error | dependency gap not valid ISO 8601 duration |\n| `duplicate_dependency_uid` | error in strict mode when `dependencies.enforce_unique_uid=true`; warning otherwise by policy | repeated dependency uid in task |\n| `self_dependency` | error | task depends on itself |\n| `unresolved_dependency_target` | warning | dependency target not resolvable |\n| `invalid_reminder_entry` | error | reminder object missing required fields |\n| `duplicate_reminder_id` | error | repeated reminder id in task |\n| `invalid_reminder_type` | error | reminder type not allowed |\n| `invalid_reminder_offset` | error | relative reminder offset not valid duration |\n| `invalid_reminder_related_to` | error | relatedTo must be due or scheduled |\n| `invalid_reminder_absolute_time` | error | absoluteTime invalid datetime |\n| `unresolvable_reminder_base` | error | relative reminder base field missing/unusable |\n| `invalid_link_format` | error | link value cannot be parsed as supported format |\n| `ambiguous_link` | warning | link resolves to multiple candidates |\n| `path_traversal` | error | resolved path escapes collection root |\n| `unresolved_link_target` | warning | link target cannot be resolved |\n| `invalid_task_id` | error | semantic `id` is empty or invalid type |\n| `duplicate_task_id` | warning | duplicate semantic `id` detected in collection scope |\n| `alias_conflict_ignored` | warning | alias key ignored due to canonical conflict |\n| `unresolvable_title` | error | title cannot be resolved from title resolution policy |\n| `title_source_conflict` | warning | mapped title and filename title differ; active title-storage policy selected authoritative source |\n| `template_missing` | warning | configured template file cannot be read/found |\n| `template_parse_failed` | warning | template frontmatter/body parsing or expansion failed |\n| `missing_recurrence_parent` | error | materialized occurrence note omits recurrence_parent |\n| `invalid_recurrence_parent` | warning | occurrence note parent reference cannot be resolved or does not reference a recurring task |\n| `missing_occurrence_date` | error | materialized occurrence note omits occurrence_date |\n| `duplicate_occurrence_note` | warning | more than one materialized occurrence note exists for the same parent/date |\n| `occurrence_state_conflict` | warning | materialized occurrence state disagrees with parent instance lists |\n| `materialization_target_not_generated` | warning | occurrence date is not generated by current parent recurrence rule |\n| `missing_skipped_status` | error | skip of materialized occurrence requires configured skipped status |\n| `next_occurrence_materialization_failed` | warning | triggering operation succeeded but next occurrence note could not be created |\n| `orphan_occurrence_note` | warning | materialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note |\n| `unknown_field` | info | unmapped field encountered |\n\nImplementations MAY extend this code set but SHOULD preserve existing meanings.\n\n## 6.8 Write-time validation behavior\n\nIn strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes.\n\nWarnings SHOULD NOT block writes unless explicitly configured.\n\nDatetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4.\n\n## 6.9 Validation examples\n\n### 6.9.1 Missing required role\n\nInput:\n\n```yaml\ntitle: Plan workshop\nstatus: open\ndateCreated: 2026-02-20T09:00:00Z\n```\n\nIssue:\n\n```yaml\ncode: missing_required\nseverity: error\nfield: dateModified\nmessage: Required field 'dateModified' is missing.\n```\n\n### 6.9.2 Invalid recurrence anchor\n\nInput:\n\n```yaml\nrecurrence: FREQ=DAILY\nrecurrenceAnchor: due\n```\n\nIssue:\n\n```yaml\ncode: invalid_recurrence_anchor\nseverity: error\nfield: recurrenceAnchor\nmessage: recurrence anchor must be 'scheduled' or 'completion'.\n```\n\n### 6.9.3 Overlap in instance state\n\nInput:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n```\n\nIssue:\n\n```yaml\ncode: instance_state_overlap\nseverity: error\nmessage: same date exists in complete and skipped instance lists.\n```\n\n### 6.9.4 Invalid dependency reltype\n\nInput:\n\n```yaml\nblockedBy:\n - uid: \"[[task-a]]\"\n reltype: BLOCKS\n```\n\nIssue:\n\n```yaml\ncode: invalid_dependency_reltype\nseverity: error\nfield: blockedBy[0].reltype\nmessage: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH.\n```\n\n### 6.9.5 Unresolvable reminder base\n\nInput:\n\n```yaml\nreminders:\n - id: due_minus_1d\n type: relative\n relatedTo: due\n offset: -P1D\n```\n\nIssue when `due` missing:\n\n```yaml\ncode: unresolvable_reminder_base\nseverity: error\nfield: reminders[0]\nmessage: relative reminder references due but no due value exists.\n```\n\n### 6.9.6 Unknown field in permissive mode\n\nInput:\n\n```yaml\ntitle: Plan workshop\nstatus: open\nvendorPriority: p1\n```\n\nIssue example:\n\n```yaml\ncode: unknown_field\nseverity: info\nfield: vendorPriority\nmessage: field is not mapped to a known semantic role.\n```\n\n### 6.9.7 Multiple active time entries\n\nInput:\n\n```yaml\ntimeEntries:\n - startTime: 2026-02-20T10:00:00Z\n - startTime: 2026-02-20T11:00:00Z\n```\n\nIssue:\n\n```yaml\ncode: multiple_active_time_entries\nseverity: error\nfield: timeEntries\nmessage: task contains more than one active time entry.\n```\n","aliases":["/spec/06-validation/"],"toc":[{"level":2,"id":"61-purpose","text":"6.1 Purpose"},{"level":2,"id":"62-validation-phases","text":"6.2 Validation phases"},{"level":2,"id":"63-validation-modes","text":"6.3 Validation modes"},{"level":2,"id":"64-required-checks","text":"6.4 Required checks"},{"level":2,"id":"65-unknown-field-policy","text":"6.5 Unknown field policy"},{"level":2,"id":"66-issue-structure","text":"6.6 Issue structure"},{"level":2,"id":"67-recommended-issue-codes","text":"6.7 Recommended issue codes"},{"level":2,"id":"68-write-time-validation-behavior","text":"6.8 Write-time validation behavior"},{"level":2,"id":"69-validation-examples","text":"6.9 Validation examples"},{"level":3,"id":"691-missing-required-role","text":"6.9.1 Missing required role"},{"level":3,"id":"692-invalid-recurrence-anchor","text":"6.9.2 Invalid recurrence anchor"},{"level":3,"id":"693-overlap-in-instance-state","text":"6.9.3 Overlap in instance state"},{"level":3,"id":"694-invalid-dependency-reltype","text":"6.9.4 Invalid dependency reltype"},{"level":3,"id":"695-unresolvable-reminder-base","text":"6.9.5 Unresolvable reminder base"},{"level":3,"id":"696-unknown-field-in-permissive-mode","text":"6.9.6 Unknown field in permissive mode"},{"level":3,"id":"697-multiple-active-time-entries","text":"6.9.7 Multiple active time entries"}],"html":"

6.1 Purpose#

\n

Validation ensures persisted task records conform to this specification and collection configuration.

\n

6.2 Validation phases#

\n

Implementations SHOULD validate in these phases:

\n
    \n
  1. Parse validation (YAML/frontmatter structure)
  2. \n
  3. Schema validation (types and role constraints)
  4. \n
  5. Semantic validation (cross-field invariants)
  6. \n
\n

6.3 Validation modes#

\n

Conforming implementations MUST support:

\n
    \n
  • strict: errors block writes.
  • \n
\n

Implementations MAY additionally support:

\n
    \n
  • permissive: writes may continue with warnings.
  • \n
\n

Current mode MUST be discoverable.

\n

6.4 Required checks#

\n

A conforming validator MUST implement checks required by the claimed profile(s):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Check IDRequirementRequired for
1Unconditionally required semantic roles are present (status, date_created, date_modified).core-lite and above
1acompleted_date conditional requiredness is enforced per §2.2.1.core-lite and above
1btitle resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback.core-lite and above
2Field values match role type requirements.core-lite and above
3Temporal values conform to §3.core-lite and above
4Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules).recurrence and above
5Per-instance lists contain valid dates with no overlap.recurrence and above
6date_modified is not earlier than date_created when both exist.core-lite and above
7time_estimate is non-negative when present.any profile that supports time_estimate
8time_entries entries include required startTime, ranges are valid when endTime exists, and at most one active entry exists per task.any profile that supports time_entries
9blocked_by entries conform to §10.2 (shape, enum, duplicates, self-reference).extended
10reminders entries conform to §10.3 (shape, type-specific fields, unique ids).extended
11relative reminders have resolvable base fields or produce configured error/warning behavior.extended
12link-bearing fields (projects, blocked_by.uid) conform to §11 parsing/resolution and traversal safety.extended
13templating configuration is valid when provided (templating schema and enums).templating
14create-time template failures obey configured failure mode (error vs fallback).templating
15semantic id (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable.any profile that supports semantic id
16materialized occurrence notes contain valid recurrence_parent and occurrence_date roles.materialized-occurrences
17no duplicate materialized occurrence notes exist for the same resolved (recurrence_parent, occurrence_date) pair.materialized-occurrences
18materialization policy values and rolling horizons conform to §4.18 and §9.17.materialized-occurrences
\n

6.5 Unknown field policy#

\n

Unknown fields:

\n
    \n
  • MUST NOT fail validation by default unless collection is configured for strict schema closure.
  • \n
  • SHOULD generate informational warnings when strict schema closure is desired but not enabled.
  • \n
\n

6.6 Issue structure#

\n

Validation issues MUST include:

\n
    \n
  • code (machine-readable)
  • \n
  • severity (error, warning, or info)
  • \n
  • message (human-readable)
  • \n
\n

Issues SHOULD include:

\n
    \n
  • field or path
  • \n
  • expected and actual details where useful
  • \n
\n\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CodeSeverity (default)Meaning
missing_requirederrorrequired role missing
invalid_typeerrorvalue type mismatch
invalid_enum_valueerrorvalue not in configured set
invalid_date_valueerrormalformed or impossible date
invalid_datetime_valueerrormalformed datetime
invalid_recurrence_ruleerrorrecurrence not valid tasknotes recurrence syntax
missing_recurrence_seederrorrecurrence has no resolvable seed/start date
invalid_recurrence_anchorerroranchor not allowed
instance_state_overlaperrorsame date in complete and skipped lists
invalid_time_rangeerrorend before start in time entry
missing_time_entry_starterrortime entry is missing required startTime
multiple_active_time_entrieserrormore than one active time entry exists in one task
invalid_dependency_entryerrordependency object missing required fields
invalid_dependency_reltypeerrordependency reltype not allowed
invalid_dependency_gaperrordependency gap not valid ISO 8601 duration
duplicate_dependency_uiderror in strict mode when dependencies.enforce_unique_uid=true; warning otherwise by policyrepeated dependency uid in task
self_dependencyerrortask depends on itself
unresolved_dependency_targetwarningdependency target not resolvable
invalid_reminder_entryerrorreminder object missing required fields
duplicate_reminder_iderrorrepeated reminder id in task
invalid_reminder_typeerrorreminder type not allowed
invalid_reminder_offseterrorrelative reminder offset not valid duration
invalid_reminder_related_toerrorrelatedTo must be due or scheduled
invalid_reminder_absolute_timeerrorabsoluteTime invalid datetime
unresolvable_reminder_baseerrorrelative reminder base field missing/unusable
invalid_link_formaterrorlink value cannot be parsed as supported format
ambiguous_linkwarninglink resolves to multiple candidates
path_traversalerrorresolved path escapes collection root
unresolved_link_targetwarninglink target cannot be resolved
invalid_task_iderrorsemantic id is empty or invalid type
duplicate_task_idwarningduplicate semantic id detected in collection scope
alias_conflict_ignoredwarningalias key ignored due to canonical conflict
unresolvable_titleerrortitle cannot be resolved from title resolution policy
title_source_conflictwarningmapped title and filename title differ; active title-storage policy selected authoritative source
template_missingwarningconfigured template file cannot be read/found
template_parse_failedwarningtemplate frontmatter/body parsing or expansion failed
missing_recurrence_parenterrormaterialized occurrence note omits recurrence_parent
invalid_recurrence_parentwarningoccurrence note parent reference cannot be resolved or does not reference a recurring task
missing_occurrence_dateerrormaterialized occurrence note omits occurrence_date
duplicate_occurrence_notewarningmore than one materialized occurrence note exists for the same parent/date
occurrence_state_conflictwarningmaterialized occurrence state disagrees with parent instance lists
materialization_target_not_generatedwarningoccurrence date is not generated by current parent recurrence rule
missing_skipped_statuserrorskip of materialized occurrence requires configured skipped status
next_occurrence_materialization_failedwarningtriggering operation succeeded but next occurrence note could not be created
orphan_occurrence_notewarningmaterialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note
unknown_fieldinfounmapped field encountered
\n

Implementations MAY extend this code set but SHOULD preserve existing meanings.

\n

6.8 Write-time validation behavior#

\n

In strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes.

\n

Warnings SHOULD NOT block writes unless explicitly configured.

\n

Datetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4.

\n

6.9 Validation examples#

\n

6.9.1 Missing required role#

\n

Input:

\n
title: Plan workshop\nstatus: open\ndateCreated: 2026-02-20T09:00:00Z\n

Issue:

\n
code: missing_required\nseverity: error\nfield: dateModified\nmessage: Required field 'dateModified' is missing.\n

6.9.2 Invalid recurrence anchor#

\n

Input:

\n
recurrence: FREQ=DAILY\nrecurrenceAnchor: due\n

Issue:

\n
code: invalid_recurrence_anchor\nseverity: error\nfield: recurrenceAnchor\nmessage: recurrence anchor must be 'scheduled' or 'completion'.\n

6.9.3 Overlap in instance state#

\n

Input:

\n
completeInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n

Issue:

\n
code: instance_state_overlap\nseverity: error\nmessage: same date exists in complete and skipped instance lists.\n

6.9.4 Invalid dependency reltype#

\n

Input:

\n
blockedBy:\n  - uid: "[[task-a]]"\n    reltype: BLOCKS\n

Issue:

\n
code: invalid_dependency_reltype\nseverity: error\nfield: blockedBy[0].reltype\nmessage: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH.\n

6.9.5 Unresolvable reminder base#

\n

Input:

\n
reminders:\n  - id: due_minus_1d\n    type: relative\n    relatedTo: due\n    offset: -P1D\n

Issue when due missing:

\n
code: unresolvable_reminder_base\nseverity: error\nfield: reminders[0]\nmessage: relative reminder references due but no due value exists.\n

6.9.6 Unknown field in permissive mode#

\n

Input:

\n
title: Plan workshop\nstatus: open\nvendorPriority: p1\n

Issue example:

\n
code: unknown_field\nseverity: info\nfield: vendorPriority\nmessage: field is not mapped to a known semantic role.\n

6.9.7 Multiple active time entries#

\n

Input:

\n
timeEntries:\n  - startTime: 2026-02-20T10:00:00Z\n  - startTime: 2026-02-20T11:00:00Z\n

Issue:

\n
code: multiple_active_time_entries\nseverity: error\nfield: timeEntries\nmessage: task contains more than one active time entry.\n
","text":"6.1 Purpose# Validation ensures persisted task records conform to this specification and collection configuration. 6.2 Validation phases# Implementations SHOULD validate in these phases: Parse validation (YAML/frontmatter structure) Schema validation (types and role constraints) Semantic validation (cross-field invariants) 6.3 Validation modes# Conforming implementations MUST support: strict: errors block writes. Implementations MAY additionally support: permissive: writes may continue with warnings. Current mode MUST be discoverable. 6.4 Required checks# A conforming validator MUST implement checks required by the claimed profile(s): Check ID Requirement Required for 1 Unconditionally required semantic roles are present (status, date_created, date_modified). core-lite and above 1a completed_date conditional requiredness is enforced per §2.2.1. core-lite and above 1b title resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback. core-lite and above 2 Field values match role type requirements. core-lite and above 3 Temporal values conform to §3. core-lite and above 4 Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules). recurrence and above 5 Per-instance lists contain valid dates with no overlap. recurrence and above 6 date_modified is not earlier than date_created when both exist. core-lite and above 7 time_estimate is non-negative when present. any profile that supports time_estimate 8 time_entries entries include required startTime, ranges are valid when endTime exists, and at most one active entry exists per task. any profile that supports time_entries 9 blocked_by entries conform to §10.2 (shape, enum, duplicates, self-reference). extended 10 reminders entries conform to §10.3 (shape, type-specific fields, unique ids). extended 11 relative reminders have resolvable base fields or produce configured error/warning behavior. extended 12 link-bearing fields (projects, blocked_by.uid) conform to §11 parsing/resolution and traversal safety. extended 13 templating configuration is valid when provided (templating schema and enums). templating 14 create-time template failures obey configured failure mode (error vs fallback). templating 15 semantic id (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable. any profile that supports semantic id 16 materialized occurrence notes contain valid recurrence_parent and occurrence_date roles. materialized-occurrences 17 no duplicate materialized occurrence notes exist for the same resolved (recurrence_parent, occurrence_date) pair. materialized-occurrences 18 materialization policy values and rolling horizons conform to §4.18 and §9.17. materialized-occurrences 6.5 Unknown field policy# Unknown fields: MUST NOT fail validation by default unless collection is configured for strict schema closure. SHOULD generate informational warnings when strict schema closure is desired but not enabled. 6.6 Issue structure# Validation issues MUST include: code (machine-readable) severity (error, warning, or info) message (human-readable) Issues SHOULD include: field or path expected and actual details where useful 6.7 Recommended issue codes# Code Severity (default) Meaning missing_required error required role missing invalid_type error value type mismatch invalid_enum_value error value not in configured set invalid_date_value error malformed or impossible date invalid_datetime_value error malformed datetime invalid_recurrence_rule error recurrence not valid tasknotes recurrence syntax missing_recurrence_seed error recurrence has no resolvable seed/start date invalid_recurrence_anchor error anchor not allowed instance_state_overlap error same date in complete and skipped lists invalid_time_range error end before start in time entry missing_time_entry_start error time entry is missing required startTime multiple_active_time_entries error more than one active time entry exists in one task invalid_dependency_entry error dependency object missing required fields invalid_dependency_reltype error dependency reltype not allowed invalid_dependency_gap error dependency gap not valid ISO 8601 duration duplicate_dependency_uid error in strict mode when dependencies.enforce_unique_uid=true; warning otherwise by policy repeated dependency uid in task self_dependency error task depends on itself unresolved_dependency_target warning dependency target not resolvable invalid_reminder_entry error reminder object missing required fields duplicate_reminder_id error repeated reminder id in task invalid_reminder_type error reminder type not allowed invalid_reminder_offset error relative reminder offset not valid duration invalid_reminder_related_to error relatedTo must be due or scheduled invalid_reminder_absolute_time error absoluteTime invalid datetime unresolvable_reminder_base error relative reminder base field missing/unusable invalid_link_format error link value cannot be parsed as supported format ambiguous_link warning link resolves to multiple candidates path_traversal error resolved path escapes collection root unresolved_link_target warning link target cannot be resolved invalid_task_id error semantic id is empty or invalid type duplicate_task_id warning duplicate semantic id detected in collection scope alias_conflict_ignored warning alias key ignored due to canonical conflict unresolvable_title error title cannot be resolved from title resolution policy title_source_conflict warning mapped title and filename title differ; active title-storage policy selected authoritative source template_missing warning configured template file cannot be read/found template_parse_failed warning template frontmatter/body parsing or expansion failed missing_recurrence_parent error materialized occurrence note omits recurrence_parent invalid_recurrence_parent warning occurrence note parent reference cannot be resolved or does not reference a recurring task missing_occurrence_date error materialized occurrence note omits occurrence_date duplicate_occurrence_note warning more than one materialized occurrence note exists for the same parent/date occurrence_state_conflict warning materialized occurrence state disagrees with parent instance lists materialization_target_not_generated warning occurrence date is not generated by current parent recurrence rule missing_skipped_status error skip of materialized occurrence requires configured skipped status next_occurrence_materialization_failed warning triggering operation succeeded but next occurrence note could not be created orphan_occurrence_note warning materialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note unknown_field info unmapped field encountered Implementations MAY extend this code set but SHOULD preserve existing meanings. 6.8 Write-time validation behavior# In strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes. Warnings SHOULD NOT block writes unless explicitly configured. Datetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4. 6.9 Validation examples# 6.9.1 Missing required role# Input: title: Plan workshop status: open dateCreated: 2026-02-20T09:00:00Z Issue: code: missing_required severity: error field: dateModified message: Required field 'dateModified' is missing. 6.9.2 Invalid recurrence anchor# Input: recurrence: FREQ=DAILY recurrenceAnchor: due Issue: code: invalid_recurrence_anchor severity: error field: recurrenceAnchor message: recurrence anchor must be 'scheduled' or 'completion'. 6.9.3 Overlap in instance state# Input: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Issue: code: instance_state_overlap severity: error message: same date exists in complete and skipped instance lists. 6.9.4 Invalid dependency reltype# Input: blockedBy: - uid: \"[[task-a]]\" reltype: BLOCKS Issue: code: invalid_dependency_reltype severity: error field: blockedBy[0].reltype message: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH. 6.9.5 Unresolvable reminder base# Input: reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D Issue when due missing: code: unresolvable_reminder_base severity: error field: reminders[0] message: relative reminder references due but no due value exists. 6.9.6 Unknown field in permissive mode# Input: title: Plan workshop status: open vendorPriority: p1 Issue example: code: unknown_field severity: info field: vendorPriority message: field is not mapped to a known semantic role. 6.9.7 Multiple active time entries# Input: timeEntries: - startTime: 2026-02-20T10:00:00Z - startTime: 2026-02-20T11:00:00Z Issue: code: multiple_active_time_entries severity: error field: timeEntries message: task contains more than one active time entry."},{"route":"/developers/specification/07-conformance/","title":"7. Conformance","description":"This section defines conformance profiles and claim requirements for implementations.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:07-conformance.md","namespace":"specification","relativePath":"07-conformance.md","raw":"# 7. Conformance\n\n## 7.1 Purpose\n\nThis section defines conformance profiles and claim requirements for implementations.\n\n## 7.2 Conformance principles\n\nAn implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented.\n\nImplementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements.\n\n## 7.3 Profile model\n\nProfiles are cumulative unless explicitly marked otherwise.\n\n### 7.3.1 Profile: `core-lite`\n\nRequired capabilities:\n\n- task identification and loading\n- semantic-role mapping and canonical writes (§2)\n- required role support (`title`, `status`, `completed_date`, `date_created`, `date_modified`)\n- create, update, delete operations (§5)\n- non-recurring complete/uncomplete (§5)\n- temporal parsing/canonical serialization basics (§3)\n- strict validation mode support (§6.3)\n- validation core checks (§6.4 items 1,1a,1b,2,3,6)\n\n### 7.3.2 Profile: `recurrence`\n\nAdditional required capabilities:\n\n- tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline `DTSTART` handling\n- recurrence anchor semantics, including seed precedence and completion-anchor progression\n- complete/uncomplete instance\n- skip/unskip instance\n- instance-list invariants and effective state resolution\n- validation checks for recurrence and instance overlap\n\n### 7.3.3 Profile: `templating` (non-cumulative extension)\n\nThis profile is not cumulative; it MAY be claimed alongside `core-lite`, `recurrence`, `materialized-occurrences`, and/or `extended`.\n`templating` MUST NOT be claimed alone.\n\nRequired capabilities:\n\n- create-time template processing semantics per §5.3.5\n- `templating` configuration support per §9.14\n- deterministic template/frontmatter/body merge behavior\n- deterministic failure-mode behavior for template read/parse failures\n- support for portable double-brace template variables defined in §5.3.5\n\n### 7.3.4 Profile: `materialized-occurrences` (non-cumulative extension)\n\nThis profile is not cumulative; it MUST be claimed alongside `recurrence`.\nIt MAY be claimed alongside `extended` and/or `templating`, but it does not require either.\n\nRequired capabilities:\n\n- materialized occurrence roles and identity semantics (§2.6.6)\n- recurrence materialization semantics (§4.18)\n- materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20)\n- `occurrences` configuration defaults (§9.17)\n- parent-reference link parsing/resolution for `recurrence_parent` (§11), without requiring full `extended`\n- validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18)\n\nClaiming `materialized-occurrences` also has required capability-token implications:\n\n- `meta.claim.capabilities` MUST include `materialized-occurrences`.\n- `meta.claim.profiles` MUST also include `recurrence`.\n- Omitting either token while claiming `materialized-occurrences` is a non-conformant claim.\n\n### 7.3.5 Profile: `extended`\n\nAdditional required capabilities:\n\n- dependency schema support (`blocked_by`)\n- reminder schema support (`reminders`)\n- link parsing/resolution semantics for link-bearing fields (§11)\n- time-tracking management semantics for `time_entries` (§5.19), including per-task active-session constraints\n- dependency operations and validation per §10.2\n- reminder operations and validation per §10.3\n\nIf `extended` is claimed, all of the above baseline capabilities MUST conform to documented semantics.\n\nClaiming `extended` also has required capability-token implications:\n\n- `meta.claim.capabilities` MUST include `dependencies`, `reminders`, `links`, and `time-tracking`.\n- Omitting any of these tokens while claiming `extended` is a non-conformant claim (even if capability-gated fixtures are skipped by a runner).\n\nOptional capability extensions within `extended`:\n\n- `rename` capability: reference-aware rename behavior (including dependency UID references)\n- `archive` capability: archive semantics (§5.12)\n- `batch` capability: batch operations with per-item outcomes (§5.15)\n- `concurrency` capability: write-conflict detection semantics (§5.16)\n- `dry-run` capability: dry-run semantics (§5.17)\n\nWhen an optional capability token is claimed, corresponding behavior MUST conform to documented semantics.\n\n## 7.4 Conformance claim format\n\nA conformance claim MUST include:\n\n- implementation name and version,\n- `tasknotes-spec` version,\n- claimed profile list,\n- validation mode support (`strict` required; `permissive` optional),\n- known deviations,\n- compatibility mode status (if any),\n- configuration provider status (active provider chain, precedence policy, and fallback state).\n\nExample:\n\n```text\nImplementation: example-task-cli v1.4.0\nSpec: tasknotes-spec 0.3.0-rc.1\nProfiles: core-lite, recurrence, templating\nValidation modes: strict, permissive\nKnown deviations: none\nCompatibility mode: disabled\nConfiguration providers: tasknotes_plugin_data_json > built_in_defaults\nConfiguration fallback: none\n```\n\n## 7.5 Deviation disclosure\n\nAny known deviation from normative text MUST be explicitly disclosed in conformance output/documentation.\n\nA deviation entry SHOULD include:\n\n- affected section,\n- deviation summary,\n- impact,\n- planned resolution version.\n\n## 7.6 Feature detection\n\nImplementations SHOULD expose machine-readable capability metadata, including:\n\n- profiles\n- effective runtime timezone\n- active configuration providers and precedence chain\n- enabled compatibility modes\n- configurable status sets\n- supported mapping aliases\n- templating support flags and effective templating failure mode\n- dependency and reminder support flags\n- time-tracking support flags, including active-session policy and auto-stop-on-complete behavior\n- materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds\n- configured natural-language capture triggers when the optional `nlp` block is\n present\n\n## 7.7 Strictness disclosure\n\nConformance requires `strict` validation mode support (§6.3).\n\nConformance claims MUST indicate whether `permissive` mode is also supported.\n\n## 7.8 Example profile matrix\n\n| Capability | core-lite | recurrence | templating | materialized-occurrences | extended |\n|---|---:|---:|---:|---:|---:|\n| create/update/delete | required | required | companion-profile required | companion-profile required | required |\n| non-recurring complete | required | required | companion-profile required | companion-profile required | required |\n| recurring instance complete/skip | - | required | optional | required via companion `recurrence` claim | required |\n| materialize occurrence notes (§4.18, §5.20) | - | - | optional | required | optional |\n| recurrence parent link resolution | - | - | optional | required for `recurrence_parent` only | required |\n| template expansion/merge (§5.3.5) | - | - | required | optional | optional |\n| double-brace portable variable support | - | - | required | optional | optional |\n| recurrence-string validation | - | required | optional | required via companion `recurrence` claim | required |\n| link parsing/resolution (§11) | - | - | optional | required for `recurrence_parent` only | required |\n| dependency schema and ops | - | - | optional | optional | required |\n| reminder schema and ops | - | - | optional | optional | required |\n| time tracking start/stop/edit semantics (§5.19) | - | - | optional | optional | required |\n| rename updates dependency/project links | - | - | optional | optional | optional via `rename` capability |\n| archive semantics (§5.12) | - | - | optional | optional | optional via `archive` capability |\n| batch per-item outcomes (§5.15) | - | - | optional | optional | optional via `batch` capability |\n| write-conflict detection (§5.16) | - | - | optional | optional | optional via `concurrency` capability |\n| dry-run reporting (§5.17) | - | - | optional | optional | optional via `dry-run` capability |\n\n## 7.9 Executable fixture suite\n\nThis specification includes an executable fixture suite in `conformance/`.\n\n- language-neutral fixtures are stored in `conformance/fixtures/*.json`\n- section/profile/operation coverage is tracked in `conformance/manifest.json`\n- coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations.\n- adapters execute fixture operations per `conformance/docs/ADAPTER_CONTRACT.md`\n- runners MUST execute fixtures only when both conditions hold:\n - fixture `profile` is satisfied by claimed adapter profiles under cumulative profile rules (§7.3),\n - all fixture `requires` capability tokens are present.\n\nFixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own `profile`/`requires` gating guarantees.\nFixtures for optional extension capabilities (`rename`, `archive`, `batch`, `concurrency`, `dry-run`) MUST be capability-gated via `requires` and MUST NOT rely on `extended` profile membership alone.\n\nConformance claims SHOULD report fixture pass/fail results against the claimed profiles.\n\n## 7.10 Meta operations\n\nThe following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token.\n\n### `meta.claim`\n\nReturns the adapter's self-reported metadata.\n\nInput: `{}` (empty object)\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"implementation\": \"my-tool\",\n \"version\": \"1.0.0\",\n \"spec_version\": \"0.3.0-rc.1\",\n \"validation_modes\": [\"strict\"],\n \"profiles\": [\"core-lite\", \"recurrence\"],\n \"capabilities\": [\"dependencies\", \"links\"]\n }\n}\n```\n\nFields:\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `implementation` | string | yes | Human-readable implementation name |\n| `version` | string | yes | Implementation version string |\n| `spec_version` | string | yes | `tasknotes-spec` version targeted by this adapter |\n| `validation_modes` | string[] | yes | Supported validation modes; MUST include `strict` |\n| `profiles` | string[] | yes | Claimed conformance profiles; valid values: `core-lite`, `recurrence`, `extended`, `templating`, `materialized-occurrences` |\n| `capabilities` | string[] | yes | Optional capability tokens; known tokens listed in §7.11 |\n\n`profiles` lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of `meta.has_profile`.\n\nProfile-token consistency rules:\n\n- If `profiles` contains `extended`, `capabilities` MUST include `dependencies`, `reminders`, `links`, and `time-tracking`.\n- If `profiles` contains `templating`, `capabilities` MUST include `templating`.\n- If `profiles` contains `materialized-occurrences`, `profiles` MUST also contain `recurrence` and `capabilities` MUST include `materialized-occurrences`.\n- Runners and fixture suites SHOULD validate these claim-consistency rules directly from `meta.claim`, not only by capability-gating feature fixtures.\n\n### `meta.has_capability`\n\nTests whether the adapter claims a specific capability.\n\nInput:\n```json\n{ \"capability\": \"dependencies\" }\n```\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"value\": true } }\n```\n\n`result.value` MUST be `true` if the capability is in the `capabilities` array returned by `meta.claim`, and `false` otherwise.\n\n### `meta.has_profile`\n\nTests whether the adapter claims a specific conformance profile.\n\nInput:\n```json\n{ \"profile\": \"recurrence\" }\n```\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"value\": true } }\n```\n\n`result.value` MUST be `true` if the profile is in the `profiles` array returned by `meta.claim`, and `false` otherwise.\n\n## 7.11 Known capability tokens\n\nThe following capability tokens are defined by this specification. Implementations MAY define additional tokens.\n\n| Token | Required by profile | Meaning |\n|---|---|---|\n| `dependencies` | `extended` | Supports `blocked_by`, dependency operations, and dependency validation |\n| `reminders` | `extended` | Supports `reminders`, reminder operations, and reminder validation |\n| `links` | `extended` | Supports link parsing and resolution (§11) |\n| `time-tracking` | `extended` | Supports time-tracking management operations (§5.19) |\n| `materialized-occurrences` | `materialized-occurrences` | Supports recurrence materialization and materialized occurrence operations (§4.18, §5.20) |\n| `rename` | optional extension under `extended` | Supports file rename with reference updates |\n| `archive` | optional extension under `extended` | Supports archive semantics (§5.12) |\n| `batch` | optional extension under `extended` | Supports batch operations with per-item outcomes (§5.15) |\n| `concurrency` | optional extension under `extended` | Supports write-conflict detection (§5.16) |\n| `dry-run` | optional extension under `extended` | Supports dry-run mode (§5.17) |\n| `migration` | — | Supports migration operations (§8) |\n| `templating` | `templating` | Supports create-time templating (§5.3.5) |\n","aliases":["/spec/07-conformance/"],"toc":[{"level":2,"id":"71-purpose","text":"7.1 Purpose"},{"level":2,"id":"72-conformance-principles","text":"7.2 Conformance principles"},{"level":2,"id":"73-profile-model","text":"7.3 Profile model"},{"level":3,"id":"731-profile-core-lite","text":"7.3.1 Profile: core-lite"},{"level":3,"id":"732-profile-recurrence","text":"7.3.2 Profile: recurrence"},{"level":3,"id":"733-profile-templating-non-cumulative-extension","text":"7.3.3 Profile: templating (non-cumulative extension)"},{"level":3,"id":"734-profile-materialized-occurrences-non-cumulative-extension","text":"7.3.4 Profile: materialized-occurrences (non-cumulative extension)"},{"level":3,"id":"735-profile-extended","text":"7.3.5 Profile: extended"},{"level":2,"id":"74-conformance-claim-format","text":"7.4 Conformance claim format"},{"level":2,"id":"75-deviation-disclosure","text":"7.5 Deviation disclosure"},{"level":2,"id":"76-feature-detection","text":"7.6 Feature detection"},{"level":2,"id":"77-strictness-disclosure","text":"7.7 Strictness disclosure"},{"level":2,"id":"78-example-profile-matrix","text":"7.8 Example profile matrix"},{"level":2,"id":"79-executable-fixture-suite","text":"7.9 Executable fixture suite"},{"level":2,"id":"710-meta-operations","text":"7.10 Meta operations"},{"level":3,"id":"metaclaim","text":"meta.claim"},{"level":3,"id":"metahascapability","text":"meta.has_capability"},{"level":3,"id":"metahasprofile","text":"meta.has_profile"},{"level":2,"id":"711-known-capability-tokens","text":"7.11 Known capability tokens"}],"html":"

7.1 Purpose#

\n

This section defines conformance profiles and claim requirements for implementations.

\n

7.2 Conformance principles#

\n

An implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented.

\n

Implementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements.

\n

7.3 Profile model#

\n

Profiles are cumulative unless explicitly marked otherwise.

\n

7.3.1 Profile: core-lite#

\n

Required capabilities:

\n
    \n
  • task identification and loading
  • \n
  • semantic-role mapping and canonical writes (§2)
  • \n
  • required role support (title, status, completed_date, date_created, date_modified)
  • \n
  • create, update, delete operations (§5)
  • \n
  • non-recurring complete/uncomplete (§5)
  • \n
  • temporal parsing/canonical serialization basics (§3)
  • \n
  • strict validation mode support (§6.3)
  • \n
  • validation core checks (§6.4 items 1,1a,1b,2,3,6)
  • \n
\n

7.3.2 Profile: recurrence#

\n

Additional required capabilities:

\n
    \n
  • tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline DTSTART handling
  • \n
  • recurrence anchor semantics, including seed precedence and completion-anchor progression
  • \n
  • complete/uncomplete instance
  • \n
  • skip/unskip instance
  • \n
  • instance-list invariants and effective state resolution
  • \n
  • validation checks for recurrence and instance overlap
  • \n
\n

7.3.3 Profile: templating (non-cumulative extension)#

\n

This profile is not cumulative; it MAY be claimed alongside core-lite, recurrence, materialized-occurrences, and/or extended.\ntemplating MUST NOT be claimed alone.

\n

Required capabilities:

\n
    \n
  • create-time template processing semantics per §5.3.5
  • \n
  • templating configuration support per §9.14
  • \n
  • deterministic template/frontmatter/body merge behavior
  • \n
  • deterministic failure-mode behavior for template read/parse failures
  • \n
  • support for portable double-brace template variables defined in §5.3.5
  • \n
\n

7.3.4 Profile: materialized-occurrences (non-cumulative extension)#

\n

This profile is not cumulative; it MUST be claimed alongside recurrence.\nIt MAY be claimed alongside extended and/or templating, but it does not require either.

\n

Required capabilities:

\n
    \n
  • materialized occurrence roles and identity semantics (§2.6.6)
  • \n
  • recurrence materialization semantics (§4.18)
  • \n
  • materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20)
  • \n
  • occurrences configuration defaults (§9.17)
  • \n
  • parent-reference link parsing/resolution for recurrence_parent (§11), without requiring full extended
  • \n
  • validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18)
  • \n
\n

Claiming materialized-occurrences also has required capability-token implications:

\n
    \n
  • meta.claim.capabilities MUST include materialized-occurrences.
  • \n
  • meta.claim.profiles MUST also include recurrence.
  • \n
  • Omitting either token while claiming materialized-occurrences is a non-conformant claim.
  • \n
\n

7.3.5 Profile: extended#

\n

Additional required capabilities:

\n
    \n
  • dependency schema support (blocked_by)
  • \n
  • reminder schema support (reminders)
  • \n
  • link parsing/resolution semantics for link-bearing fields (§11)
  • \n
  • time-tracking management semantics for time_entries (§5.19), including per-task active-session constraints
  • \n
  • dependency operations and validation per §10.2
  • \n
  • reminder operations and validation per §10.3
  • \n
\n

If extended is claimed, all of the above baseline capabilities MUST conform to documented semantics.

\n

Claiming extended also has required capability-token implications:

\n
    \n
  • meta.claim.capabilities MUST include dependencies, reminders, links, and time-tracking.
  • \n
  • Omitting any of these tokens while claiming extended is a non-conformant claim (even if capability-gated fixtures are skipped by a runner).
  • \n
\n

Optional capability extensions within extended:

\n
    \n
  • rename capability: reference-aware rename behavior (including dependency UID references)
  • \n
  • archive capability: archive semantics (§5.12)
  • \n
  • batch capability: batch operations with per-item outcomes (§5.15)
  • \n
  • concurrency capability: write-conflict detection semantics (§5.16)
  • \n
  • dry-run capability: dry-run semantics (§5.17)
  • \n
\n

When an optional capability token is claimed, corresponding behavior MUST conform to documented semantics.

\n

7.4 Conformance claim format#

\n

A conformance claim MUST include:

\n
    \n
  • implementation name and version,
  • \n
  • tasknotes-spec version,
  • \n
  • claimed profile list,
  • \n
  • validation mode support (strict required; permissive optional),
  • \n
  • known deviations,
  • \n
  • compatibility mode status (if any),
  • \n
  • configuration provider status (active provider chain, precedence policy, and fallback state).
  • \n
\n

Example:

\n
Implementation: example-task-cli v1.4.0\nSpec: tasknotes-spec 0.3.0-rc.1\nProfiles: core-lite, recurrence, templating\nValidation modes: strict, permissive\nKnown deviations: none\nCompatibility mode: disabled\nConfiguration providers: tasknotes_plugin_data_json > built_in_defaults\nConfiguration fallback: none\n

7.5 Deviation disclosure#

\n

Any known deviation from normative text MUST be explicitly disclosed in conformance output/documentation.

\n

A deviation entry SHOULD include:

\n
    \n
  • affected section,
  • \n
  • deviation summary,
  • \n
  • impact,
  • \n
  • planned resolution version.
  • \n
\n

7.6 Feature detection#

\n

Implementations SHOULD expose machine-readable capability metadata, including:

\n
    \n
  • profiles
  • \n
  • effective runtime timezone
  • \n
  • active configuration providers and precedence chain
  • \n
  • enabled compatibility modes
  • \n
  • configurable status sets
  • \n
  • supported mapping aliases
  • \n
  • templating support flags and effective templating failure mode
  • \n
  • dependency and reminder support flags
  • \n
  • time-tracking support flags, including active-session policy and auto-stop-on-complete behavior
  • \n
  • materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds
  • \n
  • configured natural-language capture triggers when the optional nlp block is\npresent
  • \n
\n

7.7 Strictness disclosure#

\n

Conformance requires strict validation mode support (§6.3).

\n

Conformance claims MUST indicate whether permissive mode is also supported.

\n

7.8 Example profile matrix#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Capabilitycore-literecurrencetemplatingmaterialized-occurrencesextended
create/update/deleterequiredrequiredcompanion-profile requiredcompanion-profile requiredrequired
non-recurring completerequiredrequiredcompanion-profile requiredcompanion-profile requiredrequired
recurring instance complete/skip-requiredoptionalrequired via companion recurrence claimrequired
materialize occurrence notes (§4.18, §5.20)--optionalrequiredoptional
recurrence parent link resolution--optionalrequired for recurrence_parent onlyrequired
template expansion/merge (§5.3.5)--requiredoptionaloptional
double-brace portable variable support--requiredoptionaloptional
recurrence-string validation-requiredoptionalrequired via companion recurrence claimrequired
link parsing/resolution (§11)--optionalrequired for recurrence_parent onlyrequired
dependency schema and ops--optionaloptionalrequired
reminder schema and ops--optionaloptionalrequired
time tracking start/stop/edit semantics (§5.19)--optionaloptionalrequired
rename updates dependency/project links--optionaloptionaloptional via rename capability
archive semantics (§5.12)--optionaloptionaloptional via archive capability
batch per-item outcomes (§5.15)--optionaloptionaloptional via batch capability
write-conflict detection (§5.16)--optionaloptionaloptional via concurrency capability
dry-run reporting (§5.17)--optionaloptionaloptional via dry-run capability
\n

7.9 Executable fixture suite#

\n

This specification includes an executable fixture suite in conformance/.

\n
    \n
  • language-neutral fixtures are stored in conformance/fixtures/*.json
  • \n
  • section/profile/operation coverage is tracked in conformance/manifest.json
  • \n
  • coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations.
  • \n
  • adapters execute fixture operations per conformance/docs/ADAPTER_CONTRACT.md
  • \n
  • runners MUST execute fixtures only when both conditions hold:
      \n
    • fixture profile is satisfied by claimed adapter profiles under cumulative profile rules (§7.3),
    • \n
    • all fixture requires capability tokens are present.
    • \n
    \n
  • \n
\n

Fixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own profile/requires gating guarantees.\nFixtures for optional extension capabilities (rename, archive, batch, concurrency, dry-run) MUST be capability-gated via requires and MUST NOT rely on extended profile membership alone.

\n

Conformance claims SHOULD report fixture pass/fail results against the claimed profiles.

\n

7.10 Meta operations#

\n

The following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token.

\n

meta.claim#

\n

Returns the adapter's self-reported metadata.

\n

Input: {} (empty object)

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "implementation": "my-tool",\n    "version": "1.0.0",\n    "spec_version": "0.3.0-rc.1",\n    "validation_modes": ["strict"],\n    "profiles": ["core-lite", "recurrence"],\n    "capabilities": ["dependencies", "links"]\n  }\n}\n

Fields:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldTypeRequiredDescription
implementationstringyesHuman-readable implementation name
versionstringyesImplementation version string
spec_versionstringyestasknotes-spec version targeted by this adapter
validation_modesstring[]yesSupported validation modes; MUST include strict
profilesstring[]yesClaimed conformance profiles; valid values: core-lite, recurrence, extended, templating, materialized-occurrences
capabilitiesstring[]yesOptional capability tokens; known tokens listed in §7.11
\n

profiles lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of meta.has_profile.

\n

Profile-token consistency rules:

\n
    \n
  • If profiles contains extended, capabilities MUST include dependencies, reminders, links, and time-tracking.
  • \n
  • If profiles contains templating, capabilities MUST include templating.
  • \n
  • If profiles contains materialized-occurrences, profiles MUST also contain recurrence and capabilities MUST include materialized-occurrences.
  • \n
  • Runners and fixture suites SHOULD validate these claim-consistency rules directly from meta.claim, not only by capability-gating feature fixtures.
  • \n
\n

meta.has_capability#

\n

Tests whether the adapter claims a specific capability.

\n

Input:

\n
{ "capability": "dependencies" }\n

Output:

\n
{ "ok": true, "result": { "value": true } }\n

result.value MUST be true if the capability is in the capabilities array returned by meta.claim, and false otherwise.

\n

meta.has_profile#

\n

Tests whether the adapter claims a specific conformance profile.

\n

Input:

\n
{ "profile": "recurrence" }\n

Output:

\n
{ "ok": true, "result": { "value": true } }\n

result.value MUST be true if the profile is in the profiles array returned by meta.claim, and false otherwise.

\n

7.11 Known capability tokens#

\n

The following capability tokens are defined by this specification. Implementations MAY define additional tokens.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TokenRequired by profileMeaning
dependenciesextendedSupports blocked_by, dependency operations, and dependency validation
remindersextendedSupports reminders, reminder operations, and reminder validation
linksextendedSupports link parsing and resolution (§11)
time-trackingextendedSupports time-tracking management operations (§5.19)
materialized-occurrencesmaterialized-occurrencesSupports recurrence materialization and materialized occurrence operations (§4.18, §5.20)
renameoptional extension under extendedSupports file rename with reference updates
archiveoptional extension under extendedSupports archive semantics (§5.12)
batchoptional extension under extendedSupports batch operations with per-item outcomes (§5.15)
concurrencyoptional extension under extendedSupports write-conflict detection (§5.16)
dry-runoptional extension under extendedSupports dry-run mode (§5.17)
migration—Supports migration operations (§8)
templatingtemplatingSupports create-time templating (§5.3.5)
\n","text":"7.1 Purpose# This section defines conformance profiles and claim requirements for implementations. 7.2 Conformance principles# An implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented. Implementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements. 7.3 Profile model# Profiles are cumulative unless explicitly marked otherwise. 7.3.1 Profile: core-lite# Required capabilities: task identification and loading semantic-role mapping and canonical writes (§2) required role support (title, status, completed_date, date_created, date_modified) create, update, delete operations (§5) non-recurring complete/uncomplete (§5) temporal parsing/canonical serialization basics (§3) strict validation mode support (§6.3) validation core checks (§6.4 items 1,1a,1b,2,3,6) 7.3.2 Profile: recurrence# Additional required capabilities: tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline DTSTART handling recurrence anchor semantics, including seed precedence and completion-anchor progression complete/uncomplete instance skip/unskip instance instance-list invariants and effective state resolution validation checks for recurrence and instance overlap 7.3.3 Profile: templating (non-cumulative extension)# This profile is not cumulative; it MAY be claimed alongside core-lite, recurrence, materialized-occurrences, and/or extended. templating MUST NOT be claimed alone. Required capabilities: create-time template processing semantics per §5.3.5 templating configuration support per §9.14 deterministic template/frontmatter/body merge behavior deterministic failure-mode behavior for template read/parse failures support for portable double-brace template variables defined in §5.3.5 7.3.4 Profile: materialized-occurrences (non-cumulative extension)# This profile is not cumulative; it MUST be claimed alongside recurrence. It MAY be claimed alongside extended and/or templating, but it does not require either. Required capabilities: materialized occurrence roles and identity semantics (§2.6.6) recurrence materialization semantics (§4.18) materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20) occurrences configuration defaults (§9.17) parent-reference link parsing/resolution for recurrence_parent (§11), without requiring full extended validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18) Claiming materialized-occurrences also has required capability-token implications: meta.claim.capabilities MUST include materialized-occurrences. meta.claim.profiles MUST also include recurrence. Omitting either token while claiming materialized-occurrences is a non-conformant claim. 7.3.5 Profile: extended# Additional required capabilities: dependency schema support (blocked_by) reminder schema support (reminders) link parsing/resolution semantics for link-bearing fields (§11) time-tracking management semantics for time_entries (§5.19), including per-task active-session constraints dependency operations and validation per §10.2 reminder operations and validation per §10.3 If extended is claimed, all of the above baseline capabilities MUST conform to documented semantics. Claiming extended also has required capability-token implications: meta.claim.capabilities MUST include dependencies, reminders, links, and time-tracking. Omitting any of these tokens while claiming extended is a non-conformant claim (even if capability-gated fixtures are skipped by a runner). Optional capability extensions within extended: rename capability: reference-aware rename behavior (including dependency UID references) archive capability: archive semantics (§5.12) batch capability: batch operations with per-item outcomes (§5.15) concurrency capability: write-conflict detection semantics (§5.16) dry-run capability: dry-run semantics (§5.17) When an optional capability token is claimed, corresponding behavior MUST conform to documented semantics. 7.4 Conformance claim format# A conformance claim MUST include: implementation name and version, tasknotes-spec version, claimed profile list, validation mode support (strict required; permissive optional), known deviations, compatibility mode status (if any), configuration provider status (active provider chain, precedence policy, and fallback state). Example: Implementation: example-task-cli v1.4.0 Spec: tasknotes-spec 0.3.0-rc.1 Profiles: core-lite, recurrence, templating Validation modes: strict, permissive Known deviations: none Compatibility mode: disabled Configuration providers: tasknotes_plugin_data_json > built_in_defaults Configuration fallback: none 7.5 Deviation disclosure# Any known deviation from normative text MUST be explicitly disclosed in conformance output/documentation. A deviation entry SHOULD include: affected section, deviation summary, impact, planned resolution version. 7.6 Feature detection# Implementations SHOULD expose machine-readable capability metadata, including: profiles effective runtime timezone active configuration providers and precedence chain enabled compatibility modes configurable status sets supported mapping aliases templating support flags and effective templating failure mode dependency and reminder support flags time-tracking support flags, including active-session policy and auto-stop-on-complete behavior materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds configured natural-language capture triggers when the optional nlp block is present 7.7 Strictness disclosure# Conformance requires strict validation mode support (§6.3). Conformance claims MUST indicate whether permissive mode is also supported. 7.8 Example profile matrix# Capability core-lite recurrence templating materialized-occurrences extended create/update/delete required required companion-profile required companion-profile required required non-recurring complete required required companion-profile required companion-profile required required recurring instance complete/skip - required optional required via companion recurrence claim required materialize occurrence notes (§4.18, §5.20) - - optional required optional recurrence parent link resolution - - optional required for recurrence_parent only required template expansion/merge (§5.3.5) - - required optional optional double-brace portable variable support - - required optional optional recurrence-string validation - required optional required via companion recurrence claim required link parsing/resolution (§11) - - optional required for recurrence_parent only required dependency schema and ops - - optional optional required reminder schema and ops - - optional optional required time tracking start/stop/edit semantics (§5.19) - - optional optional required rename updates dependency/project links - - optional optional optional via rename capability archive semantics (§5.12) - - optional optional optional via archive capability batch per-item outcomes (§5.15) - - optional optional optional via batch capability write-conflict detection (§5.16) - - optional optional optional via concurrency capability dry-run reporting (§5.17) - - optional optional optional via dry-run capability 7.9 Executable fixture suite# This specification includes an executable fixture suite in conformance/. language-neutral fixtures are stored in conformance/fixtures/*.json section/profile/operation coverage is tracked in conformance/manifest.json coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations. adapters execute fixture operations per conformance/docs/ADAPTER_CONTRACT.md runners MUST execute fixtures only when both conditions hold: fixture profile is satisfied by claimed adapter profiles under cumulative profile rules (§7.3), all fixture requires capability tokens are present. Fixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own profile/requires gating guarantees. Fixtures for optional extension capabilities (rename, archive, batch, concurrency, dry-run) MUST be capability-gated via requires and MUST NOT rely on extended profile membership alone. Conformance claims SHOULD report fixture pass/fail results against the claimed profiles. 7.10 Meta operations# The following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token. meta.claim# Returns the adapter's self-reported metadata. Input: {} (empty object) Output: { \"ok\": true, \"result\": { \"implementation\": \"my-tool\", \"version\": \"1.0.0\", \"spec_version\": \"0.3.0-rc.1\", \"validation_modes\": [\"strict\"], \"profiles\": [\"core-lite\", \"recurrence\"], \"capabilities\": [\"dependencies\", \"links\"] } } Fields: Field Type Required Description implementation string yes Human-readable implementation name version string yes Implementation version string spec_version string yes tasknotes-spec version targeted by this adapter validation_modes string[] yes Supported validation modes; MUST include strict profiles string[] yes Claimed conformance profiles; valid values: core-lite, recurrence, extended, templating, materialized-occurrences capabilities string[] yes Optional capability tokens; known tokens listed in §7.11 profiles lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of meta.has_profile. Profile-token consistency rules: If profiles contains extended, capabilities MUST include dependencies, reminders, links, and time-tracking. If profiles contains templating, capabilities MUST include templating. If profiles contains materialized-occurrences, profiles MUST also contain recurrence and capabilities MUST include materialized-occurrences. Runners and fixture suites SHOULD validate these claim-consistency rules directly from meta.claim, not only by capability-gating feature fixtures. meta.has_capability# Tests whether the adapter claims a specific capability. Input: { \"capability\": \"dependencies\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the capability is in the capabilities array returned by meta.claim, and false otherwise. meta.has_profile# Tests whether the adapter claims a specific conformance profile. Input: { \"profile\": \"recurrence\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the profile is in the profiles array returned by meta.claim, and false otherwise. 7.11 Known capability tokens# The following capability tokens are defined by this specification. Implementations MAY define additional tokens. Token Required by profile Meaning dependencies extended Supports blocked_by, dependency operations, and dependency validation reminders extended Supports reminders, reminder operations, and reminder validation links extended Supports link parsing and resolution (§11) time-tracking extended Supports time-tracking management operations (§5.19) materialized-occurrences materialized-occurrences Supports recurrence materialization and materialized occurrence operations (§4.18, §5.20) rename optional extension under extended Supports file rename with reference updates archive optional extension under extended Supports archive semantics (§5.12) batch optional extension under extended Supports batch operations with per-item outcomes (§5.15) concurrency optional extension under extended Supports write-conflict detection (§5.16) dry-run optional extension under extended Supports dry-run mode (§5.17) migration — Supports migration operations (§8) templating templating Supports create-time templating (§5.3.5)"},{"route":"/developers/specification/08-compatibility-and-migrations/","title":"8. Compatibility and Migrations","description":"This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:08-compatibility-and-migrations.md","namespace":"specification","relativePath":"08-compatibility-and-migrations.md","raw":"# 8. Compatibility and Migrations\n\n## 8.1 Purpose\n\nThis section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.\n\n## 8.2 Compatibility modes\n\nImplementations MAY support compatibility modes for legacy behavior.\n\nIf supported, compatibility modes MUST:\n\n- be explicitly enabled or disabled,\n- be discoverable through configuration or capability metadata,\n- not be silently enabled by default in new collections.\n\n## 8.3 Migration expectations\n\nWhen canonical behavior differs from historical behavior, implementations SHOULD provide:\n\n1. deterministic migration rules,\n2. dry-run preview support,\n3. rollback-safe workflow guidance.\n\n## 8.4 Alias normalization migration\n\nFor legacy key aliases, a migration SHOULD:\n\n- read both canonical and alias keys,\n- choose canonical value deterministically (recommended: canonical key precedence),\n- rewrite persisted file using canonical keys,\n- preserve unrelated unknown fields.\n\n### 8.4.1 Example\n\nBefore:\n\n```yaml\nrecurrenceAnchor: scheduled\nrecurrence_anchor: completion\n```\n\nAfter normalization:\n\n```yaml\nrecurrenceAnchor: scheduled\n```\n\nWith warning:\n\n- `alias_conflict_ignored`: alias value ignored because canonical key present.\n\n## 8.5 Temporal normalization migration\n\nIf historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO `Z` for datetime roles while preserving date-only roles as dates.\n\nExample:\n\nBefore:\n\n```yaml\ndateCreated: 2026-02-20 10:00:00+00:00\n```\n\nAfter:\n\n```yaml\ndateCreated: 2026-02-20T10:00:00Z\n```\n\n## 8.6 Recurrence state migration\n\nIf historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically.\n\nRecommended resolution policy:\n\n- if overlap exists, prefer most recent user action where recoverable,\n- otherwise prefer `complete_instances` and remove overlapping skip entries,\n- emit migration report for affected dates.\n\nPolicy choice MUST be documented.\n\n## 8.7 Materialized occurrence migration\n\nWhen introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation.\nRecommended migration behavior:\n\n- do not materialize historical or future occurrence notes unless explicitly requested;\n- preserve existing parent `complete_instances` and `skipped_instances`;\n- when importing existing per-occurrence task files, require deterministic parent/date matching before adding `recurrence_parent` and `occurrence_date`;\n- when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report `occurrence_state_conflict`;\n- provide a dry-run report before converting existing task files into materialized occurrence notes.\n\nMigration tooling MUST NOT silently delete occurrence notes or parent recurring tasks.\n\n## 8.8 Dependency migration\n\nWhen migrating legacy dependency data, implementations SHOULD:\n\n- normalize dependency key names to mapped canonical key,\n- ensure each entry has `uid` and canonical `reltype`,\n- normalize legacy string/path references into configured canonical reference style,\n- remove duplicate dependency entries by policy.\n\nIf historical data omits `reltype`, migration MAY apply `dependencies.default_reltype` and SHOULD report count of inferred values.\n\n## 8.9 Reminder migration\n\nWhen migrating legacy reminder data, implementations SHOULD:\n\n- normalize reminder key names,\n- normalize `type` values to canonical enum (`absolute` or `relative`),\n- normalize `relatedTo` values to canonical enum (`due` or `scheduled`),\n- normalize `absoluteTime` to canonical UTC ISO `Z`,\n- validate and normalize offsets to ISO 8601 duration syntax.\n\nIf reminder `id` values are missing, migration MAY generate IDs and MUST report generated count.\n\n## 8.10 Link migration\n\nWhen migrating legacy link values, implementations SHOULD:\n\n- normalize supported link syntaxes according to §11 parsing rules,\n- preserve alias and anchor components where possible,\n- normalize resolved targets into canonical write format by policy,\n- detect and report ambiguous links instead of silently choosing non-deterministically.\n\n## 8.11 Divergence register\n\nImplementations SHOULD maintain a divergence register with columns:\n\n- section\n- current behavior\n- target canonical behavior\n- migration strategy\n- deprecation timeline\n\n## 8.12 Deprecation policy\n\nFor any behavior deprecated by the specification:\n\n1. announce deprecation in release notes,\n2. provide warning period,\n3. provide migration tooling where feasible,\n4. remove deprecated behavior only in a version aligned with compatibility commitments.\n\n## 8.13 Data safety requirements\n\nMigrations MUST NOT:\n\n- silently drop unknown fields,\n- silently convert valid date-only fields to datetime,\n- silently rewrite recurrence semantics without explicit policy,\n- silently materialize occurrence notes outside explicit user/configured materialization policy,\n- silently delete materialized occurrence notes during recurrence edits,\n- silently drop unresolved dependency entries,\n- silently rewrite link targets to different destinations without explicit policy,\n- silently delete reminders unless explicitly requested.\n\n## 8.14 Suggested migration report format\n\n```yaml\nspec_version_from: 0.1.0-draft\nspec_version_to: 0.3.0-rc.1\nfiles_scanned: 214\nfiles_changed: 67\nwarnings:\n alias_conflict_ignored: 3\n instance_state_overlap_resolved: 2\n occurrence_state_conflict: 1\n unresolved_dependency_target: 4\nchanges:\n normalized_datetime_fields: 41\n alias_keys_removed: 29\n instance_overlaps_fixed: 2\n occurrence_state_conflicts: 1\n inferred_dependency_reltype: 5\n generated_reminder_ids: 8\n normalized_link_targets: 14\n```\n\n## 8.15 Compatibility statement example\n\n```text\nCompatibility mode: legacy-aliases=true, legacy-timeentry-duration=true\nPlanned removal: v2.0.0\nMigration command: tasknotes migrate --normalize-frontmatter\n```\n","aliases":["/spec/08-compatibility-and-migrations/"],"toc":[{"level":2,"id":"81-purpose","text":"8.1 Purpose"},{"level":2,"id":"82-compatibility-modes","text":"8.2 Compatibility modes"},{"level":2,"id":"83-migration-expectations","text":"8.3 Migration expectations"},{"level":2,"id":"84-alias-normalization-migration","text":"8.4 Alias normalization migration"},{"level":3,"id":"841-example","text":"8.4.1 Example"},{"level":2,"id":"85-temporal-normalization-migration","text":"8.5 Temporal normalization migration"},{"level":2,"id":"86-recurrence-state-migration","text":"8.6 Recurrence state migration"},{"level":2,"id":"87-materialized-occurrence-migration","text":"8.7 Materialized occurrence migration"},{"level":2,"id":"88-dependency-migration","text":"8.8 Dependency migration"},{"level":2,"id":"89-reminder-migration","text":"8.9 Reminder migration"},{"level":2,"id":"810-link-migration","text":"8.10 Link migration"},{"level":2,"id":"811-divergence-register","text":"8.11 Divergence register"},{"level":2,"id":"812-deprecation-policy","text":"8.12 Deprecation policy"},{"level":2,"id":"813-data-safety-requirements","text":"8.13 Data safety requirements"},{"level":2,"id":"814-suggested-migration-report-format","text":"8.14 Suggested migration report format"},{"level":2,"id":"815-compatibility-statement-example","text":"8.15 Compatibility statement example"}],"html":"

8.1 Purpose#

\n

This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.

\n

8.2 Compatibility modes#

\n

Implementations MAY support compatibility modes for legacy behavior.

\n

If supported, compatibility modes MUST:

\n
    \n
  • be explicitly enabled or disabled,
  • \n
  • be discoverable through configuration or capability metadata,
  • \n
  • not be silently enabled by default in new collections.
  • \n
\n

8.3 Migration expectations#

\n

When canonical behavior differs from historical behavior, implementations SHOULD provide:

\n
    \n
  1. deterministic migration rules,
  2. \n
  3. dry-run preview support,
  4. \n
  5. rollback-safe workflow guidance.
  6. \n
\n

8.4 Alias normalization migration#

\n

For legacy key aliases, a migration SHOULD:

\n
    \n
  • read both canonical and alias keys,
  • \n
  • choose canonical value deterministically (recommended: canonical key precedence),
  • \n
  • rewrite persisted file using canonical keys,
  • \n
  • preserve unrelated unknown fields.
  • \n
\n

8.4.1 Example#

\n

Before:

\n
recurrenceAnchor: scheduled\nrecurrence_anchor: completion\n

After normalization:

\n
recurrenceAnchor: scheduled\n

With warning:

\n
    \n
  • alias_conflict_ignored: alias value ignored because canonical key present.
  • \n
\n

8.5 Temporal normalization migration#

\n

If historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO Z for datetime roles while preserving date-only roles as dates.

\n

Example:

\n

Before:

\n
dateCreated: 2026-02-20 10:00:00+00:00\n

After:

\n
dateCreated: 2026-02-20T10:00:00Z\n

8.6 Recurrence state migration#

\n

If historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically.

\n

Recommended resolution policy:

\n
    \n
  • if overlap exists, prefer most recent user action where recoverable,
  • \n
  • otherwise prefer complete_instances and remove overlapping skip entries,
  • \n
  • emit migration report for affected dates.
  • \n
\n

Policy choice MUST be documented.

\n

8.7 Materialized occurrence migration#

\n

When introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation.\nRecommended migration behavior:

\n
    \n
  • do not materialize historical or future occurrence notes unless explicitly requested;
  • \n
  • preserve existing parent complete_instances and skipped_instances;
  • \n
  • when importing existing per-occurrence task files, require deterministic parent/date matching before adding recurrence_parent and occurrence_date;
  • \n
  • when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report occurrence_state_conflict;
  • \n
  • provide a dry-run report before converting existing task files into materialized occurrence notes.
  • \n
\n

Migration tooling MUST NOT silently delete occurrence notes or parent recurring tasks.

\n

8.8 Dependency migration#

\n

When migrating legacy dependency data, implementations SHOULD:

\n
    \n
  • normalize dependency key names to mapped canonical key,
  • \n
  • ensure each entry has uid and canonical reltype,
  • \n
  • normalize legacy string/path references into configured canonical reference style,
  • \n
  • remove duplicate dependency entries by policy.
  • \n
\n

If historical data omits reltype, migration MAY apply dependencies.default_reltype and SHOULD report count of inferred values.

\n

8.9 Reminder migration#

\n

When migrating legacy reminder data, implementations SHOULD:

\n
    \n
  • normalize reminder key names,
  • \n
  • normalize type values to canonical enum (absolute or relative),
  • \n
  • normalize relatedTo values to canonical enum (due or scheduled),
  • \n
  • normalize absoluteTime to canonical UTC ISO Z,
  • \n
  • validate and normalize offsets to ISO 8601 duration syntax.
  • \n
\n

If reminder id values are missing, migration MAY generate IDs and MUST report generated count.

\n\n

When migrating legacy link values, implementations SHOULD:

\n
    \n
  • normalize supported link syntaxes according to §11 parsing rules,
  • \n
  • preserve alias and anchor components where possible,
  • \n
  • normalize resolved targets into canonical write format by policy,
  • \n
  • detect and report ambiguous links instead of silently choosing non-deterministically.
  • \n
\n

8.11 Divergence register#

\n

Implementations SHOULD maintain a divergence register with columns:

\n
    \n
  • section
  • \n
  • current behavior
  • \n
  • target canonical behavior
  • \n
  • migration strategy
  • \n
  • deprecation timeline
  • \n
\n

8.12 Deprecation policy#

\n

For any behavior deprecated by the specification:

\n
    \n
  1. announce deprecation in release notes,
  2. \n
  3. provide warning period,
  4. \n
  5. provide migration tooling where feasible,
  6. \n
  7. remove deprecated behavior only in a version aligned with compatibility commitments.
  8. \n
\n

8.13 Data safety requirements#

\n

Migrations MUST NOT:

\n
    \n
  • silently drop unknown fields,
  • \n
  • silently convert valid date-only fields to datetime,
  • \n
  • silently rewrite recurrence semantics without explicit policy,
  • \n
  • silently materialize occurrence notes outside explicit user/configured materialization policy,
  • \n
  • silently delete materialized occurrence notes during recurrence edits,
  • \n
  • silently drop unresolved dependency entries,
  • \n
  • silently rewrite link targets to different destinations without explicit policy,
  • \n
  • silently delete reminders unless explicitly requested.
  • \n
\n

8.14 Suggested migration report format#

\n
spec_version_from: 0.1.0-draft\nspec_version_to: 0.3.0-rc.1\nfiles_scanned: 214\nfiles_changed: 67\nwarnings:\n  alias_conflict_ignored: 3\n  instance_state_overlap_resolved: 2\n  occurrence_state_conflict: 1\n  unresolved_dependency_target: 4\nchanges:\n  normalized_datetime_fields: 41\n  alias_keys_removed: 29\n  instance_overlaps_fixed: 2\n  occurrence_state_conflicts: 1\n  inferred_dependency_reltype: 5\n  generated_reminder_ids: 8\n  normalized_link_targets: 14\n

8.15 Compatibility statement example#

\n
Compatibility mode: legacy-aliases=true, legacy-timeentry-duration=true\nPlanned removal: v2.0.0\nMigration command: tasknotes migrate --normalize-frontmatter\n
","text":"8.1 Purpose# This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage. 8.2 Compatibility modes# Implementations MAY support compatibility modes for legacy behavior. If supported, compatibility modes MUST: be explicitly enabled or disabled, be discoverable through configuration or capability metadata, not be silently enabled by default in new collections. 8.3 Migration expectations# When canonical behavior differs from historical behavior, implementations SHOULD provide: deterministic migration rules, dry-run preview support, rollback-safe workflow guidance. 8.4 Alias normalization migration# For legacy key aliases, a migration SHOULD: read both canonical and alias keys, choose canonical value deterministically (recommended: canonical key precedence), rewrite persisted file using canonical keys, preserve unrelated unknown fields. 8.4.1 Example# Before: recurrenceAnchor: scheduled recurrence_anchor: completion After normalization: recurrenceAnchor: scheduled With warning: alias_conflict_ignored: alias value ignored because canonical key present. 8.5 Temporal normalization migration# If historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO Z for datetime roles while preserving date-only roles as dates. Example: Before: dateCreated: 2026-02-20 10:00:00+00:00 After: dateCreated: 2026-02-20T10:00:00Z 8.6 Recurrence state migration# If historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically. Recommended resolution policy: if overlap exists, prefer most recent user action where recoverable, otherwise prefer complete_instances and remove overlapping skip entries, emit migration report for affected dates. Policy choice MUST be documented. 8.7 Materialized occurrence migration# When introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation. Recommended migration behavior: do not materialize historical or future occurrence notes unless explicitly requested; preserve existing parent complete_instances and skipped_instances; when importing existing per-occurrence task files, require deterministic parent/date matching before adding recurrence_parent and occurrence_date; when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report occurrence_state_conflict; provide a dry-run report before converting existing task files into materialized occurrence notes. Migration tooling MUST NOT silently delete occurrence notes or parent recurring tasks. 8.8 Dependency migration# When migrating legacy dependency data, implementations SHOULD: normalize dependency key names to mapped canonical key, ensure each entry has uid and canonical reltype, normalize legacy string/path references into configured canonical reference style, remove duplicate dependency entries by policy. If historical data omits reltype, migration MAY apply dependencies.default_reltype and SHOULD report count of inferred values. 8.9 Reminder migration# When migrating legacy reminder data, implementations SHOULD: normalize reminder key names, normalize type values to canonical enum (absolute or relative), normalize relatedTo values to canonical enum (due or scheduled), normalize absoluteTime to canonical UTC ISO Z, validate and normalize offsets to ISO 8601 duration syntax. If reminder id values are missing, migration MAY generate IDs and MUST report generated count. 8.10 Link migration# When migrating legacy link values, implementations SHOULD: normalize supported link syntaxes according to §11 parsing rules, preserve alias and anchor components where possible, normalize resolved targets into canonical write format by policy, detect and report ambiguous links instead of silently choosing non-deterministically. 8.11 Divergence register# Implementations SHOULD maintain a divergence register with columns: section current behavior target canonical behavior migration strategy deprecation timeline 8.12 Deprecation policy# For any behavior deprecated by the specification: announce deprecation in release notes, provide warning period, provide migration tooling where feasible, remove deprecated behavior only in a version aligned with compatibility commitments. 8.13 Data safety requirements# Migrations MUST NOT: silently drop unknown fields, silently convert valid date-only fields to datetime, silently rewrite recurrence semantics without explicit policy, silently materialize occurrence notes outside explicit user/configured materialization policy, silently delete materialized occurrence notes during recurrence edits, silently drop unresolved dependency entries, silently rewrite link targets to different destinations without explicit policy, silently delete reminders unless explicitly requested. 8.14 Suggested migration report format# spec_version_from: 0.1.0-draft spec_version_to: 0.3.0-rc.1 files_scanned: 214 files_changed: 67 warnings: alias_conflict_ignored: 3 instance_state_overlap_resolved: 2 occurrence_state_conflict: 1 unresolved_dependency_target: 4 changes: normalized_datetime_fields: 41 alias_keys_removed: 29 instance_overlaps_fixed: 2 occurrence_state_conflicts: 1 inferred_dependency_reltype: 5 generated_reminder_ids: 8 normalized_link_targets: 14 8.15 Compatibility statement example# Compatibility mode: legacy-aliases=true, legacy-timeentry-duration=true Planned removal: v2.0.0 Migration command: tasknotes migrate --normalize-frontmatter"},{"route":"/developers/specification/09-configuration/","title":"9. Configuration","description":"This section defines the normative configuration model for collections using tasknotes-spec.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:09-configuration.md","namespace":"specification","relativePath":"09-configuration.md","raw":"# 9. Configuration\n\n## 9.1 Purpose\n\nThis section defines the normative configuration model for collections using `tasknotes-spec`.\n\n## 9.2 Configuration provider model\n\nImplementations MUST derive an **effective configuration** from one or more configuration providers.\n\nA provider is a source adapter that returns a partial configuration normalized to this section's schema.\n\nImplementations MUST:\n\n- support at least one provider,\n- document supported providers,\n- document provider precedence order,\n- disclose active providers and fallback behavior in conformance output (§7).\n\n### 9.2.1 Common provider types\n\nCommon providers include:\n\n- `yaml_file`: a `tasknotes.yaml` document at collection root,\n- `tasknotes_plugin_data_json`: `.obsidian/plugins/tasknotes/data.json`,\n- `built_in_defaults`: implementation defaults,\n- optional runtime/CLI/env overrides.\n\nThis list is not exhaustive.\n\n### 9.2.2 Deterministic precedence and merge\n\nProvider precedence MUST be deterministic.\n\nUnless explicitly documented otherwise, implementations MUST resolve configuration per top-level key:\n\n- for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins,\n- winning object values replace lower-precedence object values as whole objects (no implicit deep merge),\n- after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration.\n\nIf an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic.\n\n### 9.2.3 Strict vs permissive provider behavior\n\nIn strict mode:\n\n- failure to resolve required effective keys (`spec_version`, `mapping`) MUST be a configuration error.\n\nIf permissive mode is implemented, then in permissive mode:\n\n- implementations MAY continue with defaults when providers are missing/unreadable,\n- implementations MUST emit configuration warnings,\n- implementations MUST disclose that effective configuration is partial/default-derived.\n\n### 9.2.4 TaskNotes plugin provider (`data.json`)\n\nThe TaskNotes plugin stores settings in `.obsidian/plugins/tasknotes/data.json` within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below.\n\n**Key mapping table** (`data.json` key → spec effective config):\n\n| `data.json` key | Spec key | Notes |\n|---|---|---|\n| `fieldMapping` | `mapping` | Normalize role names: `dateCreated`→`date_created`, `completedDate`→`completed_date`, `recurrenceAnchor`→`recurrence_anchor`, `completeInstances`→`complete_instances`, `skippedInstances`→`skipped_instances`, `recurrenceParent`→`recurrence_parent`, `occurrenceDate`→`occurrence_date`, `occurrenceMaterialization`→`occurrence_materialization`, `occurrenceNextTrigger`→`occurrence_next_trigger`, `occurrenceTemplate`→`occurrence_template`, `occurrencePastHorizon`→`occurrence_past_horizon`, `occurrenceFutureHorizon`→`occurrence_future_horizon`, `blockedBy`→`blocked_by`, `timeEntries`→`time_entries`, `timeEstimate`→`time_estimate` |\n| `storeTitleInFilename` | `title.storage` | `true` → `\"filename\"`, `false` → `\"frontmatter\"` |\n| `taskFilenameFormat` | `title.filename_format` | Values: `\"title\"`, `\"zettel\"`, `\"timestamp\"`, `\"custom\"`; used only when `title.storage=frontmatter` for canonical writes, but preserved as compatibility input when present |\n| `customFilenameTemplate` | `title.custom_filename_template` | Template string, e.g. `\"{title}\"`; used only when `title.storage=frontmatter` and `filename_format=custom` |\n| `taskCreationDefaults.useBodyTemplate` | `templating.enabled` | boolean |\n| `taskCreationDefaults.bodyTemplate` | `templating.template_path` | Path to template file |\n| `customStatuses[*].value` | `status.values` | Ordered array of status value strings |\n| `defaultTaskStatus` | `status.default` | Default status string |\n| `customStatuses[isCompleted=true][*].value` | `status.completed_values` | Statuses where `isCompleted: true` |\n| `defaultTaskPriority` | `defaults.priority` | Default priority string |\n| `autoStopTimeTrackingOnComplete` | `time_tracking.auto_stop_on_complete` | boolean |\n| `autoStopTimeTrackingNotification` | `time_tracking.auto_stop_notification` | boolean |\n| `taskIdentificationMethod` | `task_detection.method` | `\"tag\"` or `\"property\"` |\n| `taskTag` | `task_detection.tag` | Tag string used when `method=\"tag\"` |\n| `taskPropertyName` | `task_detection.property_name` | Frontmatter key used when `method=\"property\"` |\n| `taskPropertyValue` | `task_detection.property_value` | Expected value; empty means key must exist |\n| `tasksFolder` | `task_detection.default_folder` | Default folder for new tasks |\n| `excludedFolders` | `task_detection.excluded_folders` | Comma-separated folder paths to exclude |\n| `moveArchivedTasks` | `archive.move_on_archive` | boolean |\n| `archiveFolder` | `archive.folder` | Archive destination folder |\n| `useFrontmatterMarkdownLinks` | `links.use_markdown_format` | boolean; see §11 |\n\n**Key `data.json` fields with defaults** (for cold-start reading of a vault with no `tasknotes.yaml`):\n\n| Field | Type | Default | Meaning |\n|---|---|---|---|\n| `tasksFolder` | string | `\"TaskNotes/Tasks\"` | Default folder for new task files |\n| `taskIdentificationMethod` | `\"tag\" \\| \"property\"` | `\"tag\"` | How task files are identified |\n| `taskTag` | string | `\"task\"` | Tag that identifies task files (when `method=\"tag\"`) |\n| `taskPropertyName` | string | `\"\"` | Frontmatter key for property-based identification |\n| `taskPropertyValue` | string | `\"\"` | Expected value for property-based identification (empty = key presence) |\n| `storeTitleInFilename` | boolean | `true` | Title storage mode |\n| `taskFilenameFormat` | `\"title\" \\| \"zettel\" \\| \"timestamp\" \\| \"custom\"` | `\"title\"` | Filename generation format |\n| `customFilenameTemplate` | string | `\"{title}\"` | Template for `\"custom\"` filename format |\n| `defaultTaskStatus` | string | `\"open\"` | Default status on create |\n| `defaultTaskPriority` | string | `\"normal\"` | Default priority on create |\n| `customStatuses` | StatusConfig[] | see object shape below | Ordered status definitions |\n| `autoStopTimeTrackingOnComplete` | boolean | `true` | Auto-stop active session on completion |\n| `autoStopTimeTrackingNotification` | boolean | `false` | Show notification when auto-stopping |\n| `useFrontmatterMarkdownLinks` | boolean | `false` | Use markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin) |\n| `moveArchivedTasks` | boolean | `false` | Move task file to archive folder on archive |\n| `archiveFolder` | string | `\"TaskNotes/Archive\"` | Archive destination folder |\n| `excludedFolders` | string | `\"\"` | Comma-separated folders to exclude from task indexing |\n\n**StatusConfig object shape:**\n\n```json\n{\n \"id\": \"done\",\n \"value\": \"done\",\n \"label\": \"Done\",\n \"color\": \"#00aa00\",\n \"isCompleted\": true,\n \"order\": 3,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n}\n```\n\n`spec_version` is not present in `data.json`. Implementations MUST synthesize an effective `spec_version` as described in §9.5.\n\nProvider keys not listed above MAY be ignored by `tasknotes-spec` consumers.\n\n## 9.3 Required top-level keys\n\nRequired keys apply to the effective configuration after provider resolution.\n\n| Key | Type | Required | Description |\n|---|---|---|---|\n| `spec_version` | string | yes | target spec version (provider-supplied or synthesized per §9.5) |\n| `mapping` | object | yes | semantic role to storage key mapping |\n\n## 9.4 Recommended top-level keys\n\n| Key | Type | Description |\n|---|---|---|\n| `runtime_timezone` | string | IANA timezone for day-level semantics |\n| `task_detection` | object | task file identification rules |\n| `defaults` | object | role defaults used during create |\n| `status` | object | status set and completed-value semantics |\n| `validation` | object | validation behavior (`strict` required, `permissive` optional) |\n| `links` | object | link parsing/resolution behavior |\n| `title` | object | title source and filename behavior policy |\n| `templating` | object | optional create-time templating behavior policy |\n| `dependencies` | object | dependency behavior policy |\n| `reminders` | object | reminder behavior policy |\n| `time_tracking` | object | time-tracking management behavior policy |\n| `occurrences` | object | recurrence materialization defaults and bounds |\n| `compatibility` | object | legacy alias/behavior switches |\n\n## 9.5 spec_version behavior\n\n`spec_version` MUST be a semantic version string.\nPre-release identifiers are valid (for example `0.3.0-rc.1`).\n\nImplementations in strict mode MUST reject unsupported major versions.\n\nIf permissive mode is implemented, permissive mode MAY proceed with warning when major version differs.\n\nIf a provider does not supply `spec_version` (for example TaskNotes `data.json`), implementations MUST synthesize an effective `spec_version` matching their target `tasknotes-spec` version and SHOULD disclose that it was synthesized.\n\n### 9.5.1 runtime_timezone behavior\n\nIf `runtime_timezone` is configured, it MUST be a valid IANA timezone identifier and MUST be used for day-level semantics.\n\nIf `runtime_timezone` is absent, implementations MUST use system local timezone.\nThe effective timezone MUST be discoverable.\n\n## 9.6 mapping schema\n\n`mapping` MUST map semantic roles (from §2) to string storage keys.\n\nMinimum required roles in mapping:\n\n- `title`\n- `status`\n- `completed_date`\n- `date_created`\n- `date_modified`\n\nIf semantic role `id` is supported (§2.6.5), mapping SHOULD include `id`.\nIf profile `materialized-occurrences` is claimed, mapping MUST include `recurrence_parent` and `occurrence_date`, and SHOULD include parent policy roles (`occurrence_materialization`, `occurrence_next_trigger`, `occurrence_template`, `occurrence_past_horizon`, `occurrence_future_horizon`).\n\nExample:\n\n```yaml\nmapping:\n title: title\n status: status\n date_created: dateCreated\n date_modified: dateModified\n completed_date: completedDate\n recurrence: recurrence\n recurrence_anchor: recurrenceAnchor\n complete_instances: completeInstances\n skipped_instances: skippedInstances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\n```\n\n## 9.7 task_detection schema\n\n`task_detection` controls how task files are identified within the vault.\n\n### Detection methods\n\nThe tasknotes plugin natively supports two identification methods, controlled by `taskIdentificationMethod` in `data.json` (mapped to `task_detection.method`):\n\n**`tag` (default)** — A markdown file is a task if it contains the configured tag (default `#task`) in its frontmatter `tags` array or inline in the body. Configured by `task_detection.tag`.\n\n**`property`** — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by `task_detection.property_name` and `task_detection.property_value`.\n\nSchema and selection rules:\n\n1. `task_detection` MAY specify either:\n - `method` (single-method form), or\n - `methods` (multi-method form; non-empty list).\n2. If both are present, `methods` MUST take precedence and implementations SHOULD emit a configuration warning.\n3. If neither is present, effective detection method MUST default to `tag`.\n4. `method` MUST be `tag` or `property`.\n5. `methods` entries MUST be unique and MUST be from:\n - `tag`\n - `property`\n - `field_presence`\n - `field_match`\n6. Method-specific required keys:\n - when `tag` is enabled, effective `task_detection.tag` MUST be non-empty (default `task` when absent);\n - when `property` is enabled, `task_detection.property_name` MUST be provided and non-empty; `task_detection.property_value` MAY be empty (empty means key-exists semantics).\n7. If `methods` has more than one entry, `task_detection.combine` controls combination semantics (§9.7.3). If omitted, it MUST default to `or`.\n\n### 9.7.1 Tag matching semantics\n\nWhen `task_detection.method=tag`, matching MUST follow these rules:\n\n1. Normalize configured `task_detection.tag` by stripping one leading `#` when present.\n2. Compare tag names case-insensitively after normalization.\n3. Frontmatter matching:\n - `tags` MAY be a list of strings or a single string.\n - each tag value is normalized by trimming surrounding whitespace and stripping one leading `#`.\n - match requires exact normalized equality (for example `task` matches `#task`; `task` does not match `tasking`).\n4. Body matching:\n - only markdown text outside fenced code blocks and inline code spans is considered,\n - a match requires a hashtag token with exact normalized name (for example `#task`),\n - partial-word matches MUST NOT count (for example `#tasking` does not match configured `task`).\n\nIf either frontmatter or body matches, the file is identified as a task.\n\n### 9.7.2 Property matching semantics\n\nWhen property detection is enabled (`method=property` or `methods` includes `property`):\n\n1. `task_detection.property_name` MUST name the frontmatter key to inspect.\n2. If `task_detection.property_value` is non-empty, match requires semantic equality with the configured value.\n3. If `task_detection.property_value` is empty or absent, match requires key presence only.\n\n### 9.7.3 Multi-method extension semantics\n\n`tasknotes.yaml`-level providers MAY additionally support:\n\n- `field_presence` (example: required key `status`)\n- `field_match` (example: `type == \"task\"`)\n\nExtension-key shape:\n\n- `field_presence`: string or list of required frontmatter keys.\n- `field_match`: object map of `key -> expected scalar value` for exact semantic equality checks.\n\nIf multiple methods are configured in `tasknotes.yaml`, `task_detection.combine` MUST define combinator semantics:\n\n- `or` (default): file is a task if any enabled method matches.\n- `and`: file is a task only if all enabled methods match.\n\nIf `task_detection.combine` is absent, implementations MUST default to `or`.\n\nImplementations MUST exclude folders listed in `task_detection.excluded_folders` from task indexing.\n\nExecutable conformance: adapters participating in the fixture suite SHOULD expose `config.detect_task_file` to evaluate these detection semantics against fixture inputs.\n\nExample (`tasknotes.yaml`, equivalent to tag-based default):\n\n```yaml\ntask_detection:\n method: tag\n tag: task\n default_folder: TaskNotes/Tasks\n```\n\nExample (property-based):\n\n```yaml\ntask_detection:\n method: property\n property_name: type\n property_value: task\n```\n\n## 9.8 defaults schema\n\n`defaults` defines values used at create time when caller input omits a role.\n\nDefaults MUST NOT override explicit user input.\n\nExample:\n\n```yaml\ndefaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n reminders:\n - id: due_minus_1d\n type: relative\n relatedTo: due\n offset: -P1D\n```\n\n`defaults.reminders` behavior is defined in §10.3.9.\n\n## 9.9 status schema\n\n`status` defines known status values and completion semantics.\n\nExample:\n\n```yaml\nstatus:\n values: [open, in-progress, done, cancelled]\n default: open\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n```\n\nRules:\n\n- `default` MUST be one of `values`.\n- `completed_values` MUST be a non-empty list.\n- Each `completed_values` entry MUST be in `values`.\n- `skipped_values`, when present, MUST be a list whose entries are in `values`.\n- `default_skipped`, when present, MUST be in `skipped_values`.\n- For implementations claiming `materialized-occurrences`, `skipped_values` MUST NOT overlap `completed_values`.\n- Implementations claiming `materialized-occurrences` MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3).\n- Non-recurring completion MUST use this list, not hardcoded literals.\n- When a complete operation does not provide an explicit target status, writers MUST use the first entry of `completed_values`.\n- When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use `default_skipped` when present, otherwise the first entry of `skipped_values`.\n\n## 9.10 validation schema\n\nExample:\n\n```yaml\nvalidation:\n mode: strict\n reject_unknown_fields: false\n```\n\nRules:\n\n- `mode` MUST be `strict` or `permissive` when present.\n- If `mode` is absent, effective mode MUST default to `strict`.\n- Conforming implementations MUST support `strict`.\n- Implementations MAY support `permissive`.\n- If `mode=permissive` is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode.\n- `reject_unknown_fields=true` enforces closed-schema behavior for mapped roles.\n\n## 9.11 dependencies schema\n\nExample:\n\n```yaml\ndependencies:\n default_reltype: FINISHTOSTART\n treat_missing_target_as_blocked: true\n enforce_unique_uid: true\n unresolved_target_severity: warning\n require_resolved_uid_on_write: false\n```\n\nRules:\n\n- `default_reltype` MUST be one of the allowed reltype values in §10.2.\n- `treat_missing_target_as_blocked` controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5).\n- If `treat_missing_target_as_blocked` is absent, effective value MUST default to `true`.\n- `enforce_unique_uid=true` enforces uniqueness at validation/write time.\n- If `enforce_unique_uid` is absent, effective value MUST default to `true`.\n- `unresolved_target_severity` MUST be `warning` or `error`.\n- `require_resolved_uid_on_write=true` requires dependency UID resolution success for add/update operations.\n\n## 9.12 links schema\n\nExample:\n\n```yaml\nlinks:\n extensions: [\".md\"]\n unresolved_default_severity: warning\n update_references_on_rename: true\n```\n\nRules:\n\n- `extensions` defines extension trial order for extensionless targets.\n- `unresolved_default_severity` MUST be `warning` or `error`.\n- `update_references_on_rename=true` enables rename-time link rewrite behavior when supported.\n\n## 9.13 title schema\n\nExample (`storage=frontmatter`):\n\n```yaml\ntitle:\n storage: frontmatter\n filename_format: custom\n custom_filename_template: \"{{date}} {{title}}\"\n```\n\nExample (`storage=filename`):\n\n```yaml\ntitle:\n storage: filename\n```\n\nRules:\n\n- `storage` MUST be `frontmatter` or `filename`.\n- when `storage=frontmatter`, `filename_format` MUST be `title`, `zettel`, `timestamp`, or `custom`.\n- when `storage=frontmatter` and `filename_format=custom`, `custom_filename_template` MUST be provided and non-empty.\n- when `storage=filename`, `filename_format` and `custom_filename_template` MAY be present for compatibility input but MUST be ignored for canonical write behavior.\n- Read precedence MUST be storage-mode-aware:\n 1. when `storage=frontmatter`, use mapped `title` key when present and non-empty, then file basename fallback;\n 2. when `storage=filename`, use file basename first, then mapped `title` fallback when basename is unavailable.\n- If frontmatter and basename titles both exist and differ, the source authoritative for active `storage` MUST win.\n- If `storage=filename`, canonical writes MUST treat filename as title source, MUST rename on title change, and MUST ignore `filename_format` and `custom_filename_template`.\n- If `storage=frontmatter`, canonical writes MUST persist mapped title key; `filename_format` and `custom_filename_template` govern create-time filename generation.\n\nInformative mapping to TaskNotes settings:\n\n- `title.storage=filename` corresponds to `storeTitleInFilename=true`.\n- `title.filename_format` corresponds to `taskFilenameFormat`.\n- `title.custom_filename_template` corresponds to `customFilenameTemplate`.\n\n## 9.14 templating schema\n\n`templating` defines optional create-time template behavior.\nThis schema is required only for implementations claiming profile `templating` (§7.3.3).\n\nExample:\n\n```yaml\ntemplating:\n enabled: true\n template_path: Templates/Task.md\n failure_mode: warning_fallback\n unknown_variable_policy: preserve\n```\n\nRules:\n\n- `enabled` MUST be boolean.\n- If `enabled=true`, `template_path` MUST be provided and non-empty.\n- `failure_mode` MUST be `error` or `warning_fallback` when present.\n- `unknown_variable_policy` MUST be `preserve` or `empty` when present.\n- If `failure_mode` is absent, effective value MUST default to `warning_fallback`.\n- If `unknown_variable_policy` is absent, effective value MUST default to `preserve`.\n- Implementations claiming `templating` MUST support portable double-brace variables from §5.3.5.\n- Implementations not claiming `templating` MAY ignore `templating` settings.\n\n## 9.15 reminders schema\n\nExample:\n\n```yaml\nreminders:\n date_only_anchor_time: \"00:00\"\n apply_defaults_when_explicit: false\n```\n\nRules:\n\n- `date_only_anchor_time` MUST be `HH:MM` 24-hour local time format.\n- `date_only_anchor_time` is used by §10.3.4 for relative reminders against date-only bases.\n- `apply_defaults_when_explicit` MUST be boolean when present.\n- if `apply_defaults_when_explicit` is absent, effective value MUST default to `false`.\n- `apply_defaults_when_explicit=false` means explicit input reminders replace default-reminder application at create time.\n- `apply_defaults_when_explicit=true` means explicit create-time reminders are merged with defaults using §10.3.9 deterministic merge rules.\n\n## 9.16 time_tracking schema\n\nExample:\n\n```yaml\ntime_tracking:\n auto_stop_on_complete: true\n auto_stop_notification: false\n```\n\nRules:\n\n- `auto_stop_on_complete` MUST be boolean when present.\n- `auto_stop_notification` MUST be boolean when present.\n- if `auto_stop_on_complete=true`, completion-triggered stop behavior MUST follow §5.19.5.\n- if `auto_stop_notification` is absent, effective value MUST default to `false`.\n\n## 9.17 occurrences schema\n\n`occurrences` defines collection-level defaults for recurrence materialization.\nThis schema is required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\nExample:\n\n```yaml\noccurrences:\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n```\n\nRules:\n\n- `default_materialization` MUST be one of `manual`, `on_completion`, or `rolling`.\n- If `default_materialization` is absent, effective value MUST default to `manual`.\n- `default_next_trigger` MUST be `completion` or `completion_or_skip`.\n- If `default_next_trigger` is absent, effective value MUST default to `completion`.\n- `past_horizon` and `future_horizon`, when present, MUST be ISO 8601 duration strings.\n- If `default_materialization=rolling`, implementations MUST use finite rolling bounds. If bounds are absent, documented finite defaults MUST be used.\n- Parent task fields override collection defaults: `occurrence_materialization` overrides `occurrences.default_materialization`; `occurrence_next_trigger` overrides `occurrences.default_next_trigger`; `occurrence_past_horizon` and `occurrence_future_horizon` override `occurrences.past_horizon` and `occurrences.future_horizon`.\n- If `occurrences` is absent, the effective behavior is `manual` materialization and `completion` next trigger.\n\n## 9.17.1 nlp schema\n\n`nlp` advertises optional natural-language capture triggers. These settings\nallow another TaskNotes client to preserve the same capture vocabulary without\nmaking natural-language parsing a requirement of the core profile.\n\nExample:\n\n```yaml\nnlp:\n triggers:\n - property_id: tags\n trigger: \"#\"\n enabled: true\n - property_id: contexts\n trigger: \"@\"\n enabled: true\n - property_id: priority\n trigger: \"!\"\n enabled: false\n```\n\nRules:\n\n- `triggers` MUST be a list when present.\n- Every trigger entry MUST contain non-empty `property_id` and `trigger`\n strings.\n- `property_id` SHOULD use a stable TaskNotes role (`tags`, `contexts`,\n `projects`, `status`, or `priority`) or the stable identifier of a configured\n user field.\n- `enabled` MUST be boolean when present and MUST default to `true`.\n- Trigger strings MAY contain more than one character.\n- Trigger entries with unknown `property_id` values MUST be preserved by\n configuration round-trips and MAY be ignored by clients that cannot resolve\n the property.\n- If `nlp` is absent, clients MAY use documented local defaults.\n- This block controls capture parsing and suggestions only. It MUST NOT change\n persisted task field names or values.\n\nInformative mapping to TaskNotes settings:\n\n- `nlp.triggers` corresponds to `nlpTriggers.triggers`.\n- `property_id`, `trigger`, and `enabled` correspond to the plugin fields\n `propertyId`, `trigger`, and `enabled`.\n\n## 9.18 compatibility schema\n\nExample:\n\n```yaml\ncompatibility:\n read_aliases: true\n legacy_duration_field: true\n legacy_local_datetime_input: false\n```\n\nRules:\n\n- Compatibility flags MUST default to conservative behavior in new collections.\n- `legacy_local_datetime_input=true` MAY relax strict parsing for offset-less datetimes only in permissive mode; strict mode parsing rules in §3.4.2 still apply.\n- Enabled compatibility flags SHOULD be disclosed in conformance output (§7).\n\n## 9.19 Complete configuration example (`yaml_file` provider)\n\n```yaml\nspec_version: 0.3.0-rc.1\nruntime_timezone: America/Los_Angeles\n\nmapping:\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n completed_date: completedDate\n date_created: dateCreated\n date_modified: dateModified\n recurrence: recurrence\n recurrence_anchor: recurrenceAnchor\n complete_instances: completeInstances\n skipped_instances: skippedInstances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\n\ntask_detection:\n method: tag\n tag: task\n default_folder: TaskNotes/Tasks\n\ndefaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n reminders:\n - id: due_minus_1d\n type: relative\n relatedTo: due\n offset: -P1D\n\nstatus:\n values: [open, in-progress, done, cancelled]\n default: open\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n\nvalidation:\n mode: strict\n reject_unknown_fields: false\n\ndependencies:\n default_reltype: FINISHTOSTART\n treat_missing_target_as_blocked: true\n enforce_unique_uid: true\n unresolved_target_severity: warning\n require_resolved_uid_on_write: false\n\nlinks:\n extensions: [\".md\"]\n unresolved_default_severity: warning\n update_references_on_rename: true\n\ntitle:\n storage: filename\n\ntemplating:\n enabled: false\n failure_mode: warning_fallback\n unknown_variable_policy: preserve\n\nreminders:\n date_only_anchor_time: \"00:00\"\n apply_defaults_when_explicit: false\n\ntime_tracking:\n auto_stop_on_complete: true\n auto_stop_notification: false\n\noccurrences:\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n\nnlp:\n triggers:\n - property_id: tags\n trigger: \"#\"\n enabled: true\n - property_id: contexts\n trigger: \"@\"\n enabled: true\n - property_id: projects\n trigger: \"+\"\n enabled: true\n - property_id: status\n trigger: \"*\"\n enabled: true\n - property_id: priority\n trigger: \"!\"\n enabled: false\n\ncompatibility:\n read_aliases: true\n legacy_duration_field: true\n```\n\n## 9.20 Configuration errors\n\nConfiguration validation MUST report structured errors with key path context.\n\nExamples:\n\n- no readable configuration provider available in strict mode\n- required effective key unresolved after provider resolution (`spec_version` or `mapping`)\n- missing `mapping.title`\n- `status.default` not present in `status.values`\n- `status.completed_values` contains a value not present in `status.values`\n- `status.skipped_values` contains a value not present in `status.values`\n- `status.default_skipped` not present in `status.skipped_values`\n- `status.skipped_values` overlaps `status.completed_values` when `materialized-occurrences` is claimed\n- unsupported `validation.mode`\n- `validation.mode=permissive` but permissive mode is not implemented\n- invalid `task_detection.method`\n- invalid `task_detection.methods` entry\n- empty `task_detection.tag` when `tag` method is enabled\n- missing `task_detection.property_name` when `property` method is enabled\n- invalid `task_detection.combine`\n- invalid `dependencies.default_reltype`\n- invalid `dependencies.unresolved_target_severity`\n- invalid `links.unresolved_default_severity`\n- invalid `title.storage`\n- invalid `title.filename_format`\n- missing `title.filename_format` when `title.storage=frontmatter`\n- missing `title.custom_filename_template` when `title.storage=frontmatter` and `title.filename_format=custom`\n- missing `templating.template_path` when `templating.enabled=true`\n- invalid `templating.failure_mode`\n- invalid `templating.unknown_variable_policy`\n- invalid `reminders.date_only_anchor_time`\n- invalid `reminders.apply_defaults_when_explicit`\n- invalid `time_tracking.auto_stop_on_complete`\n- invalid `time_tracking.auto_stop_notification`\n- invalid `occurrences.default_materialization`\n- invalid `occurrences.default_next_trigger`\n- invalid `occurrences.past_horizon`\n- invalid `occurrences.future_horizon`\n- invalid `nlp.triggers`\n- empty `nlp.triggers[].property_id`\n- empty `nlp.triggers[].trigger`\n- invalid `nlp.triggers[].enabled`\n\n## 9.21 Default collection state\n\nThis section describes what a fresh tasknotes vault looks like before any user customization. Implementations that read an existing tasknotes vault without a `tasknotes.yaml` SHOULD apply these defaults when `data.json` is absent or fields are missing.\n\n### Folder layout\n\n```text\nMyVault/\n├── TaskNotes/\n│ ├── Tasks/ ← new tasks created here by default\n│ └── Archive/ ← archived tasks moved here (if moveArchivedTasks=true)\n└── .obsidian/\n └── plugins/\n └── tasknotes/\n └── data.json\n```\n\n### Task detection\n\nDefault method: `tag`. A file is a task if it contains the tag `#task` in its frontmatter `tags` array or inline in the body.\n\n### Default field mapping\n\n| Semantic role | Default storage key |\n|---|---|\n| `title` | `title` |\n| `status` | `status` |\n| `priority` | `priority` |\n| `due` | `due` |\n| `scheduled` | `scheduled` |\n| `contexts` | `contexts` |\n| `projects` | `projects` |\n| `time_estimate` | `timeEstimate` |\n| `completed_date` | `completedDate` |\n| `date_created` | `dateCreated` |\n| `date_modified` | `dateModified` |\n| `recurrence` | `recurrence` |\n| `recurrence_anchor` | `recurrence_anchor` |\n| `complete_instances` | `complete_instances` |\n| `skipped_instances` | `skipped_instances` |\n| `recurrence_parent` | `recurrence_parent` |\n| `occurrence_date` | `occurrence_date` |\n| `occurrence_materialization` | `occurrence_materialization` |\n| `occurrence_next_trigger` | `occurrence_next_trigger` |\n| `occurrence_template` | `occurrence_template` |\n| `occurrence_past_horizon` | `occurrence_past_horizon` |\n| `occurrence_future_horizon` | `occurrence_future_horizon` |\n| `time_entries` | `timeEntries` |\n| `blocked_by` | `blockedBy` |\n| `reminders` | `reminders` |\n\nNote: `recurrenceAnchor`, `completeInstances`, and `skippedInstances` are accepted as aliases on read (§2.5). The mixed camelCase/snake_case defaults are intentional for compatibility with historical TaskNotes frontmatter.\n\n### Default statuses\n\n| Value | Label | `isCompleted` | Order |\n|---|---|---|---|\n| `none` | None | false | 0 |\n| `open` | Open | false | 1 |\n| `in-progress` | In progress | false | 2 |\n| `done` | Done | true | 3 |\n\nDefault status on create: `open`. Default completed status (first `isCompleted=true`): `done`.\nNo skipped status is configured by default; implementations that support materialized occurrence skips MUST require configuration or expose a documented default before writing skipped occurrence state.\n\n### Default priorities\n\n| Value | Label | Weight |\n|---|---|---|\n| `none` | None | 0 |\n| `low` | Low | 1 |\n| `normal` | Normal | 2 |\n| `high` | High | 3 |\n\nDefault priority on create: `normal`.\n\n### Title and filename defaults\n\n- `title.storage`: `filename` (filename/path is the authoritative title source)\n- default basename generation under `title.storage=filename` derives from semantic title using filename-safe sanitization\n- implementations MAY also keep mapped `title` in frontmatter as a synchronized compatibility mirror\n- TaskNotes `data.json` may still contain legacy `taskFilenameFormat` values such as `zettel`, but these are compatibility inputs rather than the forward default when `title.storage=filename`\n- title is read from filename first; frontmatter `title` is compatibility fallback when filename-derived title is unavailable (§2.2.2)\n\n### Time tracking defaults\n\n- `auto_stop_on_complete`: `true`\n- `auto_stop_notification`: `false`\n\n### Link format defaults\n\n- `useFrontmatterMarkdownLinks`: `false` — wikilinks used by default (e.g. `[[task-name]]`)\n- To use markdown link format, the `obsidian-frontmatter-markdown-links` plugin must also be installed\n\n### Effective configuration for a minimal fresh vault\n\nWhen neither `data.json` nor `tasknotes.yaml` is present, implementations MUST use the following effective configuration:\n\n```yaml\nspec_version: 0.3.0-rc.1 # synthesized\nmapping:\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n time_estimate: timeEstimate\n completed_date: completedDate\n date_created: dateCreated\n date_modified: dateModified\n recurrence: recurrence\n recurrence_anchor: recurrence_anchor\n complete_instances: complete_instances\n skipped_instances: skipped_instances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\ntask_detection:\n method: tag\n tag: task\n default_folder: TaskNotes/Tasks\nstatus:\n values: [none, open, in-progress, done]\n default: open\n completed_values: [done]\ntitle:\n storage: filename\ntime_tracking:\n auto_stop_on_complete: true\n auto_stop_notification: false\nlinks:\n use_markdown_format: false\n extensions: [\".md\"]\n unresolved_default_severity: warning\n update_references_on_rename: true\n```\n","aliases":["/spec/09-configuration/"],"toc":[{"level":2,"id":"91-purpose","text":"9.1 Purpose"},{"level":2,"id":"92-configuration-provider-model","text":"9.2 Configuration provider model"},{"level":3,"id":"921-common-provider-types","text":"9.2.1 Common provider types"},{"level":3,"id":"922-deterministic-precedence-and-merge","text":"9.2.2 Deterministic precedence and merge"},{"level":3,"id":"923-strict-vs-permissive-provider-behavior","text":"9.2.3 Strict vs permissive provider behavior"},{"level":3,"id":"924-tasknotes-plugin-provider-datajson","text":"9.2.4 TaskNotes plugin provider (data.json)"},{"level":2,"id":"93-required-top-level-keys","text":"9.3 Required top-level keys"},{"level":2,"id":"94-recommended-top-level-keys","text":"9.4 Recommended top-level keys"},{"level":2,"id":"95-specversion-behavior","text":"9.5 spec_version behavior"},{"level":3,"id":"951-runtimetimezone-behavior","text":"9.5.1 runtime_timezone behavior"},{"level":2,"id":"96-mapping-schema","text":"9.6 mapping schema"},{"level":2,"id":"97-taskdetection-schema","text":"9.7 task_detection schema"},{"level":3,"id":"detection-methods","text":"Detection methods"},{"level":3,"id":"971-tag-matching-semantics","text":"9.7.1 Tag matching semantics"},{"level":3,"id":"972-property-matching-semantics","text":"9.7.2 Property matching semantics"},{"level":3,"id":"973-multi-method-extension-semantics","text":"9.7.3 Multi-method extension semantics"},{"level":2,"id":"98-defaults-schema","text":"9.8 defaults schema"},{"level":2,"id":"99-status-schema","text":"9.9 status schema"},{"level":2,"id":"910-validation-schema","text":"9.10 validation schema"},{"level":2,"id":"911-dependencies-schema","text":"9.11 dependencies schema"},{"level":2,"id":"912-links-schema","text":"9.12 links schema"},{"level":2,"id":"913-title-schema","text":"9.13 title schema"},{"level":2,"id":"914-templating-schema","text":"9.14 templating schema"},{"level":2,"id":"915-reminders-schema","text":"9.15 reminders schema"},{"level":2,"id":"916-timetracking-schema","text":"9.16 time_tracking schema"},{"level":2,"id":"917-occurrences-schema","text":"9.17 occurrences schema"},{"level":2,"id":"9171-nlp-schema","text":"9.17.1 nlp schema"},{"level":2,"id":"918-compatibility-schema","text":"9.18 compatibility schema"},{"level":2,"id":"919-complete-configuration-example-yamlfile-provider","text":"9.19 Complete configuration example (yaml_file provider)"},{"level":2,"id":"920-configuration-errors","text":"9.20 Configuration errors"},{"level":2,"id":"921-default-collection-state","text":"9.21 Default collection state"},{"level":3,"id":"folder-layout","text":"Folder layout"},{"level":3,"id":"task-detection","text":"Task detection"},{"level":3,"id":"default-field-mapping","text":"Default field mapping"},{"level":3,"id":"default-statuses","text":"Default statuses"},{"level":3,"id":"default-priorities","text":"Default priorities"},{"level":3,"id":"title-and-filename-defaults","text":"Title and filename defaults"},{"level":3,"id":"time-tracking-defaults","text":"Time tracking defaults"},{"level":3,"id":"link-format-defaults","text":"Link format defaults"},{"level":3,"id":"effective-configuration-for-a-minimal-fresh-vault","text":"Effective configuration for a minimal fresh vault"}],"html":"

9.1 Purpose#

\n

This section defines the normative configuration model for collections using tasknotes-spec.

\n

9.2 Configuration provider model#

\n

Implementations MUST derive an effective configuration from one or more configuration providers.

\n

A provider is a source adapter that returns a partial configuration normalized to this section's schema.

\n

Implementations MUST:

\n
    \n
  • support at least one provider,
  • \n
  • document supported providers,
  • \n
  • document provider precedence order,
  • \n
  • disclose active providers and fallback behavior in conformance output (§7).
  • \n
\n

9.2.1 Common provider types#

\n

Common providers include:

\n
    \n
  • yaml_file: a tasknotes.yaml document at collection root,
  • \n
  • tasknotes_plugin_data_json: .obsidian/plugins/tasknotes/data.json,
  • \n
  • built_in_defaults: implementation defaults,
  • \n
  • optional runtime/CLI/env overrides.
  • \n
\n

This list is not exhaustive.

\n

9.2.2 Deterministic precedence and merge#

\n

Provider precedence MUST be deterministic.

\n

Unless explicitly documented otherwise, implementations MUST resolve configuration per top-level key:

\n
    \n
  • for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins,
  • \n
  • winning object values replace lower-precedence object values as whole objects (no implicit deep merge),
  • \n
  • after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration.
  • \n
\n

If an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic.

\n

9.2.3 Strict vs permissive provider behavior#

\n

In strict mode:

\n
    \n
  • failure to resolve required effective keys (spec_version, mapping) MUST be a configuration error.
  • \n
\n

If permissive mode is implemented, then in permissive mode:

\n
    \n
  • implementations MAY continue with defaults when providers are missing/unreadable,
  • \n
  • implementations MUST emit configuration warnings,
  • \n
  • implementations MUST disclose that effective configuration is partial/default-derived.
  • \n
\n

9.2.4 TaskNotes plugin provider (data.json)#

\n

The TaskNotes plugin stores settings in .obsidian/plugins/tasknotes/data.json within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below.

\n

Key mapping table (data.json key → spec effective config):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
data.json keySpec keyNotes
fieldMappingmappingNormalize role names: dateCreated→date_created, completedDate→completed_date, recurrenceAnchor→recurrence_anchor, completeInstances→complete_instances, skippedInstances→skipped_instances, recurrenceParent→recurrence_parent, occurrenceDate→occurrence_date, occurrenceMaterialization→occurrence_materialization, occurrenceNextTrigger→occurrence_next_trigger, occurrenceTemplate→occurrence_template, occurrencePastHorizon→occurrence_past_horizon, occurrenceFutureHorizon→occurrence_future_horizon, blockedBy→blocked_by, timeEntries→time_entries, timeEstimate→time_estimate
storeTitleInFilenametitle.storagetrue → "filename", false → "frontmatter"
taskFilenameFormattitle.filename_formatValues: "title", "zettel", "timestamp", "custom"; used only when title.storage=frontmatter for canonical writes, but preserved as compatibility input when present
customFilenameTemplatetitle.custom_filename_templateTemplate string, e.g. "{title}"; used only when title.storage=frontmatter and filename_format=custom
taskCreationDefaults.useBodyTemplatetemplating.enabledboolean
taskCreationDefaults.bodyTemplatetemplating.template_pathPath to template file
customStatuses[*].valuestatus.valuesOrdered array of status value strings
defaultTaskStatusstatus.defaultDefault status string
customStatuses[isCompleted=true][*].valuestatus.completed_valuesStatuses where isCompleted: true
defaultTaskPrioritydefaults.priorityDefault priority string
autoStopTimeTrackingOnCompletetime_tracking.auto_stop_on_completeboolean
autoStopTimeTrackingNotificationtime_tracking.auto_stop_notificationboolean
taskIdentificationMethodtask_detection.method"tag" or "property"
taskTagtask_detection.tagTag string used when method="tag"
taskPropertyNametask_detection.property_nameFrontmatter key used when method="property"
taskPropertyValuetask_detection.property_valueExpected value; empty means key must exist
tasksFoldertask_detection.default_folderDefault folder for new tasks
excludedFolderstask_detection.excluded_foldersComma-separated folder paths to exclude
moveArchivedTasksarchive.move_on_archiveboolean
archiveFolderarchive.folderArchive destination folder
useFrontmatterMarkdownLinkslinks.use_markdown_formatboolean; see §11
\n

Key data.json fields with defaults (for cold-start reading of a vault with no tasknotes.yaml):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldTypeDefaultMeaning
tasksFolderstring"TaskNotes/Tasks"Default folder for new task files
taskIdentificationMethod"tag" | "property""tag"How task files are identified
taskTagstring"task"Tag that identifies task files (when method="tag")
taskPropertyNamestring""Frontmatter key for property-based identification
taskPropertyValuestring""Expected value for property-based identification (empty = key presence)
storeTitleInFilenamebooleantrueTitle storage mode
taskFilenameFormat"title" | "zettel" | "timestamp" | "custom""title"Filename generation format
customFilenameTemplatestring"{title}"Template for "custom" filename format
defaultTaskStatusstring"open"Default status on create
defaultTaskPrioritystring"normal"Default priority on create
customStatusesStatusConfig[]see object shape belowOrdered status definitions
autoStopTimeTrackingOnCompletebooleantrueAuto-stop active session on completion
autoStopTimeTrackingNotificationbooleanfalseShow notification when auto-stopping
useFrontmatterMarkdownLinksbooleanfalseUse markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin)
moveArchivedTasksbooleanfalseMove task file to archive folder on archive
archiveFolderstring"TaskNotes/Archive"Archive destination folder
excludedFoldersstring""Comma-separated folders to exclude from task indexing
\n

StatusConfig object shape:

\n
{\n  "id": "done",\n  "value": "done",\n  "label": "Done",\n  "color": "#00aa00",\n  "isCompleted": true,\n  "order": 3,\n  "autoArchive": false,\n  "autoArchiveDelay": 5\n}\n

spec_version is not present in data.json. Implementations MUST synthesize an effective spec_version as described in §9.5.

\n

Provider keys not listed above MAY be ignored by tasknotes-spec consumers.

\n

9.3 Required top-level keys#

\n

Required keys apply to the effective configuration after provider resolution.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyTypeRequiredDescription
spec_versionstringyestarget spec version (provider-supplied or synthesized per §9.5)
mappingobjectyessemantic role to storage key mapping
\n\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyTypeDescription
runtime_timezonestringIANA timezone for day-level semantics
task_detectionobjecttask file identification rules
defaultsobjectrole defaults used during create
statusobjectstatus set and completed-value semantics
validationobjectvalidation behavior (strict required, permissive optional)
linksobjectlink parsing/resolution behavior
titleobjecttitle source and filename behavior policy
templatingobjectoptional create-time templating behavior policy
dependenciesobjectdependency behavior policy
remindersobjectreminder behavior policy
time_trackingobjecttime-tracking management behavior policy
occurrencesobjectrecurrence materialization defaults and bounds
compatibilityobjectlegacy alias/behavior switches
\n

9.5 spec_version behavior#

\n

spec_version MUST be a semantic version string.\nPre-release identifiers are valid (for example 0.3.0-rc.1).

\n

Implementations in strict mode MUST reject unsupported major versions.

\n

If permissive mode is implemented, permissive mode MAY proceed with warning when major version differs.

\n

If a provider does not supply spec_version (for example TaskNotes data.json), implementations MUST synthesize an effective spec_version matching their target tasknotes-spec version and SHOULD disclose that it was synthesized.

\n

9.5.1 runtime_timezone behavior#

\n

If runtime_timezone is configured, it MUST be a valid IANA timezone identifier and MUST be used for day-level semantics.

\n

If runtime_timezone is absent, implementations MUST use system local timezone.\nThe effective timezone MUST be discoverable.

\n

9.6 mapping schema#

\n

mapping MUST map semantic roles (from §2) to string storage keys.

\n

Minimum required roles in mapping:

\n
    \n
  • title
  • \n
  • status
  • \n
  • completed_date
  • \n
  • date_created
  • \n
  • date_modified
  • \n
\n

If semantic role id is supported (§2.6.5), mapping SHOULD include id.\nIf profile materialized-occurrences is claimed, mapping MUST include recurrence_parent and occurrence_date, and SHOULD include parent policy roles (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon).

\n

Example:

\n
mapping:\n  title: title\n  status: status\n  date_created: dateCreated\n  date_modified: dateModified\n  completed_date: completedDate\n  recurrence: recurrence\n  recurrence_anchor: recurrenceAnchor\n  complete_instances: completeInstances\n  skipped_instances: skippedInstances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\n

9.7 task_detection schema#

\n

task_detection controls how task files are identified within the vault.

\n

Detection methods#

\n

The tasknotes plugin natively supports two identification methods, controlled by taskIdentificationMethod in data.json (mapped to task_detection.method):

\n

tag (default) — A markdown file is a task if it contains the configured tag (default #task) in its frontmatter tags array or inline in the body. Configured by task_detection.tag.

\n

property — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by task_detection.property_name and task_detection.property_value.

\n

Schema and selection rules:

\n
    \n
  1. task_detection MAY specify either:
      \n
    • method (single-method form), or
    • \n
    • methods (multi-method form; non-empty list).
    • \n
    \n
  2. \n
  3. If both are present, methods MUST take precedence and implementations SHOULD emit a configuration warning.
  4. \n
  5. If neither is present, effective detection method MUST default to tag.
  6. \n
  7. method MUST be tag or property.
  8. \n
  9. methods entries MUST be unique and MUST be from:
      \n
    • tag
    • \n
    • property
    • \n
    • field_presence
    • \n
    • field_match
    • \n
    \n
  10. \n
  11. Method-specific required keys:
      \n
    • when tag is enabled, effective task_detection.tag MUST be non-empty (default task when absent);
    • \n
    • when property is enabled, task_detection.property_name MUST be provided and non-empty; task_detection.property_value MAY be empty (empty means key-exists semantics).
    • \n
    \n
  12. \n
  13. If methods has more than one entry, task_detection.combine controls combination semantics (§9.7.3). If omitted, it MUST default to or.
  14. \n
\n

9.7.1 Tag matching semantics#

\n

When task_detection.method=tag, matching MUST follow these rules:

\n
    \n
  1. Normalize configured task_detection.tag by stripping one leading # when present.
  2. \n
  3. Compare tag names case-insensitively after normalization.
  4. \n
  5. Frontmatter matching:
      \n
    • tags MAY be a list of strings or a single string.
    • \n
    • each tag value is normalized by trimming surrounding whitespace and stripping one leading #.
    • \n
    • match requires exact normalized equality (for example task matches #task; task does not match tasking).
    • \n
    \n
  6. \n
  7. Body matching:
      \n
    • only markdown text outside fenced code blocks and inline code spans is considered,
    • \n
    • a match requires a hashtag token with exact normalized name (for example #task),
    • \n
    • partial-word matches MUST NOT count (for example #tasking does not match configured task).
    • \n
    \n
  8. \n
\n

If either frontmatter or body matches, the file is identified as a task.

\n

9.7.2 Property matching semantics#

\n

When property detection is enabled (method=property or methods includes property):

\n
    \n
  1. task_detection.property_name MUST name the frontmatter key to inspect.
  2. \n
  3. If task_detection.property_value is non-empty, match requires semantic equality with the configured value.
  4. \n
  5. If task_detection.property_value is empty or absent, match requires key presence only.
  6. \n
\n

9.7.3 Multi-method extension semantics#

\n

tasknotes.yaml-level providers MAY additionally support:

\n
    \n
  • field_presence (example: required key status)
  • \n
  • field_match (example: type == "task")
  • \n
\n

Extension-key shape:

\n
    \n
  • field_presence: string or list of required frontmatter keys.
  • \n
  • field_match: object map of key -> expected scalar value for exact semantic equality checks.
  • \n
\n

If multiple methods are configured in tasknotes.yaml, task_detection.combine MUST define combinator semantics:

\n
    \n
  • or (default): file is a task if any enabled method matches.
  • \n
  • and: file is a task only if all enabled methods match.
  • \n
\n

If task_detection.combine is absent, implementations MUST default to or.

\n

Implementations MUST exclude folders listed in task_detection.excluded_folders from task indexing.

\n

Executable conformance: adapters participating in the fixture suite SHOULD expose config.detect_task_file to evaluate these detection semantics against fixture inputs.

\n

Example (tasknotes.yaml, equivalent to tag-based default):

\n
task_detection:\n  method: tag\n  tag: task\n  default_folder: TaskNotes/Tasks\n

Example (property-based):

\n
task_detection:\n  method: property\n  property_name: type\n  property_value: task\n

9.8 defaults schema#

\n

defaults defines values used at create time when caller input omits a role.

\n

Defaults MUST NOT override explicit user input.

\n

Example:

\n
defaults:\n  status: open\n  priority: normal\n  recurrence_anchor: scheduled\n  reminders:\n    - id: due_minus_1d\n      type: relative\n      relatedTo: due\n      offset: -P1D\n

defaults.reminders behavior is defined in §10.3.9.

\n

9.9 status schema#

\n

status defines known status values and completion semantics.

\n

Example:

\n
status:\n  values: [open, in-progress, done, cancelled]\n  default: open\n  completed_values: [done]\n  skipped_values: [cancelled]\n  default_skipped: cancelled\n

Rules:

\n
    \n
  • default MUST be one of values.
  • \n
  • completed_values MUST be a non-empty list.
  • \n
  • Each completed_values entry MUST be in values.
  • \n
  • skipped_values, when present, MUST be a list whose entries are in values.
  • \n
  • default_skipped, when present, MUST be in skipped_values.
  • \n
  • For implementations claiming materialized-occurrences, skipped_values MUST NOT overlap completed_values.
  • \n
  • Implementations claiming materialized-occurrences MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3).
  • \n
  • Non-recurring completion MUST use this list, not hardcoded literals.
  • \n
  • When a complete operation does not provide an explicit target status, writers MUST use the first entry of completed_values.
  • \n
  • When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use default_skipped when present, otherwise the first entry of skipped_values.
  • \n
\n

9.10 validation schema#

\n

Example:

\n
validation:\n  mode: strict\n  reject_unknown_fields: false\n

Rules:

\n
    \n
  • mode MUST be strict or permissive when present.
  • \n
  • If mode is absent, effective mode MUST default to strict.
  • \n
  • Conforming implementations MUST support strict.
  • \n
  • Implementations MAY support permissive.
  • \n
  • If mode=permissive is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode.
  • \n
  • reject_unknown_fields=true enforces closed-schema behavior for mapped roles.
  • \n
\n

9.11 dependencies schema#

\n

Example:

\n
dependencies:\n  default_reltype: FINISHTOSTART\n  treat_missing_target_as_blocked: true\n  enforce_unique_uid: true\n  unresolved_target_severity: warning\n  require_resolved_uid_on_write: false\n

Rules:

\n
    \n
  • default_reltype MUST be one of the allowed reltype values in §10.2.
  • \n
  • treat_missing_target_as_blocked controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5).
  • \n
  • If treat_missing_target_as_blocked is absent, effective value MUST default to true.
  • \n
  • enforce_unique_uid=true enforces uniqueness at validation/write time.
  • \n
  • If enforce_unique_uid is absent, effective value MUST default to true.
  • \n
  • unresolved_target_severity MUST be warning or error.
  • \n
  • require_resolved_uid_on_write=true requires dependency UID resolution success for add/update operations.
  • \n
\n\n

Example:

\n
links:\n  extensions: [".md"]\n  unresolved_default_severity: warning\n  update_references_on_rename: true\n

Rules:

\n
    \n
  • extensions defines extension trial order for extensionless targets.
  • \n
  • unresolved_default_severity MUST be warning or error.
  • \n
  • update_references_on_rename=true enables rename-time link rewrite behavior when supported.
  • \n
\n

9.13 title schema#

\n

Example (storage=frontmatter):

\n
title:\n  storage: frontmatter\n  filename_format: custom\n  custom_filename_template: "{{date}} {{title}}"\n

Example (storage=filename):

\n
title:\n  storage: filename\n

Rules:

\n
    \n
  • storage MUST be frontmatter or filename.
  • \n
  • when storage=frontmatter, filename_format MUST be title, zettel, timestamp, or custom.
  • \n
  • when storage=frontmatter and filename_format=custom, custom_filename_template MUST be provided and non-empty.
  • \n
  • when storage=filename, filename_format and custom_filename_template MAY be present for compatibility input but MUST be ignored for canonical write behavior.
  • \n
  • Read precedence MUST be storage-mode-aware:
      \n
    1. when storage=frontmatter, use mapped title key when present and non-empty, then file basename fallback;
    2. \n
    3. when storage=filename, use file basename first, then mapped title fallback when basename is unavailable.
    4. \n
    \n
  • \n
  • If frontmatter and basename titles both exist and differ, the source authoritative for active storage MUST win.
  • \n
  • If storage=filename, canonical writes MUST treat filename as title source, MUST rename on title change, and MUST ignore filename_format and custom_filename_template.
  • \n
  • If storage=frontmatter, canonical writes MUST persist mapped title key; filename_format and custom_filename_template govern create-time filename generation.
  • \n
\n

Informative mapping to TaskNotes settings:

\n
    \n
  • title.storage=filename corresponds to storeTitleInFilename=true.
  • \n
  • title.filename_format corresponds to taskFilenameFormat.
  • \n
  • title.custom_filename_template corresponds to customFilenameTemplate.
  • \n
\n

9.14 templating schema#

\n

templating defines optional create-time template behavior.\nThis schema is required only for implementations claiming profile templating (§7.3.3).

\n

Example:

\n
templating:\n  enabled: true\n  template_path: Templates/Task.md\n  failure_mode: warning_fallback\n  unknown_variable_policy: preserve\n

Rules:

\n
    \n
  • enabled MUST be boolean.
  • \n
  • If enabled=true, template_path MUST be provided and non-empty.
  • \n
  • failure_mode MUST be error or warning_fallback when present.
  • \n
  • unknown_variable_policy MUST be preserve or empty when present.
  • \n
  • If failure_mode is absent, effective value MUST default to warning_fallback.
  • \n
  • If unknown_variable_policy is absent, effective value MUST default to preserve.
  • \n
  • Implementations claiming templating MUST support portable double-brace variables from §5.3.5.
  • \n
  • Implementations not claiming templating MAY ignore templating settings.
  • \n
\n

9.15 reminders schema#

\n

Example:

\n
reminders:\n  date_only_anchor_time: "00:00"\n  apply_defaults_when_explicit: false\n

Rules:

\n
    \n
  • date_only_anchor_time MUST be HH:MM 24-hour local time format.
  • \n
  • date_only_anchor_time is used by §10.3.4 for relative reminders against date-only bases.
  • \n
  • apply_defaults_when_explicit MUST be boolean when present.
  • \n
  • if apply_defaults_when_explicit is absent, effective value MUST default to false.
  • \n
  • apply_defaults_when_explicit=false means explicit input reminders replace default-reminder application at create time.
  • \n
  • apply_defaults_when_explicit=true means explicit create-time reminders are merged with defaults using §10.3.9 deterministic merge rules.
  • \n
\n

9.16 time_tracking schema#

\n

Example:

\n
time_tracking:\n  auto_stop_on_complete: true\n  auto_stop_notification: false\n

Rules:

\n
    \n
  • auto_stop_on_complete MUST be boolean when present.
  • \n
  • auto_stop_notification MUST be boolean when present.
  • \n
  • if auto_stop_on_complete=true, completion-triggered stop behavior MUST follow §5.19.5.
  • \n
  • if auto_stop_notification is absent, effective value MUST default to false.
  • \n
\n

9.17 occurrences schema#

\n

occurrences defines collection-level defaults for recurrence materialization.\nThis schema is required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

Example:

\n
occurrences:\n  default_materialization: manual\n  default_next_trigger: completion\n  past_horizon: P0D\n  future_horizon: P14D\n

Rules:

\n
    \n
  • default_materialization MUST be one of manual, on_completion, or rolling.
  • \n
  • If default_materialization is absent, effective value MUST default to manual.
  • \n
  • default_next_trigger MUST be completion or completion_or_skip.
  • \n
  • If default_next_trigger is absent, effective value MUST default to completion.
  • \n
  • past_horizon and future_horizon, when present, MUST be ISO 8601 duration strings.
  • \n
  • If default_materialization=rolling, implementations MUST use finite rolling bounds. If bounds are absent, documented finite defaults MUST be used.
  • \n
  • Parent task fields override collection defaults: occurrence_materialization overrides occurrences.default_materialization; occurrence_next_trigger overrides occurrences.default_next_trigger; occurrence_past_horizon and occurrence_future_horizon override occurrences.past_horizon and occurrences.future_horizon.
  • \n
  • If occurrences is absent, the effective behavior is manual materialization and completion next trigger.
  • \n
\n

9.17.1 nlp schema#

\n

nlp advertises optional natural-language capture triggers. These settings\nallow another TaskNotes client to preserve the same capture vocabulary without\nmaking natural-language parsing a requirement of the core profile.

\n

Example:

\n
nlp:\n  triggers:\n    - property_id: tags\n      trigger: "#"\n      enabled: true\n    - property_id: contexts\n      trigger: "@"\n      enabled: true\n    - property_id: priority\n      trigger: "!"\n      enabled: false\n

Rules:

\n
    \n
  • triggers MUST be a list when present.
  • \n
  • Every trigger entry MUST contain non-empty property_id and trigger\nstrings.
  • \n
  • property_id SHOULD use a stable TaskNotes role (tags, contexts,\nprojects, status, or priority) or the stable identifier of a configured\nuser field.
  • \n
  • enabled MUST be boolean when present and MUST default to true.
  • \n
  • Trigger strings MAY contain more than one character.
  • \n
  • Trigger entries with unknown property_id values MUST be preserved by\nconfiguration round-trips and MAY be ignored by clients that cannot resolve\nthe property.
  • \n
  • If nlp is absent, clients MAY use documented local defaults.
  • \n
  • This block controls capture parsing and suggestions only. It MUST NOT change\npersisted task field names or values.
  • \n
\n

Informative mapping to TaskNotes settings:

\n
    \n
  • nlp.triggers corresponds to nlpTriggers.triggers.
  • \n
  • property_id, trigger, and enabled correspond to the plugin fields\npropertyId, trigger, and enabled.
  • \n
\n

9.18 compatibility schema#

\n

Example:

\n
compatibility:\n  read_aliases: true\n  legacy_duration_field: true\n  legacy_local_datetime_input: false\n

Rules:

\n
    \n
  • Compatibility flags MUST default to conservative behavior in new collections.
  • \n
  • legacy_local_datetime_input=true MAY relax strict parsing for offset-less datetimes only in permissive mode; strict mode parsing rules in §3.4.2 still apply.
  • \n
  • Enabled compatibility flags SHOULD be disclosed in conformance output (§7).
  • \n
\n

9.19 Complete configuration example (yaml_file provider)#

\n
spec_version: 0.3.0-rc.1\nruntime_timezone: America/Los_Angeles\n\nmapping:\n  title: title\n  status: status\n  priority: priority\n  due: due\n  scheduled: scheduled\n  completed_date: completedDate\n  date_created: dateCreated\n  date_modified: dateModified\n  recurrence: recurrence\n  recurrence_anchor: recurrenceAnchor\n  complete_instances: completeInstances\n  skipped_instances: skippedInstances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\n\ntask_detection:\n  method: tag\n  tag: task\n  default_folder: TaskNotes/Tasks\n\ndefaults:\n  status: open\n  priority: normal\n  recurrence_anchor: scheduled\n  reminders:\n    - id: due_minus_1d\n      type: relative\n      relatedTo: due\n      offset: -P1D\n\nstatus:\n  values: [open, in-progress, done, cancelled]\n  default: open\n  completed_values: [done]\n  skipped_values: [cancelled]\n  default_skipped: cancelled\n\nvalidation:\n  mode: strict\n  reject_unknown_fields: false\n\ndependencies:\n  default_reltype: FINISHTOSTART\n  treat_missing_target_as_blocked: true\n  enforce_unique_uid: true\n  unresolved_target_severity: warning\n  require_resolved_uid_on_write: false\n\nlinks:\n  extensions: [".md"]\n  unresolved_default_severity: warning\n  update_references_on_rename: true\n\ntitle:\n  storage: filename\n\ntemplating:\n  enabled: false\n  failure_mode: warning_fallback\n  unknown_variable_policy: preserve\n\nreminders:\n  date_only_anchor_time: "00:00"\n  apply_defaults_when_explicit: false\n\ntime_tracking:\n  auto_stop_on_complete: true\n  auto_stop_notification: false\n\noccurrences:\n  default_materialization: manual\n  default_next_trigger: completion\n  past_horizon: P0D\n  future_horizon: P14D\n\nnlp:\n  triggers:\n    - property_id: tags\n      trigger: "#"\n      enabled: true\n    - property_id: contexts\n      trigger: "@"\n      enabled: true\n    - property_id: projects\n      trigger: "+"\n      enabled: true\n    - property_id: status\n      trigger: "*"\n      enabled: true\n    - property_id: priority\n      trigger: "!"\n      enabled: false\n\ncompatibility:\n  read_aliases: true\n  legacy_duration_field: true\n

9.20 Configuration errors#

\n

Configuration validation MUST report structured errors with key path context.

\n

Examples:

\n
    \n
  • no readable configuration provider available in strict mode
  • \n
  • required effective key unresolved after provider resolution (spec_version or mapping)
  • \n
  • missing mapping.title
  • \n
  • status.default not present in status.values
  • \n
  • status.completed_values contains a value not present in status.values
  • \n
  • status.skipped_values contains a value not present in status.values
  • \n
  • status.default_skipped not present in status.skipped_values
  • \n
  • status.skipped_values overlaps status.completed_values when materialized-occurrences is claimed
  • \n
  • unsupported validation.mode
  • \n
  • validation.mode=permissive but permissive mode is not implemented
  • \n
  • invalid task_detection.method
  • \n
  • invalid task_detection.methods entry
  • \n
  • empty task_detection.tag when tag method is enabled
  • \n
  • missing task_detection.property_name when property method is enabled
  • \n
  • invalid task_detection.combine
  • \n
  • invalid dependencies.default_reltype
  • \n
  • invalid dependencies.unresolved_target_severity
  • \n
  • invalid links.unresolved_default_severity
  • \n
  • invalid title.storage
  • \n
  • invalid title.filename_format
  • \n
  • missing title.filename_format when title.storage=frontmatter
  • \n
  • missing title.custom_filename_template when title.storage=frontmatter and title.filename_format=custom
  • \n
  • missing templating.template_path when templating.enabled=true
  • \n
  • invalid templating.failure_mode
  • \n
  • invalid templating.unknown_variable_policy
  • \n
  • invalid reminders.date_only_anchor_time
  • \n
  • invalid reminders.apply_defaults_when_explicit
  • \n
  • invalid time_tracking.auto_stop_on_complete
  • \n
  • invalid time_tracking.auto_stop_notification
  • \n
  • invalid occurrences.default_materialization
  • \n
  • invalid occurrences.default_next_trigger
  • \n
  • invalid occurrences.past_horizon
  • \n
  • invalid occurrences.future_horizon
  • \n
  • invalid nlp.triggers
  • \n
  • empty nlp.triggers[].property_id
  • \n
  • empty nlp.triggers[].trigger
  • \n
  • invalid nlp.triggers[].enabled
  • \n
\n

9.21 Default collection state#

\n

This section describes what a fresh tasknotes vault looks like before any user customization. Implementations that read an existing tasknotes vault without a tasknotes.yaml SHOULD apply these defaults when data.json is absent or fields are missing.

\n

Folder layout#

\n
MyVault/\n├── TaskNotes/\n│   ├── Tasks/          ← new tasks created here by default\n│   └── Archive/        ← archived tasks moved here (if moveArchivedTasks=true)\n└── .obsidian/\n    └── plugins/\n        └── tasknotes/\n            └── data.json\n

Task detection#

\n

Default method: tag. A file is a task if it contains the tag #task in its frontmatter tags array or inline in the body.

\n

Default field mapping#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleDefault storage key
titletitle
statusstatus
prioritypriority
duedue
scheduledscheduled
contextscontexts
projectsprojects
time_estimatetimeEstimate
completed_datecompletedDate
date_createddateCreated
date_modifieddateModified
recurrencerecurrence
recurrence_anchorrecurrence_anchor
complete_instancescomplete_instances
skipped_instancesskipped_instances
recurrence_parentrecurrence_parent
occurrence_dateoccurrence_date
occurrence_materializationoccurrence_materialization
occurrence_next_triggeroccurrence_next_trigger
occurrence_templateoccurrence_template
occurrence_past_horizonoccurrence_past_horizon
occurrence_future_horizonoccurrence_future_horizon
time_entriestimeEntries
blocked_byblockedBy
remindersreminders
\n

Note: recurrenceAnchor, completeInstances, and skippedInstances are accepted as aliases on read (§2.5). The mixed camelCase/snake_case defaults are intentional for compatibility with historical TaskNotes frontmatter.

\n

Default statuses#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ValueLabelisCompletedOrder
noneNonefalse0
openOpenfalse1
in-progressIn progressfalse2
doneDonetrue3
\n

Default status on create: open. Default completed status (first isCompleted=true): done.\nNo skipped status is configured by default; implementations that support materialized occurrence skips MUST require configuration or expose a documented default before writing skipped occurrence state.

\n

Default priorities#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ValueLabelWeight
noneNone0
lowLow1
normalNormal2
highHigh3
\n

Default priority on create: normal.

\n

Title and filename defaults#

\n
    \n
  • title.storage: filename (filename/path is the authoritative title source)
  • \n
  • default basename generation under title.storage=filename derives from semantic title using filename-safe sanitization
  • \n
  • implementations MAY also keep mapped title in frontmatter as a synchronized compatibility mirror
  • \n
  • TaskNotes data.json may still contain legacy taskFilenameFormat values such as zettel, but these are compatibility inputs rather than the forward default when title.storage=filename
  • \n
  • title is read from filename first; frontmatter title is compatibility fallback when filename-derived title is unavailable (§2.2.2)
  • \n
\n

Time tracking defaults#

\n
    \n
  • auto_stop_on_complete: true
  • \n
  • auto_stop_notification: false
  • \n
\n\n
    \n
  • useFrontmatterMarkdownLinks: false — wikilinks used by default (e.g. [[task-name]])
  • \n
  • To use markdown link format, the obsidian-frontmatter-markdown-links plugin must also be installed
  • \n
\n

Effective configuration for a minimal fresh vault#

\n

When neither data.json nor tasknotes.yaml is present, implementations MUST use the following effective configuration:

\n
spec_version: 0.3.0-rc.1   # synthesized\nmapping:\n  title: title\n  status: status\n  priority: priority\n  due: due\n  scheduled: scheduled\n  contexts: contexts\n  projects: projects\n  time_estimate: timeEstimate\n  completed_date: completedDate\n  date_created: dateCreated\n  date_modified: dateModified\n  recurrence: recurrence\n  recurrence_anchor: recurrence_anchor\n  complete_instances: complete_instances\n  skipped_instances: skipped_instances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\ntask_detection:\n  method: tag\n  tag: task\n  default_folder: TaskNotes/Tasks\nstatus:\n  values: [none, open, in-progress, done]\n  default: open\n  completed_values: [done]\ntitle:\n  storage: filename\ntime_tracking:\n  auto_stop_on_complete: true\n  auto_stop_notification: false\nlinks:\n  use_markdown_format: false\n  extensions: [".md"]\n  unresolved_default_severity: warning\n  update_references_on_rename: true\n
","text":"9.1 Purpose# This section defines the normative configuration model for collections using tasknotes-spec. 9.2 Configuration provider model# Implementations MUST derive an effective configuration from one or more configuration providers. A provider is a source adapter that returns a partial configuration normalized to this section's schema. Implementations MUST: support at least one provider, document supported providers, document provider precedence order, disclose active providers and fallback behavior in conformance output (§7). 9.2.1 Common provider types# Common providers include: yaml_file: a tasknotes.yaml document at collection root, tasknotes_plugin_data_json: .obsidian/plugins/tasknotes/data.json, built_in_defaults: implementation defaults, optional runtime/CLI/env overrides. This list is not exhaustive. 9.2.2 Deterministic precedence and merge# Provider precedence MUST be deterministic. Unless explicitly documented otherwise, implementations MUST resolve configuration per top-level key: for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins, winning object values replace lower-precedence object values as whole objects (no implicit deep merge), after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration. If an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic. 9.2.3 Strict vs permissive provider behavior# In strict mode: failure to resolve required effective keys (spec_version, mapping) MUST be a configuration error. If permissive mode is implemented, then in permissive mode: implementations MAY continue with defaults when providers are missing/unreadable, implementations MUST emit configuration warnings, implementations MUST disclose that effective configuration is partial/default-derived. 9.2.4 TaskNotes plugin provider (data.json)# The TaskNotes plugin stores settings in .obsidian/plugins/tasknotes/data.json within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below. Key mapping table (data.json key → spec effective config): data.json key Spec key Notes fieldMapping mapping Normalize role names: dateCreated→date_created, completedDate→completed_date, recurrenceAnchor→recurrence_anchor, completeInstances→complete_instances, skippedInstances→skipped_instances, recurrenceParent→recurrence_parent, occurrenceDate→occurrence_date, occurrenceMaterialization→occurrence_materialization, occurrenceNextTrigger→occurrence_next_trigger, occurrenceTemplate→occurrence_template, occurrencePastHorizon→occurrence_past_horizon, occurrenceFutureHorizon→occurrence_future_horizon, blockedBy→blocked_by, timeEntries→time_entries, timeEstimate→time_estimate storeTitleInFilename title.storage true → \"filename\", false → \"frontmatter\" taskFilenameFormat title.filename_format Values: \"title\", \"zettel\", \"timestamp\", \"custom\"; used only when title.storage=frontmatter for canonical writes, but preserved as compatibility input when present customFilenameTemplate title.custom_filename_template Template string, e.g. \"{title}\"; used only when title.storage=frontmatter and filename_format=custom taskCreationDefaults.useBodyTemplate templating.enabled boolean taskCreationDefaults.bodyTemplate templating.template_path Path to template file customStatuses[*].value status.values Ordered array of status value strings defaultTaskStatus status.default Default status string customStatuses[isCompleted=true][*].value status.completed_values Statuses where isCompleted: true defaultTaskPriority defaults.priority Default priority string autoStopTimeTrackingOnComplete time_tracking.auto_stop_on_complete boolean autoStopTimeTrackingNotification time_tracking.auto_stop_notification boolean taskIdentificationMethod task_detection.method \"tag\" or \"property\" taskTag task_detection.tag Tag string used when method=\"tag\" taskPropertyName task_detection.property_name Frontmatter key used when method=\"property\" taskPropertyValue task_detection.property_value Expected value; empty means key must exist tasksFolder task_detection.default_folder Default folder for new tasks excludedFolders task_detection.excluded_folders Comma-separated folder paths to exclude moveArchivedTasks archive.move_on_archive boolean archiveFolder archive.folder Archive destination folder useFrontmatterMarkdownLinks links.use_markdown_format boolean; see §11 Key data.json fields with defaults (for cold-start reading of a vault with no tasknotes.yaml): Field Type Default Meaning tasksFolder string \"TaskNotes/Tasks\" Default folder for new task files taskIdentificationMethod \"tag\" | \"property\" \"tag\" How task files are identified taskTag string \"task\" Tag that identifies task files (when method=\"tag\") taskPropertyName string \"\" Frontmatter key for property-based identification taskPropertyValue string \"\" Expected value for property-based identification (empty = key presence) storeTitleInFilename boolean true Title storage mode taskFilenameFormat \"title\" | \"zettel\" | \"timestamp\" | \"custom\" \"title\" Filename generation format customFilenameTemplate string \"{title}\" Template for \"custom\" filename format defaultTaskStatus string \"open\" Default status on create defaultTaskPriority string \"normal\" Default priority on create customStatuses StatusConfig[] see object shape below Ordered status definitions autoStopTimeTrackingOnComplete boolean true Auto-stop active session on completion autoStopTimeTrackingNotification boolean false Show notification when auto-stopping useFrontmatterMarkdownLinks boolean false Use markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin) moveArchivedTasks boolean false Move task file to archive folder on archive archiveFolder string \"TaskNotes/Archive\" Archive destination folder excludedFolders string \"\" Comma-separated folders to exclude from task indexing StatusConfig object shape: { \"id\": \"done\", \"value\": \"done\", \"label\": \"Done\", \"color\": \"#00aa00\", \"isCompleted\": true, \"order\": 3, \"autoArchive\": false, \"autoArchiveDelay\": 5 } spec_version is not present in data.json. Implementations MUST synthesize an effective spec_version as described in §9.5. Provider keys not listed above MAY be ignored by tasknotes-spec consumers. 9.3 Required top-level keys# Required keys apply to the effective configuration after provider resolution. Key Type Required Description spec_version string yes target spec version (provider-supplied or synthesized per §9.5) mapping object yes semantic role to storage key mapping 9.4 Recommended top-level keys# Key Type Description runtime_timezone string IANA timezone for day-level semantics task_detection object task file identification rules defaults object role defaults used during create status object status set and completed-value semantics validation object validation behavior (strict required, permissive optional) links object link parsing/resolution behavior title object title source and filename behavior policy templating object optional create-time templating behavior policy dependencies object dependency behavior policy reminders object reminder behavior policy time_tracking object time-tracking management behavior policy occurrences object recurrence materialization defaults and bounds compatibility object legacy alias/behavior switches 9.5 spec_version behavior# spec_version MUST be a semantic version string. Pre-release identifiers are valid (for example 0.3.0-rc.1). Implementations in strict mode MUST reject unsupported major versions. If permissive mode is implemented, permissive mode MAY proceed with warning when major version differs. If a provider does not supply spec_version (for example TaskNotes data.json), implementations MUST synthesize an effective spec_version matching their target tasknotes-spec version and SHOULD disclose that it was synthesized. 9.5.1 runtime_timezone behavior# If runtime_timezone is configured, it MUST be a valid IANA timezone identifier and MUST be used for day-level semantics. If runtime_timezone is absent, implementations MUST use system local timezone. The effective timezone MUST be discoverable. 9.6 mapping schema# mapping MUST map semantic roles (from §2) to string storage keys. Minimum required roles in mapping: title status completed_date date_created date_modified If semantic role id is supported (§2.6.5), mapping SHOULD include id. If profile materialized-occurrences is claimed, mapping MUST include recurrence_parent and occurrence_date, and SHOULD include parent policy roles (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon). Example: mapping: title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrenceAnchor complete_instances: completeInstances skipped_instances: skippedInstances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_entries: timeEntries blocked_by: blockedBy reminders: reminders 9.7 task_detection schema# task_detection controls how task files are identified within the vault. Detection methods# The tasknotes plugin natively supports two identification methods, controlled by taskIdentificationMethod in data.json (mapped to task_detection.method): tag (default) — A markdown file is a task if it contains the configured tag (default #task) in its frontmatter tags array or inline in the body. Configured by task_detection.tag. property — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by task_detection.property_name and task_detection.property_value. Schema and selection rules: task_detection MAY specify either: method (single-method form), or methods (multi-method form; non-empty list). If both are present, methods MUST take precedence and implementations SHOULD emit a configuration warning. If neither is present, effective detection method MUST default to tag. method MUST be tag or property. methods entries MUST be unique and MUST be from: tag property field_presence field_match Method-specific required keys: when tag is enabled, effective task_detection.tag MUST be non-empty (default task when absent); when property is enabled, task_detection.property_name MUST be provided and non-empty; task_detection.property_value MAY be empty (empty means key-exists semantics). If methods has more than one entry, task_detection.combine controls combination semantics (§9.7.3). If omitted, it MUST default to or. 9.7.1 Tag matching semantics# When task_detection.method=tag, matching MUST follow these rules: Normalize configured task_detection.tag by stripping one leading # when present. Compare tag names case-insensitively after normalization. Frontmatter matching: tags MAY be a list of strings or a single string. each tag value is normalized by trimming surrounding whitespace and stripping one leading #. match requires exact normalized equality (for example task matches #task; task does not match tasking). Body matching: only markdown text outside fenced code blocks and inline code spans is considered, a match requires a hashtag token with exact normalized name (for example #task), partial-word matches MUST NOT count (for example #tasking does not match configured task). If either frontmatter or body matches, the file is identified as a task. 9.7.2 Property matching semantics# When property detection is enabled (method=property or methods includes property): task_detection.property_name MUST name the frontmatter key to inspect. If task_detection.property_value is non-empty, match requires semantic equality with the configured value. If task_detection.property_value is empty or absent, match requires key presence only. 9.7.3 Multi-method extension semantics# tasknotes.yaml-level providers MAY additionally support: field_presence (example: required key status) field_match (example: type == \"task\") Extension-key shape: field_presence: string or list of required frontmatter keys. field_match: object map of key -> expected scalar value for exact semantic equality checks. If multiple methods are configured in tasknotes.yaml, task_detection.combine MUST define combinator semantics: or (default): file is a task if any enabled method matches. and: file is a task only if all enabled methods match. If task_detection.combine is absent, implementations MUST default to or. Implementations MUST exclude folders listed in task_detection.excluded_folders from task indexing. Executable conformance: adapters participating in the fixture suite SHOULD expose config.detect_task_file to evaluate these detection semantics against fixture inputs. Example (tasknotes.yaml, equivalent to tag-based default): task_detection: method: tag tag: task default_folder: TaskNotes/Tasks Example (property-based): task_detection: method: property property_name: type property_value: task 9.8 defaults schema# defaults defines values used at create time when caller input omits a role. Defaults MUST NOT override explicit user input. Example: defaults: status: open priority: normal recurrence_anchor: scheduled reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D defaults.reminders behavior is defined in §10.3.9. 9.9 status schema# status defines known status values and completion semantics. Example: status: values: [open, in-progress, done, cancelled] default: open completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled Rules: default MUST be one of values. completed_values MUST be a non-empty list. Each completed_values entry MUST be in values. skipped_values, when present, MUST be a list whose entries are in values. default_skipped, when present, MUST be in skipped_values. For implementations claiming materialized-occurrences, skipped_values MUST NOT overlap completed_values. Implementations claiming materialized-occurrences MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3). Non-recurring completion MUST use this list, not hardcoded literals. When a complete operation does not provide an explicit target status, writers MUST use the first entry of completed_values. When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use default_skipped when present, otherwise the first entry of skipped_values. 9.10 validation schema# Example: validation: mode: strict reject_unknown_fields: false Rules: mode MUST be strict or permissive when present. If mode is absent, effective mode MUST default to strict. Conforming implementations MUST support strict. Implementations MAY support permissive. If mode=permissive is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode. reject_unknown_fields=true enforces closed-schema behavior for mapped roles. 9.11 dependencies schema# Example: dependencies: default_reltype: FINISHTOSTART treat_missing_target_as_blocked: true enforce_unique_uid: true unresolved_target_severity: warning require_resolved_uid_on_write: false Rules: default_reltype MUST be one of the allowed reltype values in §10.2. treat_missing_target_as_blocked controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5). If treat_missing_target_as_blocked is absent, effective value MUST default to true. enforce_unique_uid=true enforces uniqueness at validation/write time. If enforce_unique_uid is absent, effective value MUST default to true. unresolved_target_severity MUST be warning"},{"route":"/developers/specification/10-dependencies-and-reminders/","title":"10. Dependencies and Reminders","description":"This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders).","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:10-dependencies-and-reminders.md","namespace":"specification","relativePath":"10-dependencies-and-reminders.md","raw":"# 10. Dependencies and Reminders\n\n## 10.1 Purpose\n\nThis section defines canonical semantics for task dependencies (`blocked_by`) and task reminders (`reminders`).\n\n## 10.2 Dependencies (`blocked_by`)\n\n### 10.2.1 Data shape\n\n`blocked_by` MUST be a list of dependency entries.\n\nEach entry MUST be an object with:\n\n- `uid` (required): reference to a blocking task (link or string)\n- `reltype` (required): one of\n - `FINISHTOSTART`\n - `STARTTOSTART`\n - `FINISHTOFINISH`\n - `STARTTOFINISH`\n- `gap` (optional): ISO 8601 duration string\n\nIf `reltype` is omitted on read in compatibility mode, implementations MAY treat it as `FINISHTOSTART` and SHOULD emit a warning.\n\n### 10.2.2 UID normalization\n\nImplementations SHOULD normalize `uid` values to a canonical reference representation on write.\n\nIf link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented.\nLink parsing and resolution MUST follow §11.\n\n### 10.2.3 Dependency uniqueness\n\nWithin a task, dependency entries are keyed by normalized `uid`.\n\nPolicy is configuration-driven and MUST be deterministic:\n\n- when `dependencies.enforce_unique_uid=true` (default), duplicate normalized `uid` values MUST NOT be accepted as canonical persisted state:\n - strict mode: duplicates MUST fail validation/write with `duplicate_dependency_uid`;\n - permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit `duplicate_dependency_uid`.\n- when `dependencies.enforce_unique_uid=false`, duplicates MAY be preserved as compatibility behavior.\n\nThe active policy MUST be documented in conformance claims.\n\n### 10.2.4 Self-dependency\n\nA task MUST NOT depend on itself.\n\nSelf-dependency is a validation error.\n\n### 10.2.5 Blocking semantics (v0.1)\n\nFor v0.1, blocking evaluation MUST be status-presence based:\n\n1. A task is blocked if it has at least one unresolved dependency.\n2. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status.\n3. Completed status MUST be determined from configured `status.completed_values`.\n4. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base `status` only; `complete_instances`/`skipped_instances` are not consulted.\n5. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow `dependencies.treat_missing_target_as_blocked` (§9.11, default `true`).\n\nFor v0.1, `reltype` and `gap` are preserved and validated but MUST NOT change the unresolved/resolved decision.\n\n### 10.2.6 Missing referenced task\n\nWhen `uid` cannot be resolved:\n\n- implementations SHOULD emit `unresolved_dependency_target`.\n- blocked-state contribution for this missing target MUST follow `dependencies.treat_missing_target_as_blocked` (§9.11).\n- issue severity SHOULD follow `dependencies.unresolved_target_severity` (default: `warning`).\n- for `blocked_by.uid`, this dependency-specific severity policy MUST take precedence over `links.unresolved_default_severity`.\n- parse failures that produce `invalid_link_format` and containment violations that produce `path_traversal` remain error-severity conditions from §11.\n- if `dependencies.require_resolved_uid_on_write=true`, add/update MUST fail with error.\n\n### 10.2.7 Cycles\n\nImplementations MUST reject direct self-cycles.\n\nDetection of multi-hop dependency cycles is RECOMMENDED but not required for `core-lite` or `recurrence` profiles.\n\n### 10.2.8 Reverse relation field\n\nSome implementations maintain reverse relationships (for example `blocking`). Such fields are derived and non-canonical in this spec unless explicitly mapped.\n\nIf maintained, reverse updates SHOULD remain consistent with `blocked_by` edits.\n\n### 10.2.9 Dependency operation semantics\n\n#### Add dependency\n\nAdd dependency MUST:\n\n- validate entry shape,\n- handle duplicates by policy (preserve, normalize, or reject),\n- preserve unrelated dependency entries,\n- update `date_modified` on change.\n\n#### Remove dependency\n\nRemove dependency MUST remove by normalized `uid` and be idempotent.\n\n#### Replace dependencies\n\nReplace behavior MUST be explicit operation mode (not default for patch update).\n\n### 10.2.10 Dependency examples\n\nExample entry:\n\n```yaml\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n gap: PT4H\n```\n\nExample unresolved dependency (target missing):\n\n```yaml\nblockedBy:\n - uid: \"[[non-existent-task]]\"\n reltype: FINISHTOSTART\n```\n\n## 10.3 Reminders (`reminders`)\n\n### 10.3.1 Data shape\n\n`reminders` MUST be a list of reminder entries.\n\nEach reminder MUST include:\n\n- `id` (required): unique string within the task\n- `type` (required): `absolute` or `relative`\n\nOptional field:\n\n- `description` string\n\nType-specific fields:\n\n- `absolute`: requires `absoluteTime` datetime\n- `relative`: requires `relatedTo` (`due` or `scheduled`) and `offset` (ISO 8601 duration)\n\n### 10.3.2 Reminder uniqueness\n\nReminder `id` values MUST be unique within the task.\n\nIf duplicates occur:\n\n- strict mode: MUST raise `duplicate_reminder_id`.\n- permissive mode: MAY normalize deterministically and emit warning.\n\n### 10.3.3 Relative reminder base\n\n`relatedTo` MUST reference semantic role `due` or `scheduled`.\n\nIf the referenced role is absent, the reminder is unresolved.\n\n### 10.3.4 Trigger instant computation\n\nTrigger instant MUST be computed as follows:\n\n1. If `type=absolute`, trigger = `absoluteTime` instant.\n2. If `type=relative`,\n - resolve base field from `relatedTo`,\n - if base is datetime: use that instant,\n - if base is date: convert to local datetime at configured `reminders.date_only_anchor_time`,\n - trigger = base + `offset`.\n\nIf `reminders.date_only_anchor_time` is not configured, implementations MUST use `00:00` local time.\n\n### 10.3.5 Offset semantics\n\n`offset` MUST be a valid ISO 8601 duration with optional sign.\n\n- negative offset = before base\n- positive offset = after base\n- zero offset = at base instant\n\n### 10.3.6 Invalid mixed fields\n\nEntries with incompatible field combinations MUST fail validation in strict mode.\n\nExamples:\n\n- `type=absolute` with `relatedTo` and no `absoluteTime`\n- `type=relative` with `absoluteTime` and missing `offset`\n\n### 10.3.7 Reminder ordering\n\nWhen computing reminder schedules, implementations MUST sort by trigger instant ascending.\n\nFor identical trigger instants, implementations MUST use stable tie-break ordering by `id` ascending.\n\n### 10.3.8 Reminder operation semantics\n\n#### Add reminder\n\nAdd reminder MUST validate shape and unique `id`, then update `date_modified`.\n\nIf `id` is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task.\n\n#### Update reminder\n\nUpdate reminder MUST address reminders by `id` and be patch-by-default.\n\n#### Remove reminder\n\nRemove reminder by `id` MUST be idempotent.\n\n### 10.3.9 Default reminders\n\nIf `defaults.reminders` is configured (see §9):\n\n- create without explicit reminders MUST apply defaults.\n- create with explicit reminders MUST follow `reminders.apply_defaults_when_explicit` (§9.15):\n - `false` (default): explicit reminders replace defaults.\n - `true`: explicit reminders are merged with defaults.\n\nDeterministic merge rules when `apply_defaults_when_explicit=true`:\n\n1. Start with explicit reminders in caller order.\n2. Append each default reminder whose `id` is not already present.\n3. If explicit and default reminders share an `id`, explicit reminder MUST win.\n\n### 10.3.10 Reminder examples\n\nRelative reminder:\n\n```yaml\nreminders:\n - id: due_minus_15m\n type: relative\n relatedTo: due\n offset: -PT15M\n```\n\nAbsolute reminder:\n\n```yaml\nreminders:\n - id: call_now\n type: absolute\n absoluteTime: 2026-02-20T09:00:00Z\n```\n\n### 10.3.11 Reminder resolution error handling\n\nIf relative reminder base is unavailable (`relatedTo=due` but no `due` field):\n\n- strict mode: validation error `unresolvable_reminder_base`.\n- permissive mode: warning and reminder excluded from trigger computation.\n\n## 10.4 Interactions\n\n### 10.4.1 Rename interaction\n\nIf implementation supports rename/reference updates, dependency `uid` references SHOULD be updated consistently with other link references.\n\n### 10.4.2 Completion interaction\n\nChanging task completion state does not automatically remove dependencies or reminders unless explicitly configured.\n\n### 10.4.3 Archive interaction\n\nArchive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested.\n","aliases":["/spec/10-dependencies-and-reminders/"],"toc":[{"level":2,"id":"101-purpose","text":"10.1 Purpose"},{"level":2,"id":"102-dependencies-blockedby","text":"10.2 Dependencies (blocked_by)"},{"level":3,"id":"1021-data-shape","text":"10.2.1 Data shape"},{"level":3,"id":"1022-uid-normalization","text":"10.2.2 UID normalization"},{"level":3,"id":"1023-dependency-uniqueness","text":"10.2.3 Dependency uniqueness"},{"level":3,"id":"1024-self-dependency","text":"10.2.4 Self-dependency"},{"level":3,"id":"1025-blocking-semantics-v01","text":"10.2.5 Blocking semantics (v0.1)"},{"level":3,"id":"1026-missing-referenced-task","text":"10.2.6 Missing referenced task"},{"level":3,"id":"1027-cycles","text":"10.2.7 Cycles"},{"level":3,"id":"1028-reverse-relation-field","text":"10.2.8 Reverse relation field"},{"level":3,"id":"1029-dependency-operation-semantics","text":"10.2.9 Dependency operation semantics"},{"level":3,"id":"10210-dependency-examples","text":"10.2.10 Dependency examples"},{"level":2,"id":"103-reminders-reminders","text":"10.3 Reminders (reminders)"},{"level":3,"id":"1031-data-shape","text":"10.3.1 Data shape"},{"level":3,"id":"1032-reminder-uniqueness","text":"10.3.2 Reminder uniqueness"},{"level":3,"id":"1033-relative-reminder-base","text":"10.3.3 Relative reminder base"},{"level":3,"id":"1034-trigger-instant-computation","text":"10.3.4 Trigger instant computation"},{"level":3,"id":"1035-offset-semantics","text":"10.3.5 Offset semantics"},{"level":3,"id":"1036-invalid-mixed-fields","text":"10.3.6 Invalid mixed fields"},{"level":3,"id":"1037-reminder-ordering","text":"10.3.7 Reminder ordering"},{"level":3,"id":"1038-reminder-operation-semantics","text":"10.3.8 Reminder operation semantics"},{"level":3,"id":"1039-default-reminders","text":"10.3.9 Default reminders"},{"level":3,"id":"10310-reminder-examples","text":"10.3.10 Reminder examples"},{"level":3,"id":"10311-reminder-resolution-error-handling","text":"10.3.11 Reminder resolution error handling"},{"level":2,"id":"104-interactions","text":"10.4 Interactions"},{"level":3,"id":"1041-rename-interaction","text":"10.4.1 Rename interaction"},{"level":3,"id":"1042-completion-interaction","text":"10.4.2 Completion interaction"},{"level":3,"id":"1043-archive-interaction","text":"10.4.3 Archive interaction"}],"html":"

10.1 Purpose#

\n

This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders).

\n

10.2 Dependencies (blocked_by)#

\n

10.2.1 Data shape#

\n

blocked_by MUST be a list of dependency entries.

\n

Each entry MUST be an object with:

\n
    \n
  • uid (required): reference to a blocking task (link or string)
  • \n
  • reltype (required): one of
      \n
    • FINISHTOSTART
    • \n
    • STARTTOSTART
    • \n
    • FINISHTOFINISH
    • \n
    • STARTTOFINISH
    • \n
    \n
  • \n
  • gap (optional): ISO 8601 duration string
  • \n
\n

If reltype is omitted on read in compatibility mode, implementations MAY treat it as FINISHTOSTART and SHOULD emit a warning.

\n

10.2.2 UID normalization#

\n

Implementations SHOULD normalize uid values to a canonical reference representation on write.

\n

If link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented.\nLink parsing and resolution MUST follow §11.

\n

10.2.3 Dependency uniqueness#

\n

Within a task, dependency entries are keyed by normalized uid.

\n

Policy is configuration-driven and MUST be deterministic:

\n
    \n
  • when dependencies.enforce_unique_uid=true (default), duplicate normalized uid values MUST NOT be accepted as canonical persisted state:
      \n
    • strict mode: duplicates MUST fail validation/write with duplicate_dependency_uid;
    • \n
    • permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit duplicate_dependency_uid.
    • \n
    \n
  • \n
  • when dependencies.enforce_unique_uid=false, duplicates MAY be preserved as compatibility behavior.
  • \n
\n

The active policy MUST be documented in conformance claims.

\n

10.2.4 Self-dependency#

\n

A task MUST NOT depend on itself.

\n

Self-dependency is a validation error.

\n

10.2.5 Blocking semantics (v0.1)#

\n

For v0.1, blocking evaluation MUST be status-presence based:

\n
    \n
  1. A task is blocked if it has at least one unresolved dependency.
  2. \n
  3. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status.
  4. \n
  5. Completed status MUST be determined from configured status.completed_values.
  6. \n
  7. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base status only; complete_instances/skipped_instances are not consulted.
  8. \n
  9. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow dependencies.treat_missing_target_as_blocked (§9.11, default true).
  10. \n
\n

For v0.1, reltype and gap are preserved and validated but MUST NOT change the unresolved/resolved decision.

\n

10.2.6 Missing referenced task#

\n

When uid cannot be resolved:

\n
    \n
  • implementations SHOULD emit unresolved_dependency_target.
  • \n
  • blocked-state contribution for this missing target MUST follow dependencies.treat_missing_target_as_blocked (§9.11).
  • \n
  • issue severity SHOULD follow dependencies.unresolved_target_severity (default: warning).
  • \n
  • for blocked_by.uid, this dependency-specific severity policy MUST take precedence over links.unresolved_default_severity.
  • \n
  • parse failures that produce invalid_link_format and containment violations that produce path_traversal remain error-severity conditions from §11.
  • \n
  • if dependencies.require_resolved_uid_on_write=true, add/update MUST fail with error.
  • \n
\n

10.2.7 Cycles#

\n

Implementations MUST reject direct self-cycles.

\n

Detection of multi-hop dependency cycles is RECOMMENDED but not required for core-lite or recurrence profiles.

\n

10.2.8 Reverse relation field#

\n

Some implementations maintain reverse relationships (for example blocking). Such fields are derived and non-canonical in this spec unless explicitly mapped.

\n

If maintained, reverse updates SHOULD remain consistent with blocked_by edits.

\n

10.2.9 Dependency operation semantics#

\n

Add dependency#

\n

Add dependency MUST:

\n
    \n
  • validate entry shape,
  • \n
  • handle duplicates by policy (preserve, normalize, or reject),
  • \n
  • preserve unrelated dependency entries,
  • \n
  • update date_modified on change.
  • \n
\n

Remove dependency#

\n

Remove dependency MUST remove by normalized uid and be idempotent.

\n

Replace dependencies#

\n

Replace behavior MUST be explicit operation mode (not default for patch update).

\n

10.2.10 Dependency examples#

\n

Example entry:

\n
blockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n    gap: PT4H\n

Example unresolved dependency (target missing):

\n
blockedBy:\n  - uid: "[[non-existent-task]]"\n    reltype: FINISHTOSTART\n

10.3 Reminders (reminders)#

\n

10.3.1 Data shape#

\n

reminders MUST be a list of reminder entries.

\n

Each reminder MUST include:

\n
    \n
  • id (required): unique string within the task
  • \n
  • type (required): absolute or relative
  • \n
\n

Optional field:

\n
    \n
  • description string
  • \n
\n

Type-specific fields:

\n
    \n
  • absolute: requires absoluteTime datetime
  • \n
  • relative: requires relatedTo (due or scheduled) and offset (ISO 8601 duration)
  • \n
\n

10.3.2 Reminder uniqueness#

\n

Reminder id values MUST be unique within the task.

\n

If duplicates occur:

\n
    \n
  • strict mode: MUST raise duplicate_reminder_id.
  • \n
  • permissive mode: MAY normalize deterministically and emit warning.
  • \n
\n

10.3.3 Relative reminder base#

\n

relatedTo MUST reference semantic role due or scheduled.

\n

If the referenced role is absent, the reminder is unresolved.

\n

10.3.4 Trigger instant computation#

\n

Trigger instant MUST be computed as follows:

\n
    \n
  1. If type=absolute, trigger = absoluteTime instant.
  2. \n
  3. If type=relative,
      \n
    • resolve base field from relatedTo,
    • \n
    • if base is datetime: use that instant,
    • \n
    • if base is date: convert to local datetime at configured reminders.date_only_anchor_time,
    • \n
    • trigger = base + offset.
    • \n
    \n
  4. \n
\n

If reminders.date_only_anchor_time is not configured, implementations MUST use 00:00 local time.

\n

10.3.5 Offset semantics#

\n

offset MUST be a valid ISO 8601 duration with optional sign.

\n
    \n
  • negative offset = before base
  • \n
  • positive offset = after base
  • \n
  • zero offset = at base instant
  • \n
\n

10.3.6 Invalid mixed fields#

\n

Entries with incompatible field combinations MUST fail validation in strict mode.

\n

Examples:

\n
    \n
  • type=absolute with relatedTo and no absoluteTime
  • \n
  • type=relative with absoluteTime and missing offset
  • \n
\n

10.3.7 Reminder ordering#

\n

When computing reminder schedules, implementations MUST sort by trigger instant ascending.

\n

For identical trigger instants, implementations MUST use stable tie-break ordering by id ascending.

\n

10.3.8 Reminder operation semantics#

\n

Add reminder#

\n

Add reminder MUST validate shape and unique id, then update date_modified.

\n

If id is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task.

\n

Update reminder#

\n

Update reminder MUST address reminders by id and be patch-by-default.

\n

Remove reminder#

\n

Remove reminder by id MUST be idempotent.

\n

10.3.9 Default reminders#

\n

If defaults.reminders is configured (see §9):

\n
    \n
  • create without explicit reminders MUST apply defaults.
  • \n
  • create with explicit reminders MUST follow reminders.apply_defaults_when_explicit (§9.15):
      \n
    • false (default): explicit reminders replace defaults.
    • \n
    • true: explicit reminders are merged with defaults.
    • \n
    \n
  • \n
\n

Deterministic merge rules when apply_defaults_when_explicit=true:

\n
    \n
  1. Start with explicit reminders in caller order.
  2. \n
  3. Append each default reminder whose id is not already present.
  4. \n
  5. If explicit and default reminders share an id, explicit reminder MUST win.
  6. \n
\n

10.3.10 Reminder examples#

\n

Relative reminder:

\n
reminders:\n  - id: due_minus_15m\n    type: relative\n    relatedTo: due\n    offset: -PT15M\n

Absolute reminder:

\n
reminders:\n  - id: call_now\n    type: absolute\n    absoluteTime: 2026-02-20T09:00:00Z\n

10.3.11 Reminder resolution error handling#

\n

If relative reminder base is unavailable (relatedTo=due but no due field):

\n
    \n
  • strict mode: validation error unresolvable_reminder_base.
  • \n
  • permissive mode: warning and reminder excluded from trigger computation.
  • \n
\n

10.4 Interactions#

\n

10.4.1 Rename interaction#

\n

If implementation supports rename/reference updates, dependency uid references SHOULD be updated consistently with other link references.

\n

10.4.2 Completion interaction#

\n

Changing task completion state does not automatically remove dependencies or reminders unless explicitly configured.

\n

10.4.3 Archive interaction#

\n

Archive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested.

\n","text":"10.1 Purpose# This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders). 10.2 Dependencies (blocked_by)# 10.2.1 Data shape# blocked_by MUST be a list of dependency entries. Each entry MUST be an object with: uid (required): reference to a blocking task (link or string) reltype (required): one of FINISHTOSTART STARTTOSTART FINISHTOFINISH STARTTOFINISH gap (optional): ISO 8601 duration string If reltype is omitted on read in compatibility mode, implementations MAY treat it as FINISHTOSTART and SHOULD emit a warning. 10.2.2 UID normalization# Implementations SHOULD normalize uid values to a canonical reference representation on write. If link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented. Link parsing and resolution MUST follow §11. 10.2.3 Dependency uniqueness# Within a task, dependency entries are keyed by normalized uid. Policy is configuration-driven and MUST be deterministic: when dependencies.enforce_unique_uid=true (default), duplicate normalized uid values MUST NOT be accepted as canonical persisted state: strict mode: duplicates MUST fail validation/write with duplicate_dependency_uid; permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit duplicate_dependency_uid. when dependencies.enforce_unique_uid=false, duplicates MAY be preserved as compatibility behavior. The active policy MUST be documented in conformance claims. 10.2.4 Self-dependency# A task MUST NOT depend on itself. Self-dependency is a validation error. 10.2.5 Blocking semantics (v0.1)# For v0.1, blocking evaluation MUST be status-presence based: A task is blocked if it has at least one unresolved dependency. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status. Completed status MUST be determined from configured status.completed_values. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base status only; complete_instances/skipped_instances are not consulted. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow dependencies.treat_missing_target_as_blocked (§9.11, default true). For v0.1, reltype and gap are preserved and validated but MUST NOT change the unresolved/resolved decision. 10.2.6 Missing referenced task# When uid cannot be resolved: implementations SHOULD emit unresolved_dependency_target. blocked-state contribution for this missing target MUST follow dependencies.treat_missing_target_as_blocked (§9.11). issue severity SHOULD follow dependencies.unresolved_target_severity (default: warning). for blocked_by.uid, this dependency-specific severity policy MUST take precedence over links.unresolved_default_severity. parse failures that produce invalid_link_format and containment violations that produce path_traversal remain error-severity conditions from §11. if dependencies.require_resolved_uid_on_write=true, add/update MUST fail with error. 10.2.7 Cycles# Implementations MUST reject direct self-cycles. Detection of multi-hop dependency cycles is RECOMMENDED but not required for core-lite or recurrence profiles. 10.2.8 Reverse relation field# Some implementations maintain reverse relationships (for example blocking). Such fields are derived and non-canonical in this spec unless explicitly mapped. If maintained, reverse updates SHOULD remain consistent with blocked_by edits. 10.2.9 Dependency operation semantics# Add dependency# Add dependency MUST: validate entry shape, handle duplicates by policy (preserve, normalize, or reject), preserve unrelated dependency entries, update date_modified on change. Remove dependency# Remove dependency MUST remove by normalized uid and be idempotent. Replace dependencies# Replace behavior MUST be explicit operation mode (not default for patch update). 10.2.10 Dependency examples# Example entry: blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: PT4H Example unresolved dependency (target missing): blockedBy: - uid: \"[[non-existent-task]]\" reltype: FINISHTOSTART 10.3 Reminders (reminders)# 10.3.1 Data shape# reminders MUST be a list of reminder entries. Each reminder MUST include: id (required): unique string within the task type (required): absolute or relative Optional field: description string Type-specific fields: absolute: requires absoluteTime datetime relative: requires relatedTo (due or scheduled) and offset (ISO 8601 duration) 10.3.2 Reminder uniqueness# Reminder id values MUST be unique within the task. If duplicates occur: strict mode: MUST raise duplicate_reminder_id. permissive mode: MAY normalize deterministically and emit warning. 10.3.3 Relative reminder base# relatedTo MUST reference semantic role due or scheduled. If the referenced role is absent, the reminder is unresolved. 10.3.4 Trigger instant computation# Trigger instant MUST be computed as follows: If type=absolute, trigger = absoluteTime instant. If type=relative, resolve base field from relatedTo, if base is datetime: use that instant, if base is date: convert to local datetime at configured reminders.date_only_anchor_time, trigger = base + offset. If reminders.date_only_anchor_time is not configured, implementations MUST use 00:00 local time. 10.3.5 Offset semantics# offset MUST be a valid ISO 8601 duration with optional sign. negative offset = before base positive offset = after base zero offset = at base instant 10.3.6 Invalid mixed fields# Entries with incompatible field combinations MUST fail validation in strict mode. Examples: type=absolute with relatedTo and no absoluteTime type=relative with absoluteTime and missing offset 10.3.7 Reminder ordering# When computing reminder schedules, implementations MUST sort by trigger instant ascending. For identical trigger instants, implementations MUST use stable tie-break ordering by id ascending. 10.3.8 Reminder operation semantics# Add reminder# Add reminder MUST validate shape and unique id, then update date_modified. If id is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task. Update reminder# Update reminder MUST address reminders by id and be patch-by-default. Remove reminder# Remove reminder by id MUST be idempotent. 10.3.9 Default reminders# If defaults.reminders is configured (see §9): create without explicit reminders MUST apply defaults. create with explicit reminders MUST follow reminders.apply_defaults_when_explicit (§9.15): false (default): explicit reminders replace defaults. true: explicit reminders are merged with defaults. Deterministic merge rules when apply_defaults_when_explicit=true: Start with explicit reminders in caller order. Append each default reminder whose id is not already present. If explicit and default reminders share an id, explicit reminder MUST win. 10.3.10 Reminder examples# Relative reminder: reminders: - id: due_minus_15m type: relative relatedTo: due offset: -PT15M Absolute reminder: reminders: - id: call_now type: absolute absoluteTime: 2026-02-20T09:00:00Z 10.3.11 Reminder resolution error handling# If relative reminder base is unavailable (relatedTo=due but no due field): strict mode: validation error unresolvable_reminder_base. permissive mode: warning and reminder excluded from trigger computation. 10.4 Interactions# 10.4.1 Rename interaction# If implementation supports rename/reference updates, dependency uid references SHOULD be updated consistently with other link references. 10.4.2 Completion interaction# Changing task completion state does not automatically remove dependencies or reminders unless explicitly configured. 10.4.3 Archive interaction# Archive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested."},{"route":"/developers/specification/11-links/","title":"11. Links","description":"This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects and blocked_by.uid. Alignment with Obsidian a...","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:11-links.md","namespace":"specification","relativePath":"11-links.md","raw":"# 11. Links\n\n## 11.1 Purpose\n\nThis section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily `projects` and `blocked_by.uid`.\nAlignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section.\n\nApplicability:\n\n- Implementations claiming profile `extended` (§7.3.5) MUST conform to this section for supported link-bearing roles.\n- Implementations claiming profile `materialized-occurrences` (§7.3.4) MUST conform to this section for `recurrence_parent` links, but are not required to support unrelated extended link-bearing roles solely because of that profile.\n- Implementations that claim neither `extended` nor `materialized-occurrences` MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior.\n\n---\n\n## 11.2 Link formats\n\nImplementations that conform to §11 (see §11.1 applicability) MUST support three link formats.\n\n### 11.2.1 Wikilinks\n\n```\n[[target]]\n[[target|alias]]\n[[target#anchor]]\n[[target#anchor|alias]]\n[[folder/target]]\n[[./relative]]\n[[../parent/target]]\n```\n\n**Components:**\n- **target**: The file being linked to (without extension by default)\n- **alias**: Display text; does not affect resolution\n- **anchor**: A heading or block reference within the target\n- **path**: May be absolute (from collection root) or relative (from current file)\n\nExamples in frontmatter:\n\n```yaml\nprojects:\n - \"[[home-project]]\"\n - \"[[projects/alpha|Alpha Project]]\"\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n```\n\n### 11.2.2 Markdown links\n\n```\n[text](path.md)\n[text](./relative.md)\n[text](../other/file.md)\n[text](path.md#anchor)\n```\n\nThe text portion is treated as an alias and does not affect resolution.\n\nMarkdown links in frontmatter require the `obsidian-frontmatter-markdown-links` Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless `links.use_markdown_format=true` is configured (§11.7).\n\n### 11.2.3 Bare paths\n\n```\n./sibling.md\n../other/file.md\nfolder/file.md\n```\n\nBare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with `/`).\n\n---\n\n## 11.3 Link parsing\n\nWhen a link value is read, implementations MUST parse it into a structured representation:\n\n| Component | Type | Description |\n|---|---|---|\n| `raw` | string | Original string value exactly as written |\n| `target` | string | File path or identifier (without anchor or alias) |\n| `alias` | string? | Display text if provided, otherwise null |\n| `anchor` | string? | Heading or block reference if provided, otherwise null |\n| `format` | enum | One of: `wikilink`, `markdown`, `path` |\n| `is_relative` | boolean | Whether target begins with `./` or `../` |\n\nParsing examples:\n\n| Input | target | alias | anchor | format | is_relative |\n|---|---|---|---|---|---|\n| `[[task-001]]` | `task-001` | null | null | wikilink | false |\n| `[[task-001\\|My Task]]` | `task-001` | `My Task` | null | wikilink | false |\n| `[[docs/api#auth]]` | `docs/api` | null | `auth` | wikilink | false |\n| `[[./sibling]]` | `./sibling` | null | null | wikilink | true |\n| `[Link](file.md)` | `file.md` | `Link` | null | markdown | false |\n| `./other.md` | `./other.md` | null | null | path | true |\n\n---\n\n## 11.4 Resolution algorithm\n\nResolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file.\n\nGiven a parsed link and the path of the source file containing it:\n\n### Step 1: Parse the link into components (target, format, is_relative)\n\n### Step 2: Route by format\n\n**If format is `markdown` or `path`:**\n- If target starts with `/`, resolve from collection root (strip the leading `/`)\n- Otherwise, resolve relative to the source file's directory (standard markdown behavior)\n- Example: link `[Docs](docs/api.md)` in `notes/meeting.md` resolves to `notes/docs/api.md`\n\n**If format is `wikilink`:**\n- If target starts with `./` or `../`, resolve relative to the source file's directory\n- If target starts with `/`, resolve from collection root (strip the leading `/`)\n- If target contains `/` (and is not relative), resolve from collection root\n - Example: `[[docs/api]]` resolves to `docs/api`\n- If simple name (no `/`, no `./` or `../`): proceed to Step 3\n\n### Step 3: Simple-name resolution (wikilinks only)\n\nFor simple wikilink names (no path separator):\n\n1. **Define the search scope:**\n - For `blocked_by.uid`: scope to files matching `task_detection` (task files only)\n - For `projects`: scope to all markdown files in the collection unless narrowed by explicit configuration\n\n2. **ID match pass:** search scoped files for semantic role `id` (§2.6.5) equal to the name.\n - Implementations MAY treat literal frontmatter key `id` as compatibility input when semantic mapping for `id` is unavailable.\n - Equality MUST be exact string equality.\n - If exactly one match: resolve to that file\n - If multiple matches: fail with `ambiguous_link`\n\n3. **Filename match pass:** if no ID match, search scoped markdown files by filename (without extension).\n4. Implementations MUST deduplicate normalized candidate paths before final selection.\n5. If exactly one filename candidate remains after normalization and extension handling, resolve to that file.\n6. If multiple filename candidates remain, resolve to `null` and emit `ambiguous_link`. Callers SHOULD use a path-qualified or relative target to disambiguate.\n\n### Step 4: Extension handling\n\nIf the target has no extension, implementations SHOULD try configured extensions in order.\n\nDefault extension order: `[\".md\"]`.\n\nExample: `[[readme]]` tries `readme.md`, `readme.mdx`, etc.\n\n### Step 5: Path traversal check\n\nAfter resolution and normalization, if the resolved path would escape the collection root, abort with `path_traversal`. See §11.5.\n\n### Step 6: Return result\n\n- The normalized collection-relative path if found\n- `null` if no matching file exists\n\n### Resolution examples\n\nGiven collection structure:\n```\n/\n├── TaskNotes/\n│ ├── Tasks/\n│ │ ├── task-001.md\n│ │ └── subtasks/\n│ │ └── task-002.md\n├── notes/\n│ └── meeting.md\n└── projects/\n └── alpha.md\n```\n\nResolution from `TaskNotes/Tasks/subtasks/task-002.md`:\n\n| Link value | Resolved path | Notes |\n|---|---|---|\n| `[[task-001]]` | `TaskNotes/Tasks/task-001.md` | Simple-name search |\n| `[[../task-001]]` | `TaskNotes/Tasks/task-001.md` | Relative wikilink |\n| `[[./task-003]]` | `TaskNotes/Tasks/subtasks/task-003.md` | Relative (may not exist) |\n| `[[notes/meeting]]` | `notes/meeting.md` | Absolute from root |\n| `[[alpha]]` | `projects/alpha.md` | Simple-name search (projects scope) |\n| `[link](../task-001.md)` | `TaskNotes/Tasks/task-001.md` | Markdown, relative |\n| `../task-001.md` | `TaskNotes/Tasks/task-001.md` | Bare path, relative |\n\n---\n\n## 11.5 Path sandboxing\n\nLink resolution MUST NOT produce paths outside the collection root.\n\n**Rules:**\n- After resolving relative paths (applying `../` segments), the resulting path MUST be within the collection root directory\n- If resolution would escape the collection root, the link MUST resolve to `null` and implementations MUST emit a `path_traversal` error\n- This applies to all link formats: wikilinks, markdown links, and bare paths\n- Implementations MUST normalize paths (resolve `.` and `..` segments) before checking containment\n\n**Examples** (collection rooted at `/home/user/MyVault/`):\n\n| Link | From file | Result |\n|---|---|---|\n| `[[../../../etc/passwd]]` | `TaskNotes/Tasks/task.md` | `null` + `path_traversal` |\n| `[[../../secrets/key]]` | `deep/nested/file.md` | `null` + `path_traversal` |\n| `[[../task-001]]` | `TaskNotes/Tasks/subtasks/t.md` | Resolves normally |\n\n---\n\n## 11.6 Canonical write format\n\nWhen creating new link values or changing a link target, implementations MUST use a deterministic canonical form.\n\n### Default (wikilink format)\n\nBy default (`links.use_markdown_format=false`), the canonical write format is a **simple wikilink**:\n\n```yaml\nblockedBy:\n - uid: \"[[task-001]]\"\n reltype: FINISHTOSTART\nprojects:\n - \"[[projects/alpha]]\"\n```\n\nRules:\n- Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope.\n- Use a path-qualified target (`folder/name`) when the simple name would be ambiguous.\n- Do NOT include the alias component in dependency `uid` writes.\n- Do NOT include the anchor component in dependency `uid` writes.\n- Preserve the alias component in `projects` entries when the alias was provided by the user.\n\n### Markdown link format (`links.use_markdown_format=true`)\n\nWhen `links.use_markdown_format=true` is configured (requires the `obsidian-frontmatter-markdown-links` Obsidian plugin), the canonical write format for link-bearing fields is a **markdown link** using the collection-relative path:\n\n```yaml\nblockedBy:\n - uid: \"[task-001](TaskNotes/Tasks/task-001.md)\"\n reltype: FINISHTOSTART\n```\n\n### Round-trip preservation\n\nWhen writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible:\n- If the user wrote `[[task-001|My Task]]`, preserve alias for `projects` entries.\n- If the user wrote a relative path, preserve relativity when possible.\n- For `blocked_by.uid`, alias and anchor components MUST still be removed on canonical writes.\n- If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section.\n\n---\n\n## 11.7 Configuration\n\n`links` configuration keys (see §9.12):\n\n```yaml\nlinks:\n extensions: [\".md\"] # Extension trial order for extensionless targets\n use_markdown_format: false # Write markdown links instead of wikilinks\n unresolved_default_severity: warning # \"warning\" or \"error\"\n update_references_on_rename: true # Update link targets when files are renamed\n```\n\nRules:\n- `extensions` MUST be a non-empty list when present\n- `unresolved_default_severity` MUST be `\"warning\"` or `\"error\"`\n- `update_references_on_rename=true` enables rename-time link rewrite behavior (§11.9)\n- `use_markdown_format=true` requires the `obsidian-frontmatter-markdown-links` plugin in Obsidian deployments\n\n---\n\n## 11.8 Role-specific rules\n\n### 11.8.1 `projects`\n\n`projects` entries SHOULD be interpreted with this section's parsing/resolution rules.\n\nIf a `projects` entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution.\n\nIf unresolved:\n- `links.unresolved_default_severity=error`: validation error\n- otherwise: SHOULD emit `unresolved_link_target` warning\n\n### 11.8.2 `blocked_by.uid`\n\n`blocked_by.uid` values MUST use this section's parsing/resolution rules.\n\nFor dependency semantics, unresolved `uid` handling follows §10.2.6.\nFor unresolved-target severity, `dependencies.unresolved_target_severity` controls and takes precedence over `links.unresolved_default_severity`.\n\nThe canonical write form for `uid` values is specified in §11.6.\n\n---\n\n## 11.9 Rename and reference updates\n\nIf an implementation supports reference updates on rename (i.e. claims the `rename` capability):\n\n1. It MUST update resolvable references in `blocked_by.uid` and `projects` link fields.\n2. It SHOULD update links in body content.\n3. It SHOULD preserve the original link format when possible.\n4. It MUST preserve alias and anchor components where valid for the target field. For `blocked_by.uid`, alias and anchor are non-canonical and MUST be removed on write (§11.6).\n5. It MUST report unresolved or ambiguous rewrite cases.\n\nIf reference updates are not supported, this limitation MUST be disclosed in conformance claims.\n\n---\n\n## 11.10 Validation\n\nLink validation issues:\n\n| Code | Severity | Trigger |\n|---|---|---|\n| `invalid_link_format` | error | Link value cannot be parsed as any supported format |\n| `ambiguous_link` | warning | Simple-name resolution found multiple candidates after normalization |\n| `unresolved_link_target` | warning | Link target cannot be resolved to an existing file |\n| `path_traversal` | error | Resolved path escapes collection root |\n\n`unresolved_link_target` severity may be promoted to error via `links.unresolved_default_severity=error`.\nFor `blocked_by.uid`, use `unresolved_dependency_target` severity policy from §10.2.6 instead of `unresolved_link_target`.\n\n---\n\n## 11.11 Examples\n\n### Dependency with wikilink (default)\n\n```yaml\n---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n - uid: \"[[design-api]]\"\n reltype: FINISHTOSTART\n - uid: \"[[projects/infra/setup-server]]\"\n reltype: FINISHTOSTART\n gap: P1D\nprojects:\n - \"[[projects/alpha]]\"\ndateCreated: 2026-02-20T10:00:00Z\ndateModified: 2026-02-20T10:00:00Z\n---\n```\n\n### Dependency with markdown links (`links.use_markdown_format=true`)\n\n```yaml\n---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n - uid: \"[design-api](TaskNotes/Tasks/design-api.md)\"\n reltype: FINISHTOSTART\n---\n```\n\n### Relative links from nested task\n\n```yaml\n# TaskNotes/Tasks/subtasks/task-002.md\n---\ntitle: Sub-task\nstatus: open\ntags: [task]\nblockedBy:\n - uid: \"[[../task-001]]\" # resolves to TaskNotes/Tasks/task-001.md\n reltype: FINISHTOSTART\nprojects:\n - \"[[projects/alpha]]\" # resolves from collection root\n---\n```\n","aliases":["/spec/11-links/"],"toc":[{"level":2,"id":"111-purpose","text":"11.1 Purpose"},{"level":2,"id":"112-link-formats","text":"11.2 Link formats"},{"level":3,"id":"1121-wikilinks","text":"11.2.1 Wikilinks"},{"level":3,"id":"1122-markdown-links","text":"11.2.2 Markdown links"},{"level":3,"id":"1123-bare-paths","text":"11.2.3 Bare paths"},{"level":2,"id":"113-link-parsing","text":"11.3 Link parsing"},{"level":2,"id":"114-resolution-algorithm","text":"11.4 Resolution algorithm"},{"level":3,"id":"step-1-parse-the-link-into-components-target-format-isrelative","text":"Step 1: Parse the link into components (target, format, is_relative)"},{"level":3,"id":"step-2-route-by-format","text":"Step 2: Route by format"},{"level":3,"id":"step-3-simple-name-resolution-wikilinks-only","text":"Step 3: Simple-name resolution (wikilinks only)"},{"level":3,"id":"step-4-extension-handling","text":"Step 4: Extension handling"},{"level":3,"id":"step-5-path-traversal-check","text":"Step 5: Path traversal check"},{"level":3,"id":"step-6-return-result","text":"Step 6: Return result"},{"level":3,"id":"resolution-examples","text":"Resolution examples"},{"level":2,"id":"115-path-sandboxing","text":"11.5 Path sandboxing"},{"level":2,"id":"116-canonical-write-format","text":"11.6 Canonical write format"},{"level":3,"id":"default-wikilink-format","text":"Default (wikilink format)"},{"level":3,"id":"markdown-link-format-linksusemarkdownformattrue","text":"Markdown link format (links.use_markdown_format=true)"},{"level":3,"id":"round-trip-preservation","text":"Round-trip preservation"},{"level":2,"id":"117-configuration","text":"11.7 Configuration"},{"level":2,"id":"118-role-specific-rules","text":"11.8 Role-specific rules"},{"level":3,"id":"1181-projects","text":"11.8.1 projects"},{"level":3,"id":"1182-blockedbyuid","text":"11.8.2 blocked_by.uid"},{"level":2,"id":"119-rename-and-reference-updates","text":"11.9 Rename and reference updates"},{"level":2,"id":"1110-validation","text":"11.10 Validation"},{"level":2,"id":"1111-examples","text":"11.11 Examples"},{"level":3,"id":"dependency-with-wikilink-default","text":"Dependency with wikilink (default)"},{"level":3,"id":"dependency-with-markdown-links-linksusemarkdownformattrue","text":"Dependency with markdown links (links.use_markdown_format=true)"},{"level":3,"id":"relative-links-from-nested-task","text":"Relative links from nested task"}],"html":"

11.1 Purpose#

\n

This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects and blocked_by.uid.\nAlignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section.

\n

Applicability:

\n
    \n
  • Implementations claiming profile extended (§7.3.5) MUST conform to this section for supported link-bearing roles.
  • \n
  • Implementations claiming profile materialized-occurrences (§7.3.4) MUST conform to this section for recurrence_parent links, but are not required to support unrelated extended link-bearing roles solely because of that profile.
  • \n
  • Implementations that claim neither extended nor materialized-occurrences MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior.
  • \n
\n
\n\n

Implementations that conform to §11 (see §11.1 applicability) MUST support three link formats.

\n

11.2.1 Wikilinks#

\n
[[target]]\n[[target|alias]]\n[[target#anchor]]\n[[target#anchor|alias]]\n[[folder/target]]\n[[./relative]]\n[[../parent/target]]\n

Components:

\n
    \n
  • target: The file being linked to (without extension by default)
  • \n
  • alias: Display text; does not affect resolution
  • \n
  • anchor: A heading or block reference within the target
  • \n
  • path: May be absolute (from collection root) or relative (from current file)
  • \n
\n

Examples in frontmatter:

\n
projects:\n  - "[[home-project]]"\n  - "[[projects/alpha|Alpha Project]]"\nblockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n

11.2.2 Markdown links#

\n
[text](path.md)\n[text](./relative.md)\n[text](../other/file.md)\n[text](path.md#anchor)\n

The text portion is treated as an alias and does not affect resolution.

\n

Markdown links in frontmatter require the obsidian-frontmatter-markdown-links Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless links.use_markdown_format=true is configured (§11.7).

\n

11.2.3 Bare paths#

\n
./sibling.md\n../other/file.md\nfolder/file.md\n

Bare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with /).

\n
\n\n

When a link value is read, implementations MUST parse it into a structured representation:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ComponentTypeDescription
rawstringOriginal string value exactly as written
targetstringFile path or identifier (without anchor or alias)
aliasstring?Display text if provided, otherwise null
anchorstring?Heading or block reference if provided, otherwise null
formatenumOne of: wikilink, markdown, path
is_relativebooleanWhether target begins with ./ or ../
\n

Parsing examples:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Inputtargetaliasanchorformatis_relative
[[task-001]]task-001nullnullwikilinkfalse
[[task-001|My Task]]task-001My Tasknullwikilinkfalse
[[docs/api#auth]]docs/apinullauthwikilinkfalse
[[./sibling]]./siblingnullnullwikilinktrue
[Link](file.md)file.mdLinknullmarkdownfalse
./other.md./other.mdnullnullpathtrue
\n
\n

11.4 Resolution algorithm#

\n

Resolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file.

\n

Given a parsed link and the path of the source file containing it:

\n\n

Step 2: Route by format#

\n

If format is markdown or path:

\n
    \n
  • If target starts with /, resolve from collection root (strip the leading /)
  • \n
  • Otherwise, resolve relative to the source file's directory (standard markdown behavior)
  • \n
  • Example: link [Docs](docs/api.md) in notes/meeting.md resolves to notes/docs/api.md
  • \n
\n

If format is wikilink:

\n
    \n
  • If target starts with ./ or ../, resolve relative to the source file's directory
  • \n
  • If target starts with /, resolve from collection root (strip the leading /)
  • \n
  • If target contains / (and is not relative), resolve from collection root
      \n
    • Example: [[docs/api]] resolves to docs/api
    • \n
    \n
  • \n
  • If simple name (no /, no ./ or ../): proceed to Step 3
  • \n
\n\n

For simple wikilink names (no path separator):

\n
    \n
  1. Define the search scope:

    \n
      \n
    • For blocked_by.uid: scope to files matching task_detection (task files only)
    • \n
    • For projects: scope to all markdown files in the collection unless narrowed by explicit configuration
    • \n
    \n
  2. \n
  3. ID match pass: search scoped files for semantic role id (§2.6.5) equal to the name.

    \n
      \n
    • Implementations MAY treat literal frontmatter key id as compatibility input when semantic mapping for id is unavailable.
    • \n
    • Equality MUST be exact string equality.
    • \n
    • If exactly one match: resolve to that file
    • \n
    • If multiple matches: fail with ambiguous_link
    • \n
    \n
  4. \n
  5. Filename match pass: if no ID match, search scoped markdown files by filename (without extension).

    \n
  6. \n
  7. Implementations MUST deduplicate normalized candidate paths before final selection.

    \n
  8. \n
  9. If exactly one filename candidate remains after normalization and extension handling, resolve to that file.

    \n
  10. \n
  11. If multiple filename candidates remain, resolve to null and emit ambiguous_link. Callers SHOULD use a path-qualified or relative target to disambiguate.

    \n
  12. \n
\n

Step 4: Extension handling#

\n

If the target has no extension, implementations SHOULD try configured extensions in order.

\n

Default extension order: [".md"].

\n

Example: [[readme]] tries readme.md, readme.mdx, etc.

\n

Step 5: Path traversal check#

\n

After resolution and normalization, if the resolved path would escape the collection root, abort with path_traversal. See §11.5.

\n

Step 6: Return result#

\n
    \n
  • The normalized collection-relative path if found
  • \n
  • null if no matching file exists
  • \n
\n

Resolution examples#

\n

Given collection structure:

\n
/\n├── TaskNotes/\n│   ├── Tasks/\n│   │   ├── task-001.md\n│   │   └── subtasks/\n│   │       └── task-002.md\n├── notes/\n│   └── meeting.md\n└── projects/\n    └── alpha.md\n

Resolution from TaskNotes/Tasks/subtasks/task-002.md:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Link valueResolved pathNotes
[[task-001]]TaskNotes/Tasks/task-001.mdSimple-name search
[[../task-001]]TaskNotes/Tasks/task-001.mdRelative wikilink
[[./task-003]]TaskNotes/Tasks/subtasks/task-003.mdRelative (may not exist)
[[notes/meeting]]notes/meeting.mdAbsolute from root
[[alpha]]projects/alpha.mdSimple-name search (projects scope)
[link](../task-001.md)TaskNotes/Tasks/task-001.mdMarkdown, relative
../task-001.mdTaskNotes/Tasks/task-001.mdBare path, relative
\n
\n

11.5 Path sandboxing#

\n

Link resolution MUST NOT produce paths outside the collection root.

\n

Rules:

\n
    \n
  • After resolving relative paths (applying ../ segments), the resulting path MUST be within the collection root directory
  • \n
  • If resolution would escape the collection root, the link MUST resolve to null and implementations MUST emit a path_traversal error
  • \n
  • This applies to all link formats: wikilinks, markdown links, and bare paths
  • \n
  • Implementations MUST normalize paths (resolve . and .. segments) before checking containment
  • \n
\n

Examples (collection rooted at /home/user/MyVault/):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LinkFrom fileResult
[[../../../etc/passwd]]TaskNotes/Tasks/task.mdnull + path_traversal
[[../../secrets/key]]deep/nested/file.mdnull + path_traversal
[[../task-001]]TaskNotes/Tasks/subtasks/t.mdResolves normally
\n
\n

11.6 Canonical write format#

\n

When creating new link values or changing a link target, implementations MUST use a deterministic canonical form.

\n\n

By default (links.use_markdown_format=false), the canonical write format is a simple wikilink:

\n
blockedBy:\n  - uid: "[[task-001]]"\n    reltype: FINISHTOSTART\nprojects:\n  - "[[projects/alpha]]"\n

Rules:

\n
    \n
  • Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope.
  • \n
  • Use a path-qualified target (folder/name) when the simple name would be ambiguous.
  • \n
  • Do NOT include the alias component in dependency uid writes.
  • \n
  • Do NOT include the anchor component in dependency uid writes.
  • \n
  • Preserve the alias component in projects entries when the alias was provided by the user.
  • \n
\n\n

When links.use_markdown_format=true is configured (requires the obsidian-frontmatter-markdown-links Obsidian plugin), the canonical write format for link-bearing fields is a markdown link using the collection-relative path:

\n
blockedBy:\n  - uid: "[task-001](TaskNotes/Tasks/task-001.md)"\n    reltype: FINISHTOSTART\n

Round-trip preservation#

\n

When writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible:

\n
    \n
  • If the user wrote [[task-001|My Task]], preserve alias for projects entries.
  • \n
  • If the user wrote a relative path, preserve relativity when possible.
  • \n
  • For blocked_by.uid, alias and anchor components MUST still be removed on canonical writes.
  • \n
  • If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section.
  • \n
\n
\n

11.7 Configuration#

\n

links configuration keys (see §9.12):

\n
links:\n  extensions: [".md"]                  # Extension trial order for extensionless targets\n  use_markdown_format: false           # Write markdown links instead of wikilinks\n  unresolved_default_severity: warning # "warning" or "error"\n  update_references_on_rename: true    # Update link targets when files are renamed\n

Rules:

\n
    \n
  • extensions MUST be a non-empty list when present
  • \n
  • unresolved_default_severity MUST be "warning" or "error"
  • \n
  • update_references_on_rename=true enables rename-time link rewrite behavior (§11.9)
  • \n
  • use_markdown_format=true requires the obsidian-frontmatter-markdown-links plugin in Obsidian deployments
  • \n
\n
\n

11.8 Role-specific rules#

\n

11.8.1 projects#

\n

projects entries SHOULD be interpreted with this section's parsing/resolution rules.

\n

If a projects entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution.

\n

If unresolved:

\n
    \n
  • links.unresolved_default_severity=error: validation error
  • \n
  • otherwise: SHOULD emit unresolved_link_target warning
  • \n
\n

11.8.2 blocked_by.uid#

\n

blocked_by.uid values MUST use this section's parsing/resolution rules.

\n

For dependency semantics, unresolved uid handling follows §10.2.6.\nFor unresolved-target severity, dependencies.unresolved_target_severity controls and takes precedence over links.unresolved_default_severity.

\n

The canonical write form for uid values is specified in §11.6.

\n
\n

11.9 Rename and reference updates#

\n

If an implementation supports reference updates on rename (i.e. claims the rename capability):

\n
    \n
  1. It MUST update resolvable references in blocked_by.uid and projects link fields.
  2. \n
  3. It SHOULD update links in body content.
  4. \n
  5. It SHOULD preserve the original link format when possible.
  6. \n
  7. It MUST preserve alias and anchor components where valid for the target field. For blocked_by.uid, alias and anchor are non-canonical and MUST be removed on write (§11.6).
  8. \n
  9. It MUST report unresolved or ambiguous rewrite cases.
  10. \n
\n

If reference updates are not supported, this limitation MUST be disclosed in conformance claims.

\n
\n

11.10 Validation#

\n

Link validation issues:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CodeSeverityTrigger
invalid_link_formaterrorLink value cannot be parsed as any supported format
ambiguous_linkwarningSimple-name resolution found multiple candidates after normalization
unresolved_link_targetwarningLink target cannot be resolved to an existing file
path_traversalerrorResolved path escapes collection root
\n

unresolved_link_target severity may be promoted to error via links.unresolved_default_severity=error.\nFor blocked_by.uid, use unresolved_dependency_target severity policy from §10.2.6 instead of unresolved_link_target.

\n
\n

11.11 Examples#

\n\n
---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n  - uid: "[[design-api]]"\n    reltype: FINISHTOSTART\n  - uid: "[[projects/infra/setup-server]]"\n    reltype: FINISHTOSTART\n    gap: P1D\nprojects:\n  - "[[projects/alpha]]"\ndateCreated: 2026-02-20T10:00:00Z\ndateModified: 2026-02-20T10:00:00Z\n---\n
\n
---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n  - uid: "[design-api](TaskNotes/Tasks/design-api.md)"\n    reltype: FINISHTOSTART\n---\n
\n
# TaskNotes/Tasks/subtasks/task-002.md\n---\ntitle: Sub-task\nstatus: open\ntags: [task]\nblockedBy:\n  - uid: "[[../task-001]]"    # resolves to TaskNotes/Tasks/task-001.md\n    reltype: FINISHTOSTART\nprojects:\n  - "[[projects/alpha]]"      # resolves from collection root\n---\n
","text":"11.1 Purpose# This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects and blocked_by.uid. Alignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section. Applicability: Implementations claiming profile extended (§7.3.5) MUST conform to this section for supported link-bearing roles. Implementations claiming profile materialized-occurrences (§7.3.4) MUST conform to this section for recurrence_parent links, but are not required to support unrelated extended link-bearing roles solely because of that profile. Implementations that claim neither extended nor materialized-occurrences MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior. 11.2 Link formats# Implementations that conform to §11 (see §11.1 applicability) MUST support three link formats. 11.2.1 Wikilinks# [[target]] [[target|alias]] [[target#anchor]] [[target#anchor|alias]] [[folder/target]] [[./relative]] [[../parent/target]] Components: target: The file being linked to (without extension by default) alias: Display text; does not affect resolution anchor: A heading or block reference within the target path: May be absolute (from collection root) or relative (from current file) Examples in frontmatter: projects: - \"[[home-project]]\" - \"[[projects/alpha|Alpha Project]]\" blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART 11.2.2 Markdown links# [text](path.md) [text](./relative.md) [text](../other/file.md) [text](path.md#anchor) The text portion is treated as an alias and does not affect resolution. Markdown links in frontmatter require the obsidian-frontmatter-markdown-links Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless links.use_markdown_format=true is configured (§11.7). 11.2.3 Bare paths# ./sibling.md ../other/file.md folder/file.md Bare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with /). 11.3 Link parsing# When a link value is read, implementations MUST parse it into a structured representation: Component Type Description raw string Original string value exactly as written target string File path or identifier (without anchor or alias) alias string? Display text if provided, otherwise null anchor string? Heading or block reference if provided, otherwise null format enum One of: wikilink, markdown, path is_relative boolean Whether target begins with ./ or ../ Parsing examples: Input target alias anchor format is_relative [[task-001]] task-001 null null wikilink false [[task-001|My Task]] task-001 My Task null wikilink false [[docs/api#auth]] docs/api null auth wikilink false [[./sibling]] ./sibling null null wikilink true [Link](file.md) file.md Link null markdown false ./other.md ./other.md null null path true 11.4 Resolution algorithm# Resolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file. Given a parsed link and the path of the source file containing it: Step 1: Parse the link into components (target, format, is_relative)# Step 2: Route by format# If format is markdown or path: If target starts with /, resolve from collection root (strip the leading /) Otherwise, resolve relative to the source file's directory (standard markdown behavior) Example: link [Docs](docs/api.md) in notes/meeting.md resolves to notes/docs/api.md If format is wikilink: If target starts with ./ or ../, resolve relative to the source file's directory If target starts with /, resolve from collection root (strip the leading /) If target contains / (and is not relative), resolve from collection root Example: [[docs/api]] resolves to docs/api If simple name (no /, no ./ or ../): proceed to Step 3 Step 3: Simple-name resolution (wikilinks only)# For simple wikilink names (no path separator): Define the search scope: For blocked_by.uid: scope to files matching task_detection (task files only) For projects: scope to all markdown files in the collection unless narrowed by explicit configuration ID match pass: search scoped files for semantic role id (§2.6.5) equal to the name. Implementations MAY treat literal frontmatter key id as compatibility input when semantic mapping for id is unavailable. Equality MUST be exact string equality. If exactly one match: resolve to that file If multiple matches: fail with ambiguous_link Filename match pass: if no ID match, search scoped markdown files by filename (without extension). Implementations MUST deduplicate normalized candidate paths before final selection. If exactly one filename candidate remains after normalization and extension handling, resolve to that file. If multiple filename candidates remain, resolve to null and emit ambiguous_link. Callers SHOULD use a path-qualified or relative target to disambiguate. Step 4: Extension handling# If the target has no extension, implementations SHOULD try configured extensions in order. Default extension order: [\".md\"]. Example: [[readme]] tries readme.md, readme.mdx, etc. Step 5: Path traversal check# After resolution and normalization, if the resolved path would escape the collection root, abort with path_traversal. See §11.5. Step 6: Return result# The normalized collection-relative path if found null if no matching file exists Resolution examples# Given collection structure: / ├── TaskNotes/ │ ├── Tasks/ │ │ ├── task-001.md │ │ └── subtasks/ │ │ └── task-002.md ├── notes/ │ └── meeting.md └── projects/ └── alpha.md Resolution from TaskNotes/Tasks/subtasks/task-002.md: Link value Resolved path Notes [[task-001]] TaskNotes/Tasks/task-001.md Simple-name search [[../task-001]] TaskNotes/Tasks/task-001.md Relative wikilink [[./task-003]] TaskNotes/Tasks/subtasks/task-003.md Relative (may not exist) [[notes/meeting]] notes/meeting.md Absolute from root [[alpha]] projects/alpha.md Simple-name search (projects scope) [link](../task-001.md) TaskNotes/Tasks/task-001.md Markdown, relative ../task-001.md TaskNotes/Tasks/task-001.md Bare path, relative 11.5 Path sandboxing# Link resolution MUST NOT produce paths outside the collection root. Rules: After resolving relative paths (applying ../ segments), the resulting path MUST be within the collection root directory If resolution would escape the collection root, the link MUST resolve to null and implementations MUST emit a path_traversal error This applies to all link formats: wikilinks, markdown links, and bare paths Implementations MUST normalize paths (resolve . and .. segments) before checking containment Examples (collection rooted at /home/user/MyVault/): Link From file Result [[../../../etc/passwd]] TaskNotes/Tasks/task.md null + path_traversal [[../../secrets/key]] deep/nested/file.md null + path_traversal [[../task-001]] TaskNotes/Tasks/subtasks/t.md Resolves normally 11.6 Canonical write format# When creating new link values or changing a link target, implementations MUST use a deterministic canonical form. Default (wikilink format)# By default (links.use_markdown_format=false), the canonical write format is a simple wikilink: blockedBy: - uid: \"[[task-001]]\" reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" Rules: Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope. Use a path-qualified target (folder/name) when the simple name would be ambiguous. Do NOT include the alias component in dependency uid writes. Do NOT include the anchor component in dependency uid writes. Preserve the alias component in projects entries when the alias was provided by the user. Markdown link format (links.use_markdown_format=true)# When links.use_markdown_format=true is configured (requires the obsidian-frontmatter-markdown-links Obsidian plugin), the canonical write format for link-bearing fields is a markdown link using the collection-relative path: blockedBy: - uid: \"[task-001](TaskNotes/Tasks/task-001.md)\" reltype: FINISHTOSTART Round-trip preservation# When writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible: If the user wrote [[task-001|My Task]], preserve alias for projects entries. If the user wrote a relative path, preserve relativity when possible. For blocked_by.uid, alias and anchor components MUST still be removed on canonical writes. If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section. 11.7 Configuration# links configuration keys (see §9.12): links: extensions: [\".md\"] # Extension trial order for extensionless targets use_markdown_format: false # Write markdown links instead of wikilinks unresolved_default_severity: warning # \"warning\" or \"error\" update_references_on_rename: true # Update link targets when files are renamed Rules: extensions MUST be a non-empty list when present unresolved_default_severity MUST be \"warning\" or \"error\" update_references_on_rename=true enables rename-time link rewrite behavior (§11.9) use_markdown_format=true requires the obsidian-frontmatter-markdown-links plugin in Obsidian deployments 11.8 Role-specific rules# 11.8.1 projects# projects entries SHOULD be interpreted with this section's parsing/resolution rules. If a projects entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution. If unresolved: links.unresolved_default_severity=error: validation error otherwise: SHOULD emit unresolved_link_target warning 11.8.2 blocked_by.uid# blocked_by.uid values MUST use this section's parsing/resolution rules. For dependency semantics, unresolved uid handling follows §10.2.6. For unresolved-target severity, dependencies.unresolved_target_severity controls and takes precedence over links.unresolved_default_severity. The canonical write form for uid values is specified in §11.6. 11.9 Rename and reference updates# If an implementation supports reference updates on rename (i.e. claims the rename capability): It MUST update resolvable references in blocked_by.uid and projects link fields. It SHOULD update links in body content. It SHOULD preserve the original link format when possible. It MUST preserve alias and anchor components where valid for the target field. For blocked_by.uid, alias and anchor are non-canonical and MUST be removed on write (§11.6). It MUST report unresolved or ambiguous rewrite cases. If reference updates are not supported, this limitation MUST be disclosed in conformance claims. 11.10 Validation# Link validation issues: Code Severity Trigger invalid_link_format error Link value cannot be parsed as any supported format ambiguous_link warning Simple-name resolution found multiple candidates after normalization unresolved_link_target warning Link target cannot be resolved to an existing file path_traversal error Resolved path escapes collection root unresolved_link_target severity may be promoted to error via links.unresolved_default_severity=error. For blocked_by.uid, use unresolved_dependency_target severity policy from §10.2.6 instead of unresolved_link_target. 11.11 Examples# Dependency with wikilink (default)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[[design-api]]\" reltype: FINISHTOSTART - uid: \"[[projects/infra/setup-server]]\" reltype: FINISHTOSTART gap: P1D projects: - \"[[projects/alpha]]\" dateCreated: 2026-02-20T10:00:00Z dateModified: 2026-02-20T10:00:00Z --- Dependency with markdown links (links.use_markdown_format=true)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[design-api](TaskNotes/Tasks/design-api.md)\" reltype: FINISHTOSTART --- Relative links from nested task# # TaskNotes/Tasks/subtasks/task-002.md --- title: Sub-task status: open tags: [task] blockedBy: - uid: \"[[../task-001]]\" # resolves to TaskNotes/Tasks/task-001.md reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" # resolves from collection root ---"},{"route":"/developers/specification/12-mdbase-v0.3-binding/","title":"12. mdbase v0.3 Data-Contract Binding","description":"Status: Draft","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:12-mdbase-v0.3-binding.md","namespace":"specification","relativePath":"12-mdbase-v0.3-binding.md","raw":"# 12. mdbase v0.3 Data-Contract Binding\n\n**Status:** Draft\n\n**Record contract:** `tasknotes.task` `0.3.0-rc.1`\n\n**Event contract:** `tasknotes.task.completed` `1.0.0`\n\n**Target:** mdbase `0.3.x`\n\n## 12.1 Purpose\n\nThis chapter defines how a TaskNotes task model is exposed through mdbase\nwithout coupling TaskNotes to one record type or one application's private\nextension.\n\nThe binding has three deliberately separate parts:\n\n1. the `tasknotes.task` data contract defines the portable task view;\n2. an mdbase type's `implements` entry maps that view to its own frontmatter\n fields and supplies TaskNotes behavior; and\n3. the rest of the type file continues to define that type's storage,\n matching, defaults, lifecycle, links, and paths.\n\nThe normative artifacts are:\n\n- [`mdbase/tasknotes.task.md`](mdbase/tasknotes.task.md), the record contract;\n- [`schemas/tasknotes-task.schema.json`](schemas/tasknotes-task.schema.json),\n the projected task-view schema; and\n- [`schemas/tasknotes-task-binding.schema.json`](schemas/tasknotes-task-binding.schema.json),\n the implementation binding schema.\n\nThe optional event-interoperability artifacts are:\n\n- [`mdbase/tasknotes.task.completed.md`](mdbase/tasknotes.task.completed.md),\n the event contract; and\n- [`schemas/tasknotes-task-completed.schema.json`](schemas/tasknotes-task-completed.schema.json),\n its event-data schema.\n\n## 12.2 The mental model\n\nA contract is not another record type. It is a view that several record types\ncan implement and several applications can consume.\n\n```text\npersonal_task ─┐\nwork_task ─────┼─ implements tasknotes.task 0.3.0-rc.1 ── TaskNotes\nissue_task ────┘ ├─ automation\n └─ another task app\n```\n\nReading or listing through the contract uses the union of all implementing\ntypes. Creating a task is different: the caller MUST choose one exact target\ntype because the contract does not choose storage, paths, or lifecycle policy.\n\nThe contract version is an exact semantic version. For this draft it is also\nthe tasknotes-spec version whose task semantics the contract exposes. There is\nno independent `x-tasknotes.version` or `spec_version` mirror.\n\nRecord types use `implements` because they adapt persisted fields and semantic\nbindings to the `tasknotes.task` record contract. Event sources do not use a\ntype file. A TaskNotes application instead registers an event-source\ndeclaration for `tasknotes.task.completed` with an active mdbase\ninteroperability bridge.\n\n## 12.3 Layering\n\nAn implementing type MUST keep these responsibilities in their canonical\nlocations:\n\n| Information | mdbase v0.3 location |\n|---|---|\n| Persisted frontmatter shape, required fields, enum values, formats | `schema` |\n| Type identification | `match` |\n| Display field, defaults, links, uniqueness, and path generation | `collection` |\n| Managed create/update values | `lifecycle` |\n| Contract identity and custom field names | `implements[].contract`, `version`, and `fields` |\n| TaskNotes semantic behavior | `implements[].binding` |\n\nTaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords.\n`x-tasknotes` MUST NOT be used for contract discovery, field mapping,\nconformance, or authorization.\n\n## 12.4 Declaring an implementation\n\nAn mdbase TaskNotes type declares one implementation:\n\n```yaml\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.1\n fields:\n title: summary\n status: state\n priority: importance\n dateCreated: created_at\n binding:\n # TaskNotes behavior; abbreviated here\n profiles: [core-lite]\n capabilities: []\n title:\n storage: frontmatter\n filename_format: title\n status:\n values: [todo, doing, done]\n default: todo\n completed_values: [done]\n definitions: []\n priority:\n values: [normal]\n default: normal\n definitions: []\n```\n\nThe contract file identified by the exact `contract` and `version` MUST exist\nin the collection contract registry. The `binding` MUST validate against that\ncontract's `binding_schema`.\n\nEach type MUST declare at most one implementation of one exact contract\nidentity. A type may implement several different contracts.\n\n## 12.5 Portable fields\n\n`fields` maps contract field paths to record field paths. Consumers access\ncontract fields and MUST NOT assume that their names are also frontmatter\nproperty names.\n\n```yaml\nfields:\n title: summary\n status: state\n blockedBy: dependencies\n```\n\nEvery unconditionally required contract field MUST be mapped. Every mapped\ncontract field and record field MUST exist in its respective JSON Schema.\n\nThe contract view contains only mapped fields. It does not expose unmapped\nfrontmatter or the Markdown body. A consumer that requires either needs\nseparate, explicit whole-record access.\n\n`title` is optional in the portable schema because TaskNotes permits filename\ntitle storage. When `binding.title.storage` is `filename`, consumers derive\nthe effective title from the record identity/path rules in §9.13 instead of\nexpecting a projected frontmatter value.\n\nThe camel-case contract field names are stable portable identifiers. Their\nsnake-case tasknotes-spec counterparts include:\n\n| Contract field | tasknotes-spec role |\n|---|---|\n| `timeEstimate` | `time_estimate` |\n| `completedDate` | `completed_date` |\n| `dateCreated` | `date_created` |\n| `dateModified` | `date_modified` |\n| `recurrenceAnchor` | `recurrence_anchor` |\n| `completeInstances` | `complete_instances` |\n| `skippedInstances` | `skipped_instances` |\n| `recurrenceParent` | `recurrence_parent` |\n| `occurrenceDate` | `occurrence_date` |\n| `occurrenceMaterialization` | `occurrence_materialization` |\n| `occurrenceNextTrigger` | `occurrence_next_trigger` |\n| `occurrenceTemplate` | `occurrence_template` |\n| `occurrencePastHorizon` | `occurrence_past_horizon` |\n| `occurrenceFutureHorizon` | `occurrence_future_horizon` |\n| `timeEntries` | `time_entries` |\n| `blockedBy` | `blocked_by` |\n\n## 12.6 Semantic profiles and capabilities\n\n`binding.profiles` and `binding.capabilities` describe semantics that records\nof this implementation may use:\n\n```yaml\nbinding:\n profiles: [core-lite, recurrence, materialized-occurrences]\n capabilities:\n - dependencies\n - reminders\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n```\n\nThese are properties of the implementation, not claims that every consuming\napplication supports them. Before mutating a governed field, a consumer SHOULD\nverify its own corresponding capability. It may still perform unrelated\noperations when it preserves unsupported fields and invariants.\n\n## 12.7 Status and priority semantics\n\nThe implementing type schema defines the legal persisted values of the mapped\nfields. The binding gives those values TaskNotes meaning:\n\n```yaml\nbinding:\n status:\n values: [todo, doing, done, cancelled]\n default: todo\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n definitions: []\n priority:\n values: [low, normal, high]\n default: normal\n definitions: []\n```\n\nThe following consistency rules apply:\n\n- binding values MUST equal the mapped type-schema enum values;\n- defaults MUST equal mapped `collection.read_defaults` values when present;\n- completed and skipped values MUST be members of `status.values`;\n- `default_skipped` MUST be a skipped value;\n- completed and skipped values MUST NOT overlap for materialized occurrences;\n and\n- definition semantics MUST agree with completed/skipped membership.\n\nStatus and priority labels, colors, and icons are presentation hints. Status\ncycle, completion, skipping, auto-archive, and priority weight are semantic.\n\n## 12.8 Title, recurrence, links, and operations\n\nThe remaining binding sections project the effective TaskNotes behavior\ndefined elsewhere in this specification:\n\n- `title` follows §9.13 and MUST agree with `collection.display` and\n `collection.path`;\n- `recurrence` follows §4;\n- `occurrences` follows §2.6.6, §4.18, §5.20, and §9.17;\n- `links` follows §11;\n- `archive` follows §5.12;\n- `time_tracking` follows §5.19 and §9.16;\n- `templating` follows §5.3.5 and §9.14; and\n- optional `nlp` triggers follow §9.18.\n\nArchive always operates on the portable `tags` contract field, so the binding\ndoes not repeat a record-specific `tags_field`. The implementation's `fields`\nmap determines the actual frontmatter property.\n\nApplication-local notification preferences and generator bookkeeping MUST NOT\nbe placed in the binding.\n\n## 12.9 Multiple implementations\n\nA collection may contain any number of types implementing\n`tasknotes.task 0.3.0-rc.1`. TaskNotes-aware readers MUST:\n\n1. resolve the exact local contract;\n2. enumerate every implementation in canonical type-name order;\n3. read each matching record through that implementation's projected view;\n4. validate the projected view; and\n5. retain the concrete type identity for updates.\n\nImplementations MUST NOT merge type schemas into one synthetic schema. A record\nis validated by its concrete type and then by its projected contract view.\n\nWhen an approval, cache, or external protocol pins an implementation set, it\nMUST pin the exact contract digest and sorted implementation descriptors,\nincluding each implementation digest. A newly installed type is therefore not\nsilently added to an existing approval.\n\nCreation MUST name one concrete implementing type. If no type is selected,\ncreation fails as ambiguous.\n\n## 12.10 Task-completed event\n\nAn event source that claims `tasknotes.task.completed 1.0.0` MUST emit one\nCloudEvents structured event for each observed transition from a\nnon-completed status to a completed status. Its `data` contains only:\n\n- `task_id`, using the stable TaskNotes ID when present and otherwise the\n normalized path;\n- `task_path`;\n- the current `title` and completed `status`; and\n- `completed_at`, the instant when TaskNotes observed the transition.\n\nThe event source MUST use the mdbase event/action interoperability profile\n`0.1`, pin the exact event-contract digest, and preserve any correlation and\ncausation identifiers supplied by the mutation context. It MUST NOT include a\ncomplete task record merely because one is locally available. An authorized\nconsumer can retrieve current state separately, avoiding stale snapshots and\nunnecessary disclosure.\n\nContract compatibility and bridge authorization are independent. Installing\nTaskNotes or resolving this contract does not grant permission to publish or\nconsume the event.\n\n## 12.11 Precedence and consistency\n\nThe complete implementation is self-describing:\n\n1. the contract schema is authoritative for the portable projected view;\n2. the type schema is authoritative for persisted value shapes;\n3. `collection` is authoritative for generic mdbase behavior;\n4. `lifecycle` is authoritative for generic managed writes; and\n5. `implements[].binding` is authoritative for TaskNotes semantics.\n\nWhere values intentionally mirror each other, producers MUST keep them equal.\nA TaskNotes-aware consumer MUST report a configuration error instead of\nsilently choosing between contradictory values.\n\n## 12.12 Safe writes\n\nTaskNotes-aware consumers MUST preserve:\n\n- unknown frontmatter properties unless explicit replacement or migration was\n requested;\n- Markdown body content unless an operation explicitly replaces it;\n- fields governed by unsupported capabilities; and\n- unrelated type metadata and implementations.\n\nGeneric mdbase operations are safe only when they preserve the same data.\nCompletion, recurrence mutation, occurrence materialization, dependency\nupdates, time tracking, archive, and other domain operations MUST follow the\nTaskNotes semantics referenced by the binding.\n\n## 12.13 Complete custom-field example\n\n```yaml\n---\nkind: mdbase.type\nname: work_task\nversion: 1\nschema:\n dialect: json-schema-2020-12\n value:\n type: object\n additionalProperties: true\n required: [summary, state, created_at]\n properties:\n summary: { type: string, minLength: 1 }\n state: { enum: [todo, doing, done, cancelled] }\n importance: { enum: [low, normal, high] }\n created_at: { type: string, format: date-time }\n tags:\n type: array\n items: { type: string }\ncollection:\n display:\n name_field: summary\n read_defaults:\n state: todo\n importance: normal\nlifecycle:\n on_create:\n set:\n created_at: { now: true }\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.1\n fields:\n title: summary\n status: state\n priority: importance\n dateCreated: created_at\n tags: tags\n binding:\n profiles: [core-lite]\n capabilities: [archive]\n title:\n storage: frontmatter\n filename_format: title\n status:\n values: [todo, doing, done, cancelled]\n default: todo\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n definitions: []\n priority:\n values: [low, normal, high]\n default: normal\n definitions: []\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: false\n reset_body_checkboxes: false\n occurrences:\n identity_roles: [recurrenceParent, occurrenceDate]\n default_materialization: manual\n default_next_trigger: completion\n links:\n accepted_formats: [wikilink, markdown]\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: true\n templating:\n enabled: false\n occurrence_enabled: false\n---\n```\n","aliases":["/spec/12-mdbase-v0.3-binding/"],"toc":[{"level":2,"id":"121-purpose","text":"12.1 Purpose"},{"level":2,"id":"122-the-mental-model","text":"12.2 The mental model"},{"level":2,"id":"123-layering","text":"12.3 Layering"},{"level":2,"id":"124-declaring-an-implementation","text":"12.4 Declaring an implementation"},{"level":2,"id":"125-portable-fields","text":"12.5 Portable fields"},{"level":2,"id":"126-semantic-profiles-and-capabilities","text":"12.6 Semantic profiles and capabilities"},{"level":2,"id":"127-status-and-priority-semantics","text":"12.7 Status and priority semantics"},{"level":2,"id":"128-title-recurrence-links-and-operations","text":"12.8 Title, recurrence, links, and operations"},{"level":2,"id":"129-multiple-implementations","text":"12.9 Multiple implementations"},{"level":2,"id":"1210-task-completed-event","text":"12.10 Task-completed event"},{"level":2,"id":"1211-precedence-and-consistency","text":"12.11 Precedence and consistency"},{"level":2,"id":"1212-safe-writes","text":"12.12 Safe writes"},{"level":2,"id":"1213-complete-custom-field-example","text":"12.13 Complete custom-field example"}],"html":"

Status: Draft

\n

Record contract: tasknotes.task 0.3.0-rc.1

\n

Event contract: tasknotes.task.completed 1.0.0

\n

Target: mdbase 0.3.x

\n

12.1 Purpose#

\n

This chapter defines how a TaskNotes task model is exposed through mdbase\nwithout coupling TaskNotes to one record type or one application's private\nextension.

\n

The binding has three deliberately separate parts:

\n
    \n
  1. the tasknotes.task data contract defines the portable task view;
  2. \n
  3. an mdbase type's implements entry maps that view to its own frontmatter\nfields and supplies TaskNotes behavior; and
  4. \n
  5. the rest of the type file continues to define that type's storage,\nmatching, defaults, lifecycle, links, and paths.
  6. \n
\n

The normative artifacts are:

\n\n

The optional event-interoperability artifacts are:

\n\n

12.2 The mental model#

\n

A contract is not another record type. It is a view that several record types\ncan implement and several applications can consume.

\n
personal_task ─┐\nwork_task ─────┼─ implements tasknotes.task 0.3.0-rc.1 ── TaskNotes\nissue_task ────┘                                  ├─ automation\n                                                  └─ another task app\n

Reading or listing through the contract uses the union of all implementing\ntypes. Creating a task is different: the caller MUST choose one exact target\ntype because the contract does not choose storage, paths, or lifecycle policy.

\n

The contract version is an exact semantic version. For this draft it is also\nthe tasknotes-spec version whose task semantics the contract exposes. There is\nno independent x-tasknotes.version or spec_version mirror.

\n

Record types use implements because they adapt persisted fields and semantic\nbindings to the tasknotes.task record contract. Event sources do not use a\ntype file. A TaskNotes application instead registers an event-source\ndeclaration for tasknotes.task.completed with an active mdbase\ninteroperability bridge.

\n

12.3 Layering#

\n

An implementing type MUST keep these responsibilities in their canonical\nlocations:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Informationmdbase v0.3 location
Persisted frontmatter shape, required fields, enum values, formatsschema
Type identificationmatch
Display field, defaults, links, uniqueness, and path generationcollection
Managed create/update valueslifecycle
Contract identity and custom field namesimplements[].contract, version, and fields
TaskNotes semantic behaviorimplements[].binding
\n

TaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords.\nx-tasknotes MUST NOT be used for contract discovery, field mapping,\nconformance, or authorization.

\n

12.4 Declaring an implementation#

\n

An mdbase TaskNotes type declares one implementation:

\n
implements:\n  - contract: tasknotes.task\n    version: 0.3.0-rc.1\n    fields:\n      title: summary\n      status: state\n      priority: importance\n      dateCreated: created_at\n    binding:\n      # TaskNotes behavior; abbreviated here\n      profiles: [core-lite]\n      capabilities: []\n      title:\n        storage: frontmatter\n        filename_format: title\n      status:\n        values: [todo, doing, done]\n        default: todo\n        completed_values: [done]\n        definitions: []\n      priority:\n        values: [normal]\n        default: normal\n        definitions: []\n

The contract file identified by the exact contract and version MUST exist\nin the collection contract registry. The binding MUST validate against that\ncontract's binding_schema.

\n

Each type MUST declare at most one implementation of one exact contract\nidentity. A type may implement several different contracts.

\n

12.5 Portable fields#

\n

fields maps contract field paths to record field paths. Consumers access\ncontract fields and MUST NOT assume that their names are also frontmatter\nproperty names.

\n
fields:\n  title: summary\n  status: state\n  blockedBy: dependencies\n

Every unconditionally required contract field MUST be mapped. Every mapped\ncontract field and record field MUST exist in its respective JSON Schema.

\n

The contract view contains only mapped fields. It does not expose unmapped\nfrontmatter or the Markdown body. A consumer that requires either needs\nseparate, explicit whole-record access.

\n

title is optional in the portable schema because TaskNotes permits filename\ntitle storage. When binding.title.storage is filename, consumers derive\nthe effective title from the record identity/path rules in §9.13 instead of\nexpecting a projected frontmatter value.

\n

The camel-case contract field names are stable portable identifiers. Their\nsnake-case tasknotes-spec counterparts include:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Contract fieldtasknotes-spec role
timeEstimatetime_estimate
completedDatecompleted_date
dateCreateddate_created
dateModifieddate_modified
recurrenceAnchorrecurrence_anchor
completeInstancescomplete_instances
skippedInstancesskipped_instances
recurrenceParentrecurrence_parent
occurrenceDateoccurrence_date
occurrenceMaterializationoccurrence_materialization
occurrenceNextTriggeroccurrence_next_trigger
occurrenceTemplateoccurrence_template
occurrencePastHorizonoccurrence_past_horizon
occurrenceFutureHorizonoccurrence_future_horizon
timeEntriestime_entries
blockedByblocked_by
\n

12.6 Semantic profiles and capabilities#

\n

binding.profiles and binding.capabilities describe semantics that records\nof this implementation may use:

\n
binding:\n  profiles: [core-lite, recurrence, materialized-occurrences]\n  capabilities:\n    - dependencies\n    - reminders\n    - links\n    - time-tracking\n    - materialized-occurrences\n    - archive\n

These are properties of the implementation, not claims that every consuming\napplication supports them. Before mutating a governed field, a consumer SHOULD\nverify its own corresponding capability. It may still perform unrelated\noperations when it preserves unsupported fields and invariants.

\n

12.7 Status and priority semantics#

\n

The implementing type schema defines the legal persisted values of the mapped\nfields. The binding gives those values TaskNotes meaning:

\n
binding:\n  status:\n    values: [todo, doing, done, cancelled]\n    default: todo\n    completed_values: [done]\n    skipped_values: [cancelled]\n    default_skipped: cancelled\n    definitions: []\n  priority:\n    values: [low, normal, high]\n    default: normal\n    definitions: []\n

The following consistency rules apply:

\n
    \n
  • binding values MUST equal the mapped type-schema enum values;
  • \n
  • defaults MUST equal mapped collection.read_defaults values when present;
  • \n
  • completed and skipped values MUST be members of status.values;
  • \n
  • default_skipped MUST be a skipped value;
  • \n
  • completed and skipped values MUST NOT overlap for materialized occurrences;\nand
  • \n
  • definition semantics MUST agree with completed/skipped membership.
  • \n
\n

Status and priority labels, colors, and icons are presentation hints. Status\ncycle, completion, skipping, auto-archive, and priority weight are semantic.

\n\n

The remaining binding sections project the effective TaskNotes behavior\ndefined elsewhere in this specification:

\n
    \n
  • title follows §9.13 and MUST agree with collection.display and\ncollection.path;
  • \n
  • recurrence follows §4;
  • \n
  • occurrences follows §2.6.6, §4.18, §5.20, and §9.17;
  • \n
  • links follows §11;
  • \n
  • archive follows §5.12;
  • \n
  • time_tracking follows §5.19 and §9.16;
  • \n
  • templating follows §5.3.5 and §9.14; and
  • \n
  • optional nlp triggers follow §9.18.
  • \n
\n

Archive always operates on the portable tags contract field, so the binding\ndoes not repeat a record-specific tags_field. The implementation's fields\nmap determines the actual frontmatter property.

\n

Application-local notification preferences and generator bookkeeping MUST NOT\nbe placed in the binding.

\n

12.9 Multiple implementations#

\n

A collection may contain any number of types implementing\ntasknotes.task 0.3.0-rc.1. TaskNotes-aware readers MUST:

\n
    \n
  1. resolve the exact local contract;
  2. \n
  3. enumerate every implementation in canonical type-name order;
  4. \n
  5. read each matching record through that implementation's projected view;
  6. \n
  7. validate the projected view; and
  8. \n
  9. retain the concrete type identity for updates.
  10. \n
\n

Implementations MUST NOT merge type schemas into one synthetic schema. A record\nis validated by its concrete type and then by its projected contract view.

\n

When an approval, cache, or external protocol pins an implementation set, it\nMUST pin the exact contract digest and sorted implementation descriptors,\nincluding each implementation digest. A newly installed type is therefore not\nsilently added to an existing approval.

\n

Creation MUST name one concrete implementing type. If no type is selected,\ncreation fails as ambiguous.

\n

12.10 Task-completed event#

\n

An event source that claims tasknotes.task.completed 1.0.0 MUST emit one\nCloudEvents structured event for each observed transition from a\nnon-completed status to a completed status. Its data contains only:

\n
    \n
  • task_id, using the stable TaskNotes ID when present and otherwise the\nnormalized path;
  • \n
  • task_path;
  • \n
  • the current title and completed status; and
  • \n
  • completed_at, the instant when TaskNotes observed the transition.
  • \n
\n

The event source MUST use the mdbase event/action interoperability profile\n0.1, pin the exact event-contract digest, and preserve any correlation and\ncausation identifiers supplied by the mutation context. It MUST NOT include a\ncomplete task record merely because one is locally available. An authorized\nconsumer can retrieve current state separately, avoiding stale snapshots and\nunnecessary disclosure.

\n

Contract compatibility and bridge authorization are independent. Installing\nTaskNotes or resolving this contract does not grant permission to publish or\nconsume the event.

\n

12.11 Precedence and consistency#

\n

The complete implementation is self-describing:

\n
    \n
  1. the contract schema is authoritative for the portable projected view;
  2. \n
  3. the type schema is authoritative for persisted value shapes;
  4. \n
  5. collection is authoritative for generic mdbase behavior;
  6. \n
  7. lifecycle is authoritative for generic managed writes; and
  8. \n
  9. implements[].binding is authoritative for TaskNotes semantics.
  10. \n
\n

Where values intentionally mirror each other, producers MUST keep them equal.\nA TaskNotes-aware consumer MUST report a configuration error instead of\nsilently choosing between contradictory values.

\n

12.12 Safe writes#

\n

TaskNotes-aware consumers MUST preserve:

\n
    \n
  • unknown frontmatter properties unless explicit replacement or migration was\nrequested;
  • \n
  • Markdown body content unless an operation explicitly replaces it;
  • \n
  • fields governed by unsupported capabilities; and
  • \n
  • unrelated type metadata and implementations.
  • \n
\n

Generic mdbase operations are safe only when they preserve the same data.\nCompletion, recurrence mutation, occurrence materialization, dependency\nupdates, time tracking, archive, and other domain operations MUST follow the\nTaskNotes semantics referenced by the binding.

\n

12.13 Complete custom-field example#

\n
---\nkind: mdbase.type\nname: work_task\nversion: 1\nschema:\n  dialect: json-schema-2020-12\n  value:\n    type: object\n    additionalProperties: true\n    required: [summary, state, created_at]\n    properties:\n      summary: { type: string, minLength: 1 }\n      state: { enum: [todo, doing, done, cancelled] }\n      importance: { enum: [low, normal, high] }\n      created_at: { type: string, format: date-time }\n      tags:\n        type: array\n        items: { type: string }\ncollection:\n  display:\n    name_field: summary\n  read_defaults:\n    state: todo\n    importance: normal\nlifecycle:\n  on_create:\n    set:\n      created_at: { now: true }\nimplements:\n  - contract: tasknotes.task\n    version: 0.3.0-rc.1\n    fields:\n      title: summary\n      status: state\n      priority: importance\n      dateCreated: created_at\n      tags: tags\n    binding:\n      profiles: [core-lite]\n      capabilities: [archive]\n      title:\n        storage: frontmatter\n        filename_format: title\n      status:\n        values: [todo, doing, done, cancelled]\n        default: todo\n        completed_values: [done]\n        skipped_values: [cancelled]\n        default_skipped: cancelled\n        definitions: []\n      priority:\n        values: [low, normal, high]\n        default: normal\n        definitions: []\n      recurrence:\n        syntax: tasknotes\n        maintain_due_date_offset: false\n        reset_body_checkboxes: false\n      occurrences:\n        identity_roles: [recurrenceParent, occurrenceDate]\n        default_materialization: manual\n        default_next_trigger: completion\n      links:\n        accepted_formats: [wikilink, markdown]\n        write_format: wikilink\n      archive:\n        archived_tag: archived\n        move_on_archive: false\n      time_tracking:\n        auto_stop_on_complete: true\n      templating:\n        enabled: false\n        occurrence_enabled: false\n---\n
","text":"Status: Draft Record contract: tasknotes.task 0.3.0-rc.1 Event contract: tasknotes.task.completed 1.0.0 Target: mdbase 0.3.x 12.1 Purpose# This chapter defines how a TaskNotes task model is exposed through mdbase without coupling TaskNotes to one record type or one application's private extension. The binding has three deliberately separate parts: the tasknotes.task data contract defines the portable task view; an mdbase type's implements entry maps that view to its own frontmatter fields and supplies TaskNotes behavior; and the rest of the type file continues to define that type's storage, matching, defaults, lifecycle, links, and paths. The normative artifacts are: mdbase/tasknotes.task.md, the record contract; schemas/tasknotes-task.schema.json, the projected task-view schema; and schemas/tasknotes-task-binding.schema.json, the implementation binding schema. The optional event-interoperability artifacts are: mdbase/tasknotes.task.completed.md, the event contract; and schemas/tasknotes-task-completed.schema.json, its event-data schema. 12.2 The mental model# A contract is not another record type. It is a view that several record types can implement and several applications can consume. personal_task ─┐ work_task ─────┼─ implements tasknotes.task 0.3.0-rc.1 ── TaskNotes issue_task ────┘ ├─ automation └─ another task app Reading or listing through the contract uses the union of all implementing types. Creating a task is different: the caller MUST choose one exact target type because the contract does not choose storage, paths, or lifecycle policy. The contract version is an exact semantic version. For this draft it is also the tasknotes-spec version whose task semantics the contract exposes. There is no independent x-tasknotes.version or spec_version mirror. Record types use implements because they adapt persisted fields and semantic bindings to the tasknotes.task record contract. Event sources do not use a type file. A TaskNotes application instead registers an event-source declaration for tasknotes.task.completed with an active mdbase interoperability bridge. 12.3 Layering# An implementing type MUST keep these responsibilities in their canonical locations: Information mdbase v0.3 location Persisted frontmatter shape, required fields, enum values, formats schema Type identification match Display field, defaults, links, uniqueness, and path generation collection Managed create/update values lifecycle Contract identity and custom field names implements[].contract, version, and fields TaskNotes semantic behavior implements[].binding TaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords. x-tasknotes MUST NOT be used for contract discovery, field mapping, conformance, or authorization. 12.4 Declaring an implementation# An mdbase TaskNotes type declares one implementation: implements: - contract: tasknotes.task version: 0.3.0-rc.1 fields: title: summary status: state priority: importance dateCreated: created_at binding: # TaskNotes behavior; abbreviated here profiles: [core-lite] capabilities: [] title: storage: frontmatter filename_format: title status: values: [todo, doing, done] default: todo completed_values: [done] definitions: [] priority: values: [normal] default: normal definitions: [] The contract file identified by the exact contract and version MUST exist in the collection contract registry. The binding MUST validate against that contract's binding_schema. Each type MUST declare at most one implementation of one exact contract identity. A type may implement several different contracts. 12.5 Portable fields# fields maps contract field paths to record field paths. Consumers access contract fields and MUST NOT assume that their names are also frontmatter property names. fields: title: summary status: state blockedBy: dependencies Every unconditionally required contract field MUST be mapped. Every mapped contract field and record field MUST exist in its respective JSON Schema. The contract view contains only mapped fields. It does not expose unmapped frontmatter or the Markdown body. A consumer that requires either needs separate, explicit whole-record access. title is optional in the portable schema because TaskNotes permits filename title storage. When binding.title.storage is filename, consumers derive the effective title from the record identity/path rules in §9.13 instead of expecting a projected frontmatter value. The camel-case contract field names are stable portable identifiers. Their snake-case tasknotes-spec counterparts include: Contract field tasknotes-spec role timeEstimate time_estimate completedDate completed_date dateCreated date_created dateModified date_modified recurrenceAnchor recurrence_anchor completeInstances complete_instances skippedInstances skipped_instances recurrenceParent recurrence_parent occurrenceDate occurrence_date occurrenceMaterialization occurrence_materialization occurrenceNextTrigger occurrence_next_trigger occurrenceTemplate occurrence_template occurrencePastHorizon occurrence_past_horizon occurrenceFutureHorizon occurrence_future_horizon timeEntries time_entries blockedBy blocked_by 12.6 Semantic profiles and capabilities# binding.profiles and binding.capabilities describe semantics that records of this implementation may use: binding: profiles: [core-lite, recurrence, materialized-occurrences] capabilities: - dependencies - reminders - links - time-tracking - materialized-occurrences - archive These are properties of the implementation, not claims that every consuming application supports them. Before mutating a governed field, a consumer SHOULD verify its own corresponding capability. It may still perform unrelated operations when it preserves unsupported fields and invariants. 12.7 Status and priority semantics# The implementing type schema defines the legal persisted values of the mapped fields. The binding gives those values TaskNotes meaning: binding: status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] The following consistency rules apply: binding values MUST equal the mapped type-schema enum values; defaults MUST equal mapped collection.read_defaults values when present; completed and skipped values MUST be members of status.values; default_skipped MUST be a skipped value; completed and skipped values MUST NOT overlap for materialized occurrences; and definition semantics MUST agree with completed/skipped membership. Status and priority labels, colors, and icons are presentation hints. Status cycle, completion, skipping, auto-archive, and priority weight are semantic. 12.8 Title, recurrence, links, and operations# The remaining binding sections project the effective TaskNotes behavior defined elsewhere in this specification: title follows §9.13 and MUST agree with collection.display and collection.path; recurrence follows §4; occurrences follows §2.6.6, §4.18, §5.20, and §9.17; links follows §11; archive follows §5.12; time_tracking follows §5.19 and §9.16; templating follows §5.3.5 and §9.14; and optional nlp triggers follow §9.18. Archive always operates on the portable tags contract field, so the binding does not repeat a record-specific tags_field. The implementation's fields map determines the actual frontmatter property. Application-local notification preferences and generator bookkeeping MUST NOT be placed in the binding. 12.9 Multiple implementations# A collection may contain any number of types implementing tasknotes.task 0.3.0-rc.1. TaskNotes-aware readers MUST: resolve the exact local contract; enumerate every implementation in canonical type-name order; read each matching record through that implementation's projected view; validate the projected view; and retain the concrete type identity for updates. Implementations MUST NOT merge type schemas into one synthetic schema. A record is validated by its concrete type and then by its projected contract view. When an approval, cache, or external protocol pins an implementation set, it MUST pin the exact contract digest and sorted implementation descriptors, including each implementation digest. A newly installed type is therefore not silently added to an existing approval. Creation MUST name one concrete implementing type. If no type is selected, creation fails as ambiguous. 12.10 Task-completed event# An event source that claims tasknotes.task.completed 1.0.0 MUST emit one CloudEvents structured event for each observed transition from a non-completed status to a completed status. Its data contains only: task_id, using the stable TaskNotes ID when present and otherwise the normalized path; task_path; the current title and completed status; and completed_at, the instant when TaskNotes observed the transition. The event source MUST use the mdbase event/action interoperability profile 0.1, pin the exact event-contract digest, and preserve any correlation and causation identifiers supplied by the mutation context. It MUST NOT include a complete task record merely because one is locally available. An authorized consumer can retrieve current state separately, avoiding stale snapshots and unnecessary disclosure. Contract compatibility and bridge authorization are independent. Installing TaskNotes or resolving this contract does not grant permission to publish or consume the event. 12.11 Precedence and consistency# The complete implementation is self-describing: the contract schema is authoritative for the portable projected view; the type schema is authoritative for persisted value shapes; collection is authoritative for generic mdbase behavior; lifecycle is authoritative for generic managed writes; and implements[].binding is authoritative for TaskNotes semantics. Where values intentionally mirror each other, producers MUST keep them equal. A TaskNotes-aware consumer MUST report a configuration error instead of silently choosing between contradictory values. 12.12 Safe writes# TaskNotes-aware consumers MUST preserve: unknown frontmatter properties unless explicit replacement or migration was requested; Markdown body content unless an operation explicitly replaces it; fields governed by unsupported capabilities; and unrelated type metadata and implementations. Generic mdbase operations are safe only when they preserve the same data. Completion, recurrence mutation, occurrence materialization, dependency updates, time tracking, archive, and other domain operations MUST follow the TaskNotes semantics referenced by the binding. 12.13 Complete custom-field example# --- kind: mdbase.type name: work_task version: 1 schema: dialect: json-schema-2020-12 value: type: object additionalProperties: true required: [summary, state, created_at] properties: summary: { type: string, minLength: 1 } state: { enum: [todo, doing, done, cancelled] } importance: { enum: [low, normal, high] } created_at: { type: string, format: date-time } tags: type: array items: { type: string } collection: display: name_field: summary read_defaults: state: todo importance: normal lifecycle: on_create: set: created_at: { now: true } implements: - contract: tasknotes.task version: 0.3.0-rc.1 fields: title: summary status: state priority: importance dateCreated: created_at tags: tags binding: profiles: [core-lite] capabilities: [archive] title: storage: frontmatter filename_format: title status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] recurrence: syntax: tasknotes maintain_due_date_offset: false reset_body_checkboxes: false occurrences: identity_roles: [recurrenceParent, occurrenceDate] default_materialization: manual default_next_trigger: completion links: accepted_formats: [wikilink, markdown] write_format: wikilink archive: archived_tag: archived move_on_archive: false time_tracking: auto_stop_on_complete: true templating: enabled: false occurrence_enabled: false ---"},{"route":"/developers/specification/CHANGELOG/","title":"Changelog","description":"Initial standalone draft of tasknotes-spec including:","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:CHANGELOG.md","namespace":"specification","relativePath":"CHANGELOG.md","raw":"# Changelog\n\n## 0.3.0-rc.1 - 2026-07-28\n\n- adopt the discriminated first-class mdbase contract shape for\n `tasknotes.task`, including explicit `contract_type: record`\n- add the `tasknotes.task.completed 1.0.0` event contract and minimal\n privacy-preserving event-data schema for the mdbase interoperability profile\n- separate type-file record implementation bindings from application-level\n event-source declarations\n\n## 0.2.0-draft - 2026-05-31\n\n- add optional `materialized-occurrences` profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation\n- add optional NLP trigger configuration so TaskNotes clients can share capture\n suggestion vocabulary\n- replace the private `x-tasknotes` discovery envelope with the first-class\n `tasknotes.task 0.2.0` mdbase data contract, portable task-view schema, and\n implementation binding schema\n- document the precedence and consistency rules between JSON Schema,\n `collection`, `lifecycle`, contract field mappings, and TaskNotes behavior\n\n## 0.1.0-draft - 2026-02-20\n\nInitial standalone draft of `tasknotes-spec` including:\n\n- motivation, scope, and normative conventions\n- terminology\n- task model and field mapping\n- temporal semantics\n- recurrence semantics\n- operation semantics\n- validation model\n- conformance profiles\n- compatibility and migration policy\n- collection configuration schema and provider model (`tasknotes.yaml`, TaskNotes `data.json`)\n- full dependency (`blocked_by`) semantics\n- full reminder (`reminders`) semantics\n- explicit time-tracking management semantics (`time_entries` lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration)\n- explicit links chapter and link-resolution rules for projects/dependencies\n- optional `templating` conformance profile with create-time template expansion/merge semantics\n","aliases":["/spec/CHANGELOG/"],"toc":[{"level":2,"id":"030-rc1-2026-07-28","text":"0.3.0-rc.1 - 2026-07-28"},{"level":2,"id":"020-draft-2026-05-31","text":"0.2.0-draft - 2026-05-31"},{"level":2,"id":"010-draft-2026-02-20","text":"0.1.0-draft - 2026-02-20"}],"html":"

0.3.0-rc.1 - 2026-07-28#

\n
    \n
  • adopt the discriminated first-class mdbase contract shape for\ntasknotes.task, including explicit contract_type: record
  • \n
  • add the tasknotes.task.completed 1.0.0 event contract and minimal\nprivacy-preserving event-data schema for the mdbase interoperability profile
  • \n
  • separate type-file record implementation bindings from application-level\nevent-source declarations
  • \n
\n

0.2.0-draft - 2026-05-31#

\n
    \n
  • add optional materialized-occurrences profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation
  • \n
  • add optional NLP trigger configuration so TaskNotes clients can share capture\nsuggestion vocabulary
  • \n
  • replace the private x-tasknotes discovery envelope with the first-class\ntasknotes.task 0.2.0 mdbase data contract, portable task-view schema, and\nimplementation binding schema
  • \n
  • document the precedence and consistency rules between JSON Schema,\ncollection, lifecycle, contract field mappings, and TaskNotes behavior
  • \n
\n

0.1.0-draft - 2026-02-20#

\n

Initial standalone draft of tasknotes-spec including:

\n
    \n
  • motivation, scope, and normative conventions
  • \n
  • terminology
  • \n
  • task model and field mapping
  • \n
  • temporal semantics
  • \n
  • recurrence semantics
  • \n
  • operation semantics
  • \n
  • validation model
  • \n
  • conformance profiles
  • \n
  • compatibility and migration policy
  • \n
  • collection configuration schema and provider model (tasknotes.yaml, TaskNotes data.json)
  • \n
  • full dependency (blocked_by) semantics
  • \n
  • full reminder (reminders) semantics
  • \n
  • explicit time-tracking management semantics (time_entries lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration)
  • \n
  • explicit links chapter and link-resolution rules for projects/dependencies
  • \n
  • optional templating conformance profile with create-time template expansion/merge semantics
  • \n
\n","text":"0.3.0-rc.1 - 2026-07-28# adopt the discriminated first-class mdbase contract shape for tasknotes.task, including explicit contract_type: record add the tasknotes.task.completed 1.0.0 event contract and minimal privacy-preserving event-data schema for the mdbase interoperability profile separate type-file record implementation bindings from application-level event-source declarations 0.2.0-draft - 2026-05-31# add optional materialized-occurrences profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation add optional NLP trigger configuration so TaskNotes clients can share capture suggestion vocabulary replace the private x-tasknotes discovery envelope with the first-class tasknotes.task 0.2.0 mdbase data contract, portable task-view schema, and implementation binding schema document the precedence and consistency rules between JSON Schema, collection, lifecycle, contract field mappings, and TaskNotes behavior 0.1.0-draft - 2026-02-20# Initial standalone draft of tasknotes-spec including: motivation, scope, and normative conventions terminology task model and field mapping temporal semantics recurrence semantics operation semantics validation model conformance profiles compatibility and migration policy collection configuration schema and provider model (tasknotes.yaml, TaskNotes data.json) full dependency (blocked_by) semantics full reminder (reminders) semantics explicit time-tracking management semantics (time_entries lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration) explicit links chapter and link-resolution rules for projects/dependencies optional templating conformance profile with create-time template expansion/merge semantics"},{"route":"/obsidian/","title":"TaskNotes for Obsidian","description":"Install TaskNotes, create a first task, and open the default Obsidian Base views.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/index.md","namespace":"obsidian","relativePath":"index.md","raw":"---\ndescription: Install TaskNotes, create a first task, and open the default Obsidian Base views.\nhide:\n - toc\n---\n\n# TaskNotes for Obsidian\n\nThis guide covers the TaskNotes plugin for Obsidian. It follows the \"one note per task\" principle: each task is a Markdown file with structured metadata in YAML frontmatter.\n\n![Task List view](assets/views-tasks-list.png)\n\n## Requirements\n\nTaskNotes 4.11.1 requires **Obsidian 1.12.2** or later and depends on the **Bases** core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins.\n\n## Getting Started\n\n### 1. Install and Enable\n\nInstall TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly.\n\n### 2. Create Your First Task\n\nPress Ctrl+P (or Cmd+P on macOS), run **TaskNotes: Create new task**, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like `- [ ] Buy groceries` and convert it using the inline task command.\n\n![Create task modal](assets/modal-task-create.png)\n\n### 3. Open the Task List\n\nOpen your first view from the TaskNotes ribbon icon or by running **TaskNotes: Open tasks view** from the command palette. This opens the default Task List `.base` file inside `TaskNotes/Views`.\n\n### 4. Explore\n\nUse [Core Concepts](core-concepts.md) to understand the data model, [Features](features.md) for workflow capabilities, [Views](views.md) for interface behaviour, and [Settings](settings.md) to tune TaskNotes for your vault. If you already have task-like notes, start with [Adopt TaskNotes in an existing vault](getting-started/existing-vault.md).\n\n## Quick Links\n\n\n","aliases":[],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"getting-started","text":"Getting Started"},{"level":3,"id":"1-install-and-enable","text":"1. Install and Enable"},{"level":3,"id":"2-create-your-first-task","text":"2. Create Your First Task"},{"level":3,"id":"3-open-the-task-list","text":"3. Open the Task List"},{"level":3,"id":"4-explore","text":"4. Explore"},{"level":2,"id":"quick-links","text":"Quick Links"}],"html":"

This guide covers the TaskNotes plugin for Obsidian. It follows the "one note per task" principle: each task is a Markdown file with structured metadata in YAML frontmatter.

\n

\"Task

\n

Requirements#

\n

TaskNotes 4.11.1 requires Obsidian 1.12.2 or later and depends on the Bases core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins.

\n

Getting Started#

\n

1. Install and Enable#

\n

Install TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly.

\n

2. Create Your First Task#

\n

Press Ctrl+P (or Cmd+P on macOS), run TaskNotes: Create new task, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like - [ ] Buy groceries and convert it using the inline task command.

\n

\"Create

\n

3. Open the Task List#

\n

Open your first view from the TaskNotes ribbon icon or by running TaskNotes: Open tasks view from the command palette. This opens the default Task List .base file inside TaskNotes/Views.

\n

4. Explore#

\n

Use Core Concepts to understand the data model, Features for workflow capabilities, Views for interface behaviour, and Settings to tune TaskNotes for your vault. If you already have task-like notes, start with Adopt TaskNotes in an existing vault.

\n

Quick Links#

\n\n","text":"This guide covers the TaskNotes plugin for Obsidian. It follows the \"one note per task\" principle: each task is a Markdown file with structured metadata in YAML frontmatter. Requirements# TaskNotes 4.11.1 requires Obsidian 1.12.2 or later and depends on the Bases core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins. Getting Started# 1. Install and Enable# Install TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly. 2. Create Your First Task# Press Ctrl+P (or Cmd+P on macOS), run TaskNotes: Create new task, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like - [ ] Buy groceries and convert it using the inline task command. 3. Open the Task List# Open your first view from the TaskNotes ribbon icon or by running TaskNotes: Open tasks view from the command palette. This opens the default Task List .base file inside TaskNotes/Views. 4. Explore# Use Core Concepts to understand the data model, Features for workflow capabilities, Views for interface behaviour, and Settings to tune TaskNotes for your vault. If you already have task-like notes, start with Adopt TaskNotes in an existing vault. Quick Links# GitHub Repository Source code, issues, releases, and contribution discussions Task Management Status, priority, dates, reminders, and recurring tasks Inline Tasks Widgets, natural language parsing, and checkbox conversion Calendar Integration Google Calendar, Outlook, and ICS subscriptions HTTP API REST API for automation and external integrations JavaScript API In-process API for companion plugins and in-vault scripts Companion Plugins Optional plugins such as Canvas Bases and TaskNotes Workflows that build on TaskNotes Migration Guide Upgrading from TaskNotes v3 to v4 Troubleshooting Common issues and how to resolve them Command Reference Every registered command, generated from the plugin source Backup & Recovery Protect task notes, Base files, settings, and integration data Specification The formal spec behind TaskNotes: data model, operations, recurrence, and conformance"},{"route":"/obsidian/calendar-setup/","title":"Calendar Integration Setup","description":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/calendar-setup.md","namespace":"obsidian","relativePath":"calendar-setup.md","raw":"# Calendar Integration Setup\n\nTaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.\n\n## Setup (Your Own OAuth Credentials)\n\nTo connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider.\n\n![Integrations calendar settings](assets/settings-integrations-calendar.png)\n\n### Google Calendar\n\n\n\n*Video by [@antoneheyward](https://www.youtube.com/@antoneheyward)*\n\nIn [Google Cloud Console](https://console.cloud.google.com), create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (`Settings -> TaskNotes -> Integrations`) and click **Connect Google Calendar**.\n\nIf your Google OAuth app is still in testing mode, add the Google account you will connect with under **Google Auth Platform -> Audience -> Test users**. Otherwise Google may block sign-in with a 403 `access_denied` error saying the app has not completed verification.\n\n### Microsoft Calendar\n\nIn [Azure Portal](https://portal.azure.com), create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's `common` OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet.\n\nUnder **Authentication**, add the **Mobile and desktop applications** platform and add this redirect URI:\n\n```text\nhttp://localhost\n```\n\nAlso turn on **Allow public client flows**. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI.\n\nIf Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding:\n\n```json\n{\n \"url\": \"http://127.0.0.1\",\n \"type\": \"Web\"\n}\n```\n\nNext, add delegated Microsoft Graph API permissions (`Calendars.Read`, `Calendars.ReadWrite`, and `offline_access`) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click **Connect Microsoft Calendar**. The client secret field can be left blank for public-client desktop setup.\n\n## Security Notes\n\nOAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' `data.json`. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access.\n\nSecret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use **Forget saved credentials** if you also want to remove the client ID and client secret.\n\n## Troubleshooting\n\n**\"Failed to connect\"**\n\nVerify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on `127.0.0.1` with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted.\n\nFor Google 403 `access_denied` errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode.\n\n**\"Failed to fetch events\"**\n\nDisconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions.\n\n**Connection lost after Obsidian restart**\n\nTokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault.\n","aliases":["/calendar-setup/"],"toc":[{"level":2,"id":"setup-your-own-oauth-credentials","text":"Setup (Your Own OAuth Credentials)"},{"level":3,"id":"google-calendar","text":"Google Calendar"},{"level":3,"id":"microsoft-calendar","text":"Microsoft Calendar"},{"level":2,"id":"security-notes","text":"Security Notes"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"}],"html":"

TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.

\n

Setup (Your Own OAuth Credentials)#

\n

To connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider.

\n

\"Integrations

\n

Google Calendar#

\n\n\n

Video by @antoneheyward

\n

In Google Cloud Console, create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (Settings -> TaskNotes -> Integrations) and click Connect Google Calendar.

\n

If your Google OAuth app is still in testing mode, add the Google account you will connect with under Google Auth Platform -> Audience -> Test users. Otherwise Google may block sign-in with a 403 access_denied error saying the app has not completed verification.

\n

Microsoft Calendar#

\n

In Azure Portal, create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's common OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet.

\n

Under Authentication, add the Mobile and desktop applications platform and add this redirect URI:

\n
http://localhost\n

Also turn on Allow public client flows. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI.

\n

If Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding:

\n
{\n  "url": "http://127.0.0.1",\n  "type": "Web"\n}\n

Next, add delegated Microsoft Graph API permissions (Calendars.Read, Calendars.ReadWrite, and offline_access) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click Connect Microsoft Calendar. The client secret field can be left blank for public-client desktop setup.

\n

Security Notes#

\n

OAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' data.json. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access.

\n

Secret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use Forget saved credentials if you also want to remove the client ID and client secret.

\n

Troubleshooting#

\n

"Failed to connect"

\n

Verify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on 127.0.0.1 with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted.

\n

For Google 403 access_denied errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode.

\n

"Failed to fetch events"

\n

Disconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions.

\n

Connection lost after Obsidian restart

\n

Tokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault.

\n","text":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0. Setup (Your Own OAuth Credentials)# To connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider. Google Calendar# Video by @antoneheyward In Google Cloud Console, create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (Settings -> TaskNotes -> Integrations) and click Connect Google Calendar. If your Google OAuth app is still in testing mode, add the Google account you will connect with under Google Auth Platform -> Audience -> Test users. Otherwise Google may block sign-in with a 403 access_denied error saying the app has not completed verification. Microsoft Calendar# In Azure Portal, create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's common OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet. Under Authentication, add the Mobile and desktop applications platform and add this redirect URI: http://localhost Also turn on Allow public client flows. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI. If Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding: { \"url\": \"http://127.0.0.1\", \"type\": \"Web\" } Next, add delegated Microsoft Graph API permissions (Calendars.Read, Calendars.ReadWrite, and offline_access) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click Connect Microsoft Calendar. The client secret field can be left blank for public-client desktop setup. Security Notes# OAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' data.json. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access. Secret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use Forget saved credentials if you also want to remove the client ID and client secret. Troubleshooting# \"Failed to connect\" Verify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on 127.0.0.1 with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted. For Google 403 access_denied errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode. \"Failed to fetch events\" Disconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions. Connection lost after Obsidian restart Tokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault."},{"route":"/obsidian/companion-plugins/","title":"Companion Plugins","description":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/companion-plugins.md","namespace":"obsidian","relativePath":"companion-plugins.md","raw":"# Companion Plugins\n\nCompanion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files.\n\nUse companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior.\n\n## Available Companion Plugins\n\n| Plugin | Purpose | Documentation |\n| --- | --- | --- |\n| Canvas Bases | TaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges. | [Canvas Bases](companion-plugins/canvas-bases.md) |\n| TaskNotes Workflows | Markdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows. | [TaskNotes Workflows](companion-plugins/tasknotes-workflows.md) |\n\nMore companion plugins may be documented here over time.\n\n## How Companion Plugins Relate to TaskNotes\n\nTaskNotes remains the source of truth for task behavior. Companion plugins should use the [TaskNotes JavaScript Runtime API](javascript-api.md) for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes.\n\nCompanion plugins can also publish their own runtime surface through `api.extensions`. Other plugins and scripts can discover those extension APIs from TaskNotes:\n\n```js\nconst tasknotes = app.plugins.getPlugin(\"tasknotes\");\nconst workflows = tasknotes?.api?.extensions.get(\"tasknotes-workflows\");\n```\n\nThe extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools.\n\n## Choosing an Integration Surface\n\n| Use case | Prefer |\n| --- | --- |\n| A user-facing Obsidian UI that works with TaskNotes tasks | Companion plugin |\n| In-vault scripting with Templater, QuickAdd, MetaBind, or another plugin | [JavaScript Runtime API](javascript-api.md) |\n| Local tools outside Obsidian | [HTTP API](HTTP_API.md) or [TaskNotes Obsidian CLI](obsidian-cli.md) |\n| Notifications to external services when tasks change | [Webhooks](webhooks.md) |\n| Direct file analysis without Obsidian running | [mdbase-tasknotes CLI](mdbase-tasknotes-cli.md) |\n\n## Compatibility Expectations\n\nCompanion plugins should:\n\n- Check `api.apiVersion` and `api.hasCapability(...)` before using runtime features.\n- Use `api.catalog` and canonical runtime query DTOs from `api.query` instead of reaching into TaskNotes filter/view internals.\n- Include a `source` value when mutating tasks so TaskNotes events are debuggable.\n- Avoid reacting to their own mutations unless the behavior is explicit.\n- Keep user data in the vault where possible, using readable Markdown or JSON files.\n- Treat TaskNotes task notes and Bases files as user-owned documents.\n\nTaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work.\n","aliases":["/companion-plugins/"],"toc":[{"level":2,"id":"available-companion-plugins","text":"Available Companion Plugins"},{"level":2,"id":"how-companion-plugins-relate-to-tasknotes","text":"How Companion Plugins Relate to TaskNotes"},{"level":2,"id":"choosing-an-integration-surface","text":"Choosing an Integration Surface"},{"level":2,"id":"compatibility-expectations","text":"Compatibility Expectations"}],"html":"

Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files.

\n

Use companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior.

\n

Available Companion Plugins#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PluginPurposeDocumentation
Canvas BasesTaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges.Canvas Bases
TaskNotes WorkflowsMarkdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows.TaskNotes Workflows
\n

More companion plugins may be documented here over time.

\n

How Companion Plugins Relate to TaskNotes#

\n

TaskNotes remains the source of truth for task behavior. Companion plugins should use the TaskNotes JavaScript Runtime API for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes.

\n

Companion plugins can also publish their own runtime surface through api.extensions. Other plugins and scripts can discover those extension APIs from TaskNotes:

\n
const tasknotes = app.plugins.getPlugin("tasknotes");\nconst workflows = tasknotes?.api?.extensions.get("tasknotes-workflows");\n

The extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools.

\n

Choosing an Integration Surface#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Use casePrefer
A user-facing Obsidian UI that works with TaskNotes tasksCompanion plugin
In-vault scripting with Templater, QuickAdd, MetaBind, or another pluginJavaScript Runtime API
Local tools outside ObsidianHTTP API or TaskNotes Obsidian CLI
Notifications to external services when tasks changeWebhooks
Direct file analysis without Obsidian runningmdbase-tasknotes CLI
\n

Compatibility Expectations#

\n

Companion plugins should:

\n
    \n
  • Check api.apiVersion and api.hasCapability(...) before using runtime features.
  • \n
  • Use api.catalog and canonical runtime query DTOs from api.query instead of reaching into TaskNotes filter/view internals.
  • \n
  • Include a source value when mutating tasks so TaskNotes events are debuggable.
  • \n
  • Avoid reacting to their own mutations unless the behavior is explicit.
  • \n
  • Keep user data in the vault where possible, using readable Markdown or JSON files.
  • \n
  • Treat TaskNotes task notes and Bases files as user-owned documents.
  • \n
\n

TaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work.

\n","text":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files. Use companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior. Available Companion Plugins# Plugin Purpose Documentation Canvas Bases TaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges. Canvas Bases TaskNotes Workflows Markdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows. TaskNotes Workflows More companion plugins may be documented here over time. How Companion Plugins Relate to TaskNotes# TaskNotes remains the source of truth for task behavior. Companion plugins should use the TaskNotes JavaScript Runtime API for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes. Companion plugins can also publish their own runtime surface through api.extensions. Other plugins and scripts can discover those extension APIs from TaskNotes: const tasknotes = app.plugins.getPlugin(\"tasknotes\"); const workflows = tasknotes?.api?.extensions.get(\"tasknotes-workflows\"); The extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools. Choosing an Integration Surface# Use case Prefer A user-facing Obsidian UI that works with TaskNotes tasks Companion plugin In-vault scripting with Templater, QuickAdd, MetaBind, or another plugin JavaScript Runtime API Local tools outside Obsidian HTTP API or TaskNotes Obsidian CLI Notifications to external services when tasks change Webhooks Direct file analysis without Obsidian running mdbase-tasknotes CLI Compatibility Expectations# Companion plugins should: Check api.apiVersion and api.hasCapability(...) before using runtime features. Use api.catalog and canonical runtime query DTOs from api.query instead of reaching into TaskNotes filter/view internals. Include a source value when mutating tasks so TaskNotes events are debuggable. Avoid reacting to their own mutations unless the behavior is explicit. Keep user data in the vault where possible, using readable Markdown or JSON files. Treat TaskNotes task notes and Bases files as user-owned documents. TaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work."},{"route":"/obsidian/companion-plugins/canvas-bases/","title":"Canvas Bases","description":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layo...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/companion-plugins/canvas-bases.md","namespace":"obsidian","relativePath":"companion-plugins/canvas-bases.md","raw":"# Canvas Bases\n\nCanvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named **Canvas Bases** or as a generated JSON Canvas snapshot.\n\nCanvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the `.base` file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates.\n\n## Requirements\n\n- Obsidian 1.10.1 or newer.\n- The Obsidian Bases core plugin.\n- The Obsidian Canvas core plugin when opening or editing generated `.canvas` files.\n- TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions.\n\nIf TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability.\n\n## When to Use Canvas Bases\n\nUse Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set.\n\nCommon uses include:\n\n- Planning project tasks on a visual board.\n- Seeing dependencies or related notes as edges between cards.\n- Embedding a board in a daily note, project note, or meeting note.\n- Turning a filtered Base view into a reusable `.canvas` snapshot.\n- Grouping notes with Bases, then manually arranging the result.\n- Dropping cards into assignment zones to update a note property or run a supported TaskNotes action.\n\nIf the question is only \"which tasks should appear?\", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set.\n\n## Canvas Bases Layout\n\nAfter Canvas Bases is installed, open or create a `.base` file and add a view using the **Canvas Bases** layout.\n\nIn the live layout:\n\n- Each Base result row becomes a file card.\n- Displayed Base properties appear on each card in the same order as the Base properties menu.\n- Base groups become group frames.\n- Cards and group frames can be dragged and resized.\n- Ungrouped views place cards directly on the board.\n- The initial card order follows the Base sort order.\n- Inline note-body editing is available when **Show body editor** is enabled.\n- Board controls support panning, zooming, fit view, reset view, and opening cards.\n- Manual notes, manual groups, and text cards can be added without changing the Base query.\n\nCanvas Bases stores layout and board state in Canvas Bases-owned keys in the `.base` view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path.\n\n## Materialize a Canvas\n\nCanvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts.\n\nRun these commands from the command palette:\n\n```text\nCanvas Bases: Create canvas from current bases view\nCanvas Bases: Update linked canvas\nCanvas Bases: Open linked canvas\n```\n\nThe create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges.\n\nThe generated `.canvas` file is a snapshot, not a live query. Re-run **Canvas Bases: Update linked canvas** after changing the Base result set or board layout.\n\n## TaskNotes Integration\n\nCanvas Bases reads TaskNotes through the [TaskNotes JavaScript Runtime API](../javascript-api.md). It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing.\n\nWhen TaskNotes integration is enabled, Canvas Bases can:\n\n- Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards.\n- Add TaskNotes task actions to card context menus through the TaskNotes task menu API.\n- Draw dependency edges between visible tasks.\n- Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to `all`.\n- Add or remove dependency and subtask relationships by dragging from one card's link handle to another.\n- Update mapped TaskNotes task properties when a card is dropped into a property zone.\n- Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence.\n\nTaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly.\n\n## Edges and Relationships\n\nCanvas Bases can draw edges when both endpoint notes are present on the board.\n\nSupported edge sources include:\n\n| Source | What it uses |\n| --- | --- |\n| `wikilinks` | Links found in the note body. |\n| `properties` | Links stored in configured note properties. |\n| `all` | Wikilinks and configured property links. |\n| TaskNotes dependencies | Blocking relationships from TaskNotes. |\n| TaskNotes subtasks | Parent-child task relationships from TaskNotes when enabled. |\n\nFor property edges, configure a comma-separated list of property names, such as:\n\n```text\ndepends_on, related\n```\n\nEdges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu.\n\n## Assignment Zones\n\nAssignment zones are board regions that do something when a card is dropped into them.\n\nThe default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note.\n\nCustom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones.\n\n## Files and Data\n\nCanvas Bases keeps user data in normal vault files:\n\n| Data | Where it lives |\n| --- | --- |\n| Task and note content | Markdown files. |\n| Query, visible properties, sorting, and grouping | `.base` files. |\n| Live board geometry and Canvas Bases options | Canvas Bases-owned keys in the `.base` view config. |\n| Generated board snapshots | `.canvas` files. |\n| Options for non-Canvas Bases active views | Canvas Bases plugin data. |\n\nManual non-Canvas Bases nodes in a generated `.canvas` file are preserved when Canvas Bases updates that canvas.\n\n## First Board\n\nA practical first Canvas Bases setup is:\n\n1. Create or duplicate a TaskNotes `.base` view.\n2. Filter it to the tasks or notes you want on the board.\n3. Add a Canvas Bases layout view to that `.base` file.\n4. Choose which properties to show on cards.\n5. Enable TaskNotes badges, actions, or relationships if the board is task-focused.\n6. Arrange the cards and groups.\n7. Use the toolbar to create a linked `.canvas` snapshot when you want a Canvas file.\n\nCanvas Bases can also create starter files under `Canvas Bases/` with a demo Base, sample notes, and a linked Canvas path. Run **Canvas Bases: Create starter files** from the command palette if you want a small example board to inspect before adapting your own TaskNotes views.\n","aliases":["/companion-plugins/canvas-bases/"],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"when-to-use-canvas-bases","text":"When to Use Canvas Bases"},{"level":2,"id":"canvas-bases-layout","text":"Canvas Bases Layout"},{"level":2,"id":"materialize-a-canvas","text":"Materialize a Canvas"},{"level":2,"id":"tasknotes-integration","text":"TaskNotes Integration"},{"level":2,"id":"edges-and-relationships","text":"Edges and Relationships"},{"level":2,"id":"assignment-zones","text":"Assignment Zones"},{"level":2,"id":"files-and-data","text":"Files and Data"},{"level":2,"id":"first-board","text":"First Board"}],"html":"

Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named Canvas Bases or as a generated JSON Canvas snapshot.

\n

Canvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the .base file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates.

\n

Requirements#

\n
    \n
  • Obsidian 1.10.1 or newer.
  • \n
  • The Obsidian Bases core plugin.
  • \n
  • The Obsidian Canvas core plugin when opening or editing generated .canvas files.
  • \n
  • TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions.
  • \n
\n

If TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability.

\n

When to Use Canvas Bases#

\n

Use Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set.

\n

Common uses include:

\n
    \n
  • Planning project tasks on a visual board.
  • \n
  • Seeing dependencies or related notes as edges between cards.
  • \n
  • Embedding a board in a daily note, project note, or meeting note.
  • \n
  • Turning a filtered Base view into a reusable .canvas snapshot.
  • \n
  • Grouping notes with Bases, then manually arranging the result.
  • \n
  • Dropping cards into assignment zones to update a note property or run a supported TaskNotes action.
  • \n
\n

If the question is only "which tasks should appear?", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set.

\n

Canvas Bases Layout#

\n

After Canvas Bases is installed, open or create a .base file and add a view using the Canvas Bases layout.

\n

In the live layout:

\n
    \n
  • Each Base result row becomes a file card.
  • \n
  • Displayed Base properties appear on each card in the same order as the Base properties menu.
  • \n
  • Base groups become group frames.
  • \n
  • Cards and group frames can be dragged and resized.
  • \n
  • Ungrouped views place cards directly on the board.
  • \n
  • The initial card order follows the Base sort order.
  • \n
  • Inline note-body editing is available when Show body editor is enabled.
  • \n
  • Board controls support panning, zooming, fit view, reset view, and opening cards.
  • \n
  • Manual notes, manual groups, and text cards can be added without changing the Base query.
  • \n
\n

Canvas Bases stores layout and board state in Canvas Bases-owned keys in the .base view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path.

\n

Materialize a Canvas#

\n

Canvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts.

\n

Run these commands from the command palette:

\n
Canvas Bases: Create canvas from current bases view\nCanvas Bases: Update linked canvas\nCanvas Bases: Open linked canvas\n

The create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges.

\n

The generated .canvas file is a snapshot, not a live query. Re-run Canvas Bases: Update linked canvas after changing the Base result set or board layout.

\n

TaskNotes Integration#

\n

Canvas Bases reads TaskNotes through the TaskNotes JavaScript Runtime API. It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing.

\n

When TaskNotes integration is enabled, Canvas Bases can:

\n
    \n
  • Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards.
  • \n
  • Add TaskNotes task actions to card context menus through the TaskNotes task menu API.
  • \n
  • Draw dependency edges between visible tasks.
  • \n
  • Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to all.
  • \n
  • Add or remove dependency and subtask relationships by dragging from one card's link handle to another.
  • \n
  • Update mapped TaskNotes task properties when a card is dropped into a property zone.
  • \n
  • Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence.
  • \n
\n

TaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly.

\n

Edges and Relationships#

\n

Canvas Bases can draw edges when both endpoint notes are present on the board.

\n

Supported edge sources include:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SourceWhat it uses
wikilinksLinks found in the note body.
propertiesLinks stored in configured note properties.
allWikilinks and configured property links.
TaskNotes dependenciesBlocking relationships from TaskNotes.
TaskNotes subtasksParent-child task relationships from TaskNotes when enabled.
\n

For property edges, configure a comma-separated list of property names, such as:

\n
depends_on, related\n

Edges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu.

\n

Assignment Zones#

\n

Assignment zones are board regions that do something when a card is dropped into them.

\n

The default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note.

\n

Custom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones.

\n

Files and Data#

\n

Canvas Bases keeps user data in normal vault files:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DataWhere it lives
Task and note contentMarkdown files.
Query, visible properties, sorting, and grouping.base files.
Live board geometry and Canvas Bases optionsCanvas Bases-owned keys in the .base view config.
Generated board snapshots.canvas files.
Options for non-Canvas Bases active viewsCanvas Bases plugin data.
\n

Manual non-Canvas Bases nodes in a generated .canvas file are preserved when Canvas Bases updates that canvas.

\n

First Board#

\n

A practical first Canvas Bases setup is:

\n
    \n
  1. Create or duplicate a TaskNotes .base view.
  2. \n
  3. Filter it to the tasks or notes you want on the board.
  4. \n
  5. Add a Canvas Bases layout view to that .base file.
  6. \n
  7. Choose which properties to show on cards.
  8. \n
  9. Enable TaskNotes badges, actions, or relationships if the board is task-focused.
  10. \n
  11. Arrange the cards and groups.
  12. \n
  13. Use the toolbar to create a linked .canvas snapshot when you want a Canvas file.
  14. \n
\n

Canvas Bases can also create starter files under Canvas Bases/ with a demo Base, sample notes, and a linked Canvas path. Run Canvas Bases: Create starter files from the command palette if you want a small example board to inspect before adapting your own TaskNotes views.

\n","text":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named Canvas Bases or as a generated JSON Canvas snapshot. Canvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the .base file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates. Requirements# Obsidian 1.10.1 or newer. The Obsidian Bases core plugin. The Obsidian Canvas core plugin when opening or editing generated .canvas files. TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions. If TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability. When to Use Canvas Bases# Use Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set. Common uses include: Planning project tasks on a visual board. Seeing dependencies or related notes as edges between cards. Embedding a board in a daily note, project note, or meeting note. Turning a filtered Base view into a reusable .canvas snapshot. Grouping notes with Bases, then manually arranging the result. Dropping cards into assignment zones to update a note property or run a supported TaskNotes action. If the question is only \"which tasks should appear?\", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set. Canvas Bases Layout# After Canvas Bases is installed, open or create a .base file and add a view using the Canvas Bases layout. In the live layout: Each Base result row becomes a file card. Displayed Base properties appear on each card in the same order as the Base properties menu. Base groups become group frames. Cards and group frames can be dragged and resized. Ungrouped views place cards directly on the board. The initial card order follows the Base sort order. Inline note-body editing is available when Show body editor is enabled. Board controls support panning, zooming, fit view, reset view, and opening cards. Manual notes, manual groups, and text cards can be added without changing the Base query. Canvas Bases stores layout and board state in Canvas Bases-owned keys in the .base view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path. Materialize a Canvas# Canvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts. Run these commands from the command palette: Canvas Bases: Create canvas from current bases view Canvas Bases: Update linked canvas Canvas Bases: Open linked canvas The create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges. The generated .canvas file is a snapshot, not a live query. Re-run Canvas Bases: Update linked canvas after changing the Base result set or board layout. TaskNotes Integration# Canvas Bases reads TaskNotes through the TaskNotes JavaScript Runtime API. It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing. When TaskNotes integration is enabled, Canvas Bases can: Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards. Add TaskNotes task actions to card context menus through the TaskNotes task menu API. Draw dependency edges between visible tasks. Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to all. Add or remove dependency and subtask relationships by dragging from one card's link handle to another. Update mapped TaskNotes task properties when a card is dropped into a property zone. Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence. TaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly. Edges and Relationships# Canvas Bases can draw edges when both endpoint notes are present on the board. Supported edge sources include: Source What it uses wikilinks Links found in the note body. properties Links stored in configured note properties. all Wikilinks and configured property links. TaskNotes dependencies Blocking relationships from TaskNotes. TaskNotes subtasks Parent-child task relationships from TaskNotes when enabled. For property edges, configure a comma-separated list of property names, such as: depends_on, related Edges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu. Assignment Zones# Assignment zones are board regions that do something when a card is dropped into them. The default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note. Custom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones. Files and Data# Canvas Bases keeps user data in normal vault files: Data Where it lives Task and note content Markdown files. Query, visible properties, sorting, and grouping .base files. Live board geometry and Canvas Bases options Canvas Bases-owned keys in the .base view config. Generated board snapshots .canvas files. Options for non-Canvas Bases active views Canvas Bases plugin data. Manual non-Canvas Bases nodes in a generated .canvas file are preserved when Canvas Bases updates that canvas. First Board# A practical first Canvas Bases setup is: Create or duplicate a TaskNotes .base view. Filter it to the tasks or notes you want on the board. Add a Canvas Bases layout view to that .base file. Choose which properties to show on cards. Enable TaskNotes badges, actions, or relationships if the board is task-focused. Arrange the cards and groups. Use the toolbar to create a linked .canvas snapshot when you want a Canvas file. Canvas Bases can also create starter files under Canvas Bases/ with a demo Base, sample notes, and a linked Canvas path. Run Canvas Bases: Create starter files from the command palette if you want a small example board to inspect before adapting your own TaskNotes views."},{"route":"/obsidian/companion-plugins/tasknotes-workflows/","title":"TaskNotes Workflows","description":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and se...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/companion-plugins/tasknotes-workflows.md","namespace":"obsidian","relativePath":"companion-plugins/tasknotes-workflows.md","raw":"# TaskNotes Workflows\n\nTaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks.\n\n## Install TaskNotes Workflows\n\n\n\nYou can also install it from Obsidian: open Settings > Community plugins > Browse, then search for `TaskNotes Workflows`.\n\nThe plugin is designed for workflows users often ask TaskNotes core to handle, such as:\n\n- Start time tracking when a task becomes active.\n- Stop time tracking when a task is completed.\n- Move completed tasks into a review folder.\n- Copy parent task context, tags, priority, dates, or dependencies to subtasks.\n- Warn when a blocked task is moved to active.\n- Run a daily review query.\n\nTaskNotes Workflows keeps this behavior outside TaskNotes core while still using the [TaskNotes JavaScript Runtime API](../javascript-api.md) for safe task reads, writes, canonical queries, events, and relationship resolution.\n\n## Requirements\n\n- TaskNotes must be installed and enabled.\n- TaskNotes must expose the JavaScript runtime API.\n- Obsidian must be open for workflows to run.\n- Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed.\n- The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded.\n\nIf TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run.\n\n## Files Created by the Plugin\n\nBy default, TaskNotes Workflows uses:\n\n| Path | Purpose |\n| --- | --- |\n| `TaskNotes/Workflows/` | Workflow Markdown files. |\n| `TaskNotes/Views/workflows.base` | Generated Obsidian Base that renders workflow cards through the custom workflow view. |\n| Plugin config folder | Run history and detail logs, unless a run-log folder is configured. |\n\nWorkflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance.\n\n## First Run\n\nOn first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally.\n\nThe generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note.\n\nWorkflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly.\n\n## Default Workflows\n\nThe plugin can write these starter workflows:\n\n| Workflow | What it demonstrates |\n| --- | --- |\n| Auto-start time tracking | Starts a timer when a task status changes to active. |\n| Stop time tracking on complete | Stops the timer when a task is completed. |\n| Morning overdue review | Runs a daily cron query and marks overdue open tasks high priority. |\n| Move completed tasks to review | Moves completed task notes into a review folder. |\n| Inherit subtask contexts and tags | Copies contexts and tags from the first parent task when a task becomes a subtask. |\n| Inherit subtask priority | Copies priority from the first parent task when a task becomes a subtask. |\n| Inherit subtask planning dates | Copies scheduled and due dates from the first parent task when a task becomes a subtask. |\n| Inherit subtask dependencies | Adds the first parent task's blocking dependencies to new subtasks. |\n| Mirror parent priority to subtasks | Updates existing subtasks when a parent task priority changes. |\n| Mirror parent planning dates to subtasks | Updates existing subtasks when a parent scheduled or due date changes. |\n| Mirror parent dependencies to subtasks | Replaces each subtask's dependencies with the parent task's current dependencies. |\n| Warn when starting a blocked task | Shows a notice when a task becomes active while dependencies remain. |\n| Daily active task review | Shows a daily count of tasks still marked active. |\n\nTreat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows.\n\n## Workflow Shape\n\nA workflow file looks like this:\n\n```markdown\n---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: auto-start-time-tracking\nname: Auto-start time tracking\nenabled: false\ndescription: Start a timer when a task status changes to active.\ntriggers:\n - id: status-active\n type: tasknotes.event\n event: task.status.changed\n to: active\nconditions:\n - field: trigger.after.path\n operator: exists\nsteps:\n - id: start-time\n type: time.start\n input:\n task: \"{{trigger.after.path}}\"\n options:\n description: \"Started by {{workflow.name}}\"\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 1\n onError: stop\n---\n\n# Auto-start time tracking\n\nEnable this workflow to start time tracking when a TaskNotes task moves to `active`.\n```\n\nRequired frontmatter fields:\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `type` | string | Must be `tasknotes-workflow`. |\n| `schemaVersion` | number | Must be `1`. |\n| `id` | string | Stable lowercase identifier. Use letters, numbers, dots, underscores, and dashes. |\n| `name` | string | Human-readable name shown in workflow cards and command-palette commands. |\n| `enabled` | boolean | Disabled workflows can be edited and dry-run but do not run automatically or from manual commands. |\n| `triggers` | array | One or more trigger definitions. |\n| `conditions` | array | Optional workflow-level guards. |\n| `steps` | array | Linear typed step pipeline. |\n| `run` | object | Run policy and safety limits. |\n\n## Triggers\n\nTriggers decide when a workflow should run.\n\n### TaskNotes Events\n\nUse `tasknotes.event` to react to TaskNotes runtime events:\n\n```yaml\ntriggers:\n - id: status-active\n type: tasknotes.event\n event: task.status.changed\n from: open\n to: active\n```\n\nCommon event names include:\n\n- `task.created`\n- `task.updated`\n- `task.deleted`\n- `task.moved`\n- `task.status.changed`\n- `task.completed`\n- `task.uncompleted`\n- `task.archived`\n- `task.unarchived`\n- `task.scheduled.changed`\n- `task.due.changed`\n- `task.priority.changed`\n- `task.tags.changed`\n- `task.contexts.changed`\n- `task.projects.changed`\n- `task.reminders.changed`\n- `task.dependencies.changed`\n- `task.recurrence.changed`\n- `time.started`\n- `time.stopped`\n- `pomodoro.started`\n- `pomodoro.completed`\n- `pomodoro.interrupted`\n- `recurring.instance.completed`\n- `recurring.instance.skipped`\n\nThe workflow editor loads available TaskNotes events dynamically from `api.events.list()`, so event pickers can follow the runtime API instead of relying on a hardcoded list.\n\nTaskNotes event triggers can use these filters:\n\n| Field | Purpose |\n| --- | --- |\n| `event` | Runtime event name. |\n| `from` | Previous status or value for status-change workflows. |\n| `to` | New status or value for status-change workflows. |\n| `path.glob` | Optional path glob limiting which task files can trigger the workflow. |\n| `allowSelfTrigger` | Allows this workflow to react to writes caused by `tasknotes-workflows`. Leave off unless you have a clear reason. |\n\nTaskNotes event output fields include values such as `trigger.after.path`, `trigger.after.status`, `trigger.before.status`, `trigger.changes`, `trigger.source`, and `trigger.correlationId`.\n\n### Cron\n\nCron triggers run on matching minutes while Obsidian is open:\n\n```yaml\ntriggers:\n - id: weekday-review\n type: cron\n schedule: \"0 17 * * 1-5\"\n timezone: local\n```\n\nThe schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with `run.maxTasks`, especially if they query many tasks.\n\n### Interval\n\nInterval triggers run repeatedly while Obsidian is open:\n\n```yaml\ntriggers:\n - id: half-hour-check\n type: interval\n every: 30m\n```\n\nThe plugin enforces a minimum interval to avoid excessive background work.\n\n### Manual\n\nManual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette:\n\n```yaml\ntriggers:\n - id: manual\n type: manual\n```\n\nEnabled workflows with a manual trigger are registered as Obsidian commands named `Run: `. You can launch them from the command palette or assign hotkeys in Obsidian settings.\n\nThe generated command id is based on the workflow `id`. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned.\n\n### Obsidian Events\n\nAdvanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events:\n\n```yaml\ntriggers:\n - id: project-note-opened\n type: obsidian.workspace\n event: file-open\n path:\n glob: \"Projects/**/*.md\"\n\n - id: task-note-modified\n type: obsidian.vault\n event: modify\n path:\n glob: \"Tasks/**/*.md\"\n\n - id: metadata-changed\n type: obsidian.metadata\n event: changed\n path:\n glob: \"Projects/**/*.md\"\n```\n\nKeep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent.\n\n## Conditions\n\nConditions can appear at workflow level or on individual steps.\n\n```yaml\nconditions:\n - field: trigger.after.path\n operator: exists\n - field: trigger.after.status\n operator: is\n value: active\n```\n\nSupported operators:\n\n| Operator | Meaning |\n| --- | --- |\n| `is` / `isNot` | Exact comparison after scalar normalization. |\n| `in` / `notIn` | Check a value against an array. |\n| `exists` / `missing` | Check whether a field has a value. |\n| `contains` | Check whether a string contains text or an array contains a value. |\n| `startsWith` | String prefix check. |\n| `before` / `after` | Date comparison. |\n| `onOrBefore` / `onOrAfter` | Inclusive date comparison. |\n\nStep-level conditions use the same shape:\n\n```yaml\nsteps:\n - id: warn\n type: notice.show\n if:\n - field: steps.dependencies.tasks[0].path\n operator: exists\n input:\n message: \"This task still has dependencies.\"\n```\n\n## References\n\nReferences use constrained template expressions. Arbitrary JavaScript is not evaluated.\n\n```text\n{{workflow.id}}\n{{workflow.name}}\n{{trigger.after.path}}\n{{trigger.changes.status.after}}\n{{steps.query.tasks}}\n{{steps.parents.tasks[0].path}}\n{{item.path}}\n{{today}}\n{{now}}\n```\n\nIf a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified.\n\nUse `forEach` when a step should run once per item:\n\n```yaml\nsteps:\n - id: overdue\n type: task.query\n input:\n query:\n where:\n all:\n - field: task.due\n op: lt\n value:\n fn: today\n - field: task.status\n op: notIn\n value:\n - done\n - cancelled\n sort:\n - field: task.due\n direction: asc\n limit: 50\n scope:\n includeArchived: false\n\n - id: mark-high\n type: task.patch\n forEach: \"{{steps.overdue.tasks}}\"\n input:\n task: \"{{item.path}}\"\n patch:\n priority: high\n```\n\nWhen a step uses `forEach`, `{{item}}` refers to the current item and the step output becomes an array of per-item outputs.\n\n`task.query` uses the canonical TaskNotes runtime query DTO. Its output includes `tasks`, `count`, `total`, `matched`, `returned`, `groups`, `groupPaths`, `query`, and `warnings`.\n\nRuntime query conditions use canonical field IDs and operators:\n\n```yaml\nquery:\n where:\n all:\n - field: task.status\n op: ne\n value: done\n - any:\n - field: task.due\n op: lte\n value:\n fn: today\n - field: task.priority\n op: eq\n value: high\n sort:\n - field: task.due\n direction: asc\n group:\n - field: task.status\n limit: 25\n scope:\n includeArchived: false\n```\n\nCommon fields include `task.status`, `task.priority`, `task.due`, `task.scheduled`, `task.projects`, `task.contexts`, `task.tags`, `task.isBlocked`, and `file.path`. Operators include `eq`, `ne`, `contains`, `notContains`, `in`, `notIn`, `exists`, `missing`, `lt`, `lte`, `gt`, `gte`, `isTrue`, and `isFalse`. Use `api.catalog.filterProperties()` and `api.catalog.filterOperators()` for the complete runtime catalog.\n\n## Steps\n\nSteps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers.\n\nTask read steps:\n\n| Step | Output |\n| --- | --- |\n| `task.get` | One task. |\n| `task.query` | Tasks matching a canonical TaskNotes runtime query. |\n| `task.parents` | Parent tasks linked from the task's projects. |\n| `task.subtasks` | Tasks that reference the current task as a project. |\n| `task.dependencies` | Dependencies stored in `blockedBy`, with resolved task data when available. |\n| `task.blocking` | Tasks blocked by the current task. |\n| `task.relationships` | The task plus parents, subtasks, dependencies, and blocking tasks. |\n\nTask write steps:\n\n| Step | Purpose |\n| --- | --- |\n| `task.create` | Create a new TaskNotes task. |\n| `task.patch` | Update one or more fields. |\n| `task.set` | Set one field. |\n| `task.move` | Move the task note to a target folder. |\n| `task.archive` / `task.unarchive` | Archive or unarchive a task. |\n| `task.complete` / `task.uncomplete` | Complete or reopen a task. |\n| `task.reschedule` | Update planning dates. |\n| `task.setDue` / `task.clearDue` | Set or clear due date. |\n| `task.setScheduled` / `task.clearScheduled` | Set or clear scheduled date. |\n| `task.addTag` / `task.removeTag` | Mutate tags. |\n| `task.addProject` / `task.removeProject` | Mutate project links. |\n| `task.addContext` / `task.removeContext` | Mutate contexts. |\n| `task.addDependency` / `task.removeDependency` | Mutate blocking dependencies. |\n\nTime and utility steps:\n\n| Step | Purpose |\n| --- | --- |\n| `time.start` | Start time tracking for a task. |\n| `time.stop` | Stop active time tracking for a task. |\n| `time.appendEntry` | Append a time entry. |\n| `notice.show` | Show an Obsidian notice. |\n| `workflow.stop` | Stop a workflow early. |\n\nCompanion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension:\n\n```js\nconst tasknotes = app.plugins.getPlugin(\"tasknotes\")?.api;\nconst workflows = tasknotes?.extensions.get(\"tasknotes-workflows\");\nconst steps = workflows?.listStepDefinitions();\n```\n\n## Run Policy\n\nEvery workflow has a run policy:\n\n```yaml\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 25\n onError: stop\n timeout: 30s\n```\n\n| Field | Notes |\n| --- | --- |\n| `mode` | Currently `sequential`. Steps run in order. |\n| `noOverlap` | Skips a new run if the same workflow is already running. |\n| `source` | Mutation source passed to TaskNotes runtime API calls. |\n| `maxTasks` | Safety limit for `forEach` batch steps. |\n| `onError` | `stop` or `continue`. |\n| `timeout` | Optional duration string. |\n\nTaskNotes attaches `source`, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops.\n\n## Run Logs and Debugging\n\nWorkflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings.\n\nRun records include:\n\n- Workflow id, name, and source path.\n- Trigger payload.\n- Step statuses.\n- Inputs and outputs, depending on the configured log level.\n- Error text when a run fails.\n\nUse dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files.\n\n## Example: Manual Command Workflow\n\nThis workflow can be run from the command palette after it is enabled:\n\n```markdown\n---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: show-active-count\nname: Show active task count\nenabled: true\ndescription: Show a notice with the number of active tasks.\ntriggers:\n - id: manual\n type: manual\nsteps:\n - id: active\n type: task.query\n input:\n query:\n where:\n field: task.status\n op: eq\n value: active\n limit: 25\n scope:\n includeArchived: false\n - id: notice\n type: notice.show\n input:\n message: \"Active tasks: {{steps.active.count}}\"\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 25\n onError: stop\n---\n\n# Show active task count\n\nRun this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`.\n```\n\n## Example: Inherit Parent Priority\n\nThis workflow copies priority from the first parent task when a task becomes a subtask:\n\n```yaml\ntype: tasknotes-workflow\nschemaVersion: 1\nid: inherit-subtask-priority\nname: Inherit subtask priority\nenabled: false\ntriggers:\n - id: projects-changed\n type: tasknotes.event\n event: task.projects.changed\n - id: task-created\n type: tasknotes.event\n event: task.created\nconditions:\n - field: trigger.after.path\n operator: exists\n - field: trigger.after.projects\n operator: exists\nsteps:\n - id: parents\n type: task.parents\n input:\n task: \"{{trigger.after.path}}\"\n - id: inherit-priority\n type: task.patch\n if:\n - field: steps.parents.tasks[0].priority\n operator: exists\n input:\n task: \"{{trigger.after.path}}\"\n patch:\n priority: \"{{steps.parents.tasks[0].priority}}\"\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 1\n onError: stop\n```\n\nThis pattern uses `task.parents` rather than trying to parse project links manually.\n\n## Authoring Guidelines\n\nWhen writing workflow notes:\n\n- Start with `enabled: false` for any workflow that mutates tasks.\n- Give every trigger and step a stable `id`.\n- Prefer typed TaskNotes steps over direct frontmatter editing.\n- Use relationship read steps such as `task.parents`, `task.subtasks`, and `task.dependencies` for parent/subtask/dependency logic.\n- Add workflow-level conditions for required trigger fields such as `trigger.after.path`.\n- Add `run.noOverlap: true` unless overlapping runs are intentional.\n- Set `run.maxTasks` for batch workflows.\n- Use `allowSelfTrigger: true` only when the workflow really should react to its own writes.\n- Keep the Markdown body useful for future maintenance: describe what the workflow changes, how to test it, and why it exists.\n\n## Troubleshooting\n\n### Task steps do not run\n\nConfirm TaskNotes is enabled and exposes the runtime API. The workflow Base can display definitions without TaskNotes, but steps such as `task.patch`, `time.start`, or `task.dependencies` need TaskNotes.\n\n### A manual workflow is missing from the command palette\n\nCheck that:\n\n- The workflow is valid.\n- `enabled` is `true`.\n- It has a `manual` trigger.\n- The workflow `id` is valid and stable.\n- Workflows have reloaded after editing the file.\n\nDisabled manual workflows can still be dry-run from the workflow card, but they are not registered as run commands.\n\n### A cron or interval workflow did not run\n\nScheduled workflows only run while Obsidian is open and the plugin is loaded. Check the schedule, timezone, enabled state, and `run.maxTasks` limit.\n\n### A workflow runs more than once\n\nCheck whether multiple triggers match the same update. Also check `allowSelfTrigger`; most workflows should leave it unset so they do not react to writes caused by `tasknotes-workflows`.\n\n### A workflow is invalid\n\nOpen the workflow Base or the workflow note card. Validation messages point to the field path, such as `triggers[0].type` or `steps[1].input`.\n\nCommon causes are missing required fields, unsupported trigger types, invalid YAML, or references to step outputs that do not exist.\n","aliases":["/companion-plugins/tasknotes-workflows/"],"toc":[{"level":2,"id":"install-tasknotes-workflows","text":"Install TaskNotes Workflows"},{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"files-created-by-the-plugin","text":"Files Created by the Plugin"},{"level":2,"id":"first-run","text":"First Run"},{"level":2,"id":"default-workflows","text":"Default Workflows"},{"level":2,"id":"workflow-shape","text":"Workflow Shape"},{"level":2,"id":"triggers","text":"Triggers"},{"level":3,"id":"tasknotes-events","text":"TaskNotes Events"},{"level":3,"id":"cron","text":"Cron"},{"level":3,"id":"interval","text":"Interval"},{"level":3,"id":"manual","text":"Manual"},{"level":3,"id":"obsidian-events","text":"Obsidian Events"},{"level":2,"id":"conditions","text":"Conditions"},{"level":2,"id":"references","text":"References"},{"level":2,"id":"steps","text":"Steps"},{"level":2,"id":"run-policy","text":"Run Policy"},{"level":2,"id":"run-logs-and-debugging","text":"Run Logs and Debugging"},{"level":2,"id":"example-manual-command-workflow","text":"Example: Manual Command Workflow"},{"level":2,"id":"example-inherit-parent-priority","text":"Example: Inherit Parent Priority"},{"level":2,"id":"authoring-guidelines","text":"Authoring Guidelines"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"task-steps-do-not-run","text":"Task steps do not run"},{"level":3,"id":"a-manual-workflow-is-missing-from-the-command-palette","text":"A manual workflow is missing from the command palette"},{"level":3,"id":"a-cron-or-interval-workflow-did-not-run","text":"A cron or interval workflow did not run"},{"level":3,"id":"a-workflow-runs-more-than-once","text":"A workflow runs more than once"},{"level":3,"id":"a-workflow-is-invalid","text":"A workflow is invalid"}],"html":"

TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks.

\n

Install TaskNotes Workflows#

\n\n\n

You can also install it from Obsidian: open Settings > Community plugins > Browse, then search for TaskNotes Workflows.

\n

The plugin is designed for workflows users often ask TaskNotes core to handle, such as:

\n
    \n
  • Start time tracking when a task becomes active.
  • \n
  • Stop time tracking when a task is completed.
  • \n
  • Move completed tasks into a review folder.
  • \n
  • Copy parent task context, tags, priority, dates, or dependencies to subtasks.
  • \n
  • Warn when a blocked task is moved to active.
  • \n
  • Run a daily review query.
  • \n
\n

TaskNotes Workflows keeps this behavior outside TaskNotes core while still using the TaskNotes JavaScript Runtime API for safe task reads, writes, canonical queries, events, and relationship resolution.

\n

Requirements#

\n
    \n
  • TaskNotes must be installed and enabled.
  • \n
  • TaskNotes must expose the JavaScript runtime API.
  • \n
  • Obsidian must be open for workflows to run.
  • \n
  • Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed.
  • \n
  • The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded.
  • \n
\n

If TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run.

\n

Files Created by the Plugin#

\n

By default, TaskNotes Workflows uses:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PathPurpose
TaskNotes/Workflows/Workflow Markdown files.
TaskNotes/Views/workflows.baseGenerated Obsidian Base that renders workflow cards through the custom workflow view.
Plugin config folderRun history and detail logs, unless a run-log folder is configured.
\n

Workflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance.

\n

First Run#

\n

On first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally.

\n

The generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note.

\n

Workflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly.

\n

Default Workflows#

\n

The plugin can write these starter workflows:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
WorkflowWhat it demonstrates
Auto-start time trackingStarts a timer when a task status changes to active.
Stop time tracking on completeStops the timer when a task is completed.
Morning overdue reviewRuns a daily cron query and marks overdue open tasks high priority.
Move completed tasks to reviewMoves completed task notes into a review folder.
Inherit subtask contexts and tagsCopies contexts and tags from the first parent task when a task becomes a subtask.
Inherit subtask priorityCopies priority from the first parent task when a task becomes a subtask.
Inherit subtask planning datesCopies scheduled and due dates from the first parent task when a task becomes a subtask.
Inherit subtask dependenciesAdds the first parent task's blocking dependencies to new subtasks.
Mirror parent priority to subtasksUpdates existing subtasks when a parent task priority changes.
Mirror parent planning dates to subtasksUpdates existing subtasks when a parent scheduled or due date changes.
Mirror parent dependencies to subtasksReplaces each subtask's dependencies with the parent task's current dependencies.
Warn when starting a blocked taskShows a notice when a task becomes active while dependencies remain.
Daily active task reviewShows a daily count of tasks still marked active.
\n

Treat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows.

\n

Workflow Shape#

\n

A workflow file looks like this:

\n
---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: auto-start-time-tracking\nname: Auto-start time tracking\nenabled: false\ndescription: Start a timer when a task status changes to active.\ntriggers:\n  - id: status-active\n    type: tasknotes.event\n    event: task.status.changed\n    to: active\nconditions:\n  - field: trigger.after.path\n    operator: exists\nsteps:\n  - id: start-time\n    type: time.start\n    input:\n      task: "{{trigger.after.path}}"\n      options:\n        description: "Started by {{workflow.name}}"\nrun:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 1\n  onError: stop\n---\n\n# Auto-start time tracking\n\nEnable this workflow to start time tracking when a TaskNotes task moves to `active`.\n

Required frontmatter fields:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldTypeNotes
typestringMust be tasknotes-workflow.
schemaVersionnumberMust be 1.
idstringStable lowercase identifier. Use letters, numbers, dots, underscores, and dashes.
namestringHuman-readable name shown in workflow cards and command-palette commands.
enabledbooleanDisabled workflows can be edited and dry-run but do not run automatically or from manual commands.
triggersarrayOne or more trigger definitions.
conditionsarrayOptional workflow-level guards.
stepsarrayLinear typed step pipeline.
runobjectRun policy and safety limits.
\n

Triggers#

\n

Triggers decide when a workflow should run.

\n

TaskNotes Events#

\n

Use tasknotes.event to react to TaskNotes runtime events:

\n
triggers:\n  - id: status-active\n    type: tasknotes.event\n    event: task.status.changed\n    from: open\n    to: active\n

Common event names include:

\n
    \n
  • task.created
  • \n
  • task.updated
  • \n
  • task.deleted
  • \n
  • task.moved
  • \n
  • task.status.changed
  • \n
  • task.completed
  • \n
  • task.uncompleted
  • \n
  • task.archived
  • \n
  • task.unarchived
  • \n
  • task.scheduled.changed
  • \n
  • task.due.changed
  • \n
  • task.priority.changed
  • \n
  • task.tags.changed
  • \n
  • task.contexts.changed
  • \n
  • task.projects.changed
  • \n
  • task.reminders.changed
  • \n
  • task.dependencies.changed
  • \n
  • task.recurrence.changed
  • \n
  • time.started
  • \n
  • time.stopped
  • \n
  • pomodoro.started
  • \n
  • pomodoro.completed
  • \n
  • pomodoro.interrupted
  • \n
  • recurring.instance.completed
  • \n
  • recurring.instance.skipped
  • \n
\n

The workflow editor loads available TaskNotes events dynamically from api.events.list(), so event pickers can follow the runtime API instead of relying on a hardcoded list.

\n

TaskNotes event triggers can use these filters:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldPurpose
eventRuntime event name.
fromPrevious status or value for status-change workflows.
toNew status or value for status-change workflows.
path.globOptional path glob limiting which task files can trigger the workflow.
allowSelfTriggerAllows this workflow to react to writes caused by tasknotes-workflows. Leave off unless you have a clear reason.
\n

TaskNotes event output fields include values such as trigger.after.path, trigger.after.status, trigger.before.status, trigger.changes, trigger.source, and trigger.correlationId.

\n

Cron#

\n

Cron triggers run on matching minutes while Obsidian is open:

\n
triggers:\n  - id: weekday-review\n    type: cron\n    schedule: "0 17 * * 1-5"\n    timezone: local\n

The schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with run.maxTasks, especially if they query many tasks.

\n

Interval#

\n

Interval triggers run repeatedly while Obsidian is open:

\n
triggers:\n  - id: half-hour-check\n    type: interval\n    every: 30m\n

The plugin enforces a minimum interval to avoid excessive background work.

\n

Manual#

\n

Manual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette:

\n
triggers:\n  - id: manual\n    type: manual\n

Enabled workflows with a manual trigger are registered as Obsidian commands named Run: <workflow name>. You can launch them from the command palette or assign hotkeys in Obsidian settings.

\n

The generated command id is based on the workflow id. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned.

\n

Obsidian Events#

\n

Advanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events:

\n
triggers:\n  - id: project-note-opened\n    type: obsidian.workspace\n    event: file-open\n    path:\n      glob: "Projects/**/*.md"\n\n  - id: task-note-modified\n    type: obsidian.vault\n    event: modify\n    path:\n      glob: "Tasks/**/*.md"\n\n  - id: metadata-changed\n    type: obsidian.metadata\n    event: changed\n    path:\n      glob: "Projects/**/*.md"\n

Keep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent.

\n

Conditions#

\n

Conditions can appear at workflow level or on individual steps.

\n
conditions:\n  - field: trigger.after.path\n    operator: exists\n  - field: trigger.after.status\n    operator: is\n    value: active\n

Supported operators:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperatorMeaning
is / isNotExact comparison after scalar normalization.
in / notInCheck a value against an array.
exists / missingCheck whether a field has a value.
containsCheck whether a string contains text or an array contains a value.
startsWithString prefix check.
before / afterDate comparison.
onOrBefore / onOrAfterInclusive date comparison.
\n

Step-level conditions use the same shape:

\n
steps:\n  - id: warn\n    type: notice.show\n    if:\n      - field: steps.dependencies.tasks[0].path\n        operator: exists\n    input:\n      message: "This task still has dependencies."\n

References#

\n

References use constrained template expressions. Arbitrary JavaScript is not evaluated.

\n
{{workflow.id}}\n{{workflow.name}}\n{{trigger.after.path}}\n{{trigger.changes.status.after}}\n{{steps.query.tasks}}\n{{steps.parents.tasks[0].path}}\n{{item.path}}\n{{today}}\n{{now}}\n

If a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified.

\n

Use forEach when a step should run once per item:

\n
steps:\n  - id: overdue\n    type: task.query\n    input:\n      query:\n        where:\n          all:\n            - field: task.due\n              op: lt\n              value:\n                fn: today\n            - field: task.status\n              op: notIn\n              value:\n                - done\n                - cancelled\n        sort:\n          - field: task.due\n            direction: asc\n        limit: 50\n        scope:\n          includeArchived: false\n\n  - id: mark-high\n    type: task.patch\n    forEach: "{{steps.overdue.tasks}}"\n    input:\n      task: "{{item.path}}"\n      patch:\n        priority: high\n

When a step uses forEach, {{item}} refers to the current item and the step output becomes an array of per-item outputs.

\n

task.query uses the canonical TaskNotes runtime query DTO. Its output includes tasks, count, total, matched, returned, groups, groupPaths, query, and warnings.

\n

Runtime query conditions use canonical field IDs and operators:

\n
query:\n  where:\n    all:\n      - field: task.status\n        op: ne\n        value: done\n      - any:\n          - field: task.due\n            op: lte\n            value:\n              fn: today\n          - field: task.priority\n            op: eq\n            value: high\n  sort:\n    - field: task.due\n      direction: asc\n  group:\n    - field: task.status\n  limit: 25\n  scope:\n    includeArchived: false\n

Common fields include task.status, task.priority, task.due, task.scheduled, task.projects, task.contexts, task.tags, task.isBlocked, and file.path. Operators include eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Use api.catalog.filterProperties() and api.catalog.filterOperators() for the complete runtime catalog.

\n

Steps#

\n

Steps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers.

\n

Task read steps:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StepOutput
task.getOne task.
task.queryTasks matching a canonical TaskNotes runtime query.
task.parentsParent tasks linked from the task's projects.
task.subtasksTasks that reference the current task as a project.
task.dependenciesDependencies stored in blockedBy, with resolved task data when available.
task.blockingTasks blocked by the current task.
task.relationshipsThe task plus parents, subtasks, dependencies, and blocking tasks.
\n

Task write steps:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StepPurpose
task.createCreate a new TaskNotes task.
task.patchUpdate one or more fields.
task.setSet one field.
task.moveMove the task note to a target folder.
task.archive / task.unarchiveArchive or unarchive a task.
task.complete / task.uncompleteComplete or reopen a task.
task.rescheduleUpdate planning dates.
task.setDue / task.clearDueSet or clear due date.
task.setScheduled / task.clearScheduledSet or clear scheduled date.
task.addTag / task.removeTagMutate tags.
task.addProject / task.removeProjectMutate project links.
task.addContext / task.removeContextMutate contexts.
task.addDependency / task.removeDependencyMutate blocking dependencies.
\n

Time and utility steps:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StepPurpose
time.startStart time tracking for a task.
time.stopStop active time tracking for a task.
time.appendEntryAppend a time entry.
notice.showShow an Obsidian notice.
workflow.stopStop a workflow early.
\n

Companion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension:

\n
const tasknotes = app.plugins.getPlugin("tasknotes")?.api;\nconst workflows = tasknotes?.extensions.get("tasknotes-workflows");\nconst steps = workflows?.listStepDefinitions();\n

Run Policy#

\n

Every workflow has a run policy:

\n
run:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 25\n  onError: stop\n  timeout: 30s\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldNotes
modeCurrently sequential. Steps run in order.
noOverlapSkips a new run if the same workflow is already running.
sourceMutation source passed to TaskNotes runtime API calls.
maxTasksSafety limit for forEach batch steps.
onErrorstop or continue.
timeoutOptional duration string.
\n

TaskNotes attaches source, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops.

\n

Run Logs and Debugging#

\n

Workflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings.

\n

Run records include:

\n
    \n
  • Workflow id, name, and source path.
  • \n
  • Trigger payload.
  • \n
  • Step statuses.
  • \n
  • Inputs and outputs, depending on the configured log level.
  • \n
  • Error text when a run fails.
  • \n
\n

Use dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files.

\n

Example: Manual Command Workflow#

\n

This workflow can be run from the command palette after it is enabled:

\n
---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: show-active-count\nname: Show active task count\nenabled: true\ndescription: Show a notice with the number of active tasks.\ntriggers:\n  - id: manual\n    type: manual\nsteps:\n  - id: active\n    type: task.query\n    input:\n      query:\n        where:\n          field: task.status\n          op: eq\n          value: active\n        limit: 25\n        scope:\n          includeArchived: false\n  - id: notice\n    type: notice.show\n    input:\n      message: "Active tasks: {{steps.active.count}}"\nrun:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 25\n  onError: stop\n---\n\n# Show active task count\n\nRun this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`.\n

Example: Inherit Parent Priority#

\n

This workflow copies priority from the first parent task when a task becomes a subtask:

\n
type: tasknotes-workflow\nschemaVersion: 1\nid: inherit-subtask-priority\nname: Inherit subtask priority\nenabled: false\ntriggers:\n  - id: projects-changed\n    type: tasknotes.event\n    event: task.projects.changed\n  - id: task-created\n    type: tasknotes.event\n    event: task.created\nconditions:\n  - field: trigger.after.path\n    operator: exists\n  - field: trigger.after.projects\n    operator: exists\nsteps:\n  - id: parents\n    type: task.parents\n    input:\n      task: "{{trigger.after.path}}"\n  - id: inherit-priority\n    type: task.patch\n    if:\n      - field: steps.parents.tasks[0].priority\n        operator: exists\n    input:\n      task: "{{trigger.after.path}}"\n      patch:\n        priority: "{{steps.parents.tasks[0].priority}}"\nrun:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 1\n  onError: stop\n

This pattern uses task.parents rather than trying to parse project links manually.

\n

Authoring Guidelines#

\n

When writing workflow notes:

\n
    \n
  • Start with enabled: false for any workflow that mutates tasks.
  • \n
  • Give every trigger and step a stable id.
  • \n
  • Prefer typed TaskNotes steps over direct frontmatter editing.
  • \n
  • Use relationship read steps such as task.parents, task.subtasks, and task.dependencies for parent/subtask/dependency logic.
  • \n
  • Add workflow-level conditions for required trigger fields such as trigger.after.path.
  • \n
  • Add run.noOverlap: true unless overlapping runs are intentional.
  • \n
  • Set run.maxTasks for batch workflows.
  • \n
  • Use allowSelfTrigger: true only when the workflow really should react to its own writes.
  • \n
  • Keep the Markdown body useful for future maintenance: describe what the workflow changes, how to test it, and why it exists.
  • \n
\n

Troubleshooting#

\n

Task steps do not run#

\n

Confirm TaskNotes is enabled and exposes the runtime API. The workflow Base can display definitions without TaskNotes, but steps such as task.patch, time.start, or task.dependencies need TaskNotes.

\n

A manual workflow is missing from the command palette#

\n

Check that:

\n
    \n
  • The workflow is valid.
  • \n
  • enabled is true.
  • \n
  • It has a manual trigger.
  • \n
  • The workflow id is valid and stable.
  • \n
  • Workflows have reloaded after editing the file.
  • \n
\n

Disabled manual workflows can still be dry-run from the workflow card, but they are not registered as run commands.

\n

A cron or interval workflow did not run#

\n

Scheduled workflows only run while Obsidian is open and the plugin is loaded. Check the schedule, timezone, enabled state, and run.maxTasks limit.

\n

A workflow runs more than once#

\n

Check whether multiple triggers match the same update. Also check allowSelfTrigger; most workflows should leave it unset so they do not react to writes caused by tasknotes-workflows.

\n

A workflow is invalid#

\n

Open the workflow Base or the workflow note card. Validation messages point to the field path, such as triggers[0].type or steps[1].input.

\n

Common causes are missing required fields, unsupported trigger types, invalid YAML, or references to step outputs that do not exist.

\n","text":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks. Install TaskNotes Workflows# Install from Obsidian Community Plugins Open the TaskNotes Workflows listing in the Obsidian plugin directory You can also install it from Obsidian: open Settings > Community plugins > Browse, then search for TaskNotes Workflows. The plugin is designed for workflows users often ask TaskNotes core to handle, such as: Start time tracking when a task becomes active. Stop time tracking when a task is completed. Move completed tasks into a review folder. Copy parent task context, tags, priority, dates, or dependencies to subtasks. Warn when a blocked task is moved to active. Run a daily review query. TaskNotes Workflows keeps this behavior outside TaskNotes core while still using the TaskNotes JavaScript Runtime API for safe task reads, writes, canonical queries, events, and relationship resolution. Requirements# TaskNotes must be installed and enabled. TaskNotes must expose the JavaScript runtime API. Obsidian must be open for workflows to run. Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed. The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded. If TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run. Files Created by the Plugin# By default, TaskNotes Workflows uses: Path Purpose TaskNotes/Workflows/ Workflow Markdown files. TaskNotes/Views/workflows.base Generated Obsidian Base that renders workflow cards through the custom workflow view. Plugin config folder Run history and detail logs, unless a run-log folder is configured. Workflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance. First Run# On first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally. The generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note. Workflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly. Default Workflows# The plugin can write these starter workflows: Workflow What it demonstrates Auto-start time tracking Starts a timer when a task status changes to active. Stop time tracking on complete Stops the timer when a task is completed. Morning overdue review Runs a daily cron query and marks overdue open tasks high priority. Move completed tasks to review Moves completed task notes into a review folder. Inherit subtask contexts and tags Copies contexts and tags from the first parent task when a task becomes a subtask. Inherit subtask priority Copies priority from the first parent task when a task becomes a subtask. Inherit subtask planning dates Copies scheduled and due dates from the first parent task when a task becomes a subtask. Inherit subtask dependencies Adds the first parent task's blocking dependencies to new subtasks. Mirror parent priority to subtasks Updates existing subtasks when a parent task priority changes. Mirror parent planning dates to subtasks Updates existing subtasks when a parent scheduled or due date changes. Mirror parent dependencies to subtasks Replaces each subtask's dependencies with the parent task's current dependencies. Warn when starting a blocked task Shows a notice when a task becomes active while dependencies remain. Daily active task review Shows a daily count of tasks still marked active. Treat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows. Workflow Shape# A workflow file looks like this: --- type: tasknotes-workflow schemaVersion: 1 id: auto-start-time-tracking name: Auto-start time tracking enabled: false description: Start a timer when a task status changes to active. triggers: - id: status-active type: tasknotes.event event: task.status.changed to: active conditions: - field: trigger.after.path operator: exists steps: - id: start-time type: time.start input: task: \"{{trigger.after.path}}\" options: description: \"Started by {{workflow.name}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop --- # Auto-start time tracking Enable this workflow to start time tracking when a TaskNotes task moves to `active`. Required frontmatter fields: Field Type Notes type string Must be tasknotes-workflow. schemaVersion number Must be 1. id string Stable lowercase identifier. Use letters, numbers, dots, underscores, and dashes. name string Human-readable name shown in workflow cards and command-palette commands. enabled boolean Disabled workflows can be edited and dry-run but do not run automatically or from manual commands. triggers array One or more trigger definitions. conditions array Optional workflow-level guards. steps array Linear typed step pipeline. run object Run policy and safety limits. Triggers# Triggers decide when a workflow should run. TaskNotes Events# Use tasknotes.event to react to TaskNotes runtime events: triggers: - id: status-active type: tasknotes.event event: task.status.changed from: open to: active Common event names include: task.created task.updated task.deleted task.moved task.status.changed task.completed task.uncompleted task.archived task.unarchived task.scheduled.changed task.due.changed task.priority.changed task.tags.changed task.contexts.changed task.projects.changed task.reminders.changed task.dependencies.changed task.recurrence.changed time.started time.stopped pomodoro.started pomodoro.completed pomodoro.interrupted recurring.instance.completed recurring.instance.skipped The workflow editor loads available TaskNotes events dynamically from api.events.list(), so event pickers can follow the runtime API instead of relying on a hardcoded list. TaskNotes event triggers can use these filters: Field Purpose event Runtime event name. from Previous status or value for status-change workflows. to New status or value for status-change workflows. path.glob Optional path glob limiting which task files can trigger the workflow. allowSelfTrigger Allows this workflow to react to writes caused by tasknotes-workflows. Leave off unless you have a clear reason. TaskNotes event output fields include values such as trigger.after.path, trigger.after.status, trigger.before.status, trigger.changes, trigger.source, and trigger.correlationId. Cron# Cron triggers run on matching minutes while Obsidian is open: triggers: - id: weekday-review type: cron schedule: \"0 17 * * 1-5\" timezone: local The schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with run.maxTasks, especially if they query many tasks. Interval# Interval triggers run repeatedly while Obsidian is open: triggers: - id: half-hour-check type: interval every: 30m The plugin enforces a minimum interval to avoid excessive background work. Manual# Manual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette: triggers: - id: manual type: manual Enabled workflows with a manual trigger are registered as Obsidian commands named Run: . You can launch them from the command palette or assign hotkeys in Obsidian settings. The generated command id is based on the workflow id. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned. Obsidian Events# Advanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events: triggers: - id: project-note-opened type: obsidian.workspace event: file-open path: glob: \"Projects/**/*.md\" - id: task-note-modified type: obsidian.vault event: modify path: glob: \"Tasks/**/*.md\" - id: metadata-changed type: obsidian.metadata event: changed path: glob: \"Projects/**/*.md\" Keep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent. Conditions# Conditions can appear at workflow level or on individual steps. conditions: - field: trigger.after.path operator: exists - field: trigger.after.status operator: is value: active Supported operators: Operator Meaning is / isNot Exact comparison after scalar normalization. in / notIn Check a value against an array. exists / missing Check whether a field has a value. contains Check whether a string contains text or an array contains a value. startsWith String prefix check. before / after Date comparison. onOrBefore / onOrAfter Inclusive date comparison. Step-level conditions use the same shape: steps: - id: warn type: notice.show if: - field: steps.dependencies.tasks[0].path operator: exists input: message: \"This task still has dependencies.\" References# References use constrained template expressions. Arbitrary JavaScript is not evaluated. {{workflow.id}} {{workflow.name}} {{trigger.after.path}} {{trigger.changes.status.after}} {{steps.query.tasks}} {{steps.parents.tasks[0].path}} {{item.path}} {{today}} {{now}} If a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified. Use forEach when a step should run once per item: steps: - id: overdue type: task.query input: query: where: all: - field: task.due op: lt value: fn: today - field: task.status op: notIn value: - done - cancelled sort: - field: task.due direction: asc limit: 50 scope: includeArchived: false - id: mark-high type: task.patch forEach: \"{{steps.overdue.tasks}}\" input: task: \"{{item.path}}\" patch: priority: high When a step uses forEach, {{item}} refers to the current item and the step output becomes an array of per-item outputs. task.query uses the canonical TaskNotes runtime query DTO. Its output includes tasks, count, total, matched, returned, groups, groupPaths, query, and warnings. Runtime query conditions use canonical field IDs and operators: query: where: all: - field: task.status op: ne value: done - any: - field: task.due op: lte value: fn: today - field: task.priority op: eq value: high sort: - field: task.due direction: asc group: - field: task.status limit: 25 scope: includeArchived: false Common fields include task.status, task.priority, task.due, task.scheduled, task.projects, task.contexts, task.tags, task.isBlocked, and file.path. Operators include eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Use api.catalog.filterProperties() and api.catalog.filterOperators() for the complete runtime catalog. Steps# Steps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers. Task read steps: Step Output task.get One task. task.query Tasks matching a canonical TaskNotes runtime query. task.parents Parent tasks linked from the task's projects. task.subtasks Tasks that reference the current task as a project. task.dependencies Dependencies stored in blockedBy, with resolved task data when available. task.blocking Tasks blocked by the current task. task.relationships The task plus parents, subtasks, dependencies, and blocking tasks. Task write steps: Step Purpose task.create Create a new TaskNotes task. task.patch Update one or more fields. task.set Set one field. task.move Move the task note to a target folder. task.archive / task.unarchive Archive or unarchive a task. task.complete / task.uncomplete Complete or reopen a task. task.reschedule Update planning dates. task.setDue / task.clearDue Set or clear due date. task.setScheduled / task.clearScheduled Set or clear scheduled date. task.addTag / task.removeTag Mutate tags. task.addProject / task.removeProject Mutate project links. task.addContext / task.removeContext Mutate contexts. task.addDependency / task.removeDependency Mutate blocking dependencies. Time and utility steps: Step Purpose time.start Start time tracking for a task. time.stop Stop active time tracking for a task. time.appendEntry Append a time entry. notice.show Show an Obsidian notice. workflow.stop Stop a workflow early. Companion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension: const tasknotes = app.plugins.getPlugin(\"tasknotes\")?.api; const workflows = tasknotes?.extensions.get(\"tasknotes-workflows\"); const steps = workflows?.listStepDefinitions(); Run Policy# Every workflow has a run policy: run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop timeout: 30s Field Notes mode Currently sequential. Steps run in order. noOverlap Skips a new run if the same workflow is already running. source Mutation source passed to TaskNotes runtime API calls. maxTasks Safety limit for forEach batch steps. onError stop or continue. timeout Optional duration string. TaskNotes attaches source, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops. Run Logs and Debugging# Workflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings. Run records include: Workflow id, name, and source path. Trigger payload. Step statuses. Inputs and outputs, depending on the configured log level. Error text when a run fails. Use dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files. Example: Manual Command Workflow# This workflow can be run from the command palette after it is enabled: --- type: tasknotes-workflow schemaVersion: 1 id: show-active-count name: Show active task count enabled: true description: Show a notice with the number of active tasks. triggers: - id: manual type: manual steps: - id: active type: task.query input: query: where: field: task.status op: eq value: active limit: 25 scope: includeArchived: false - id: notice type: notice.show input: message: \"Active tasks: {{steps.active.count}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop --- # Show active task count Run this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`. Example: Inherit Parent Priority# This workflow copies priority from the first parent task when a task becomes a subtask: type: tasknotes-workflow schemaVersion: 1 id: inherit-subtask-priority name: Inherit subtask priority enabled: false triggers: - id: projects-changed type: tasknotes.event event: task.projects.changed - id: task-created type: tasknotes.event event: task.created conditions: - field: trigger.after.path operator: exists - field: trigger.after.projects operator: exists steps: - id: parents type: task.parents input: task: \"{{trigger.after.path}}\" - id: inherit-priority type: task.patch if: - field: steps.parents.tasks[0].priority operator: exists input: task: \"{{trigger.after.path}}\" patch: priority: \"{{steps.parents.tasks[0].priority}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop This pattern uses task.parents rather than trying to parse project links manually. Authoring Guidelines# When writing workflow notes: Start with enabled: false fo"},{"route":"/obsidian/core-concepts/","title":"Core Concepts","description":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/core-concepts.md","namespace":"obsidian","relativePath":"core-concepts.md","raw":"# Core Concepts\n\nTaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.\n\n## The Note-Per-Task Approach\n\nIndividual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool.\n\n### Task Structure\n\nA TaskNotes task is a standard Markdown file with YAML frontmatter:\n\n```markdown\n---\ntags:\n - task\ntitle: Review quarterly report\nstatus: in-progress\npriority: high\ndue: 2025-01-15\nscheduled: 2025-01-14\ncontexts:\n - office\nprojects:\n - \"[[Q1 Planning]]\"\n---\n\n## Notes\n\nKey points to review:\n- Revenue projections\n- Budget allocations\n\n## Meeting Notes\n\nDiscussion with finance team on 2025-01-10...\n```\n\nThe frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents.\n\n### Obsidian Integration\n\nSince tasks are proper notes, they work with Obsidian's core features:\n\n- **Backlinks**: See which notes reference a task\n- **Graph View**: Visualize task relationships and project connections\n- **Tags**: Use Obsidian's tag system for additional categorization\n- **Search**: Find tasks using Obsidian's search\n- **Links**: Reference tasks from daily notes, meeting notes, or project documents\n\nThis approach creates many small files. TaskNotes stores tasks in a configurable folder (default: `TaskNotes/Tasks/`) to keep them organized.\nIn practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top.\n\n## YAML Frontmatter\n\nTask properties are stored in YAML frontmatter, a standard format with broad tool support.\nTreat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body.\n\n### Property Types\n\nTaskNotes uses several property types:\n\n| Type | Example | Description |\n|------|---------|-------------|\n| Text | `title: Buy groceries` | Single text value |\n| List | `tags: [work, urgent]` | Multiple values |\n| Date | `due: 2025-01-15` | ISO 8601 date format |\n| DateTime | `scheduled: 2025-01-15T09:00` | Date with time |\n| Link | `projects: [\"[[Project A]]\"]` | Obsidian wikilinks |\n| Number | `timeEstimate: 60` | Numeric values (minutes) |\n\n### Field Mapping\n\nProperty keys are configurable. If your vault uses `deadline` instead of `due`, you can map TaskNotes to use your existing field names without modifying your files.\n\nThe exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the [TaskNotes Specification](spec.md). The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data.\n\n### Custom Fields\n\nAdd any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in `Settings -> TaskNotes -> Task Properties` to include them in task modals and views.\n\n## Bases Integration\n\nTaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides:\n\n- **Filtering**: Query tasks using AND/OR conditions\n- **Sorting**: Order tasks by any property\n- **Grouping**: Organize tasks by status, priority, project, or custom fields\n- **Views**: Task List, Kanban, Calendar, and Agenda are all Bases views\n\nViews are stored as `.base` files in `TaskNotes/Views/`. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files.\nThis makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the `.base` file and see exactly which filter or grouping rule produced that result.\n\n### Enabling Bases\n\nBases is a core plugin included with Obsidian 1.10.1+:\n\n1. Open `Settings -> Core Plugins`\n2. Enable \"Bases\"\n3. TaskNotes views will now function\n","aliases":["/core-concepts/"],"toc":[{"level":2,"id":"the-note-per-task-approach","text":"The Note-Per-Task Approach"},{"level":3,"id":"task-structure","text":"Task Structure"},{"level":3,"id":"obsidian-integration","text":"Obsidian Integration"},{"level":2,"id":"yaml-frontmatter","text":"YAML Frontmatter"},{"level":3,"id":"property-types","text":"Property Types"},{"level":3,"id":"field-mapping","text":"Field Mapping"},{"level":3,"id":"custom-fields","text":"Custom Fields"},{"level":2,"id":"bases-integration","text":"Bases Integration"},{"level":3,"id":"enabling-bases","text":"Enabling Bases"}],"html":"

TaskNotes follows the "one note per task" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.

\n

The Note-Per-Task Approach#

\n

Individual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool.

\n

Task Structure#

\n

A TaskNotes task is a standard Markdown file with YAML frontmatter:

\n
---\ntags:\n  - task\ntitle: Review quarterly report\nstatus: in-progress\npriority: high\ndue: 2025-01-15\nscheduled: 2025-01-14\ncontexts:\n  - office\nprojects:\n  - "[[Q1 Planning]]"\n---\n\n## Notes\n\nKey points to review:\n- Revenue projections\n- Budget allocations\n\n## Meeting Notes\n\nDiscussion with finance team on 2025-01-10...\n

The frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents.

\n

Obsidian Integration#

\n

Since tasks are proper notes, they work with Obsidian's core features:

\n
    \n
  • Backlinks: See which notes reference a task
  • \n
  • Graph View: Visualize task relationships and project connections
  • \n
  • Tags: Use Obsidian's tag system for additional categorization
  • \n
  • Search: Find tasks using Obsidian's search
  • \n
  • Links: Reference tasks from daily notes, meeting notes, or project documents
  • \n
\n

This approach creates many small files. TaskNotes stores tasks in a configurable folder (default: TaskNotes/Tasks/) to keep them organized.\nIn practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top.

\n

YAML Frontmatter#

\n

Task properties are stored in YAML frontmatter, a standard format with broad tool support.\nTreat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body.

\n

Property Types#

\n

TaskNotes uses several property types:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TypeExampleDescription
Texttitle: Buy groceriesSingle text value
Listtags: [work, urgent]Multiple values
Datedue: 2025-01-15ISO 8601 date format
DateTimescheduled: 2025-01-15T09:00Date with time
Linkprojects: ["[[Project A]]"]Obsidian wikilinks
NumbertimeEstimate: 60Numeric values (minutes)
\n

Field Mapping#

\n

Property keys are configurable. If your vault uses deadline instead of due, you can map TaskNotes to use your existing field names without modifying your files.

\n

The exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the TaskNotes Specification. The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data.

\n

Custom Fields#

\n

Add any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in Settings -> TaskNotes -> Task Properties to include them in task modals and views.

\n

Bases Integration#

\n

TaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides:

\n
    \n
  • Filtering: Query tasks using AND/OR conditions
  • \n
  • Sorting: Order tasks by any property
  • \n
  • Grouping: Organize tasks by status, priority, project, or custom fields
  • \n
  • Views: Task List, Kanban, Calendar, and Agenda are all Bases views
  • \n
\n

Views are stored as .base files in TaskNotes/Views/. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files.\nThis makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the .base file and see exactly which filter or grouping rule produced that result.

\n

Enabling Bases#

\n

Bases is a core plugin included with Obsidian 1.10.1+:

\n
    \n
  1. Open Settings -> Core Plugins
  2. \n
  3. Enable "Bases"
  4. \n
  5. TaskNotes views will now function
  6. \n
\n","text":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter. The Note-Per-Task Approach# Individual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool. Task Structure# A TaskNotes task is a standard Markdown file with YAML frontmatter: --- tags: - task title: Review quarterly report status: in-progress priority: high due: 2025-01-15 scheduled: 2025-01-14 contexts: - office projects: - \"[[Q1 Planning]]\" --- ## Notes Key points to review: - Revenue projections - Budget allocations ## Meeting Notes Discussion with finance team on 2025-01-10... The frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents. Obsidian Integration# Since tasks are proper notes, they work with Obsidian's core features: Backlinks: See which notes reference a task Graph View: Visualize task relationships and project connections Tags: Use Obsidian's tag system for additional categorization Search: Find tasks using Obsidian's search Links: Reference tasks from daily notes, meeting notes, or project documents This approach creates many small files. TaskNotes stores tasks in a configurable folder (default: TaskNotes/Tasks/) to keep them organized. In practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top. YAML Frontmatter# Task properties are stored in YAML frontmatter, a standard format with broad tool support. Treat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body. Property Types# TaskNotes uses several property types: Type Example Description Text title: Buy groceries Single text value List tags: [work, urgent] Multiple values Date due: 2025-01-15 ISO 8601 date format DateTime scheduled: 2025-01-15T09:00 Date with time Link projects: [\"[[Project A]]\"] Obsidian wikilinks Number timeEstimate: 60 Numeric values (minutes) Field Mapping# Property keys are configurable. If your vault uses deadline instead of due, you can map TaskNotes to use your existing field names without modifying your files. The exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the TaskNotes Specification. The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data. Custom Fields# Add any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in Settings -> TaskNotes -> Task Properties to include them in task modals and views. Bases Integration# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides: Filtering: Query tasks using AND/OR conditions Sorting: Order tasks by any property Grouping: Organize tasks by status, priority, project, or custom fields Views: Task List, Kanban, Calendar, and Agenda are all Bases views Views are stored as .base files in TaskNotes/Views/. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files. This makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the .base file and see exactly which filter or grouping rule produced that result. Enabling Bases# Bases is a core plugin included with Obsidian 1.10.1+: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes views will now function"},{"route":"/obsidian/features/","title":"Features","description":"TaskNotes includes task organization, time tracking, and calendar integration features.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features.md","namespace":"obsidian","relativePath":"features.md","raw":"# Features\n\nTaskNotes includes task organization, time tracking, and calendar integration features.\n\n## Task Management\n\nTaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases.\n\nReminders can be relative (for example, \"3 days before due\") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance.\n\nSee [Task Management](features/task-management.md) for details.\nFor recurrence behavior, see [Recurring Tasks](features/recurring-tasks.md).\nFor reminder setup and data format, see [Task Reminders](features/reminders.md).\n\n## Filtering and Views\n\nTaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a `.base` file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state.\n\nThis design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault.\n\n![Kanban view](assets/views-kanban.png)\n\nFor details on how Bases integration works, see [Core Concepts](core-concepts.md#bases-integration). For Bases syntax documentation, see the [official Obsidian Bases documentation](https://help.obsidian.md/Bases/Introduction+to+Bases).\n\n## Inline Task Integration\n\nInline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place.\n\nNatural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data.\n\nSee [Inline Task Integration](features/inline-tasks.md) for details.\n\n## Time Management\n\nTime tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution.\n\n![Pomodoro timer](assets/feature-pomodoro-timer.png)\n\nSee [Time Management](features/time-management.md) for details.\n\n## Calendar Integration\n\nTaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly.\n\nFor planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace.\n\n![Calendar month view](assets/views-calendar-month.png)\n\nSee [Calendar Integration](features/calendar-integration.md) for details.\n\n## User Fields\n\nUser fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas.\n\nSee [User Fields](features/user-fields.md) for details.\n\n## Integrations\n\nBeyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling.\n\nSee [Integrations](settings/integrations.md) for details.\n\n## Companion Plugins\n\nTaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. [Canvas Bases](companion-plugins/canvas-bases.md) is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. [TaskNotes Workflows](companion-plugins/tasknotes-workflows.md) adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions.\n\nSee [Companion Plugins](companion-plugins.md) for details.\n\n## REST API\n\nExternal applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools.\n\nSee [HTTP API](HTTP_API.md) for details.\n","aliases":["/features/"],"toc":[{"level":2,"id":"task-management","text":"Task Management"},{"level":2,"id":"filtering-and-views","text":"Filtering and Views"},{"level":2,"id":"inline-task-integration","text":"Inline Task Integration"},{"level":2,"id":"time-management","text":"Time Management"},{"level":2,"id":"calendar-integration","text":"Calendar Integration"},{"level":2,"id":"user-fields","text":"User Fields"},{"level":2,"id":"integrations","text":"Integrations"},{"level":2,"id":"companion-plugins","text":"Companion Plugins"},{"level":2,"id":"rest-api","text":"REST API"}],"html":"

TaskNotes includes task organization, time tracking, and calendar integration features.

\n

Task Management#

\n

TaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases.

\n

Reminders can be relative (for example, "3 days before due") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance.

\n

See Task Management for details.\nFor recurrence behavior, see Recurring Tasks.\nFor reminder setup and data format, see Task Reminders.

\n

Filtering and Views#

\n

TaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a .base file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state.

\n

This design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault.

\n

\"Kanban

\n

For details on how Bases integration works, see Core Concepts. For Bases syntax documentation, see the official Obsidian Bases documentation.

\n

Inline Task Integration#

\n

Inline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place.

\n

Natural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data.

\n

See Inline Task Integration for details.

\n

Time Management#

\n

Time tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution.

\n

\"Pomodoro

\n

See Time Management for details.

\n

Calendar Integration#

\n

TaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly.

\n

For planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace.

\n

\"Calendar

\n

See Calendar Integration for details.

\n

User Fields#

\n

User fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas.

\n

See User Fields for details.

\n

Integrations#

\n

Beyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling.

\n

See Integrations for details.

\n

Companion Plugins#

\n

TaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. Canvas Bases is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. TaskNotes Workflows adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions.

\n

See Companion Plugins for details.

\n

REST API#

\n

External applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools.

\n

See HTTP API for details.

\n","text":"TaskNotes includes task organization, time tracking, and calendar integration features. Task Management# TaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases. Reminders can be relative (for example, \"3 days before due\") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance. See Task Management for details. For recurrence behavior, see Recurring Tasks. For reminder setup and data format, see Task Reminders. Filtering and Views# TaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a .base file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state. This design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault. For details on how Bases integration works, see Core Concepts. For Bases syntax documentation, see the official Obsidian Bases documentation. Inline Task Integration# Inline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place. Natural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data. See Inline Task Integration for details. Time Management# Time tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution. See Time Management for details. Calendar Integration# TaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly. For planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace. See Calendar Integration for details. User Fields# User fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas. See User Fields for details. Integrations# Beyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling. See Integrations for details. Companion Plugins# TaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. Canvas Bases is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. TaskNotes Workflows adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions. See Companion Plugins for details. REST API# External applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools. See HTTP API for details."},{"route":"/obsidian/features/calendar-integration/","title":"Calendar Integration","description":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/calendar-integration.md","namespace":"obsidian","relativePath":"features/calendar-integration.md","raw":"# Calendar Integration\n\nTaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.\n\n## OAuth Calendar Integration\n\nTaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider.\n\n### Supported Providers\n\n- **Google Calendar** - OAuth 2.0 authentication with access to all calendars in your Google account\n- **Microsoft Outlook** - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account\n\n### Setup Requirements\n\nOAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to:\n\n1. Create an OAuth application in Google Cloud Console or Microsoft Azure Portal\n2. Configure redirect URIs and scopes\n3. Obtain client ID and client secret\n4. Enter credentials in TaskNotes settings (`Settings -> TaskNotes -> Integrations`, OAuth calendar section)\n\n### Synchronization Behavior\n\n- Events are fetched automatically every 15 minutes\n- Events are also fetched when local changes occur (task creation, updates, rescheduling)\n- Dragging calendar events to new dates/times updates the event in the calendar provider\n- Per-calendar visibility toggles allow selective display of calendars\n- Access tokens are automatically refreshed when expired\n\n### Token Management\n\nTaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' `data.json`. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings.\n\n## Calendar Views\n\nTaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling.\n\nFor detailed view documentation, see [Calendar Views](../views/calendar-views.md).\n\nNotes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in [Integrations settings](../settings/integrations.md#calendar-subscriptions-ics).\n\n## Time Entry Editor\n\nTaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View.\n\n### Creating Time Entries\n\nTo create a time entry on the Calendar View:\n\n1. Click and drag on a time slot in the calendar to select a time range\n2. When the selection menu appears, choose **Create time entry** (timeblock appears only if the feature is enabled)\n3. Choose a task in the task selector modal\n4. A time entry is created for that task with the selected start/end range\n\nTime entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task.\n\n### Managing Time Entries\n\nThe time entry editor modal provides functions to:\n\n- View all time entries for a task\n- Edit the start time, end time, and duration of time entries\n- Delete time entries\n- See the total time tracked across all entries for a task\n\nAccess the time entry editor by clicking an existing time entry in the calendar.\n\n## ICS Calendar Subscriptions\n\nTaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar.\n\nAdd and manage ICS subscriptions from `Settings -> TaskNotes -> Integrations` (Calendar Subscriptions section).\n\nFor details on creating notes and tasks from calendar events, see [ICS Integration](ics-integration.md).\n\n## Time Blocking\n\nThe Calendar View supports time blocking for scheduling dedicated work periods. To create a time block:\n\n1. Click and drag on a time slot in the calendar to select a time range\n2. A context menu will appear with available options\n3. Select \"Create timeblock\" from the menu (this option only appears if timeblocking is enabled in settings)\n\nTime blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes.\n\nEnable time blocking under `Settings -> TaskNotes -> Features` (Timeblocking section).\n","aliases":["/features/calendar-integration/"],"toc":[{"level":2,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"supported-providers","text":"Supported Providers"},{"level":3,"id":"setup-requirements","text":"Setup Requirements"},{"level":3,"id":"synchronization-behavior","text":"Synchronization Behavior"},{"level":3,"id":"token-management","text":"Token Management"},{"level":2,"id":"calendar-views","text":"Calendar Views"},{"level":2,"id":"time-entry-editor","text":"Time Entry Editor"},{"level":3,"id":"creating-time-entries","text":"Creating Time Entries"},{"level":3,"id":"managing-time-entries","text":"Managing Time Entries"},{"level":2,"id":"ics-calendar-subscriptions","text":"ICS Calendar Subscriptions"},{"level":2,"id":"time-blocking","text":"Time Blocking"}],"html":"

TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.

\n

OAuth Calendar Integration#

\n

TaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider.

\n

Supported Providers#

\n
    \n
  • Google Calendar - OAuth 2.0 authentication with access to all calendars in your Google account
  • \n
  • Microsoft Outlook - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account
  • \n
\n

Setup Requirements#

\n

OAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to:

\n
    \n
  1. Create an OAuth application in Google Cloud Console or Microsoft Azure Portal
  2. \n
  3. Configure redirect URIs and scopes
  4. \n
  5. Obtain client ID and client secret
  6. \n
  7. Enter credentials in TaskNotes settings (Settings -> TaskNotes -> Integrations, OAuth calendar section)
  8. \n
\n

Synchronization Behavior#

\n
    \n
  • Events are fetched automatically every 15 minutes
  • \n
  • Events are also fetched when local changes occur (task creation, updates, rescheduling)
  • \n
  • Dragging calendar events to new dates/times updates the event in the calendar provider
  • \n
  • Per-calendar visibility toggles allow selective display of calendars
  • \n
  • Access tokens are automatically refreshed when expired
  • \n
\n

Token Management#

\n

TaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' data.json. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings.

\n

Calendar Views#

\n

TaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling.

\n

For detailed view documentation, see Calendar Views.

\n

Notes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in Integrations settings.

\n

Time Entry Editor#

\n

TaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View.

\n

Creating Time Entries#

\n

To create a time entry on the Calendar View:

\n
    \n
  1. Click and drag on a time slot in the calendar to select a time range
  2. \n
  3. When the selection menu appears, choose Create time entry (timeblock appears only if the feature is enabled)
  4. \n
  5. Choose a task in the task selector modal
  6. \n
  7. A time entry is created for that task with the selected start/end range
  8. \n
\n

Time entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task.

\n

Managing Time Entries#

\n

The time entry editor modal provides functions to:

\n
    \n
  • View all time entries for a task
  • \n
  • Edit the start time, end time, and duration of time entries
  • \n
  • Delete time entries
  • \n
  • See the total time tracked across all entries for a task
  • \n
\n

Access the time entry editor by clicking an existing time entry in the calendar.

\n

ICS Calendar Subscriptions#

\n

TaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar.

\n

Add and manage ICS subscriptions from Settings -> TaskNotes -> Integrations (Calendar Subscriptions section).

\n

For details on creating notes and tasks from calendar events, see ICS Integration.

\n

Time Blocking#

\n

The Calendar View supports time blocking for scheduling dedicated work periods. To create a time block:

\n
    \n
  1. Click and drag on a time slot in the calendar to select a time range
  2. \n
  3. A context menu will appear with available options
  4. \n
  5. Select "Create timeblock" from the menu (this option only appears if timeblocking is enabled in settings)
  6. \n
\n

Time blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes.

\n

Enable time blocking under Settings -> TaskNotes -> Features (Timeblocking section).

\n","text":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions. OAuth Calendar Integration# TaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider. Supported Providers# Google Calendar - OAuth 2.0 authentication with access to all calendars in your Google account Microsoft Outlook - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account Setup Requirements# OAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to: Create an OAuth application in Google Cloud Console or Microsoft Azure Portal Configure redirect URIs and scopes Obtain client ID and client secret Enter credentials in TaskNotes settings (Settings -> TaskNotes -> Integrations, OAuth calendar section) Synchronization Behavior# Events are fetched automatically every 15 minutes Events are also fetched when local changes occur (task creation, updates, rescheduling) Dragging calendar events to new dates/times updates the event in the calendar provider Per-calendar visibility toggles allow selective display of calendars Access tokens are automatically refreshed when expired Token Management# TaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' data.json. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings. Calendar Views# TaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling. For detailed view documentation, see Calendar Views. Notes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in Integrations settings. Time Entry Editor# TaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View. Creating Time Entries# To create a time entry on the Calendar View: Click and drag on a time slot in the calendar to select a time range When the selection menu appears, choose Create time entry (timeblock appears only if the feature is enabled) Choose a task in the task selector modal A time entry is created for that task with the selected start/end range Time entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task. Managing Time Entries# The time entry editor modal provides functions to: View all time entries for a task Edit the start time, end time, and duration of time entries Delete time entries See the total time tracked across all entries for a task Access the time entry editor by clicking an existing time entry in the calendar. ICS Calendar Subscriptions# TaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar. Add and manage ICS subscriptions from Settings -> TaskNotes -> Integrations (Calendar Subscriptions section). For details on creating notes and tasks from calendar events, see ICS Integration. Time Blocking# The Calendar View supports time blocking for scheduling dedicated work periods. To create a time block: Click and drag on a time slot in the calendar to select a time range A context menu will appear with available options Select \"Create timeblock\" from the menu (this option only appears if timeblocking is enabled in settings) Time blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes. Enable time blocking under Settings -> TaskNotes -> Features (Timeblocking section)."},{"route":"/obsidian/features/ics-integration/","title":"ICS Calendar Event Integration","description":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/ics-integration.md","namespace":"obsidian","relativePath":"features/ics-integration.md","raw":"# ICS Calendar Event Integration\n\nTaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries.\nICS integration creates linked notes and tasks from event data without manual re-entry.\n\n## Overview\n\nThe ICS integration allows you to:\n\n- View detailed information about calendar events\n- Create notes from calendar events with customizable templates\n- Generate tasks from events with proper scheduling and context\n- Link existing vault content to calendar events\n- Maintain relationships between events and created content\nEvent context, notes, and follow-up tasks remain connected through frontmatter links.\n\n## Event Information Modal\n\nWhen you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides:\n\n### Event Details\n\n- Event title and description\n- Start and end times (formatted according to your locale)\n- Location information\n- Source calendar name\n- Event URL (if available)\n\n### Related Content\n\nThe modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as:\n\n- **Task** - Files containing the configured task tag\n- **Note** - Files without the task tag\n\nThe relationship is maintained through the ICS Event ID field in the content's frontmatter.\n\n### Available Actions\n\n**Create Note** - Opens a creation dialog for generating a new note from the event data.\n\n**Create Task** - Creates a task immediately using the event information with default settings.\n\n**Link Note** - Opens a file selection dialog to link an existing note to the calendar event.\n\n**Refresh** - Reloads the list of related content to reflect recent changes.\n\n## Note Creation from Events\n\nThe note creation process allows customization of the generated content:\n\n### Basic Settings\n\n- **Title** - Default combines event title and date, but can be modified\n- **Folder** - Destination for the new note (uses default ICS note folder if configured)\n- **Template** - Optional template file to structure the note content\n\n### Template Usage\n\nWhen a template is specified:\n\n- The template file is processed with ICS-specific variables\n- Standard TaskNotes template variables are also available\n- Template content replaces the default event description format\n- Frontmatter from templates is merged with required ICS fields\nTemplates apply a consistent note structure across imported events.\n\n### Default Content\n\nWithout a template, notes include:\n\n- Event title as the main heading\n- Formatted start and end times\n- Location information\n- Source calendar name\n- Event description (if provided)\n- Event URL (if available)\n\n## Task Creation from Events\n\nTasks created from calendar events include relevant event data:\n\n### Scheduled Date and Time\n\nTasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing.\n\n### Task Properties\n\n- **Title** - Uses the event title\n- **Status** - Set to the default task status configured in settings\n- **Priority** - Set to the default task priority\n- **Contexts** - Event location is added as a context (if provided)\n- **Time Estimate** - Calculated from event duration (if start and end times are available)\n- **Tags** - Includes the ICS event tag and any default task tags\nAfter creation, priority, status, and schedule can be edited if event data does not match the final task plan.\n\n### Content\n\nTask content includes formatted event details similar to note creation, providing context about the original calendar event.\n\n## Linking Existing Content\n\nYou can establish connections between existing vault content and calendar events:\n\n### Link Process\n\n1. Select an existing markdown file from your vault\n2. The file's frontmatter is updated to include the event ID\n3. The modification date is updated to reflect the change\n4. The connection appears in the related content list\n\n### Bidirectional References\n\n- Calendar events can display all linked content\n- Content files maintain references to their associated events\n- Multiple pieces of content can be linked to a single event\n- Content can be linked to multiple events (stored as an array)\n\n## Field Mapping Integration\n\nThe ICS integration extends the field mapping system with two new fields:\n\n### ICS Event ID Field\n\n- Stores the unique identifier connecting content to calendar events\n- Default field name is `icsEventId`\n- Values are stored as arrays to support multiple event associations\n- Field name can be customized through field mapping settings\n\n### ICS Event Tag Field\n\n- Tag automatically applied to content created from events\n- Default tag is `ics_event`\n- Used to identify ICS-related content throughout the system\n- Can be customized through field mapping settings\n\n## Template Variables\n\nTemplates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables:\n\n### Event Information\n\n- `{{icsEventTitle}}` - Event title\n- `{{icsEventStart}}` - Start date and time (ISO format)\n- `{{icsEventEnd}}` - End date and time (ISO format)\n- `{{icsEventLocation}}` - Event location\n- `{{icsEventDescription}}` - Event description\n- `{{icsEventUrl}}` - Event URL\n- `{{icsEventSubscription}}` - Calendar subscription name\n- `{{icsEventId}}` - Unique event identifier\n\n### Standard Variables\n\nAll standard TaskNotes template variables remain available:\n- `{{title}}`, `{{date}}`, `{{time}}`\n- `{{priority}}`, `{{status}}`, `{{contexts}}`\n- And others as documented in the template system\n\n## Configuration\n\nICS integration settings are located under `Settings -> TaskNotes -> Integrations`:\n\n### Default Templates\n\nConfigure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified.\n\n### Default Folders\n\nSet destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired.\n\nFolder paths support template variables for dynamic organization:\n\n- Date variables: `{{year}}`, `{{month}}`, `{{day}}`, `{{monthName}}`, etc.\n- ICS event variables: `{{icsEventTitle}}`, `{{icsEventLocation}}`, `{{icsEventDescription}}`\n- Other variables: See template variables section below\n\nExample folder paths:\n\n- `Daily/{{year}}/{{month}}/{{day}}` creates date-based hierarchy\n- `Events/{{year}}/{{icsEventTitle}}` organizes by year and event title\n- `Meetings/{{monthName}}` groups by month name\n\n### Filename Formats\n\nThe system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content.\n\n## Technical Implementation\n\n### Event Identification\n\nCalendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change.\n\n### Content Type Detection\n\nThe system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions.\n\n### Error Handling\n\nThe integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow.\n","aliases":["/features/ics-integration/"],"toc":[{"level":2,"id":"overview","text":"Overview"},{"level":2,"id":"event-information-modal","text":"Event Information Modal"},{"level":3,"id":"event-details","text":"Event Details"},{"level":3,"id":"related-content","text":"Related Content"},{"level":3,"id":"available-actions","text":"Available Actions"},{"level":2,"id":"note-creation-from-events","text":"Note Creation from Events"},{"level":3,"id":"basic-settings","text":"Basic Settings"},{"level":3,"id":"template-usage","text":"Template Usage"},{"level":3,"id":"default-content","text":"Default Content"},{"level":2,"id":"task-creation-from-events","text":"Task Creation from Events"},{"level":3,"id":"scheduled-date-and-time","text":"Scheduled Date and Time"},{"level":3,"id":"task-properties","text":"Task Properties"},{"level":3,"id":"content","text":"Content"},{"level":2,"id":"linking-existing-content","text":"Linking Existing Content"},{"level":3,"id":"link-process","text":"Link Process"},{"level":3,"id":"bidirectional-references","text":"Bidirectional References"},{"level":2,"id":"field-mapping-integration","text":"Field Mapping Integration"},{"level":3,"id":"ics-event-id-field","text":"ICS Event ID Field"},{"level":3,"id":"ics-event-tag-field","text":"ICS Event Tag Field"},{"level":2,"id":"template-variables","text":"Template Variables"},{"level":3,"id":"event-information","text":"Event Information"},{"level":3,"id":"standard-variables","text":"Standard Variables"},{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"default-templates","text":"Default Templates"},{"level":3,"id":"default-folders","text":"Default Folders"},{"level":3,"id":"filename-formats","text":"Filename Formats"},{"level":2,"id":"technical-implementation","text":"Technical Implementation"},{"level":3,"id":"event-identification","text":"Event Identification"},{"level":3,"id":"content-type-detection","text":"Content Type Detection"},{"level":3,"id":"error-handling","text":"Error Handling"}],"html":"

TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries.\nICS integration creates linked notes and tasks from event data without manual re-entry.

\n

Overview#

\n

The ICS integration allows you to:

\n
    \n
  • View detailed information about calendar events
  • \n
  • Create notes from calendar events with customizable templates
  • \n
  • Generate tasks from events with proper scheduling and context
  • \n
  • Link existing vault content to calendar events
  • \n
  • Maintain relationships between events and created content\nEvent context, notes, and follow-up tasks remain connected through frontmatter links.
  • \n
\n

Event Information Modal#

\n

When you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides:

\n

Event Details#

\n
    \n
  • Event title and description
  • \n
  • Start and end times (formatted according to your locale)
  • \n
  • Location information
  • \n
  • Source calendar name
  • \n
  • Event URL (if available)
  • \n
\n

Related Content#

\n

The modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as:

\n
    \n
  • Task - Files containing the configured task tag
  • \n
  • Note - Files without the task tag
  • \n
\n

The relationship is maintained through the ICS Event ID field in the content's frontmatter.

\n

Available Actions#

\n

Create Note - Opens a creation dialog for generating a new note from the event data.

\n

Create Task - Creates a task immediately using the event information with default settings.

\n

Link Note - Opens a file selection dialog to link an existing note to the calendar event.

\n

Refresh - Reloads the list of related content to reflect recent changes.

\n

Note Creation from Events#

\n

The note creation process allows customization of the generated content:

\n

Basic Settings#

\n
    \n
  • Title - Default combines event title and date, but can be modified
  • \n
  • Folder - Destination for the new note (uses default ICS note folder if configured)
  • \n
  • Template - Optional template file to structure the note content
  • \n
\n

Template Usage#

\n

When a template is specified:

\n
    \n
  • The template file is processed with ICS-specific variables
  • \n
  • Standard TaskNotes template variables are also available
  • \n
  • Template content replaces the default event description format
  • \n
  • Frontmatter from templates is merged with required ICS fields\nTemplates apply a consistent note structure across imported events.
  • \n
\n

Default Content#

\n

Without a template, notes include:

\n
    \n
  • Event title as the main heading
  • \n
  • Formatted start and end times
  • \n
  • Location information
  • \n
  • Source calendar name
  • \n
  • Event description (if provided)
  • \n
  • Event URL (if available)
  • \n
\n

Task Creation from Events#

\n

Tasks created from calendar events include relevant event data:

\n

Scheduled Date and Time#

\n

Tasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing.

\n

Task Properties#

\n
    \n
  • Title - Uses the event title
  • \n
  • Status - Set to the default task status configured in settings
  • \n
  • Priority - Set to the default task priority
  • \n
  • Contexts - Event location is added as a context (if provided)
  • \n
  • Time Estimate - Calculated from event duration (if start and end times are available)
  • \n
  • Tags - Includes the ICS event tag and any default task tags\nAfter creation, priority, status, and schedule can be edited if event data does not match the final task plan.
  • \n
\n

Content#

\n

Task content includes formatted event details similar to note creation, providing context about the original calendar event.

\n

Linking Existing Content#

\n

You can establish connections between existing vault content and calendar events:

\n\n
    \n
  1. Select an existing markdown file from your vault
  2. \n
  3. The file's frontmatter is updated to include the event ID
  4. \n
  5. The modification date is updated to reflect the change
  6. \n
  7. The connection appears in the related content list
  8. \n
\n

Bidirectional References#

\n
    \n
  • Calendar events can display all linked content
  • \n
  • Content files maintain references to their associated events
  • \n
  • Multiple pieces of content can be linked to a single event
  • \n
  • Content can be linked to multiple events (stored as an array)
  • \n
\n

Field Mapping Integration#

\n

The ICS integration extends the field mapping system with two new fields:

\n

ICS Event ID Field#

\n
    \n
  • Stores the unique identifier connecting content to calendar events
  • \n
  • Default field name is icsEventId
  • \n
  • Values are stored as arrays to support multiple event associations
  • \n
  • Field name can be customized through field mapping settings
  • \n
\n

ICS Event Tag Field#

\n
    \n
  • Tag automatically applied to content created from events
  • \n
  • Default tag is ics_event
  • \n
  • Used to identify ICS-related content throughout the system
  • \n
  • Can be customized through field mapping settings
  • \n
\n

Template Variables#

\n

Templates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables:

\n

Event Information#

\n
    \n
  • {{icsEventTitle}} - Event title
  • \n
  • {{icsEventStart}} - Start date and time (ISO format)
  • \n
  • {{icsEventEnd}} - End date and time (ISO format)
  • \n
  • {{icsEventLocation}} - Event location
  • \n
  • {{icsEventDescription}} - Event description
  • \n
  • {{icsEventUrl}} - Event URL
  • \n
  • {{icsEventSubscription}} - Calendar subscription name
  • \n
  • {{icsEventId}} - Unique event identifier
  • \n
\n

Standard Variables#

\n

All standard TaskNotes template variables remain available:

\n
    \n
  • {{title}}, {{date}}, {{time}}
  • \n
  • {{priority}}, {{status}}, {{contexts}}
  • \n
  • And others as documented in the template system
  • \n
\n

Configuration#

\n

ICS integration settings are located under Settings -> TaskNotes -> Integrations:

\n

Default Templates#

\n

Configure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified.

\n

Default Folders#

\n

Set destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired.

\n

Folder paths support template variables for dynamic organization:

\n
    \n
  • Date variables: {{year}}, {{month}}, {{day}}, {{monthName}}, etc.
  • \n
  • ICS event variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}}
  • \n
  • Other variables: See template variables section below
  • \n
\n

Example folder paths:

\n
    \n
  • Daily/{{year}}/{{month}}/{{day}} creates date-based hierarchy
  • \n
  • Events/{{year}}/{{icsEventTitle}} organizes by year and event title
  • \n
  • Meetings/{{monthName}} groups by month name
  • \n
\n

Filename Formats#

\n

The system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content.

\n

Technical Implementation#

\n

Event Identification#

\n

Calendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change.

\n

Content Type Detection#

\n

The system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions.

\n

Error Handling#

\n

The integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow.

\n","text":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-entry. Overview# The ICS integration allows you to: View detailed information about calendar events Create notes from calendar events with customizable templates Generate tasks from events with proper scheduling and context Link existing vault content to calendar events Maintain relationships between events and created content Event context, notes, and follow-up tasks remain connected through frontmatter links. Event Information Modal# When you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides: Event Details# Event title and description Start and end times (formatted according to your locale) Location information Source calendar name Event URL (if available) Related Content# The modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as: Task - Files containing the configured task tag Note - Files without the task tag The relationship is maintained through the ICS Event ID field in the content's frontmatter. Available Actions# Create Note - Opens a creation dialog for generating a new note from the event data. Create Task - Creates a task immediately using the event information with default settings. Link Note - Opens a file selection dialog to link an existing note to the calendar event. Refresh - Reloads the list of related content to reflect recent changes. Note Creation from Events# The note creation process allows customization of the generated content: Basic Settings# Title - Default combines event title and date, but can be modified Folder - Destination for the new note (uses default ICS note folder if configured) Template - Optional template file to structure the note content Template Usage# When a template is specified: The template file is processed with ICS-specific variables Standard TaskNotes template variables are also available Template content replaces the default event description format Frontmatter from templates is merged with required ICS fields Templates apply a consistent note structure across imported events. Default Content# Without a template, notes include: Event title as the main heading Formatted start and end times Location information Source calendar name Event description (if provided) Event URL (if available) Task Creation from Events# Tasks created from calendar events include relevant event data: Scheduled Date and Time# Tasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing. Task Properties# Title - Uses the event title Status - Set to the default task status configured in settings Priority - Set to the default task priority Contexts - Event location is added as a context (if provided) Time Estimate - Calculated from event duration (if start and end times are available) Tags - Includes the ICS event tag and any default task tags After creation, priority, status, and schedule can be edited if event data does not match the final task plan. Content# Task content includes formatted event details similar to note creation, providing context about the original calendar event. Linking Existing Content# You can establish connections between existing vault content and calendar events: Link Process# Select an existing markdown file from your vault The file's frontmatter is updated to include the event ID The modification date is updated to reflect the change The connection appears in the related content list Bidirectional References# Calendar events can display all linked content Content files maintain references to their associated events Multiple pieces of content can be linked to a single event Content can be linked to multiple events (stored as an array) Field Mapping Integration# The ICS integration extends the field mapping system with two new fields: ICS Event ID Field# Stores the unique identifier connecting content to calendar events Default field name is icsEventId Values are stored as arrays to support multiple event associations Field name can be customized through field mapping settings ICS Event Tag Field# Tag automatically applied to content created from events Default tag is ics_event Used to identify ICS-related content throughout the system Can be customized through field mapping settings Template Variables# Templates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables: Event Information# {{icsEventTitle}} - Event title {{icsEventStart}} - Start date and time (ISO format) {{icsEventEnd}} - End date and time (ISO format) {{icsEventLocation}} - Event location {{icsEventDescription}} - Event description {{icsEventUrl}} - Event URL {{icsEventSubscription}} - Calendar subscription name {{icsEventId}} - Unique event identifier Standard Variables# All standard TaskNotes template variables remain available: {{title}}, {{date}}, {{time}} {{priority}}, {{status}}, {{contexts}} And others as documented in the template system Configuration# ICS integration settings are located under Settings -> TaskNotes -> Integrations: Default Templates# Configure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified. Default Folders# Set destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired. Folder paths support template variables for dynamic organization: Date variables: {{year}}, {{month}}, {{day}}, {{monthName}}, etc. ICS event variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Other variables: See template variables section below Example folder paths: Daily/{{year}}/{{month}}/{{day}} creates date-based hierarchy Events/{{year}}/{{icsEventTitle}} organizes by year and event title Meetings/{{monthName}} groups by month name Filename Formats# The system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content. Technical Implementation# Event Identification# Calendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change. Content Type Detection# The system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions. Error Handling# The integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow."},{"route":"/obsidian/features/inline-tasks/","title":"Inline Task Integration","description":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes,...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/inline-tasks.md","namespace":"obsidian","relativePath":"features/inline-tasks.md","raw":"# Inline Task Integration\n\n\nTaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing.\nInline features support capture and task updates without leaving the current note.\n\n## Task Link Overlays\n\nWhen a wikilink to a task note is created, TaskNotes can replace it with an interactive **Task Link Overlay**. Enable or disable overlays from `Settings -> TaskNotes -> Features` (`Task link overlay`). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal.\n\n![Task Link Overlays in Live Preview mode](../assets/2025-07-17_21-03-55.png)\n\n*Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions*\n\n![Task Link Overlays in Source mode](../assets/2025-07-17_21-04-24.png)\n\n*In Source mode, task links appear as standard wikilinks until rendered*\n\n### Widget Features\n\nThe task link overlay displays:\n\n- **Status Dot**: Clickable circular indicator showing current task status. Click to cycle through available statuses.\n- **Priority Dot**: Color-coded indicator for task priority (only shown when assigned).\n- **Task Title**: Displays the task name (truncated to 80 characters). Click to open the task edit modal.\n- **Date Information**: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus.\n- **Recurrence Indicator**: Rotating arrow icon for recurring tasks with modification options.\n- **Action Menu**: Ellipsis icon (shown on hover) provides additional task actions.\nThe widget exposes common task actions at the link location, so status and metadata can be updated in-place.\n\n### Mode-Specific Behavior\n\nTask link overlays work in both Live Preview and Reading modes:\n\n- **Live Preview Mode**: Widgets hide when the cursor is within the wikilink range, allowing for easy editing.\n- **Reading Mode**: Widgets display with full functionality and integrate with the reading mode typography.\n\nThe overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file).\n\n## Create New Inline Task Command\n\nThe `Create new inline task` command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette.\n\nWhen the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title.\n\nTo turn the current line into a TaskNote, use `Convert to TaskNote` or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file.\n\n## Instant Task Conversion\n\nThe **Instant Task Conversion** feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from `Settings -> TaskNotes -> Features` (`Show convert button next to checkboxes`). When enabled, a \"convert\" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file.\nThis supports progressive conversion from draft notes to dedicated task files.\n\n### Folder Configuration\n\nBy default, converted tasks are placed in the same folder as the current note (`{{currentNotePath}}`). You can change this behavior in `Settings -> TaskNotes -> General` (`Folder for converted tasks`):\n\n- **Leave empty**: Uses your default tasks folder (configured in the same section)\n- **`{{currentNotePath}}`**: Places tasks in the same folder as the note you're editing (default)\n- **`{{currentNoteTitle}}`**: Creates a subfolder named after the current note\n- **Custom path**: Specify any folder path (e.g., `TaskNotes/Converted`)\n\n### Supported Line Types\n\nThe conversion feature works with:\n\n- **Checkbox tasks**: `- [ ] Task description` becomes a TaskNote with task metadata\n- **Bullet points**: `- Some task idea` becomes a TaskNote with the text as title\n- **Numbered lists**: `1. Important item` becomes a TaskNote\n- **Blockquoted content**: `> Task in callout` becomes a TaskNote (preserves blockquote formatting)\n- **Plain text lines**: `Important thing to do` becomes a TaskNote\n- **Mixed formats**: `> - [ ] Task in blockquote` handles both blockquote and checkbox formatting\n\n### Content Processing\n\nWhen converting lines:\n\n- **Special characters** like `>`, `#`, `-` are automatically removed from the task title\n- **Original formatting** is preserved in the note (e.g., `> [[Task Title]]` for blockquoted content)\n- **Task metadata** is extracted from checkbox tasks (due dates, priorities, etc.)\n- **Natural language processing** can extract dates and metadata from plain text (if enabled)\nConversion preserves surrounding formatting, including callouts, outlines, and nested lists.\n\nThe feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement.\n\n## Bulk Task Conversion\n\nThe **Bulk Task Conversion** command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as \"Convert all tasks in note to TaskNotes\".\n\n### How It Works\n\nThe command:\n\n1. Scans the entire current note for checkbox tasks (`- [ ]`, `* [ ]`, `1. [ ]`, etc.)\n2. Includes tasks inside blockquotes (e.g., `> - [ ] task in callout`)\n3. Applies the same enhanced conversion logic as instant task conversion\n4. Creates individual TaskNote files for each task\n5. Replaces the original checkboxes with links to the new task files\n6. Preserves original indentation and formatting (including blockquote markers)\n\nThe bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note.\n\n### Usage\n\nTo use bulk conversion:\n\n1. Open a note containing checkbox tasks\n2. Access the command palette (`Ctrl+P` / `Cmd+P`)\n3. Search for \"Convert all tasks in note to TaskNotes\"\n4. Execute the command\n\nThe command displays progress and shows a summary when complete (for example, \"Successfully converted 5 tasks to TaskNotes.\").\n\n!!! warning \"Important Considerations\"\n\n **This command modifies note content permanently.** Before using:\n\n - **Create a backup** of your note if it contains important data\n - **Review the tasks** to ensure they should become individual TaskNotes\n - **Expect processing time** - notes with many tasks may take several seconds to process\n - **Avoid interruption** - do not edit the note while conversion is running\n\n!!! note \"Performance\"\n\n Processing time depends on the number of tasks:\n\n - Small notes (1-10 tasks): Near-instant\n - Medium notes (10-50 tasks): 2-5 seconds\n - Large notes (50+ tasks): 10+ seconds\n\n The operation creates multiple files and updates the note content, which requires disk I/O and editor updates.\n\n### Error Handling\n\nIf some tasks fail to convert, the command will:\n\n- Complete successfully converted tasks\n- Display a summary showing both successes and failures\n- Log detailed error information to the console for troubleshooting\n\nFailed conversions typically occur due to:\n\n- Tasks with titles containing invalid filename characters\n- Insufficient disk permissions\n- Very long task titles (over 200 characters)\nFor large notes, converting a small section first helps validate folder and filename settings.\n\n## Relationships Widget\n\n**New in v4**: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface.\n\nThe widget appears in task notes and automatically displays up to five tabs based on available relationship data:\n\n- **Subtasks Tab (Kanban)**: Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management.\n- **Occurrences Tab (List)**: Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date.\n- **Projects Tab (List)**: Shows projects that the current task belongs to. Uses list layout.\n- **Blocked By Tab (List)**: Shows tasks that are blocking the current task. Uses list layout.\n- **Blocking Tab (Kanban)**: Shows tasks that the current task is blocking. Uses Kanban layout.\n\n### Automatic Tab Management\n\nTabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information.\nThe widget layout changes with available data, so simple tasks show fewer sections.\n\n### Features\n\nThe widget embeds the `TaskNotes/Views/relationships.base` view directly in the editor. Every filter, grouping rule, or property shown in that `.base` file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view.\n\nAdditional behavior:\n\n- **Collapsible Interface**: Click the widget title to expand or collapse. The state is remembered between sessions.\n- **Persistent Grouping**: Any grouping defined in the `.base` file is honoured, and collapsed groups retain their state per note.\n- **Task Details**: Each task shows its status, priority, due date, and other configured properties.\n- **Real-time Updates**: The widget updates automatically when tasks are added, modified, or deleted via Bases views.\n\n### Configuration\n\nEnable or disable the widget in `Settings -> TaskNotes -> Appearance` (`Show relationships widget`).\n\nPosition the widget at the top (after frontmatter) or bottom of the note using the **Relationships Position** setting.\n\n### Expandable Subtasks Chevron\n\nTasks with subtasks can display an expand/collapse chevron that toggles subtask visibility.\n\n- The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons).\n- Configure this in `Settings -> TaskNotes -> Appearance` (`Subtask chevron position`).\n\n![Left subtask chevron](../assets/left-task-subtask-chevron.gif)\n\n### Migration from v3\n\nIn v3, TaskNotes provided three separate widgets controlled by individual settings:\n\n- `showProjectSubtasks` and `projectSubtasksPosition`\n- `showTaskDependencies` and `taskDependenciesPosition`\n- `showBlockingTasks` and `blockingTasksPosition`\n\nThese settings are replaced in v4 by:\n\n- `showRelationships` and `relationshipsPosition`\n\nIf you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from `TaskNotes/Views/project-subtasks.base` to `TaskNotes/Views/relationships.base`. Run the **Create files** action in `Settings -> TaskNotes -> General -> Views & base files` if `relationships.base` is missing.\n\n## Natural Language Processing\n\nTaskNotes includes a **Natural Language Processor (NLP)** that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as \"Prepare quarterly report due Friday #work high priority,\" which would automatically set the due date, tag, and priority.\n\nThe NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian.\n\n### Supported Syntax\n\nThe NLP engine recognizes:\n\n- **Tags and Contexts**: `#tag` and `@context` syntax (triggers are customizable).\n- **Projects**: `+project` for simple projects or `+[[Project Name]]` for projects with spaces.\n- **Priority Levels**: Keywords like \"high,\" \"normal,\" and \"low\". Also supports a trigger character (default: `!`).\n- **Status Assignment**: Keywords like \"open,\" \"in-progress,\" and \"done\". Also supports a trigger character (default: `*`).\n- **Dates and Times**: Phrases like \"tomorrow,\" \"next Friday,\" and \"January 15th at 3pm\".\n- **Time Estimates**: Formats like \"2h,\" \"30min,\" and \"1h30m\".\n- **Recurrence Patterns**: Phrases like \"daily,\" \"weekly,\" and \"every Monday\".\n- **User-Defined Fields**: Custom fields can be assigned using configured triggers (e.g., `effort: high`). Supports quoted values for multi-word entries.\nNLP parses common patterns during capture; fields can be refined in the modal afterward.\n\n### Rich Markdown Editor\n\n**New in v4**: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea.\n\nFeatures include:\n\n- **Live Preview**: Rendered markdown preview as you type.\n- **Syntax Highlighting**: Code blocks, links, and formatting are highlighted.\n- **Wikilink Support**: Create links to other notes using `[[Note Name]]` syntax.\n- **Keyboard Shortcuts**:\n - `Ctrl/Cmd+Enter` saves the task\n - `Esc` or `Tab` to navigate out of the editor\n- **Placeholder Text**: Shows an example task (e.g., \"Buy groceries tomorrow at 3pm @home #errands\") when the editor is empty.\n\n### Customizable Triggers\n\n**New in v4**: Triggers for NLP properties can be customized in `Settings -> TaskNotes -> Features` (`NLP Triggers`).\n\nYou can configure trigger characters or strings for:\n\n- **Tags** (default: `#`) - When set to `#`, Obsidian's native tag suggester is used\n- **Contexts** (default: `@`)\n- **Projects** (default: `+`)\n- **Status** (default: `*`)\n- **Priority** (default: `!`, disabled by default)\n- **User-Defined Fields** (default: `fieldname:`) - Each custom field can have its own trigger\n\nTriggers support up to 10 characters and can include trailing spaces (e.g., `\"def: \"` for a custom field).\n\n### Autocomplete\n\n**New in v4**: When typing a trigger in the NLP editor, an autocomplete menu appears with available values.\n\n- Navigate suggestions with arrow keys\n- Select with `Enter` or `Tab`\n- Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields\n- Tag autocomplete uses Obsidian's native tag suggester when using the `#` trigger\n- For user fields with multi-word values, wrap the value in quotes (e.g., `effort: \"very high\"`)\n\nThe NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically.\n","aliases":["/features/inline-tasks/"],"toc":[{"level":2,"id":"task-link-overlays","text":"Task Link Overlays"},{"level":3,"id":"widget-features","text":"Widget Features"},{"level":3,"id":"mode-specific-behavior","text":"Mode-Specific Behavior"},{"level":2,"id":"create-new-inline-task-command","text":"Create New Inline Task Command"},{"level":2,"id":"instant-task-conversion","text":"Instant Task Conversion"},{"level":3,"id":"folder-configuration","text":"Folder Configuration"},{"level":3,"id":"supported-line-types","text":"Supported Line Types"},{"level":3,"id":"content-processing","text":"Content Processing"},{"level":2,"id":"bulk-task-conversion","text":"Bulk Task Conversion"},{"level":3,"id":"how-it-works","text":"How It Works"},{"level":3,"id":"usage","text":"Usage"},{"level":3,"id":"error-handling","text":"Error Handling"},{"level":2,"id":"relationships-widget","text":"Relationships Widget"},{"level":3,"id":"automatic-tab-management","text":"Automatic Tab Management"},{"level":3,"id":"features","text":"Features"},{"level":3,"id":"configuration","text":"Configuration"},{"level":3,"id":"expandable-subtasks-chevron","text":"Expandable Subtasks Chevron"},{"level":3,"id":"migration-from-v3","text":"Migration from v3"},{"level":2,"id":"natural-language-processing","text":"Natural Language Processing"},{"level":3,"id":"supported-syntax","text":"Supported Syntax"},{"level":3,"id":"rich-markdown-editor","text":"Rich Markdown Editor"},{"level":3,"id":"customizable-triggers","text":"Customizable Triggers"},{"level":3,"id":"autocomplete","text":"Autocomplete"}],"html":"

TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing.\nInline features support capture and task updates without leaving the current note.

\n\n

When a wikilink to a task note is created, TaskNotes can replace it with an interactive Task Link Overlay. Enable or disable overlays from Settings -> TaskNotes -> Features (Task link overlay). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal.

\n

\"Task

\n

Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions

\n

\"Task

\n

In Source mode, task links appear as standard wikilinks until rendered

\n

Widget Features#

\n

The task link overlay displays:

\n
    \n
  • Status Dot: Clickable circular indicator showing current task status. Click to cycle through available statuses.
  • \n
  • Priority Dot: Color-coded indicator for task priority (only shown when assigned).
  • \n
  • Task Title: Displays the task name (truncated to 80 characters). Click to open the task edit modal.
  • \n
  • Date Information: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus.
  • \n
  • Recurrence Indicator: Rotating arrow icon for recurring tasks with modification options.
  • \n
  • Action Menu: Ellipsis icon (shown on hover) provides additional task actions.\nThe widget exposes common task actions at the link location, so status and metadata can be updated in-place.
  • \n
\n

Mode-Specific Behavior#

\n

Task link overlays work in both Live Preview and Reading modes:

\n
    \n
  • Live Preview Mode: Widgets hide when the cursor is within the wikilink range, allowing for easy editing.
  • \n
  • Reading Mode: Widgets display with full functionality and integrate with the reading mode typography.
  • \n
\n

The overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file).

\n

Create New Inline Task Command#

\n

The Create new inline task command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette.

\n

When the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title.

\n

To turn the current line into a TaskNote, use Convert to TaskNote or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file.

\n

Instant Task Conversion#

\n

The Instant Task Conversion feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from Settings -> TaskNotes -> Features (Show convert button next to checkboxes). When enabled, a "convert" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file.\nThis supports progressive conversion from draft notes to dedicated task files.

\n

Folder Configuration#

\n

By default, converted tasks are placed in the same folder as the current note ({{currentNotePath}}). You can change this behavior in Settings -> TaskNotes -> General (Folder for converted tasks):

\n
    \n
  • Leave empty: Uses your default tasks folder (configured in the same section)
  • \n
  • {{currentNotePath}}: Places tasks in the same folder as the note you're editing (default)
  • \n
  • {{currentNoteTitle}}: Creates a subfolder named after the current note
  • \n
  • Custom path: Specify any folder path (e.g., TaskNotes/Converted)
  • \n
\n

Supported Line Types#

\n

The conversion feature works with:

\n
    \n
  • Checkbox tasks: - [ ] Task description becomes a TaskNote with task metadata
  • \n
  • Bullet points: - Some task idea becomes a TaskNote with the text as title
  • \n
  • Numbered lists: 1. Important item becomes a TaskNote
  • \n
  • Blockquoted content: > Task in callout becomes a TaskNote (preserves blockquote formatting)
  • \n
  • Plain text lines: Important thing to do becomes a TaskNote
  • \n
  • Mixed formats: > - [ ] Task in blockquote handles both blockquote and checkbox formatting
  • \n
\n

Content Processing#

\n

When converting lines:

\n
    \n
  • Special characters like >, #, - are automatically removed from the task title
  • \n
  • Original formatting is preserved in the note (e.g., > [[Task Title]] for blockquoted content)
  • \n
  • Task metadata is extracted from checkbox tasks (due dates, priorities, etc.)
  • \n
  • Natural language processing can extract dates and metadata from plain text (if enabled)\nConversion preserves surrounding formatting, including callouts, outlines, and nested lists.
  • \n
\n

The feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement.

\n

Bulk Task Conversion#

\n

The Bulk Task Conversion command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as "Convert all tasks in note to TaskNotes".

\n

How It Works#

\n

The command:

\n
    \n
  1. Scans the entire current note for checkbox tasks (- [ ], * [ ], 1. [ ], etc.)
  2. \n
  3. Includes tasks inside blockquotes (e.g., > - [ ] task in callout)
  4. \n
  5. Applies the same enhanced conversion logic as instant task conversion
  6. \n
  7. Creates individual TaskNote files for each task
  8. \n
  9. Replaces the original checkboxes with links to the new task files
  10. \n
  11. Preserves original indentation and formatting (including blockquote markers)
  12. \n
\n

The bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note.

\n

Usage#

\n

To use bulk conversion:

\n
    \n
  1. Open a note containing checkbox tasks
  2. \n
  3. Access the command palette (Ctrl+P / Cmd+P)
  4. \n
  5. Search for "Convert all tasks in note to TaskNotes"
  6. \n
  7. Execute the command
  8. \n
\n

The command displays progress and shows a summary when complete (for example, "Successfully converted 5 tasks to TaskNotes.").

\n\n
**This command modifies note content permanently.** Before using:\n\n- **Create a backup** of your note if it contains important data\n- **Review the tasks** to ensure they should become individual TaskNotes\n- **Expect processing time** - notes with many tasks may take several seconds to process\n- **Avoid interruption** - do not edit the note while conversion is running\n
\n
Processing time depends on the number of tasks:\n\n- Small notes (1-10 tasks): Near-instant\n- Medium notes (10-50 tasks): 2-5 seconds\n- Large notes (50+ tasks): 10+ seconds\n\nThe operation creates multiple files and updates the note content, which requires disk I/O and editor updates.\n

Error Handling#

\n

If some tasks fail to convert, the command will:

\n
    \n
  • Complete successfully converted tasks
  • \n
  • Display a summary showing both successes and failures
  • \n
  • Log detailed error information to the console for troubleshooting
  • \n
\n

Failed conversions typically occur due to:

\n
    \n
  • Tasks with titles containing invalid filename characters
  • \n
  • Insufficient disk permissions
  • \n
  • Very long task titles (over 200 characters)\nFor large notes, converting a small section first helps validate folder and filename settings.
  • \n
\n

Relationships Widget#

\n

New in v4: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface.

\n

The widget appears in task notes and automatically displays up to five tabs based on available relationship data:

\n
    \n
  • Subtasks Tab (Kanban): Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management.
  • \n
  • Occurrences Tab (List): Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date.
  • \n
  • Projects Tab (List): Shows projects that the current task belongs to. Uses list layout.
  • \n
  • Blocked By Tab (List): Shows tasks that are blocking the current task. Uses list layout.
  • \n
  • Blocking Tab (Kanban): Shows tasks that the current task is blocking. Uses Kanban layout.
  • \n
\n

Automatic Tab Management#

\n

Tabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information.\nThe widget layout changes with available data, so simple tasks show fewer sections.

\n

Features#

\n

The widget embeds the TaskNotes/Views/relationships.base view directly in the editor. Every filter, grouping rule, or property shown in that .base file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view.

\n

Additional behavior:

\n
    \n
  • Collapsible Interface: Click the widget title to expand or collapse. The state is remembered between sessions.
  • \n
  • Persistent Grouping: Any grouping defined in the .base file is honoured, and collapsed groups retain their state per note.
  • \n
  • Task Details: Each task shows its status, priority, due date, and other configured properties.
  • \n
  • Real-time Updates: The widget updates automatically when tasks are added, modified, or deleted via Bases views.
  • \n
\n

Configuration#

\n

Enable or disable the widget in Settings -> TaskNotes -> Appearance (Show relationships widget).

\n

Position the widget at the top (after frontmatter) or bottom of the note using the Relationships Position setting.

\n

Expandable Subtasks Chevron#

\n

Tasks with subtasks can display an expand/collapse chevron that toggles subtask visibility.

\n
    \n
  • The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons).
  • \n
  • Configure this in Settings -> TaskNotes -> Appearance (Subtask chevron position).
  • \n
\n

\"Left

\n

Migration from v3#

\n

In v3, TaskNotes provided three separate widgets controlled by individual settings:

\n
    \n
  • showProjectSubtasks and projectSubtasksPosition
  • \n
  • showTaskDependencies and taskDependenciesPosition
  • \n
  • showBlockingTasks and blockingTasksPosition
  • \n
\n

These settings are replaced in v4 by:

\n
    \n
  • showRelationships and relationshipsPosition
  • \n
\n

If you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from TaskNotes/Views/project-subtasks.base to TaskNotes/Views/relationships.base. Run the Create files action in Settings -> TaskNotes -> General -> Views & base files if relationships.base is missing.

\n

Natural Language Processing#

\n

TaskNotes includes a Natural Language Processor (NLP) that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as "Prepare quarterly report due Friday #work high priority," which would automatically set the due date, tag, and priority.

\n

The NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian.

\n

Supported Syntax#

\n

The NLP engine recognizes:

\n
    \n
  • Tags and Contexts: #tag and @context syntax (triggers are customizable).
  • \n
  • Projects: +project for simple projects or +[[Project Name]] for projects with spaces.
  • \n
  • Priority Levels: Keywords like "high," "normal," and "low". Also supports a trigger character (default: !).
  • \n
  • Status Assignment: Keywords like "open," "in-progress," and "done". Also supports a trigger character (default: *).
  • \n
  • Dates and Times: Phrases like "tomorrow," "next Friday," and "January 15th at 3pm".
  • \n
  • Time Estimates: Formats like "2h," "30min," and "1h30m".
  • \n
  • Recurrence Patterns: Phrases like "daily," "weekly," and "every Monday".
  • \n
  • User-Defined Fields: Custom fields can be assigned using configured triggers (e.g., effort: high). Supports quoted values for multi-word entries.\nNLP parses common patterns during capture; fields can be refined in the modal afterward.
  • \n
\n

Rich Markdown Editor#

\n

New in v4: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea.

\n

Features include:

\n
    \n
  • Live Preview: Rendered markdown preview as you type.
  • \n
  • Syntax Highlighting: Code blocks, links, and formatting are highlighted.
  • \n
  • Wikilink Support: Create links to other notes using [[Note Name]] syntax.
  • \n
  • Keyboard Shortcuts:
      \n
    • Ctrl/Cmd+Enter saves the task
    • \n
    • Esc or Tab to navigate out of the editor
    • \n
    \n
  • \n
  • Placeholder Text: Shows an example task (e.g., "Buy groceries tomorrow at 3pm @home #errands") when the editor is empty.
  • \n
\n

Customizable Triggers#

\n

New in v4: Triggers for NLP properties can be customized in Settings -> TaskNotes -> Features (NLP Triggers).

\n

You can configure trigger characters or strings for:

\n
    \n
  • Tags (default: #) - When set to #, Obsidian's native tag suggester is used
  • \n
  • Contexts (default: @)
  • \n
  • Projects (default: +)
  • \n
  • Status (default: *)
  • \n
  • Priority (default: !, disabled by default)
  • \n
  • User-Defined Fields (default: fieldname:) - Each custom field can have its own trigger
  • \n
\n

Triggers support up to 10 characters and can include trailing spaces (e.g., "def: " for a custom field).

\n

Autocomplete#

\n

New in v4: When typing a trigger in the NLP editor, an autocomplete menu appears with available values.

\n
    \n
  • Navigate suggestions with arrow keys
  • \n
  • Select with Enter or Tab
  • \n
  • Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields
  • \n
  • Tag autocomplete uses Obsidian's native tag suggester when using the # trigger
  • \n
  • For user fields with multi-word values, wrap the value in quotes (e.g., effort: "very high")
  • \n
\n

The NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically.

\n","text":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing. Inline features support capture and task updates without leaving the current note. Task Link Overlays# When a wikilink to a task note is created, TaskNotes can replace it with an interactive Task Link Overlay. Enable or disable overlays from Settings -> TaskNotes -> Features (Task link overlay). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal. Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions In Source mode, task links appear as standard wikilinks until rendered Widget Features# The task link overlay displays: Status Dot: Clickable circular indicator showing current task status. Click to cycle through available statuses. Priority Dot: Color-coded indicator for task priority (only shown when assigned). Task Title: Displays the task name (truncated to 80 characters). Click to open the task edit modal. Date Information: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus. Recurrence Indicator: Rotating arrow icon for recurring tasks with modification options. Action Menu: Ellipsis icon (shown on hover) provides additional task actions. The widget exposes common task actions at the link location, so status and metadata can be updated in-place. Mode-Specific Behavior# Task link overlays work in both Live Preview and Reading modes: Live Preview Mode: Widgets hide when the cursor is within the wikilink range, allowing for easy editing. Reading Mode: Widgets display with full functionality and integrate with the reading mode typography. The overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file). Create New Inline Task Command# The Create new inline task command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette. When the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title. To turn the current line into a TaskNote, use Convert to TaskNote or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file. Instant Task Conversion# The Instant Task Conversion feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from Settings -> TaskNotes -> Features (Show convert button next to checkboxes). When enabled, a \"convert\" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file. This supports progressive conversion from draft notes to dedicated task files. Folder Configuration# By default, converted tasks are placed in the same folder as the current note ({{currentNotePath}}). You can change this behavior in Settings -> TaskNotes -> General (Folder for converted tasks): Leave empty: Uses your default tasks folder (configured in the same section) {{currentNotePath}}: Places tasks in the same folder as the note you're editing (default) {{currentNoteTitle}}: Creates a subfolder named after the current note Custom path: Specify any folder path (e.g., TaskNotes/Converted) Supported Line Types# The conversion feature works with: Checkbox tasks: - [ ] Task description becomes a TaskNote with task metadata Bullet points: - Some task idea becomes a TaskNote with the text as title Numbered lists: 1. Important item becomes a TaskNote Blockquoted content: > Task in callout becomes a TaskNote (preserves blockquote formatting) Plain text lines: Important thing to do becomes a TaskNote Mixed formats: > - [ ] Task in blockquote handles both blockquote and checkbox formatting Content Processing# When converting lines: Special characters like >, #, - are automatically removed from the task title Original formatting is preserved in the note (e.g., > [[Task Title]] for blockquoted content) Task metadata is extracted from checkbox tasks (due dates, priorities, etc.) Natural language processing can extract dates and metadata from plain text (if enabled) Conversion preserves surrounding formatting, including callouts, outlines, and nested lists. The feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement. Bulk Task Conversion# The Bulk Task Conversion command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as \"Convert all tasks in note to TaskNotes\". How It Works# The command: Scans the entire current note for checkbox tasks (- [ ], * [ ], 1. [ ], etc.) Includes tasks inside blockquotes (e.g., > - [ ] task in callout) Applies the same enhanced conversion logic as instant task conversion Creates individual TaskNote files for each task Replaces the original checkboxes with links to the new task files Preserves original indentation and formatting (including blockquote markers) The bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note. Usage# To use bulk conversion: Open a note containing checkbox tasks Access the command palette (Ctrl+P / Cmd+P) Search for \"Convert all tasks in note to TaskNotes\" Execute the command The command displays progress and shows a summary when complete (for example, \"Successfully converted 5 tasks to TaskNotes.\"). Important Considerations **This command modifies note content permanently.** Before using: - **Create a backup** of your note if it contains important data - **Review the tasks** to ensure they should become individual TaskNotes - **Expect processing time** - notes with many tasks may take several seconds to process - **Avoid interruption** - do not edit the note while conversion is running Performance Processing time depends on the number of tasks: - Small notes (1-10 tasks): Near-instant - Medium notes (10-50 tasks): 2-5 seconds - Large notes (50+ tasks): 10+ seconds The operation creates multiple files and updates the note content, which requires disk I/O and editor updates. Error Handling# If some tasks fail to convert, the command will: Complete successfully converted tasks Display a summary showing both successes and failures Log detailed error information to the console for troubleshooting Failed conversions typically occur due to: Tasks with titles containing invalid filename characters Insufficient disk permissions Very long task titles (over 200 characters) For large notes, converting a small section first helps validate folder and filename settings. Relationships Widget# New in v4: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface. The widget appears in task notes and automatically displays up to five tabs based on available relationship data: Subtasks Tab (Kanban): Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management. Occurrences Tab (List): Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date. Projects Tab (List): Shows projects that the current task belongs to. Uses list layout. Blocked By Tab (List): Shows tasks that are blocking the current task. Uses list layout. Blocking Tab (Kanban): Shows tasks that the current task is blocking. Uses Kanban layout. Automatic Tab Management# Tabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information. The widget layout changes with available data, so simple tasks show fewer sections. Features# The widget embeds the TaskNotes/Views/relationships.base view directly in the editor. Every filter, grouping rule, or property shown in that .base file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view. Additional behavior: Collapsible Interface: Click the widget title to expand or collapse. The state is remembered between sessions. Persistent Grouping: Any grouping defined in the .base file is honoured, and collapsed groups retain their state per note. Task Details: Each task shows its status, priority, due date, and other configured properties. Real-time Updates: The widget updates automatically when tasks are added, modified, or deleted via Bases views. Configuration# Enable or disable the widget in Settings -> TaskNotes -> Appearance (Show relationships widget). Position the widget at the top (after frontmatter) or bottom of the note using the Relationships Position setting. Expandable Subtasks Chevron# Tasks with subtasks can display an expand/collapse chevron that toggles subtask visibility. The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons). Configure this in Settings -> TaskNotes -> Appearance (Subtask chevron position). Migration from v3# In v3, TaskNotes provided three separate widgets controlled by individual settings: showProjectSubtasks and projectSubtasksPosition showTaskDependencies and taskDependenciesPosition showBlockingTasks and blockingTasksPosition These settings are replaced in v4 by: showRelationships and relationshipsPosition If you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from TaskNotes/Views/project-subtasks.base to TaskNotes/Views/relationships.base. Run the Create files action in Settings -> TaskNotes -> General -> Views & base files if relationships.base is missing. Natural Language Processing# TaskNotes includes a Natural Language Processor (NLP) that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as \"Prepare quarterly report due Friday #work high priority,\" which would automatically set the due date, tag, and priority. The NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian. Supported Syntax# The NLP engine recognizes: Tags and Contexts: #tag and @context syntax (triggers are customizable). Projects: +project for simple projects or +[[Project Name]] for projects with spaces. Priority Levels: Keywords like \"high,\" \"normal,\" and \"low\". Also supports a trigger character (default: !). Status Assignment: Keywords like \"open,\" \"in-progress,\" and \"done\". Also supports a trigger character (default: *). Dates and Times: Phrases like \"tomorrow,\" \"next Friday,\" and \"January 15th at 3pm\". Time Estimates: Formats like \"2h,\" \"30min,\" and \"1h30m\". Recurrence Patterns: Phrases like \"daily,\" \"weekly,\" and \"every Monday\". User-Defined Fields: Custom fields can be assigned using configured triggers (e.g., effort: high). Supports quoted values for multi-word entries. NLP parses common patterns during capture; fields can be refined in the modal afterward. Rich Markdown Editor# New in v4: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea. Features include: Live Preview: Rendered markdown preview as you type. Syntax Highlighting: Code blocks, links, and formatting are highlighted. Wikilink Support: Create links to other notes using [[Note Name]] syntax. Keyboard Shortcuts: Ctrl/Cmd+Enter saves the task Esc or Tab to navigate out of the editor Placeholder Text: Shows an example task (e.g., \"Buy groceries tomorrow at 3pm @home #errands\") when the editor is empty. Customizable Triggers# New in v4: Triggers for NLP properties can be customized in Settings -> TaskNotes -> Features (NLP Triggers). You can configure trigger characters or strings for: Tags (default: #) - When set to #, Obsidian's native tag suggester is used Contexts (default: @) Projects (default: +) Status (default: *) Priority (default: !, disabled by default) User-Defined Fields (default: fieldname:) - Each custom field can have its own trigger Triggers support up to 10 characters and can include trailing spaces (e.g., \"def: \" for a custom field). Autocomplete# New in v4: When typing a trigger in the NLP editor, an autocomplete menu appears with available values. Navigate suggestions with arrow keys Select with Enter or Tab Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields Tag autocomplete uses Obsidian's native tag suggester when using the # trigger For user fields with multi-word values, wrap the value in quotes (e.g., effort: \"very high\") The NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically."},{"route":"/obsidian/features/integrations/","title":"Integrations","description":"TaskNotes integrates with external services and Obsidian's core plugins.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/integrations.md","namespace":"obsidian","relativePath":"features/integrations.md","raw":"# Integrations\n\nTaskNotes integrates with external services and Obsidian's core plugins.\n\n\n## Bases Core Plugin\n\nTaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in `Settings -> Core Plugins`.\n\nFor details on Bases integration, see [Core Concepts](../core-concepts.md#bases-integration).\n\n## External Calendars\n\nTaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions.\n\nFor setup instructions, see [Calendar Integration](calendar-integration.md).\n\n## HTTP API\n\nA REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations.\n\nFor API documentation, see [HTTP API](../HTTP_API.md).\n\n## Webhooks\n\nWebhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats.\n\nFor configuration, see [Webhooks](../webhooks.md).\n\n## Companion Plugins\n\nCompanion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files.\n\nFor the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see [Companion Plugins](../companion-plugins.md).\n","aliases":["/features/integrations/"],"toc":[{"level":2,"id":"bases-core-plugin","text":"Bases Core Plugin"},{"level":2,"id":"external-calendars","text":"External Calendars"},{"level":2,"id":"http-api","text":"HTTP API"},{"level":2,"id":"webhooks","text":"Webhooks"},{"level":2,"id":"companion-plugins","text":"Companion Plugins"}],"html":"

TaskNotes integrates with external services and Obsidian's core plugins.

\n

Bases Core Plugin#

\n

TaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in Settings -> Core Plugins.

\n

For details on Bases integration, see Core Concepts.

\n

External Calendars#

\n

TaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions.

\n

For setup instructions, see Calendar Integration.

\n

HTTP API#

\n

A REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations.

\n

For API documentation, see HTTP API.

\n

Webhooks#

\n

Webhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats.

\n

For configuration, see Webhooks.

\n

Companion Plugins#

\n

Companion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files.

\n

For the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see Companion Plugins.

\n","text":"TaskNotes integrates with external services and Obsidian's core plugins. Bases Core Plugin# TaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in Settings -> Core Plugins. For details on Bases integration, see Core Concepts. External Calendars# TaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions. For setup instructions, see Calendar Integration. HTTP API# A REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations. For API documentation, see HTTP API. Webhooks# Webhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats. For configuration, see Webhooks. Companion Plugins# Companion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files. For the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see Companion Plugins."},{"route":"/obsidian/features/recurring-tasks/","title":"Recurring Tasks","description":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned i...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/recurring-tasks.md","namespace":"obsidian","relativePath":"features/recurring-tasks.md","raw":"# Recurring Tasks\n\n\nTaskNotes recurring tasks use RFC 5545 RRule strings with `DTSTART` support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content.\n\nIf you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the `scheduled` field as the next concrete commitment. Most day-to-day editing affects `scheduled`, while recurrence editing changes the plan itself.\n\n## Core Concepts\n\nRecurring tasks operate on two independent levels:\n\n1. **Recurring Pattern**: Defines when pattern instances appear (controlled by `DTSTART` in the recurrence rule)\n2. **Next Occurrence**: The specific date/time when you plan to work on the next instance (controlled by the `scheduled` field)\n3. **Materialized Occurrence Notes**: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content\n\nThis separation lets you reschedule the next occurrence without changing the pattern.\n\n## Setting Up Recurring Tasks\n\nIn practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance.\n\n### Creating Recurrence Patterns\n\nYou can create recurring tasks through:\n\n1. **Recurrence Context Menu** in task modals for presets or custom options\n2. **Preset Options** such as daily, weekly, or monthly\n3. **Custom Recurrence Modal** with date/time pickers and RRule configuration\n\n### Required Components\n\nRecurring tasks require:\n\n- **Recurrence Rule**: RRule string with `DTSTART`\n- **Scheduled Date**: Next occurrence date (independent from the pattern)\n\nMaterialized occurrence notes add two system fields to the occurrence note:\n\n- `recurrence_parent`: link/path back to the recurring parent task\n- `occurrence_date`: the occurrence date represented by the note\n\n### DTSTART Integration\n\n`DTSTART` is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances.\n\n- **Date-only**: `DTSTART:20250804;FREQ=DAILY`\n- **Date and time**: `DTSTART:20250804T090000Z;FREQ=DAILY`\n\n## Recurring Task Due Date\n\nWhen a recurring task is completed, `scheduled` advances to the next occurrence. By default, `due` does not change.\n\nEnable `Maintain due date offset in recurring tasks` in **Settings → TaskNotes → Features → Recurring Tasks** to preserve due/scheduled spacing.\n\nExample:\n\n- Scheduled: `2025-01-01`\n- Due: `2025-01-03`\n- Recurrence: weekly\n\nIf the task advances to `scheduled: 2025-01-08`, the due date becomes `2025-01-10` when this setting is enabled.\n\nThis setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, \"due two days after execution\"). If due dates are independent deadlines, leaving the setting off is usually clearer.\n\n## Recurrence Pattern Examples\n\n```text\nDTSTART:20250804T090000Z;FREQ=DAILY\n→ Daily at 9:00 AM, starting August 4, 2025\n\nDTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR\n→ Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025\n\nDTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15\n→ 15th of each month (all-day), starting August 15, 2025\n\nDTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1\n→ Last day of each month (all-day), starting August 31, 2025\n\nDTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR\n→ Last Friday of each month at 10:00 AM, starting August 1, 2025\n```\n\n## Dynamic Scheduled Dates\n\nThe `scheduled` field automatically tracks the next uncompleted occurrence:\n\n1. Initially set to the `DTSTART` date\n2. Advances when occurrences are completed\n3. Recalculates when the rule changes\n4. Can be manually rescheduled independently\n\nThis behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities.\n\n## Materialized Occurrence Notes\n\nMost recurring tasks can remain virtual: the parent task stores `complete_instances` and `skipped_instances`, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note.\n\nGood uses include:\n\n- A weekly review where each week needs a separate agenda and notes\n- A maintenance task where each visit needs photos, links, or a checklist\n- A recurring meeting where every occurrence should have its own time entries and completion state\n\nTo create one manually, right-click a recurring task card or calendar occurrence and choose **Open or create occurrence note**. The Task Action Palette also exposes **Open or create occurrence note** for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate.\n\nAn occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time.\n\nIts frontmatter includes:\n\n```yaml\nrecurrence_parent: \"[[Tasks/Weekly review]]\"\noccurrence_date: \"2026-06-01\"\nscheduled: \"2026-06-01T09:30\"\ntimeEstimate: 45\n```\n\nWhen TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at `09:30` creates an occurrence scheduled at `09:30` on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date.\n\nOccurrence notes can use a separate template from regular new tasks. Set `occurrence_template` on the recurring parent to point at a template note, or configure **Settings → Features → Body template → Occurrence note template file** as a global fallback. Parent-level `occurrence_template` wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior.\n\nThe parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's `recurrence`, `complete_instances`, `skipped_instances`, `completedDate`, calendar provider IDs, or `timeEntries`. New time entries belong to the occurrence note once you track time there.\n\n### Occurrence Filenames\n\nBy default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set **Occurrence filename template** under **Settings → Task Properties → Title**. For example, `{{title}} — {{occurrenceDate}}` produces `Weekly review — 2026-08-01.md`.\n\nOccurrence filename templates support all regular filename variables plus these occurrence-specific variables:\n\n- `{{occurrenceDate}}` - occurrence date, such as `2026-08-01`\n- `{{occurrenceWeek}}` - ISO week, such as `2026-W31`\n- `{{occurrenceMonth}}` - month, such as `2026-08`\n- `{{occurrenceYear}}` - year, such as `2026`\n- `{{occurrenceMonthName}}` - full month name, such as `August`\n\nChoose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by **Occurrence template override property** (by default, `occurrenceFilenameTemplate`):\n\n```yaml\noccurrenceFilenameTemplate: \"{{title}} ({{occurrenceWeek}})\"\n```\n\nLeaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix.\n\n### Occurrence Note Policies\n\nEach recurring parent has an **Occurrence notes** submenu under its recurrence menu:\n\n- **Create manually**: occurrence notes are only created by explicit action.\n- **Create next after completion**: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note.\n- **Rolling window**: defined by the TaskNotes spec, but not automated in the plugin yet.\n\nWhen **Create next after completion** is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence.\n\nHTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use `POST /api/tasks/:id/materialize-occurrence` or the MCP `tasknotes_materialize_occurrence` tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the **Create next after completion** policy.\n\nThe same submenu also controls the next-note trigger:\n\n- **Completion only**: create the next occurrence note only when the current occurrence is completed.\n- **Completion or skip**: create the next occurrence note when the current occurrence is completed or skipped.\n\nSkip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent `skipped_instances` list.\n\n### Completion Reconciliation\n\nWhen a materialized occurrence note is completed, TaskNotes updates both sides of the relationship:\n\n- The occurrence note is completed like a normal task.\n- The parent adds the occurrence date to `complete_instances`.\n- The parent removes that date from `skipped_instances` if needed.\n- The parent recalculates `scheduled` to the next uncompleted occurrence.\n- If the parent policy is **Create next after completion**, TaskNotes creates the next occurrence note idempotently.\n\nUncompleting an occurrence note removes the date from the parent's `complete_instances` list, but it does not delete later occurrence notes that were already created.\n\n### Example Behavior\n\n```yaml\n# Initial state\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\"\nscheduled: \"2025-08-04T09:00\"\ncomplete_instances: []\n\n# After completing Aug 4\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\"\nscheduled: \"2025-08-05T09:00\"\ncomplete_instances: [\"2025-08-04\"]\n\n# After manually rescheduling next occurrence\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\"\nscheduled: \"2025-08-05T14:30\"\ncomplete_instances: [\"2025-08-04\"]\n```\n\n## Calendar Drag and Drop\n\nCalendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor.\n\nRecurring tasks can show:\n\n- **Next occurrence** (solid border): dragging updates only `scheduled`\n- **Pattern instances** (dashed border): dragging updates `DTSTART` and future pattern instances\n- **Materialized occurrence notes**: dragging updates the occurrence note's own `scheduled` or `due` date like a normal task, without changing the parent's recurrence rule\n\n![Recurring tasks in calendar week view](../assets/views-calendar-week.png)\n\nMaterialized occurrence notes keep `occurrence_date` as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note.\n\n## Completion Tracking\n\nEach occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar).\n\nCompleted instances are stored in:\n\n```yaml\ncomplete_instances: [\"2025-08-04\", \"2025-08-06\", \"2025-08-08\"]\n```\n\nSkipped instances are stored in:\n\n```yaml\nskipped_instances: [\"2025-08-05\"]\n```\n\nWhen completion changes, `scheduled` updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions.\n\nThis means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks.\n\n## Flexible Scheduling\n\nTaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule.\n\nThe next occurrence can be:\n\n- Before `DTSTART`\n- Outside the pattern day\n- At a different time than pattern instances\n- Far ahead while pattern continues unchanged\n\n### Examples\n\n```yaml\n# Early start before DTSTART\nrecurrence: \"DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO\"\nscheduled: \"2025-08-07T14:00\"\n```\n\n```yaml\n# Off-pattern next occurrence\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO\"\nscheduled: \"2025-08-06T15:30\"\n```\n\n## Timezone Handling\n\nRecurring task logic uses a UTC anchor approach:\n\n- Pattern generation uses UTC dates\n- `DTSTART` dates are interpreted as UTC anchors\n- Display adapts to local timezone\n- Prevents common off-by-one date issues\n\nIn other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones.\n\n## Backward Compatibility\n\nRecurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites.\n\n- Legacy RRule strings without `DTSTART` continue to work using `scheduled` as anchor\n- Legacy recurrence objects are converted to RRule format\n- Existing tasks continue to function without migration steps\n- Mixed formats are handled transparently\n","aliases":["/features/recurring-tasks/"],"toc":[{"level":2,"id":"core-concepts","text":"Core Concepts"},{"level":2,"id":"setting-up-recurring-tasks","text":"Setting Up Recurring Tasks"},{"level":3,"id":"creating-recurrence-patterns","text":"Creating Recurrence Patterns"},{"level":3,"id":"required-components","text":"Required Components"},{"level":3,"id":"dtstart-integration","text":"DTSTART Integration"},{"level":2,"id":"recurring-task-due-date","text":"Recurring Task Due Date"},{"level":2,"id":"recurrence-pattern-examples","text":"Recurrence Pattern Examples"},{"level":2,"id":"dynamic-scheduled-dates","text":"Dynamic Scheduled Dates"},{"level":2,"id":"materialized-occurrence-notes","text":"Materialized Occurrence Notes"},{"level":3,"id":"occurrence-filenames","text":"Occurrence Filenames"},{"level":3,"id":"occurrence-note-policies","text":"Occurrence Note Policies"},{"level":3,"id":"completion-reconciliation","text":"Completion Reconciliation"},{"level":3,"id":"example-behavior","text":"Example Behavior"},{"level":2,"id":"calendar-drag-and-drop","text":"Calendar Drag and Drop"},{"level":2,"id":"completion-tracking","text":"Completion Tracking"},{"level":2,"id":"flexible-scheduling","text":"Flexible Scheduling"},{"level":3,"id":"examples","text":"Examples"},{"level":2,"id":"timezone-handling","text":"Timezone Handling"},{"level":2,"id":"backward-compatibility","text":"Backward Compatibility"}],"html":"

TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content.

\n

If you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the scheduled field as the next concrete commitment. Most day-to-day editing affects scheduled, while recurrence editing changes the plan itself.

\n

Core Concepts#

\n

Recurring tasks operate on two independent levels:

\n
    \n
  1. Recurring Pattern: Defines when pattern instances appear (controlled by DTSTART in the recurrence rule)
  2. \n
  3. Next Occurrence: The specific date/time when you plan to work on the next instance (controlled by the scheduled field)
  4. \n
  5. Materialized Occurrence Notes: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content
  6. \n
\n

This separation lets you reschedule the next occurrence without changing the pattern.

\n

Setting Up Recurring Tasks#

\n

In practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance.

\n

Creating Recurrence Patterns#

\n

You can create recurring tasks through:

\n
    \n
  1. Recurrence Context Menu in task modals for presets or custom options
  2. \n
  3. Preset Options such as daily, weekly, or monthly
  4. \n
  5. Custom Recurrence Modal with date/time pickers and RRule configuration
  6. \n
\n

Required Components#

\n

Recurring tasks require:

\n
    \n
  • Recurrence Rule: RRule string with DTSTART
  • \n
  • Scheduled Date: Next occurrence date (independent from the pattern)
  • \n
\n

Materialized occurrence notes add two system fields to the occurrence note:

\n
    \n
  • recurrence_parent: link/path back to the recurring parent task
  • \n
  • occurrence_date: the occurrence date represented by the note
  • \n
\n

DTSTART Integration#

\n

DTSTART is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances.

\n
    \n
  • Date-only: DTSTART:20250804;FREQ=DAILY
  • \n
  • Date and time: DTSTART:20250804T090000Z;FREQ=DAILY
  • \n
\n

Recurring Task Due Date#

\n

When a recurring task is completed, scheduled advances to the next occurrence. By default, due does not change.

\n

Enable Maintain due date offset in recurring tasks in Settings → TaskNotes → Features → Recurring Tasks to preserve due/scheduled spacing.

\n

Example:

\n
    \n
  • Scheduled: 2025-01-01
  • \n
  • Due: 2025-01-03
  • \n
  • Recurrence: weekly
  • \n
\n

If the task advances to scheduled: 2025-01-08, the due date becomes 2025-01-10 when this setting is enabled.

\n

This setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, "due two days after execution"). If due dates are independent deadlines, leaving the setting off is usually clearer.

\n

Recurrence Pattern Examples#

\n
DTSTART:20250804T090000Z;FREQ=DAILY\n→ Daily at 9:00 AM, starting August 4, 2025\n\nDTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR\n→ Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025\n\nDTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15\n→ 15th of each month (all-day), starting August 15, 2025\n\nDTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1\n→ Last day of each month (all-day), starting August 31, 2025\n\nDTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR\n→ Last Friday of each month at 10:00 AM, starting August 1, 2025\n

Dynamic Scheduled Dates#

\n

The scheduled field automatically tracks the next uncompleted occurrence:

\n
    \n
  1. Initially set to the DTSTART date
  2. \n
  3. Advances when occurrences are completed
  4. \n
  5. Recalculates when the rule changes
  6. \n
  7. Can be manually rescheduled independently
  8. \n
\n

This behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities.

\n

Materialized Occurrence Notes#

\n

Most recurring tasks can remain virtual: the parent task stores complete_instances and skipped_instances, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note.

\n

Good uses include:

\n
    \n
  • A weekly review where each week needs a separate agenda and notes
  • \n
  • A maintenance task where each visit needs photos, links, or a checklist
  • \n
  • A recurring meeting where every occurrence should have its own time entries and completion state
  • \n
\n

To create one manually, right-click a recurring task card or calendar occurrence and choose Open or create occurrence note. The Task Action Palette also exposes Open or create occurrence note for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate.

\n

An occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time.

\n

Its frontmatter includes:

\n
recurrence_parent: "[[Tasks/Weekly review]]"\noccurrence_date: "2026-06-01"\nscheduled: "2026-06-01T09:30"\ntimeEstimate: 45\n

When TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at 09:30 creates an occurrence scheduled at 09:30 on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date.

\n

Occurrence notes can use a separate template from regular new tasks. Set occurrence_template on the recurring parent to point at a template note, or configure Settings → Features → Body template → Occurrence note template file as a global fallback. Parent-level occurrence_template wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior.

\n

The parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's recurrence, complete_instances, skipped_instances, completedDate, calendar provider IDs, or timeEntries. New time entries belong to the occurrence note once you track time there.

\n

Occurrence Filenames#

\n

By default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set Occurrence filename template under Settings → Task Properties → Title. For example, {{title}} — {{occurrenceDate}} produces Weekly review — 2026-08-01.md.

\n

Occurrence filename templates support all regular filename variables plus these occurrence-specific variables:

\n
    \n
  • {{occurrenceDate}} - occurrence date, such as 2026-08-01
  • \n
  • {{occurrenceWeek}} - ISO week, such as 2026-W31
  • \n
  • {{occurrenceMonth}} - month, such as 2026-08
  • \n
  • {{occurrenceYear}} - year, such as 2026
  • \n
  • {{occurrenceMonthName}} - full month name, such as August
  • \n
\n

Choose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by Occurrence template override property (by default, occurrenceFilenameTemplate):

\n
occurrenceFilenameTemplate: "{{title}} ({{occurrenceWeek}})"\n

Leaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix.

\n

Occurrence Note Policies#

\n

Each recurring parent has an Occurrence notes submenu under its recurrence menu:

\n
    \n
  • Create manually: occurrence notes are only created by explicit action.
  • \n
  • Create next after completion: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note.
  • \n
  • Rolling window: defined by the TaskNotes spec, but not automated in the plugin yet.
  • \n
\n

When Create next after completion is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence.

\n

HTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use POST /api/tasks/:id/materialize-occurrence or the MCP tasknotes_materialize_occurrence tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the Create next after completion policy.

\n

The same submenu also controls the next-note trigger:

\n
    \n
  • Completion only: create the next occurrence note only when the current occurrence is completed.
  • \n
  • Completion or skip: create the next occurrence note when the current occurrence is completed or skipped.
  • \n
\n

Skip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent skipped_instances list.

\n

Completion Reconciliation#

\n

When a materialized occurrence note is completed, TaskNotes updates both sides of the relationship:

\n
    \n
  • The occurrence note is completed like a normal task.
  • \n
  • The parent adds the occurrence date to complete_instances.
  • \n
  • The parent removes that date from skipped_instances if needed.
  • \n
  • The parent recalculates scheduled to the next uncompleted occurrence.
  • \n
  • If the parent policy is Create next after completion, TaskNotes creates the next occurrence note idempotently.
  • \n
\n

Uncompleting an occurrence note removes the date from the parent's complete_instances list, but it does not delete later occurrence notes that were already created.

\n

Example Behavior#

\n
# Initial state\nrecurrence: "DTSTART:20250804T090000Z;FREQ=DAILY"\nscheduled: "2025-08-04T09:00"\ncomplete_instances: []\n\n# After completing Aug 4\nrecurrence: "DTSTART:20250804T090000Z;FREQ=DAILY"\nscheduled: "2025-08-05T09:00"\ncomplete_instances: ["2025-08-04"]\n\n# After manually rescheduling next occurrence\nrecurrence: "DTSTART:20250804T090000Z;FREQ=DAILY"\nscheduled: "2025-08-05T14:30"\ncomplete_instances: ["2025-08-04"]\n

Calendar Drag and Drop#

\n

Calendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor.

\n

Recurring tasks can show:

\n
    \n
  • Next occurrence (solid border): dragging updates only scheduled
  • \n
  • Pattern instances (dashed border): dragging updates DTSTART and future pattern instances
  • \n
  • Materialized occurrence notes: dragging updates the occurrence note's own scheduled or due date like a normal task, without changing the parent's recurrence rule
  • \n
\n

\"Recurring

\n

Materialized occurrence notes keep occurrence_date as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note.

\n

Completion Tracking#

\n

Each occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar).

\n

Completed instances are stored in:

\n
complete_instances: ["2025-08-04", "2025-08-06", "2025-08-08"]\n

Skipped instances are stored in:

\n
skipped_instances: ["2025-08-05"]\n

When completion changes, scheduled updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions.

\n

This means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks.

\n

Flexible Scheduling#

\n

TaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule.

\n

The next occurrence can be:

\n
    \n
  • Before DTSTART
  • \n
  • Outside the pattern day
  • \n
  • At a different time than pattern instances
  • \n
  • Far ahead while pattern continues unchanged
  • \n
\n

Examples#

\n
# Early start before DTSTART\nrecurrence: "DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO"\nscheduled: "2025-08-07T14:00"\n
# Off-pattern next occurrence\nrecurrence: "DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO"\nscheduled: "2025-08-06T15:30"\n

Timezone Handling#

\n

Recurring task logic uses a UTC anchor approach:

\n
    \n
  • Pattern generation uses UTC dates
  • \n
  • DTSTART dates are interpreted as UTC anchors
  • \n
  • Display adapts to local timezone
  • \n
  • Prevents common off-by-one date issues
  • \n
\n

In other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones.

\n

Backward Compatibility#

\n

Recurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites.

\n
    \n
  • Legacy RRule strings without DTSTART continue to work using scheduled as anchor
  • \n
  • Legacy recurrence objects are converted to RRule format
  • \n
  • Existing tasks continue to function without migration steps
  • \n
  • Mixed formats are handled transparently
  • \n
\n","text":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content. If you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the scheduled field as the next concrete commitment. Most day-to-day editing affects scheduled, while recurrence editing changes the plan itself. Core Concepts# Recurring tasks operate on two independent levels: Recurring Pattern: Defines when pattern instances appear (controlled by DTSTART in the recurrence rule) Next Occurrence: The specific date/time when you plan to work on the next instance (controlled by the scheduled field) Materialized Occurrence Notes: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content This separation lets you reschedule the next occurrence without changing the pattern. Setting Up Recurring Tasks# In practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance. Creating Recurrence Patterns# You can create recurring tasks through: Recurrence Context Menu in task modals for presets or custom options Preset Options such as daily, weekly, or monthly Custom Recurrence Modal with date/time pickers and RRule configuration Required Components# Recurring tasks require: Recurrence Rule: RRule string with DTSTART Scheduled Date: Next occurrence date (independent from the pattern) Materialized occurrence notes add two system fields to the occurrence note: recurrence_parent: link/path back to the recurring parent task occurrence_date: the occurrence date represented by the note DTSTART Integration# DTSTART is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances. Date-only: DTSTART:20250804;FREQ=DAILY Date and time: DTSTART:20250804T090000Z;FREQ=DAILY Recurring Task Due Date# When a recurring task is completed, scheduled advances to the next occurrence. By default, due does not change. Enable Maintain due date offset in recurring tasks in Settings → TaskNotes → Features → Recurring Tasks to preserve due/scheduled spacing. Example: Scheduled: 2025-01-01 Due: 2025-01-03 Recurrence: weekly If the task advances to scheduled: 2025-01-08, the due date becomes 2025-01-10 when this setting is enabled. This setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, \"due two days after execution\"). If due dates are independent deadlines, leaving the setting off is usually clearer. Recurrence Pattern Examples# DTSTART:20250804T090000Z;FREQ=DAILY → Daily at 9:00 AM, starting August 4, 2025 DTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR → Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025 DTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15 → 15th of each month (all-day), starting August 15, 2025 DTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1 → Last day of each month (all-day), starting August 31, 2025 DTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR → Last Friday of each month at 10:00 AM, starting August 1, 2025 Dynamic Scheduled Dates# The scheduled field automatically tracks the next uncompleted occurrence: Initially set to the DTSTART date Advances when occurrences are completed Recalculates when the rule changes Can be manually rescheduled independently This behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities. Materialized Occurrence Notes# Most recurring tasks can remain virtual: the parent task stores complete_instances and skipped_instances, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note. Good uses include: A weekly review where each week needs a separate agenda and notes A maintenance task where each visit needs photos, links, or a checklist A recurring meeting where every occurrence should have its own time entries and completion state To create one manually, right-click a recurring task card or calendar occurrence and choose Open or create occurrence note. The Task Action Palette also exposes Open or create occurrence note for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate. An occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time. Its frontmatter includes: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date: \"2026-06-01\" scheduled: \"2026-06-01T09:30\" timeEstimate: 45 When TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at 09:30 creates an occurrence scheduled at 09:30 on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date. Occurrence notes can use a separate template from regular new tasks. Set occurrence_template on the recurring parent to point at a template note, or configure Settings → Features → Body template → Occurrence note template file as a global fallback. Parent-level occurrence_template wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior. The parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's recurrence, complete_instances, skipped_instances, completedDate, calendar provider IDs, or timeEntries. New time entries belong to the occurrence note once you track time there. Occurrence Filenames# By default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set Occurrence filename template under Settings → Task Properties → Title. For example, {{title}} — {{occurrenceDate}} produces Weekly review — 2026-08-01.md. Occurrence filename templates support all regular filename variables plus these occurrence-specific variables: {{occurrenceDate}} - occurrence date, such as 2026-08-01 {{occurrenceWeek}} - ISO week, such as 2026-W31 {{occurrenceMonth}} - month, such as 2026-08 {{occurrenceYear}} - year, such as 2026 {{occurrenceMonthName}} - full month name, such as August Choose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by Occurrence template override property (by default, occurrenceFilenameTemplate): occurrenceFilenameTemplate: \"{{title}} ({{occurrenceWeek}})\" Leaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix. Occurrence Note Policies# Each recurring parent has an Occurrence notes submenu under its recurrence menu: Create manually: occurrence notes are only created by explicit action. Create next after completion: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note. Rolling window: defined by the TaskNotes spec, but not automated in the plugin yet. When Create next after completion is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence. HTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use POST /api/tasks/:id/materialize-occurrence or the MCP tasknotes_materialize_occurrence tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the Create next after completion policy. The same submenu also controls the next-note trigger: Completion only: create the next occurrence note only when the current occurrence is completed. Completion or skip: create the next occurrence note when the current occurrence is completed or skipped. Skip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent skipped_instances list. Completion Reconciliation# When a materialized occurrence note is completed, TaskNotes updates both sides of the relationship: The occurrence note is completed like a normal task. The parent adds the occurrence date to complete_instances. The parent removes that date from skipped_instances if needed. The parent recalculates scheduled to the next uncompleted occurrence. If the parent policy is Create next after completion, TaskNotes creates the next occurrence note idempotently. Uncompleting an occurrence note removes the date from the parent's complete_instances list, but it does not delete later occurrence notes that were already created. Example Behavior# # Initial state recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-04T09:00\" complete_instances: [] # After completing Aug 4 recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T09:00\" complete_instances: [\"2025-08-04\"] # After manually rescheduling next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T14:30\" complete_instances: [\"2025-08-04\"] Calendar Drag and Drop# Calendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor. Recurring tasks can show: Next occurrence (solid border): dragging updates only scheduled Pattern instances (dashed border): dragging updates DTSTART and future pattern instances Materialized occurrence notes: dragging updates the occurrence note's own scheduled or due date like a normal task, without changing the parent's recurrence rule Materialized occurrence notes keep occurrence_date as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note. Completion Tracking# Each occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar). Completed instances are stored in: complete_instances: [\"2025-08-04\", \"2025-08-06\", \"2025-08-08\"] Skipped instances are stored in: skipped_instances: [\"2025-08-05\"] When completion changes, scheduled updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions. This means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks. Flexible Scheduling# TaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule. The next occurrence can be: Before DTSTART Outside the pattern day At a different time than pattern instances Far ahead while pattern continues unchanged Examples# # Early start before DTSTART recurrence: \"DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-07T14:00\" # Off-pattern next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-06T15:30\" Timezone Handling# Recurring task logic uses a UTC anchor approach: Pattern generation uses UTC dates DTSTART dates are interpreted as UTC anchors Display adapts to local timezone Prevents common off-by-one date issues In other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones. Backward Compatibility# Recurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites. Legacy RRule strings without DTSTART continue to work using scheduled as anchor Legacy recurrence objects are converted to RRule format Existing tasks continue to function without migration steps Mixed formats are handled transparently"},{"route":"/obsidian/features/reminders/","title":"Task Reminders","description":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/reminders.md","namespace":"obsidian","relativePath":"features/reminders.md","raw":"# Task Reminders\n\n\nTaskNotes reminders use iCalendar `VALARM` semantics and support both relative and absolute reminder types.\n\nThe reminders system is designed to support both habit-like workflows (\"always remind me 15 minutes before\") and one-off commitments (\"alert me exactly at this date and time\"). Most users mix both styles depending on the task.\n\n## Reminder Types\n\n### Relative Reminders\n\nRelative reminders trigger from `due` or `scheduled` dates.\n\nUse relative reminders when you want reminder behavior to stay consistent even when task dates change.\n\nExamples:\n\n- 15 minutes before due date\n- 1 hour before scheduled date\n- 2 days before due date\n- 30 minutes after scheduled date\n\n### Absolute Reminders\n\nAbsolute reminders trigger at a fixed date/time.\n\nUse absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling.\n\nExamples:\n\n- October 26, 2025 at 9:00 AM\n- Tomorrow at 2:30 PM\n- Next Monday at 10:00 AM\n\n## Adding Reminders\n\nYou can add reminders from:\n\n1. **Task Creation Modal**\n2. **Task Edit Modal**\n3. **Task Cards** (bell icon)\n4. **Reminder field context menu**\n\nFrom a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task.\n\n![Task edit modal](../assets/feature-task-modal-edit.png)\n\n### Quick Reminder Options\n\nCommon shortcuts are available for both due and scheduled anchors, such as:\n\n- 5 minutes before\n- 15 minutes before\n- 1 hour before\n- 1 day before\n\nQuick options appear only when the anchor date exists.\n\nThis prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately.\n\n![Task context menu](../assets/feature-task-context-menu.png)\n\n## Reminder Data Format\n\nReminders are stored in YAML frontmatter arrays.\n\nBecause reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML.\n\n### Relative Structure\n\n```yaml\nreminders:\n - id: \"rem_1678886400000_abc123xyz\"\n type: \"relative\"\n relatedTo: \"due\"\n offset: \"-PT15M\"\n description: \"Review task details\"\n```\n\n### Absolute Structure\n\n```yaml\nreminders:\n - id: \"rem_1678886400001_def456uvw\"\n type: \"absolute\"\n absoluteTime: \"2025-10-26T09:00:00\"\n description: \"Follow up with client\"\n```\n\nField meanings:\n\n- `id`: unique identifier\n- `type`: `relative` or `absolute`\n- `relatedTo`: `due` or `scheduled` (relative only)\n- `offset`: ISO 8601 duration, negative before and positive after (relative only)\n- `absoluteTime`: ISO 8601 timestamp (absolute only)\n- `description`: optional message\n\nYou typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data.\n\n## Visual Indicators\n\nTasks with reminders show a bell icon on task cards.\n\n- Solid bell indicates active reminders\n- Clicking opens quick reminder actions\n- Reminder UI shows task context (due/scheduled dates and reminder count)\n\nThese indicators are intended to make reminders discoverable in list-heavy views without opening every task.\n\n## Default Reminders\n\nDefault reminders can be configured in:\n\n`Settings -> TaskNotes -> Task Properties -> Reminders`\n\nDefaults are applied to:\n\n- Manual task creation\n- Instant conversion\n- Natural language task creation\n\nDefault reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts.\n\n![Task properties settings](../assets/settings-task-properties.png)\n\n## Technical Notes\n\n- Reminders follow iCalendar `VALARM` concepts with ISO 8601 offsets\n- The reminder property name can be customized through field mapping\n\nFor settings-level behavior (notification channels, enable/disable state), see [Features Settings](../settings/features.md).\n","aliases":["/features/reminders/"],"toc":[{"level":2,"id":"reminder-types","text":"Reminder Types"},{"level":3,"id":"relative-reminders","text":"Relative Reminders"},{"level":3,"id":"absolute-reminders","text":"Absolute Reminders"},{"level":2,"id":"adding-reminders","text":"Adding Reminders"},{"level":3,"id":"quick-reminder-options","text":"Quick Reminder Options"},{"level":2,"id":"reminder-data-format","text":"Reminder Data Format"},{"level":3,"id":"relative-structure","text":"Relative Structure"},{"level":3,"id":"absolute-structure","text":"Absolute Structure"},{"level":2,"id":"visual-indicators","text":"Visual Indicators"},{"level":2,"id":"default-reminders","text":"Default Reminders"},{"level":2,"id":"technical-notes","text":"Technical Notes"}],"html":"

TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types.

\n

The reminders system is designed to support both habit-like workflows ("always remind me 15 minutes before") and one-off commitments ("alert me exactly at this date and time"). Most users mix both styles depending on the task.

\n

Reminder Types#

\n

Relative Reminders#

\n

Relative reminders trigger from due or scheduled dates.

\n

Use relative reminders when you want reminder behavior to stay consistent even when task dates change.

\n

Examples:

\n
    \n
  • 15 minutes before due date
  • \n
  • 1 hour before scheduled date
  • \n
  • 2 days before due date
  • \n
  • 30 minutes after scheduled date
  • \n
\n

Absolute Reminders#

\n

Absolute reminders trigger at a fixed date/time.

\n

Use absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling.

\n

Examples:

\n
    \n
  • October 26, 2025 at 9:00 AM
  • \n
  • Tomorrow at 2:30 PM
  • \n
  • Next Monday at 10:00 AM
  • \n
\n

Adding Reminders#

\n

You can add reminders from:

\n
    \n
  1. Task Creation Modal
  2. \n
  3. Task Edit Modal
  4. \n
  5. Task Cards (bell icon)
  6. \n
  7. Reminder field context menu
  8. \n
\n

From a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task.

\n

\"Task

\n

Quick Reminder Options#

\n

Common shortcuts are available for both due and scheduled anchors, such as:

\n
    \n
  • 5 minutes before
  • \n
  • 15 minutes before
  • \n
  • 1 hour before
  • \n
  • 1 day before
  • \n
\n

Quick options appear only when the anchor date exists.

\n

This prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately.

\n

\"Task

\n

Reminder Data Format#

\n

Reminders are stored in YAML frontmatter arrays.

\n

Because reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML.

\n

Relative Structure#

\n
reminders:\n  - id: "rem_1678886400000_abc123xyz"\n    type: "relative"\n    relatedTo: "due"\n    offset: "-PT15M"\n    description: "Review task details"\n

Absolute Structure#

\n
reminders:\n  - id: "rem_1678886400001_def456uvw"\n    type: "absolute"\n    absoluteTime: "2025-10-26T09:00:00"\n    description: "Follow up with client"\n

Field meanings:

\n
    \n
  • id: unique identifier
  • \n
  • type: relative or absolute
  • \n
  • relatedTo: due or scheduled (relative only)
  • \n
  • offset: ISO 8601 duration, negative before and positive after (relative only)
  • \n
  • absoluteTime: ISO 8601 timestamp (absolute only)
  • \n
  • description: optional message
  • \n
\n

You typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data.

\n

Visual Indicators#

\n

Tasks with reminders show a bell icon on task cards.

\n
    \n
  • Solid bell indicates active reminders
  • \n
  • Clicking opens quick reminder actions
  • \n
  • Reminder UI shows task context (due/scheduled dates and reminder count)
  • \n
\n

These indicators are intended to make reminders discoverable in list-heavy views without opening every task.

\n

Default Reminders#

\n

Default reminders can be configured in:

\n

Settings -> TaskNotes -> Task Properties -> Reminders

\n

Defaults are applied to:

\n
    \n
  • Manual task creation
  • \n
  • Instant conversion
  • \n
  • Natural language task creation
  • \n
\n

Default reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts.

\n

\"Task

\n

Technical Notes#

\n
    \n
  • Reminders follow iCalendar VALARM concepts with ISO 8601 offsets
  • \n
  • The reminder property name can be customized through field mapping
  • \n
\n

For settings-level behavior (notification channels, enable/disable state), see Features Settings.

\n","text":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types. The reminders system is designed to support both habit-like workflows (\"always remind me 15 minutes before\") and one-off commitments (\"alert me exactly at this date and time\"). Most users mix both styles depending on the task. Reminder Types# Relative Reminders# Relative reminders trigger from due or scheduled dates. Use relative reminders when you want reminder behavior to stay consistent even when task dates change. Examples: 15 minutes before due date 1 hour before scheduled date 2 days before due date 30 minutes after scheduled date Absolute Reminders# Absolute reminders trigger at a fixed date/time. Use absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling. Examples: October 26, 2025 at 9:00 AM Tomorrow at 2:30 PM Next Monday at 10:00 AM Adding Reminders# You can add reminders from: Task Creation Modal Task Edit Modal Task Cards (bell icon) Reminder field context menu From a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task. Quick Reminder Options# Common shortcuts are available for both due and scheduled anchors, such as: 5 minutes before 15 minutes before 1 hour before 1 day before Quick options appear only when the anchor date exists. This prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately. Reminder Data Format# Reminders are stored in YAML frontmatter arrays. Because reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML. Relative Structure# reminders: - id: \"rem_1678886400000_abc123xyz\" type: \"relative\" relatedTo: \"due\" offset: \"-PT15M\" description: \"Review task details\" Absolute Structure# reminders: - id: \"rem_1678886400001_def456uvw\" type: \"absolute\" absoluteTime: \"2025-10-26T09:00:00\" description: \"Follow up with client\" Field meanings: id: unique identifier type: relative or absolute relatedTo: due or scheduled (relative only) offset: ISO 8601 duration, negative before and positive after (relative only) absoluteTime: ISO 8601 timestamp (absolute only) description: optional message You typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data. Visual Indicators# Tasks with reminders show a bell icon on task cards. Solid bell indicates active reminders Clicking opens quick reminder actions Reminder UI shows task context (due/scheduled dates and reminder count) These indicators are intended to make reminders discoverable in list-heavy views without opening every task. Default Reminders# Default reminders can be configured in: Settings -> TaskNotes -> Task Properties -> Reminders Defaults are applied to: Manual task creation Instant conversion Natural language task creation Default reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts. Technical Notes# Reminders follow iCalendar VALARM concepts with ISO 8601 offsets The reminder property name can be customized through field mapping For settings-level behavior (notification channels, enable/disable state), see Features Settings."},{"route":"/obsidian/features/task-management/","title":"Task Management","description":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/task-management.md","namespace":"obsidian","relativePath":"features/task-management.md","raw":"# Task Management\n\n\nThis page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see [Core Concepts](../core-concepts.md).\n\nUse this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end.\n\n## Creating and Editing Tasks\n\nYou can create and edit tasks in a variety of ways. The primary method is through the **Task Creation Modal**, which can be accessed via the \"Create new task\" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates.\n\n![Task creation modal](../assets/feature-task-modal-filled.png)\n\nTaskNotes keeps a storage title and a filename-safe title separate. When **Store title in filename** is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter.\n\nFor existing tasks, the **Quick actions for current task** command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month.\n\nTaskNotes also supports **Natural Language Creation**, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like \"Buy groceries tomorrow at 3pm @home #errands high priority.\"\n\nIn most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed.\n\n### Auto-Suggestions in Natural Language Input\n\nThe natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters:\n\n- **@** - Shows available contexts from existing tasks\n- **#** - Shows available tags from existing tasks\n- **+** - Shows files from your vault as project suggestions\n- **\\*** - Shows available status options (configurable trigger in Settings → Features)\n\nIn task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character.\n\n#### Project Suggestions\n\nWhen typing `+` in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files:\n\n```\nproject-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha]\nmeeting-notes [title: Weekly Team Meeting Notes]\nsimple-project\nwork-file [aliases: work, office-tasks]\n```\n\nProject suggestions search across:\n- File names (basename without extension)\n- Frontmatter titles (using your configured field mapping)\n- Frontmatter aliases\n- Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest\n\nSelecting a project suggestion inserts it as `+[[filename]]`, creating a wikilink to the file while maintaining the `+` project marker that the natural language parser recognizes.\n\n\n#### Enhanced Project Auto‑suggester (configurable cards)\n\nProject suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest.\n\n- Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key\n- Flags:\n - n or n(Label) → show the field name/label before the value\n - s → include this field in + search (in addition to defaults)\n- Literals: you can mix in fixed text or emojis between tokens\n\nExamples\n\n- \"{title|n(Title)}\" → Title: Alpha Project\n- \"🔖 {aliases|n(Aliases)}\" → 🔖 Aliases: alpha, proj-alpha\n- \"{file.path|n(Path)|s}\" → include path in + search as well as display it\n\nSearch behavior\n\n- Defaults: + search always includes file basename, title (via your field mapping), and aliases\n- |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer)\n- Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches\n\nPerformance tips\n\n- Keep rows to three or fewer for clarity and performance (the UI supports up to 3)\n- Prefer specific searchable fields with |s on large vaults\n\nDemo\n\n![Autosuggest projects with spaces](../assets/autosuggest_project_names_with_space.gif)\n\n![Enhanced project autosuggester](../assets/enhanced-project-auto-suggester.gif)\n\n\n#### Status Suggestions\n\nWhen typing the status trigger character (default `*`) in the natural language input, you'll see suggestions for all configured status options:\n\n![Status Auto-Suggestion](../assets/auto-suggest-status.gif)\n\nStatus suggestions allow quick selection of statuses when creating tasks. For example, typing `*in` shows \"In Progress\" as a suggestion if that's one of your configured statuses.\n\nClicking a task card's status indicator cycles through statuses in the order configured under **Settings → Task Properties → Status**. A status can optionally define a specific **Next status** for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked **Skip when cycling** are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps.\n\nAdditionally, you can convert any line type in your notes to TaskNotes using the **Instant Conversion** feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines.\n\n## Task Properties\n\nTasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure.\n\nThis frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets.\n\nFor property types and examples, see [Core Concepts](../core-concepts.md#yaml-frontmatter). For configuration options, see [Task Properties Settings](../settings/task-properties.md).\n\n## Projects\n\nTaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management.\n\nThis model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling.\n\n### Project Assignment\n\nTasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the \"Add Project\" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault.\n\n### Project Links\n\nProjects are stored as wikilinks in the task's frontmatter (e.g., `projects: [\"[[Project A]]\", \"[[Project B]]\"]`). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field.\n\n### Organization and Filtering\n\nTasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add `note.projects` conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization.\n\n### Project Indicators\n\nTaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance.\n\n### Subtask Creation\n\nTasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select \"Create subtask\" to create a new task automatically linked to the current project.\n\n## Dependencies\n\nTask dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects:\n\n```yaml\nblockedBy:\n - uid: \"[[Operations/Order hardware]]\"\n reltype: FINISHTOSTART\n gap: P1D\n```\n\n- `uid` references the blocking task, typically through an Obsidian wikilink.\n- `reltype` is stored with each dependency and defaults to `FINISHTOSTART` for dependencies created in the UI.\n- `gap` is optional and uses ISO 8601 duration syntax (for example `PT4H` or `P2D`).\n\nWhenever a dependency is added, TaskNotes updates the upstream note’s `blocking` list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides.\n\n### Selecting dependencies in the UI\n\n- The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries.\n- The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views.\n- Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place.\n\nThese controls currently create and manage finish-to-start style blockers. Advanced `reltype` values and `gap` data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules.\n\n![Task context menu](../assets/feature-task-context-menu.png)\n\n## Automation\n\n### Auto-Archiving\n\nTaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup.\n\nConfigure auto-archiving per status from **Settings → Task Properties → Task Statuses**. Each status card includes an **Auto-archive** toggle and a **Delay (minutes)** input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically.\n\nThe auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status.\n\nThis automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault.\n\n## File Management and Templates\n\nTaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks.\n\nThese settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds).\n\nFor configuration details, see [Task Defaults](../settings/task-defaults.md). \nFor template variables, see [Template Variables Reference](template-variables.md).\n\n## Recurring Tasks\n\nTaskNotes recurring tasks use RFC 5545 RRule syntax with `DTSTART`, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu.\n\nFor full behavior, examples, and edge cases, see [Recurring Tasks](recurring-tasks.md).\n\n## Task Reminders\n\nTask reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus.\n\nFor full setup, data format, defaults, and UI behavior, see [Task Reminders](reminders.md).\n","aliases":["/features/task-management/"],"toc":[{"level":2,"id":"creating-and-editing-tasks","text":"Creating and Editing Tasks"},{"level":3,"id":"auto-suggestions-in-natural-language-input","text":"Auto-Suggestions in Natural Language Input"},{"level":2,"id":"task-properties","text":"Task Properties"},{"level":2,"id":"projects","text":"Projects"},{"level":3,"id":"project-assignment","text":"Project Assignment"},{"level":3,"id":"project-links","text":"Project Links"},{"level":3,"id":"organization-and-filtering","text":"Organization and Filtering"},{"level":3,"id":"project-indicators","text":"Project Indicators"},{"level":3,"id":"subtask-creation","text":"Subtask Creation"},{"level":2,"id":"dependencies","text":"Dependencies"},{"level":3,"id":"selecting-dependencies-in-the-ui","text":"Selecting dependencies in the UI"},{"level":2,"id":"automation","text":"Automation"},{"level":3,"id":"auto-archiving","text":"Auto-Archiving"},{"level":2,"id":"file-management-and-templates","text":"File Management and Templates"},{"level":2,"id":"recurring-tasks","text":"Recurring Tasks"},{"level":2,"id":"task-reminders","text":"Task Reminders"}],"html":"

This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts.

\n

Use this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end.

\n

Creating and Editing Tasks#

\n

You can create and edit tasks in a variety of ways. The primary method is through the Task Creation Modal, which can be accessed via the "Create new task" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates.

\n

\"Task

\n

TaskNotes keeps a storage title and a filename-safe title separate. When Store title in filename is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter.

\n

For existing tasks, the Quick actions for current task command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month.

\n

TaskNotes also supports Natural Language Creation, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like "Buy groceries tomorrow at 3pm @home #errands high priority."

\n

In most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed.

\n

Auto-Suggestions in Natural Language Input#

\n

The natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters:

\n
    \n
  • @ - Shows available contexts from existing tasks
  • \n
  • # - Shows available tags from existing tasks
  • \n
  • + - Shows files from your vault as project suggestions
  • \n
  • * - Shows available status options (configurable trigger in Settings → Features)
  • \n
\n

In task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character.

\n

Project Suggestions#

\n

When typing + in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files:

\n
project-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha]\nmeeting-notes [title: Weekly Team Meeting Notes]\nsimple-project\nwork-file [aliases: work, office-tasks]\n

Project suggestions search across:

\n
    \n
  • File names (basename without extension)
  • \n
  • Frontmatter titles (using your configured field mapping)
  • \n
  • Frontmatter aliases
  • \n
  • Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest
  • \n
\n

Selecting a project suggestion inserts it as +[[filename]], creating a wikilink to the file while maintaining the + project marker that the natural language parser recognizes.

\n

Enhanced Project Auto‑suggester (configurable cards)#

\n

Project suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest.

\n
    \n
  • Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key
  • \n
  • Flags:
      \n
    • n or n(Label) → show the field name/label before the value
    • \n
    • s → include this field in + search (in addition to defaults)
    • \n
    \n
  • \n
  • Literals: you can mix in fixed text or emojis between tokens
  • \n
\n

Examples

\n
    \n
  • "{title|n(Title)}" → Title: Alpha Project
  • \n
  • "🔖 {aliases|n(Aliases)}" → 🔖 Aliases: alpha, proj-alpha
  • \n
  • "{file.path|n(Path)|s}" → include path in + search as well as display it
  • \n
\n

Search behavior

\n
    \n
  • Defaults: + search always includes file basename, title (via your field mapping), and aliases
  • \n
  • |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer)
  • \n
  • Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches
  • \n
\n

Performance tips

\n
    \n
  • Keep rows to three or fewer for clarity and performance (the UI supports up to 3)
  • \n
  • Prefer specific searchable fields with |s on large vaults
  • \n
\n

Demo

\n

\"Autosuggest

\n

\"Enhanced

\n

Status Suggestions#

\n

When typing the status trigger character (default *) in the natural language input, you'll see suggestions for all configured status options:

\n

\"Status

\n

Status suggestions allow quick selection of statuses when creating tasks. For example, typing *in shows "In Progress" as a suggestion if that's one of your configured statuses.

\n

Clicking a task card's status indicator cycles through statuses in the order configured under Settings → Task Properties → Status. A status can optionally define a specific Next status for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked Skip when cycling are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps.

\n

Additionally, you can convert any line type in your notes to TaskNotes using the Instant Conversion feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines.

\n

Task Properties#

\n

Tasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure.

\n

This frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets.

\n

For property types and examples, see Core Concepts. For configuration options, see Task Properties Settings.

\n

Projects#

\n

TaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management.

\n

This model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling.

\n

Project Assignment#

\n

Tasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the "Add Project" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault.

\n

Project Links#

\n

Projects are stored as wikilinks in the task's frontmatter (e.g., projects: ["[[Project A]]", "[[Project B]]"]). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field.

\n

Organization and Filtering#

\n

Tasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add note.projects conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization.

\n

Project Indicators#

\n

TaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance.

\n

Subtask Creation#

\n

Tasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select "Create subtask" to create a new task automatically linked to the current project.

\n

Dependencies#

\n

Task dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects:

\n
blockedBy:\n  - uid: "[[Operations/Order hardware]]"\n    reltype: FINISHTOSTART\n    gap: P1D\n
    \n
  • uid references the blocking task, typically through an Obsidian wikilink.
  • \n
  • reltype is stored with each dependency and defaults to FINISHTOSTART for dependencies created in the UI.
  • \n
  • gap is optional and uses ISO 8601 duration syntax (for example PT4H or P2D).
  • \n
\n

Whenever a dependency is added, TaskNotes updates the upstream note’s blocking list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides.

\n

Selecting dependencies in the UI#

\n
    \n
  • The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries.
  • \n
  • The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views.
  • \n
  • Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place.
  • \n
\n

These controls currently create and manage finish-to-start style blockers. Advanced reltype values and gap data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules.

\n

\"Task

\n

Automation#

\n

Auto-Archiving#

\n

TaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup.

\n

Configure auto-archiving per status from Settings → Task Properties → Task Statuses. Each status card includes an Auto-archive toggle and a Delay (minutes) input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically.

\n

The auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status.

\n

This automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault.

\n

File Management and Templates#

\n

TaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks.

\n

These settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds).

\n

For configuration details, see Task Defaults.
For template variables, see Template Variables Reference.

\n

Recurring Tasks#

\n

TaskNotes recurring tasks use RFC 5545 RRule syntax with DTSTART, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu.

\n

For full behavior, examples, and edge cases, see Recurring Tasks.

\n

Task Reminders#

\n

Task reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus.

\n

For full setup, data format, defaults, and UI behavior, see Task Reminders.

\n","text":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts. Use this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end. Creating and Editing Tasks# You can create and edit tasks in a variety of ways. The primary method is through the Task Creation Modal, which can be accessed via the \"Create new task\" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates. TaskNotes keeps a storage title and a filename-safe title separate. When Store title in filename is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter. For existing tasks, the Quick actions for current task command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month. TaskNotes also supports Natural Language Creation, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like \"Buy groceries tomorrow at 3pm @home #errands high priority.\" In most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed. Auto-Suggestions in Natural Language Input# The natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters: @ - Shows available contexts from existing tasks # - Shows available tags from existing tasks + - Shows files from your vault as project suggestions * - Shows available status options (configurable trigger in Settings → Features) In task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character. Project Suggestions# When typing + in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files: project-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha] meeting-notes [title: Weekly Team Meeting Notes] simple-project work-file [aliases: work, office-tasks] Project suggestions search across: File names (basename without extension) Frontmatter titles (using your configured field mapping) Frontmatter aliases Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest Selecting a project suggestion inserts it as +[[filename]], creating a wikilink to the file while maintaining the + project marker that the natural language parser recognizes. Enhanced Project Auto‑suggester (configurable cards)# Project suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest. Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key Flags: n or n(Label) → show the field name/label before the value s → include this field in + search (in addition to defaults) Literals: you can mix in fixed text or emojis between tokens Examples \"{title|n(Title)}\" → Title: Alpha Project \"🔖 {aliases|n(Aliases)}\" → 🔖 Aliases: alpha, proj-alpha \"{file.path|n(Path)|s}\" → include path in + search as well as display it Search behavior Defaults: + search always includes file basename, title (via your field mapping), and aliases |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer) Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches Performance tips Keep rows to three or fewer for clarity and performance (the UI supports up to 3) Prefer specific searchable fields with |s on large vaults Demo Status Suggestions# When typing the status trigger character (default *) in the natural language input, you'll see suggestions for all configured status options: Status suggestions allow quick selection of statuses when creating tasks. For example, typing *in shows \"In Progress\" as a suggestion if that's one of your configured statuses. Clicking a task card's status indicator cycles through statuses in the order configured under Settings → Task Properties → Status. A status can optionally define a specific Next status for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked Skip when cycling are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps. Additionally, you can convert any line type in your notes to TaskNotes using the Instant Conversion feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines. Task Properties# Tasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure. This frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets. For property types and examples, see Core Concepts. For configuration options, see Task Properties Settings. Projects# TaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management. This model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling. Project Assignment# Tasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the \"Add Project\" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault. Project Links# Projects are stored as wikilinks in the task's frontmatter (e.g., projects: [\"[[Project A]]\", \"[[Project B]]\"]). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field. Organization and Filtering# Tasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add note.projects conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization. Project Indicators# TaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance. Subtask Creation# Tasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select \"Create subtask\" to create a new task automatically linked to the current project. Dependencies# Task dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects: blockedBy: - uid: \"[[Operations/Order hardware]]\" reltype: FINISHTOSTART gap: P1D uid references the blocking task, typically through an Obsidian wikilink. reltype is stored with each dependency and defaults to FINISHTOSTART for dependencies created in the UI. gap is optional and uses ISO 8601 duration syntax (for example PT4H or P2D). Whenever a dependency is added, TaskNotes updates the upstream note’s blocking list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides. Selecting dependencies in the UI# The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries. The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views. Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place. These controls currently create and manage finish-to-start style blockers. Advanced reltype values and gap data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules. Automation# Auto-Archiving# TaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup. Configure auto-archiving per status from Settings → Task Properties → Task Statuses. Each status card includes an Auto-archive toggle and a Delay (minutes) input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically. The auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status. This automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault. File Management and Templates# TaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks. These settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds). For configuration details, see Task Defaults.For template variables, see Template Variables Reference. Recurring Tasks# TaskNotes recurring tasks use RFC 5545 RRule syntax with DTSTART, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu. For full behavior, examples, and edge cases, see Recurring Tasks. Task Reminders# Task reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus. For full setup, data format, defaults, and UI behavior, see Task Reminders."},{"route":"/obsidian/features/template-variables/","title":"Template Variables Reference","description":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced w...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/template-variables.md","namespace":"obsidian","relativePath":"features/template-variables.md","raw":"# Template Variables Reference\n\nTaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the `{{variableName}}` syntax and are replaced with actual values when content is created.\n\n## Overview\n\nTemplate variables are available in three contexts:\n\n- **Body templates** - Content templates for task and note files\n- **Folder templates** - Dynamic folder paths for file organization\n- **Filename templates** - Dynamic filename generation\n\nNot all variables are available in every context. The tables below indicate where each variable can be used.\n\n## Task Properties\n\nVariables for task-specific data.\n\n| Variable | Description | Body | Folder | Example |\n|----------|-------------|:----:|:------:|---------|\n| `{{title}}` | Task title | Yes | Yes | `My Task` |\n| `{{titleLower}}` | Title in lowercase | Yes | Yes | `my task` |\n| `{{titleUpper}}` | Title in uppercase | Yes | Yes | `MY TASK` |\n| `{{titleSnake}}` | Title in snake_case | Yes | Yes | `my_task` |\n| `{{titleKebab}}` | Title in kebab-case | Yes | Yes | `my-task` |\n| `{{titleCamel}}` | Title in camelCase | Yes | Yes | `myTask` |\n| `{{titlePascal}}` | Title in PascalCase | Yes | Yes | `MyTask` |\n| `{{priority}}` | Task priority value | Yes | Yes | `high` |\n| `{{priorityShort}}` | First character of priority (uppercase) | Yes | Yes | `H` |\n| `{{status}}` | Task status value | Yes | Yes | `active` |\n| `{{statusShort}}` | First character of status (uppercase) | Yes | Yes | `A` |\n| `{{context}}` | First context from contexts array | No | Yes | `work` |\n| `{{contexts}}` | All contexts (comma-separated in body, `/` in folder) | Yes | Yes | `work, home` or `work/home` |\n| `{{project}}` | First project from projects array | No | Yes | `ProjectA` |\n| `{{projects}}` | All projects joined by `/` | No | Yes | `ProjectA/ProjectB` |\n| `{{projectFilePath}}` | Full path of the first project, without `.md` | No | Yes | `Work/Projects/ProjectA` |\n| `{{projectFilePaths}}` | Full paths of all projects, joined by `/` | No | Yes | `Work/Alpha/Personal/Beta` |\n| `{{projectFolder}}` | Folder containing the first project note (its file path without the note's own name) | No | Yes | `Work/Projects` |\n| `{{projectFolders}}` | Folders of all projects, joined by `/` | No | Yes | `Work/Personal` |\n| `{{dueDate}}` | Task due date | Yes | Yes | `2025-01-15` |\n| `{{scheduledDate}}` | Task scheduled date | Yes | Yes | `2025-01-10` |\n\n## Body Template Only\n\nVariables available only in body templates (not folder templates).\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{details}}` | User-provided details/description | `Task description text` |\n| `{{parentNote}}` | Parent note name/path where task was created | `Projects/MyNote` |\n| `{{tags}}` | Task tags (comma-separated) | `urgent, review` |\n| `{{hashtags}}` | Task tags as space-separated hashtags | `#urgent #review` |\n| `{{timeEstimate}}` | Time estimate in minutes | `30` |\n\n## Date and Time\n\nVariables for current date and time values.\n\n| Variable | Description | Format | Example |\n|----------|-------------|--------|---------|\n| `{{date}}` | Full current date | `YYYY-MM-DD` | `2025-01-07` |\n| `{{year}}` | Current year | `YYYY` | `2025` |\n| `{{shortYear}}` | Short year | `YY` | `25` |\n| `{{month}}` | Current month | `MM` | `01` |\n| `{{day}}` | Current day | `DD` | `07` |\n| `{{monthName}}` | Full month name | - | `January` |\n| `{{monthNameShort}}` | Abbreviated month name | - | `Jan` |\n| `{{dayName}}` | Full day name | - | `Tuesday` |\n| `{{dayNameShort}}` | Abbreviated day name | - | `Tue` |\n| `{{week}}` | Week number of year | `WW` | `02` |\n| `{{quarter}}` | Quarter of year | `Q` | `1` |\n| `{{shortDate}}` | Compact date | `YYMMDD` | `250107` |\n\n### Time Variables\n\n| Variable | Description | Format | Example |\n|----------|-------------|--------|---------|\n| `{{time}}` | Current time (compact) | `HHmmss` | `143052` |\n| `{{time24}}` | 24-hour time | `HH:mm` | `14:30` |\n| `{{time12}}` | 12-hour time with AM/PM | `hh:mm a` | `02:30 PM` |\n| `{{hour}}` | Current hour (24-hour) | `HH` | `14` |\n| `{{hourPadded}}` | Hour with leading zero | `HH` | `14` |\n| `{{hour12}}` | Hour in 12-hour format | `hh` | `02` |\n| `{{minute}}` | Current minute | `mm` | `30` |\n| `{{second}}` | Current second | `ss` | `52` |\n| `{{ampm}}` | AM/PM indicator | `a` | `PM` |\n\n### Timestamps\n\n| Variable | Description | Format | Example |\n|----------|-------------|--------|---------|\n| `{{timestamp}}` | Date and time combined | `YYYY-MM-DD-HHmmss` | `2025-01-07-143052` |\n| `{{dateTime}}` | Date and time (no seconds) | `YYYY-MM-DD-HHmm` | `2025-01-07-1430` |\n| `{{unix}}` | Unix timestamp (seconds) | - | `1736264852` |\n| `{{unixMs}}` | Unix timestamp (milliseconds) | - | `1736264852000` |\n| `{{milliseconds}}` | Current milliseconds | `SSS` | `123` |\n| `{{ms}}` | Milliseconds (alias) | `SSS` | `123` |\n\n### Timezone\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{timezone}}` | Timezone offset | `+01:00` |\n| `{{timezoneShort}}` | Short timezone offset | `+0100` |\n| `{{utcOffset}}` | UTC offset | `+01:00` |\n| `{{utcOffsetShort}}` | Short UTC offset | `+0100` |\n| `{{utcZ}}` | UTC Z indicator | `Z` |\n\n### Unique Identifiers\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{zettel}}` | Zettelkasten-style ID (date + seconds since midnight in base36) | `250107abc` |\n| `{{nano}}` | Unique nano ID (timestamp + random string) | `1736264852000x7k2m` |\n\n## ICS Calendar Event Variables\n\nVariables for content created from ICS calendar events. Available when creating notes or tasks from calendar events.\n\n### Event Information\n\n| Variable | Description | Body | Folder |\n|----------|-------------|:----:|:------:|\n| `{{icsEventTitle}}` | Event title | Yes | Yes |\n| `{{icsEventTitleLower}}` | Event title lowercase | No | Yes |\n| `{{icsEventTitleUpper}}` | Event title uppercase | No | Yes |\n| `{{icsEventTitleSnake}}` | Event title in snake_case | No | Yes |\n| `{{icsEventTitleKebab}}` | Event title in kebab-case | No | Yes |\n| `{{icsEventTitleCamel}}` | Event title in camelCase | No | Yes |\n| `{{icsEventTitlePascal}}` | Event title in PascalCase | No | Yes |\n| `{{icsEventStart}}` | Event start time (ISO format) | Yes | No |\n| `{{icsEventEnd}}` | Event end time (ISO format) | Yes | No |\n| `{{icsEventLocation}}` | Event location | Yes | Yes |\n| `{{icsEventDescription}}` | Event description | Yes | Yes |\n| `{{icsEventUrl}}` | Event URL | Yes | No |\n| `{{icsEventSubscription}}` | Calendar subscription name | Yes | No |\n| `{{icsEventId}}` | Unique event identifier (UUID) | Yes | No |\n\n## Current Note Folder Variables\n\nVariables available for inline-created tasks and the default tasks folder.\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{currentNotePath}}` | Path to the current note's folder | `Projects/Notes` |\n| `{{currentNoteTitle}}` | Title/name of the current note | `Meeting Notes` |\n\n## Examples\n\n### Body Template\n\n```markdown\n---\ncreated: {{date}}\npriority: {{priority}}\nstatus: {{status}}\n---\n\n# {{title}}\n\n{{details}}\n\nCreated from: {{parentNote}}\nTags: {{hashtags}}\n```\n\n### Folder Template\n\nOrganize tasks by project and status:\n```\nTasks/{{project}}/{{status}}\n```\nResult: `Tasks/MyProject/active`\n\nOrganize by date hierarchy:\n```\nDaily/{{year}}/{{month}}/{{day}}\n```\nResult: `Daily/2025/01/07`\n\nOrganize ICS events by year and title:\n```\nEvents/{{year}}/{{icsEventTitleKebab}}\n```\nResult: `Events/2025/team-meeting`\n\n### Filename Template\n\nUsing Zettelkasten ID:\n```\n{{zettel}}-{{titleKebab}}\n```\nResult: `250107abc-my-task.md`\n\nUsing timestamp:\n```\n{{shortDate}}-{{title}}\n```\nResult: `250107-My Task.md`\n\n## Notes\n\n### YAML Safety\n\nWhen used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors.\n\n### Folder Path Sanitization\n\nIn folder templates, title values have filesystem-unsafe characters (`<>:\"/\\|?*`) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment.\n\n### Empty Values\n\nIf a variable references data that isn't available (e.g., `{{project}}` when no project is set), it resolves to an empty string.\n\n### Case Transformations\n\nThe case transformation variables work as follows:\n\n| Transform | Input | Output |\n|-----------|-------|--------|\n| `titleLower` | `My Task Name` | `my task name` |\n| `titleUpper` | `My Task Name` | `MY TASK NAME` |\n| `titleSnake` | `My Task Name` | `my_task_name` |\n| `titleKebab` | `My Task Name` | `my-task-name` |\n| `titleCamel` | `My Task Name` | `myTaskName` |\n| `titlePascal` | `My Task Name` | `MyTaskName` |\n","aliases":["/features/template-variables/"],"toc":[{"level":2,"id":"overview","text":"Overview"},{"level":2,"id":"task-properties","text":"Task Properties"},{"level":2,"id":"body-template-only","text":"Body Template Only"},{"level":2,"id":"date-and-time","text":"Date and Time"},{"level":3,"id":"time-variables","text":"Time Variables"},{"level":3,"id":"timestamps","text":"Timestamps"},{"level":3,"id":"timezone","text":"Timezone"},{"level":3,"id":"unique-identifiers","text":"Unique Identifiers"},{"level":2,"id":"ics-calendar-event-variables","text":"ICS Calendar Event Variables"},{"level":3,"id":"event-information","text":"Event Information"},{"level":2,"id":"current-note-folder-variables","text":"Current Note Folder Variables"},{"level":2,"id":"examples","text":"Examples"},{"level":3,"id":"body-template","text":"Body Template"},{"level":3,"id":"folder-template","text":"Folder Template"},{"level":3,"id":"filename-template","text":"Filename Template"},{"level":2,"id":"notes","text":"Notes"},{"level":3,"id":"yaml-safety","text":"YAML Safety"},{"level":3,"id":"folder-path-sanitization","text":"Folder Path Sanitization"},{"level":3,"id":"empty-values","text":"Empty Values"},{"level":3,"id":"case-transformations","text":"Case Transformations"}],"html":"

TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced with actual values when content is created.

\n

Overview#

\n

Template variables are available in three contexts:

\n
    \n
  • Body templates - Content templates for task and note files
  • \n
  • Folder templates - Dynamic folder paths for file organization
  • \n
  • Filename templates - Dynamic filename generation
  • \n
\n

Not all variables are available in every context. The tables below indicate where each variable can be used.

\n

Task Properties#

\n

Variables for task-specific data.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionBodyFolderExample
{{title}}Task titleYesYesMy Task
{{titleLower}}Title in lowercaseYesYesmy task
{{titleUpper}}Title in uppercaseYesYesMY TASK
{{titleSnake}}Title in snake_caseYesYesmy_task
{{titleKebab}}Title in kebab-caseYesYesmy-task
{{titleCamel}}Title in camelCaseYesYesmyTask
{{titlePascal}}Title in PascalCaseYesYesMyTask
{{priority}}Task priority valueYesYeshigh
{{priorityShort}}First character of priority (uppercase)YesYesH
{{status}}Task status valueYesYesactive
{{statusShort}}First character of status (uppercase)YesYesA
{{context}}First context from contexts arrayNoYeswork
{{contexts}}All contexts (comma-separated in body, / in folder)YesYeswork, home or work/home
{{project}}First project from projects arrayNoYesProjectA
{{projects}}All projects joined by /NoYesProjectA/ProjectB
{{projectFilePath}}Full path of the first project, without .mdNoYesWork/Projects/ProjectA
{{projectFilePaths}}Full paths of all projects, joined by /NoYesWork/Alpha/Personal/Beta
{{projectFolder}}Folder containing the first project note (its file path without the note's own name)NoYesWork/Projects
{{projectFolders}}Folders of all projects, joined by /NoYesWork/Personal
{{dueDate}}Task due dateYesYes2025-01-15
{{scheduledDate}}Task scheduled dateYesYes2025-01-10
\n

Body Template Only#

\n

Variables available only in body templates (not folder templates).

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{details}}User-provided details/descriptionTask description text
{{parentNote}}Parent note name/path where task was createdProjects/MyNote
{{tags}}Task tags (comma-separated)urgent, review
{{hashtags}}Task tags as space-separated hashtags#urgent #review
{{timeEstimate}}Time estimate in minutes30
\n

Date and Time#

\n

Variables for current date and time values.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionFormatExample
{{date}}Full current dateYYYY-MM-DD2025-01-07
{{year}}Current yearYYYY2025
{{shortYear}}Short yearYY25
{{month}}Current monthMM01
{{day}}Current dayDD07
{{monthName}}Full month name-January
{{monthNameShort}}Abbreviated month name-Jan
{{dayName}}Full day name-Tuesday
{{dayNameShort}}Abbreviated day name-Tue
{{week}}Week number of yearWW02
{{quarter}}Quarter of yearQ1
{{shortDate}}Compact dateYYMMDD250107
\n

Time Variables#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionFormatExample
{{time}}Current time (compact)HHmmss143052
{{time24}}24-hour timeHH:mm14:30
{{time12}}12-hour time with AM/PMhh:mm a02:30 PM
{{hour}}Current hour (24-hour)HH14
{{hourPadded}}Hour with leading zeroHH14
{{hour12}}Hour in 12-hour formathh02
{{minute}}Current minutemm30
{{second}}Current secondss52
{{ampm}}AM/PM indicatoraPM
\n

Timestamps#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionFormatExample
{{timestamp}}Date and time combinedYYYY-MM-DD-HHmmss2025-01-07-143052
{{dateTime}}Date and time (no seconds)YYYY-MM-DD-HHmm2025-01-07-1430
{{unix}}Unix timestamp (seconds)-1736264852
{{unixMs}}Unix timestamp (milliseconds)-1736264852000
{{milliseconds}}Current millisecondsSSS123
{{ms}}Milliseconds (alias)SSS123
\n

Timezone#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{timezone}}Timezone offset+01:00
{{timezoneShort}}Short timezone offset+0100
{{utcOffset}}UTC offset+01:00
{{utcOffsetShort}}Short UTC offset+0100
{{utcZ}}UTC Z indicatorZ
\n

Unique Identifiers#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{zettel}}Zettelkasten-style ID (date + seconds since midnight in base36)250107abc
{{nano}}Unique nano ID (timestamp + random string)1736264852000x7k2m
\n

ICS Calendar Event Variables#

\n

Variables for content created from ICS calendar events. Available when creating notes or tasks from calendar events.

\n

Event Information#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionBodyFolder
{{icsEventTitle}}Event titleYesYes
{{icsEventTitleLower}}Event title lowercaseNoYes
{{icsEventTitleUpper}}Event title uppercaseNoYes
{{icsEventTitleSnake}}Event title in snake_caseNoYes
{{icsEventTitleKebab}}Event title in kebab-caseNoYes
{{icsEventTitleCamel}}Event title in camelCaseNoYes
{{icsEventTitlePascal}}Event title in PascalCaseNoYes
{{icsEventStart}}Event start time (ISO format)YesNo
{{icsEventEnd}}Event end time (ISO format)YesNo
{{icsEventLocation}}Event locationYesYes
{{icsEventDescription}}Event descriptionYesYes
{{icsEventUrl}}Event URLYesNo
{{icsEventSubscription}}Calendar subscription nameYesNo
{{icsEventId}}Unique event identifier (UUID)YesNo
\n

Current Note Folder Variables#

\n

Variables available for inline-created tasks and the default tasks folder.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{currentNotePath}}Path to the current note's folderProjects/Notes
{{currentNoteTitle}}Title/name of the current noteMeeting Notes
\n

Examples#

\n

Body Template#

\n
---\ncreated: {{date}}\npriority: {{priority}}\nstatus: {{status}}\n---\n\n# {{title}}\n\n{{details}}\n\nCreated from: {{parentNote}}\nTags: {{hashtags}}\n

Folder Template#

\n

Organize tasks by project and status:

\n
Tasks/{{project}}/{{status}}\n

Result: Tasks/MyProject/active

\n

Organize by date hierarchy:

\n
Daily/{{year}}/{{month}}/{{day}}\n

Result: Daily/2025/01/07

\n

Organize ICS events by year and title:

\n
Events/{{year}}/{{icsEventTitleKebab}}\n

Result: Events/2025/team-meeting

\n

Filename Template#

\n

Using Zettelkasten ID:

\n
{{zettel}}-{{titleKebab}}\n

Result: 250107abc-my-task.md

\n

Using timestamp:

\n
{{shortDate}}-{{title}}\n

Result: 250107-My Task.md

\n

Notes#

\n

YAML Safety#

\n

When used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors.

\n

Folder Path Sanitization#

\n

In folder templates, title values have filesystem-unsafe characters (<>:"/\\|?*) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment.

\n

Empty Values#

\n

If a variable references data that isn't available (e.g., {{project}} when no project is set), it resolves to an empty string.

\n

Case Transformations#

\n

The case transformation variables work as follows:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TransformInputOutput
titleLowerMy Task Namemy task name
titleUpperMy Task NameMY TASK NAME
titleSnakeMy Task Namemy_task_name
titleKebabMy Task Namemy-task-name
titleCamelMy Task NamemyTaskName
titlePascalMy Task NameMyTaskName
\n","text":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced with actual values when content is created. Overview# Template variables are available in three contexts: Body templates - Content templates for task and note files Folder templates - Dynamic folder paths for file organization Filename templates - Dynamic filename generation Not all variables are available in every context. The tables below indicate where each variable can be used. Task Properties# Variables for task-specific data. Variable Description Body Folder Example {{title}} Task title Yes Yes My Task {{titleLower}} Title in lowercase Yes Yes my task {{titleUpper}} Title in uppercase Yes Yes MY TASK {{titleSnake}} Title in snake_case Yes Yes my_task {{titleKebab}} Title in kebab-case Yes Yes my-task {{titleCamel}} Title in camelCase Yes Yes myTask {{titlePascal}} Title in PascalCase Yes Yes MyTask {{priority}} Task priority value Yes Yes high {{priorityShort}} First character of priority (uppercase) Yes Yes H {{status}} Task status value Yes Yes active {{statusShort}} First character of status (uppercase) Yes Yes A {{context}} First context from contexts array No Yes work {{contexts}} All contexts (comma-separated in body, / in folder) Yes Yes work, home or work/home {{project}} First project from projects array No Yes ProjectA {{projects}} All projects joined by / No Yes ProjectA/ProjectB {{projectFilePath}} Full path of the first project, without .md No Yes Work/Projects/ProjectA {{projectFilePaths}} Full paths of all projects, joined by / No Yes Work/Alpha/Personal/Beta {{projectFolder}} Folder containing the first project note (its file path without the note's own name) No Yes Work/Projects {{projectFolders}} Folders of all projects, joined by / No Yes Work/Personal {{dueDate}} Task due date Yes Yes 2025-01-15 {{scheduledDate}} Task scheduled date Yes Yes 2025-01-10 Body Template Only# Variables available only in body templates (not folder templates). Variable Description Example {{details}} User-provided details/description Task description text {{parentNote}} Parent note name/path where task was created Projects/MyNote {{tags}} Task tags (comma-separated) urgent, review {{hashtags}} Task tags as space-separated hashtags #urgent #review {{timeEstimate}} Time estimate in minutes 30 Date and Time# Variables for current date and time values. Variable Description Format Example {{date}} Full current date YYYY-MM-DD 2025-01-07 {{year}} Current year YYYY 2025 {{shortYear}} Short year YY 25 {{month}} Current month MM 01 {{day}} Current day DD 07 {{monthName}} Full month name - January {{monthNameShort}} Abbreviated month name - Jan {{dayName}} Full day name - Tuesday {{dayNameShort}} Abbreviated day name - Tue {{week}} Week number of year WW 02 {{quarter}} Quarter of year Q 1 {{shortDate}} Compact date YYMMDD 250107 Time Variables# Variable Description Format Example {{time}} Current time (compact) HHmmss 143052 {{time24}} 24-hour time HH:mm 14:30 {{time12}} 12-hour time with AM/PM hh:mm a 02:30 PM {{hour}} Current hour (24-hour) HH 14 {{hourPadded}} Hour with leading zero HH 14 {{hour12}} Hour in 12-hour format hh 02 {{minute}} Current minute mm 30 {{second}} Current second ss 52 {{ampm}} AM/PM indicator a PM Timestamps# Variable Description Format Example {{timestamp}} Date and time combined YYYY-MM-DD-HHmmss 2025-01-07-143052 {{dateTime}} Date and time (no seconds) YYYY-MM-DD-HHmm 2025-01-07-1430 {{unix}} Unix timestamp (seconds) - 1736264852 {{unixMs}} Unix timestamp (milliseconds) - 1736264852000 {{milliseconds}} Current milliseconds SSS 123 {{ms}} Milliseconds (alias) SSS 123 Timezone# Variable Description Example {{timezone}} Timezone offset +01:00 {{timezoneShort}} Short timezone offset +0100 {{utcOffset}} UTC offset +01:00 {{utcOffsetShort}} Short UTC offset +0100 {{utcZ}} UTC Z indicator Z Unique Identifiers# Variable Description Example {{zettel}} Zettelkasten-style ID (date + seconds since midnight in base36) 250107abc {{nano}} Unique nano ID (timestamp + random string) 1736264852000x7k2m ICS Calendar Event Variables# Variables for content created from ICS calendar events. Available when creating notes or tasks from calendar events. Event Information# Variable Description Body Folder {{icsEventTitle}} Event title Yes Yes {{icsEventTitleLower}} Event title lowercase No Yes {{icsEventTitleUpper}} Event title uppercase No Yes {{icsEventTitleSnake}} Event title in snake_case No Yes {{icsEventTitleKebab}} Event title in kebab-case No Yes {{icsEventTitleCamel}} Event title in camelCase No Yes {{icsEventTitlePascal}} Event title in PascalCase No Yes {{icsEventStart}} Event start time (ISO format) Yes No {{icsEventEnd}} Event end time (ISO format) Yes No {{icsEventLocation}} Event location Yes Yes {{icsEventDescription}} Event description Yes Yes {{icsEventUrl}} Event URL Yes No {{icsEventSubscription}} Calendar subscription name Yes No {{icsEventId}} Unique event identifier (UUID) Yes No Current Note Folder Variables# Variables available for inline-created tasks and the default tasks folder. Variable Description Example {{currentNotePath}} Path to the current note's folder Projects/Notes {{currentNoteTitle}} Title/name of the current note Meeting Notes Examples# Body Template# --- created: {{date}} priority: {{priority}} status: {{status}} --- # {{title}} {{details}} Created from: {{parentNote}} Tags: {{hashtags}} Folder Template# Organize tasks by project and status: Tasks/{{project}}/{{status}} Result: Tasks/MyProject/active Organize by date hierarchy: Daily/{{year}}/{{month}}/{{day}} Result: Daily/2025/01/07 Organize ICS events by year and title: Events/{{year}}/{{icsEventTitleKebab}} Result: Events/2025/team-meeting Filename Template# Using Zettelkasten ID: {{zettel}}-{{titleKebab}} Result: 250107abc-my-task.md Using timestamp: {{shortDate}}-{{title}} Result: 250107-My Task.md Notes# YAML Safety# When used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors. Folder Path Sanitization# In folder templates, title values have filesystem-unsafe characters (<>:\"/\\|?*) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment. Empty Values# If a variable references data that isn't available (e.g., {{project}} when no project is set), it resolves to an empty string. Case Transformations# The case transformation variables work as follows: Transform Input Output titleLower My Task Name my task name titleUpper My Task Name MY TASK NAME titleSnake My Task Name my_task_name titleKebab My Task Name my-task-name titleCamel My Task Name myTaskName titlePascal My Task Name MyTaskName"},{"route":"/obsidian/features/time-management/","title":"Time Management","description":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/time-management.md","namespace":"obsidian","relativePath":"features/time-management.md","raw":"# Time Management\n\nTaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.\n\n## Time Tracking\n\nTaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the `timeEntries` array within each task's YAML frontmatter. Each time entry includes a start time and an end time.\n\nThe time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions.\n\n### Auto-Stop Time Tracking\n\nTaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management.\n\nThe auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated.\n\n**Configuration Options:** Configure these under `Settings -> TaskNotes -> Features` (Time Tracking section).\n\n- **Auto-stop tracking** - Enable or disable the automatic stopping behavior (enabled by default)\n- **Completion notification** - Show a notice when auto-stop occurs (disabled by default)\n\n**Behavior:**\n\n- Monitors all task status changes in real-time\n- Stops only the specific task that was completed (other active timers continue)\n- Preserves the recorded time data in the task's time entries\n- Works with both standard and recurring task completions\n- Functions across all task views (list, kanban, calendar, etc.)\n\nThe feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states.\n\n## Pomodoro Timer\n\nTaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer.\n\nWhen a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session.\n\n## Productivity Analytics\n\nThe **Pomodoro Stats View** provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time.\n\n![Task Statistics](../assets/feature-task-statistics.png)\n","aliases":["/features/time-management/"],"toc":[{"level":2,"id":"time-tracking","text":"Time Tracking"},{"level":3,"id":"auto-stop-time-tracking","text":"Auto-Stop Time Tracking"},{"level":2,"id":"pomodoro-timer","text":"Pomodoro Timer"},{"level":2,"id":"productivity-analytics","text":"Productivity Analytics"}],"html":"

TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.

\n

Time Tracking#

\n

TaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the timeEntries array within each task's YAML frontmatter. Each time entry includes a start time and an end time.

\n

The time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions.

\n

Auto-Stop Time Tracking#

\n

TaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management.

\n

The auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated.

\n

Configuration Options: Configure these under Settings -> TaskNotes -> Features (Time Tracking section).

\n
    \n
  • Auto-stop tracking - Enable or disable the automatic stopping behavior (enabled by default)
  • \n
  • Completion notification - Show a notice when auto-stop occurs (disabled by default)
  • \n
\n

Behavior:

\n
    \n
  • Monitors all task status changes in real-time
  • \n
  • Stops only the specific task that was completed (other active timers continue)
  • \n
  • Preserves the recorded time data in the task's time entries
  • \n
  • Works with both standard and recurring task completions
  • \n
  • Functions across all task views (list, kanban, calendar, etc.)
  • \n
\n

The feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states.

\n

Pomodoro Timer#

\n

TaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer.

\n

When a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session.

\n

Productivity Analytics#

\n

The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time.

\n

\"Task

\n","text":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer. Time Tracking# TaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the timeEntries array within each task's YAML frontmatter. Each time entry includes a start time and an end time. The time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions. Auto-Stop Time Tracking# TaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management. The auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated. Configuration Options: Configure these under Settings -> TaskNotes -> Features (Time Tracking section). Auto-stop tracking - Enable or disable the automatic stopping behavior (enabled by default) Completion notification - Show a notice when auto-stop occurs (disabled by default) Behavior: Monitors all task status changes in real-time Stops only the specific task that was completed (other active timers continue) Preserves the recorded time data in the task's time entries Works with both standard and recurring task completions Functions across all task views (list, kanban, calendar, etc.) The feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states. Pomodoro Timer# TaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer. When a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session. Productivity Analytics# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time."},{"route":"/obsidian/features/user-fields/","title":"User Fields","description":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User f...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/user-fields.md","namespace":"obsidian","relativePath":"features/user-fields.md","raw":"\n# User Fields\n\nTaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping.\nUser fields can store workflow-specific metadata such as owner, effort class, client, or review stage.\n\n\n## Creating User Fields\n\nUser fields are created in the TaskNotes settings, under the \"Task Properties\" tab. To create a new user field, click the \"Add new user field\" button.\nFields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views.\n\nEach user field has the following properties:\n\n- **Display Name**: The name of the field as it will be displayed in the UI.\n- **Property Name**: The name of the field as it will be stored in the frontmatter of the task note.\n- **Type**: The data type of the field. The following types are supported:\n - **Text**: A single line of text.\n - **Number**: A numeric value (supports ranges in filters and sorting).\n - **Boolean**: A true/false value stored as a checkbox in the task modal.\n - **Date**: A date.\n - **List**: A list of values.\n- **Default Value** (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type:\n - **Text**: Enter the default text value.\n - **Number**: Enter the default number.\n - **Boolean**: Toggle to set the default state (checked/unchecked).\n - **Date**: Select from presets: None, Today, Tomorrow, or Next Week.\n - **List**: Enter comma-separated default values.\n\n## Link Values\n\nUse a **Text** field for one related link, such as a pull request or specification, and a **List** field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare `https://` URLs as clickable links.\n\nFor internal note links, type `[[` in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped.\n\n## File Suggestion Filtering (Advanced)\n\nWhen using text or list type custom fields, you can configure **autosuggestion filters** to control which files appear in the autocomplete dropdown when you type `[[` in the field.\n\n![Custom field autosuggestion filters for tags, folders, and property values](../assets/custom-fields-selection-filter.webp)\n\nThis is useful when you want to limit suggestions to specific types of notes. For example:\n- An \"Assignee\" field that only suggests notes tagged with `#person`\n- A \"Project\" field that only shows notes in the `Projects/` folder\n- A \"Related Document\" field filtered by a specific frontmatter property\nFiltering narrows wikilink suggestions in large vaults.\n\n### Configuring Filters\n\nTo configure filters for a custom field:\n\n1. Go to **Settings → Task Properties → Custom User Fields**\n2. Expand the custom field card you want to configure\n3. Expand the **\"Autosuggestion filters (Advanced)\"** section\n4. Configure one or more of the following filters:\n\n#### Filter Options\n\n- **Required tags**: Only show files that have ANY of these tags (comma-separated)\n - Example: `person, team` - shows files with either `#person` OR `#team` tag\n - Supports hierarchical tags: `project/active` matches `#project/active`\n\n- **Include folders**: Only show files in these folders (comma-separated)\n - Example: `People/, Teams/` - shows files in either folder\n - Supports nested folders: `Projects/Active/` matches files in that specific folder\n\n- **Required property key**: Only show files that have this frontmatter property\n - Example: `role` - shows files with a `role:` property in frontmatter\n\n- **Required property value**: Expected value for the property (optional)\n - Example: `developer` - when combined with property key `role`, shows files with `role: developer`\n - Leave empty to match any value (just checks property exists)\n\n#### Filter Indicator\n\nWhen filters are configured, a **\"Filters On\"** badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active.\n\n### Filter Behavior\n\n- **All filters are combined with AND logic**: Files must match ALL configured filters to appear\n- **Empty filters are ignored**: If you don't configure a filter, it won't restrict results\n- **No filters = all files**: If no filters are configured, all markdown files in your vault will appear\n- **Filters only affect autocomplete**: They don't affect the actual field value or validation\nAutocomplete filtering and stored field values are handled independently.\n\n### Example Configurations\n\n#### Assignee Field (People Only)\n```\nDisplay Name: Assignee\nProperty Key: assignee\nType: List\n\nAutosuggestion filters:\n Required tags: person\n Include folders: People/\n```\n\n#### Project Field (Active Projects)\n```\nDisplay Name: Project\nProperty Key: project\nType: Text\n\nAutosuggestion filters:\n Required tags: project\n Required property key: status\n Required property value: active\n```\n\n#### Related Note (Specific Folder)\n```\nDisplay Name: Related Note\nProperty Key: related-note\nType: Text\n\nAutosuggestion filters:\n Include folders: Documentation/, Guides/\n```\n\n## Using User Fields\n\nOnce you have created a user field, it will be available in the following places:\n\n- **Task Modals**: The user field will be displayed in the task creation and edit modals.\n- **Bases Filters**: Add the field to Bases filter expressions (for example `note.effort == \"high\"`) to narrow task lists and Kanban boards.\n- **Sorting**: Use the Bases sort menu to order tasks by the user field.\n- **Grouping**: Use the Bases group menu to create swimlanes or list groupings based on the user field.\nTo verify a new field is active in workflow, add it to at least one saved view.\n\n## Frontmatter\n\nUser field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter.\n\nFor example, if you create a user field with the property name \"my_field\", the data for that field will be stored in the frontmatter as follows:\n\n```yaml\n---\nmy_field: value\n---\n```\n","aliases":["/features/user-fields/"],"toc":[{"level":2,"id":"creating-user-fields","text":"Creating User Fields"},{"level":2,"id":"link-values","text":"Link Values"},{"level":2,"id":"file-suggestion-filtering-advanced","text":"File Suggestion Filtering (Advanced)"},{"level":3,"id":"configuring-filters","text":"Configuring Filters"},{"level":3,"id":"filter-behavior","text":"Filter Behavior"},{"level":3,"id":"example-configurations","text":"Example Configurations"},{"level":2,"id":"using-user-fields","text":"Using User Fields"},{"level":2,"id":"frontmatter","text":"Frontmatter"}],"html":"

TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping.\nUser fields can store workflow-specific metadata such as owner, effort class, client, or review stage.

\n

Creating User Fields#

\n

User fields are created in the TaskNotes settings, under the "Task Properties" tab. To create a new user field, click the "Add new user field" button.\nFields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views.

\n

Each user field has the following properties:

\n
    \n
  • Display Name: The name of the field as it will be displayed in the UI.
  • \n
  • Property Name: The name of the field as it will be stored in the frontmatter of the task note.
  • \n
  • Type: The data type of the field. The following types are supported:
      \n
    • Text: A single line of text.
    • \n
    • Number: A numeric value (supports ranges in filters and sorting).
    • \n
    • Boolean: A true/false value stored as a checkbox in the task modal.
    • \n
    • Date: A date.
    • \n
    • List: A list of values.
    • \n
    \n
  • \n
  • Default Value (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type:
      \n
    • Text: Enter the default text value.
    • \n
    • Number: Enter the default number.
    • \n
    • Boolean: Toggle to set the default state (checked/unchecked).
    • \n
    • Date: Select from presets: None, Today, Tomorrow, or Next Week.
    • \n
    • List: Enter comma-separated default values.
    • \n
    \n
  • \n
\n\n

Use a Text field for one related link, such as a pull request or specification, and a List field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare https:// URLs as clickable links.

\n

For internal note links, type [[ in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped.

\n

File Suggestion Filtering (Advanced)#

\n

When using text or list type custom fields, you can configure autosuggestion filters to control which files appear in the autocomplete dropdown when you type [[ in the field.

\n

\"Custom

\n

This is useful when you want to limit suggestions to specific types of notes. For example:

\n
    \n
  • An "Assignee" field that only suggests notes tagged with #person
  • \n
  • A "Project" field that only shows notes in the Projects/ folder
  • \n
  • A "Related Document" field filtered by a specific frontmatter property\nFiltering narrows wikilink suggestions in large vaults.
  • \n
\n

Configuring Filters#

\n

To configure filters for a custom field:

\n
    \n
  1. Go to Settings → Task Properties → Custom User Fields
  2. \n
  3. Expand the custom field card you want to configure
  4. \n
  5. Expand the "Autosuggestion filters (Advanced)" section
  6. \n
  7. Configure one or more of the following filters:
  8. \n
\n

Filter Options#

\n
    \n
  • Required tags: Only show files that have ANY of these tags (comma-separated)

    \n
      \n
    • Example: person, team - shows files with either #person OR #team tag
    • \n
    • Supports hierarchical tags: project/active matches #project/active
    • \n
    \n
  • \n
  • Include folders: Only show files in these folders (comma-separated)

    \n
      \n
    • Example: People/, Teams/ - shows files in either folder
    • \n
    • Supports nested folders: Projects/Active/ matches files in that specific folder
    • \n
    \n
  • \n
  • Required property key: Only show files that have this frontmatter property

    \n
      \n
    • Example: role - shows files with a role: property in frontmatter
    • \n
    \n
  • \n
  • Required property value: Expected value for the property (optional)

    \n
      \n
    • Example: developer - when combined with property key role, shows files with role: developer
    • \n
    • Leave empty to match any value (just checks property exists)
    • \n
    \n
  • \n
\n

Filter Indicator#

\n

When filters are configured, a "Filters On" badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active.

\n

Filter Behavior#

\n
    \n
  • All filters are combined with AND logic: Files must match ALL configured filters to appear
  • \n
  • Empty filters are ignored: If you don't configure a filter, it won't restrict results
  • \n
  • No filters = all files: If no filters are configured, all markdown files in your vault will appear
  • \n
  • Filters only affect autocomplete: They don't affect the actual field value or validation\nAutocomplete filtering and stored field values are handled independently.
  • \n
\n

Example Configurations#

\n

Assignee Field (People Only)#

\n
Display Name: Assignee\nProperty Key: assignee\nType: List\n\nAutosuggestion filters:\n  Required tags: person\n  Include folders: People/\n

Project Field (Active Projects)#

\n
Display Name: Project\nProperty Key: project\nType: Text\n\nAutosuggestion filters:\n  Required tags: project\n  Required property key: status\n  Required property value: active\n

Related Note (Specific Folder)#

\n
Display Name: Related Note\nProperty Key: related-note\nType: Text\n\nAutosuggestion filters:\n  Include folders: Documentation/, Guides/\n

Using User Fields#

\n

Once you have created a user field, it will be available in the following places:

\n
    \n
  • Task Modals: The user field will be displayed in the task creation and edit modals.
  • \n
  • Bases Filters: Add the field to Bases filter expressions (for example note.effort == "high") to narrow task lists and Kanban boards.
  • \n
  • Sorting: Use the Bases sort menu to order tasks by the user field.
  • \n
  • Grouping: Use the Bases group menu to create swimlanes or list groupings based on the user field.\nTo verify a new field is active in workflow, add it to at least one saved view.
  • \n
\n

Frontmatter#

\n

User field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter.

\n

For example, if you create a user field with the property name "my_field", the data for that field will be stored in the frontmatter as follows:

\n
---\nmy_field: value\n---\n
","text":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User fields can store workflow-specific metadata such as owner, effort class, client, or review stage. Creating User Fields# User fields are created in the TaskNotes settings, under the \"Task Properties\" tab. To create a new user field, click the \"Add new user field\" button. Fields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views. Each user field has the following properties: Display Name: The name of the field as it will be displayed in the UI. Property Name: The name of the field as it will be stored in the frontmatter of the task note. Type: The data type of the field. The following types are supported: Text: A single line of text. Number: A numeric value (supports ranges in filters and sorting). Boolean: A true/false value stored as a checkbox in the task modal. Date: A date. List: A list of values. Default Value (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type: Text: Enter the default text value. Number: Enter the default number. Boolean: Toggle to set the default state (checked/unchecked). Date: Select from presets: None, Today, Tomorrow, or Next Week. List: Enter comma-separated default values. Link Values# Use a Text field for one related link, such as a pull request or specification, and a List field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare https:// URLs as clickable links. For internal note links, type [[ in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped. File Suggestion Filtering (Advanced)# When using text or list type custom fields, you can configure autosuggestion filters to control which files appear in the autocomplete dropdown when you type [[ in the field. This is useful when you want to limit suggestions to specific types of notes. For example: An \"Assignee\" field that only suggests notes tagged with #person A \"Project\" field that only shows notes in the Projects/ folder A \"Related Document\" field filtered by a specific frontmatter property Filtering narrows wikilink suggestions in large vaults. Configuring Filters# To configure filters for a custom field: Go to Settings → Task Properties → Custom User Fields Expand the custom field card you want to configure Expand the \"Autosuggestion filters (Advanced)\" section Configure one or more of the following filters: Filter Options# Required tags: Only show files that have ANY of these tags (comma-separated) Example: person, team - shows files with either #person OR #team tag Supports hierarchical tags: project/active matches #project/active Include folders: Only show files in these folders (comma-separated) Example: People/, Teams/ - shows files in either folder Supports nested folders: Projects/Active/ matches files in that specific folder Required property key: Only show files that have this frontmatter property Example: role - shows files with a role: property in frontmatter Required property value: Expected value for the property (optional) Example: developer - when combined with property key role, shows files with role: developer Leave empty to match any value (just checks property exists) Filter Indicator# When filters are configured, a \"Filters On\" badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active. Filter Behavior# All filters are combined with AND logic: Files must match ALL configured filters to appear Empty filters are ignored: If you don't configure a filter, it won't restrict results No filters = all files: If no filters are configured, all markdown files in your vault will appear Filters only affect autocomplete: They don't affect the actual field value or validation Autocomplete filtering and stored field values are handled independently. Example Configurations# Assignee Field (People Only)# Display Name: Assignee Property Key: assignee Type: List Autosuggestion filters: Required tags: person Include folders: People/ Project Field (Active Projects)# Display Name: Project Property Key: project Type: Text Autosuggestion filters: Required tags: project Required property key: status Required property value: active Related Note (Specific Folder)# Display Name: Related Note Property Key: related-note Type: Text Autosuggestion filters: Include folders: Documentation/, Guides/ Using User Fields# Once you have created a user field, it will be available in the following places: Task Modals: The user field will be displayed in the task creation and edit modals. Bases Filters: Add the field to Bases filter expressions (for example note.effort == \"high\") to narrow task lists and Kanban boards. Sorting: Use the Bases sort menu to order tasks by the user field. Grouping: Use the Bases group menu to create swimlanes or list groupings based on the user field. To verify a new field is active in workflow, add it to at least one saved view. Frontmatter# User field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter. For example, if you create a user field with the property name \"my_field\", the data for that field will be stored in the frontmatter as follows: --- my_field: value ---"},{"route":"/obsidian/getting-started/existing-vault/","title":"Adopt TaskNotes in an existing vault","description":"Adopt TaskNotes in a vault that already contains tasks, tags, and custom frontmatter without rewriting everything first.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/getting-started/existing-vault.md","namespace":"obsidian","relativePath":"getting-started/existing-vault.md","raw":"---\ndescription: Adopt TaskNotes in a vault that already contains tasks, tags, and custom frontmatter without rewriting everything first.\n---\n\n# Adopt TaskNotes in an existing vault\n\nTaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions.\n\n## 1. Back up the vault\n\nMake a complete vault backup, including the hidden `.obsidian` directory. The task notes themselves are Markdown, while TaskNotes settings live in `.obsidian/plugins/tasknotes/data.json`.\n\n## 2. Inspect a representative note\n\nChoose one existing task and record:\n\n- The property or tag that distinguishes tasks from ordinary notes\n- The property names used for title, status, priority, due date, and scheduled date\n- Whether contexts and tags are stored with or without display prefixes\n- The folder patterns that should be included or excluded\n\nCanonical frontmatter values do not include natural-language trigger characters. Store `office`, not `@office`, and `review`, not `#review`.\n\n```yaml\n---\ntype: task\nstatus: open\ncontexts:\n - office\ntags:\n - review\n---\n```\n\n## 3. Choose task identification\n\nOpen **Settings → TaskNotes → General**.\n\n- Choose **Tag** if every task contains one identifying tag, such as `task`.\n- Choose **Property** if a property/value pair identifies tasks, such as `type: task`.\n- Add archive, template, attachment, or other non-task locations to **Excluded folders**.\n\nTask identification controls indexing and every generated Base filter. Confirm it before regenerating Base files.\n\n## 4. Map properties\n\nOpen **Settings → TaskNotes → Task properties** and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both `due` and `deadline`.\n\nStart with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the [property types reference](../settings/property-types-reference.md) to check value shapes.\n\n## 5. Test one note\n\nOpen one existing note and confirm that TaskNotes recognizes it. Use **TaskNotes: Quick actions for current task** and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set.\n\nIf the note is not recognized, use the [troubleshooting decision tree](../troubleshooting.md#tasks-not-appearing-in-views).\n\n## 6. Generate views from the final mapping\n\nOpen **Settings → TaskNotes → General → Views & base files** and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping.\n\nThe update action replaces configured default Base files. Copy any customized Base to a new filename before updating it.\n\n## 7. Convert incrementally\n\nConvert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default `TaskNotes/Tasks` folder if your storage and exclusion settings already cover their location.\n","aliases":["/getting-started/existing-vault/"],"toc":[{"level":2,"id":"1-back-up-the-vault","text":"1. Back up the vault"},{"level":2,"id":"2-inspect-a-representative-note","text":"2. Inspect a representative note"},{"level":2,"id":"3-choose-task-identification","text":"3. Choose task identification"},{"level":2,"id":"4-map-properties","text":"4. Map properties"},{"level":2,"id":"5-test-one-note","text":"5. Test one note"},{"level":2,"id":"6-generate-views-from-the-final-mapping","text":"6. Generate views from the final mapping"},{"level":2,"id":"7-convert-incrementally","text":"7. Convert incrementally"}],"html":"

TaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions.

\n

1. Back up the vault#

\n

Make a complete vault backup, including the hidden .obsidian directory. The task notes themselves are Markdown, while TaskNotes settings live in .obsidian/plugins/tasknotes/data.json.

\n

2. Inspect a representative note#

\n

Choose one existing task and record:

\n
    \n
  • The property or tag that distinguishes tasks from ordinary notes
  • \n
  • The property names used for title, status, priority, due date, and scheduled date
  • \n
  • Whether contexts and tags are stored with or without display prefixes
  • \n
  • The folder patterns that should be included or excluded
  • \n
\n

Canonical frontmatter values do not include natural-language trigger characters. Store office, not @office, and review, not #review.

\n
---\ntype: task\nstatus: open\ncontexts:\n  - office\ntags:\n  - review\n---\n

3. Choose task identification#

\n

Open Settings → TaskNotes → General.

\n
    \n
  • Choose Tag if every task contains one identifying tag, such as task.
  • \n
  • Choose Property if a property/value pair identifies tasks, such as type: task.
  • \n
  • Add archive, template, attachment, or other non-task locations to Excluded folders.
  • \n
\n

Task identification controls indexing and every generated Base filter. Confirm it before regenerating Base files.

\n

4. Map properties#

\n

Open Settings → TaskNotes → Task properties and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both due and deadline.

\n

Start with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the property types reference to check value shapes.

\n

5. Test one note#

\n

Open one existing note and confirm that TaskNotes recognizes it. Use TaskNotes: Quick actions for current task and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set.

\n

If the note is not recognized, use the troubleshooting decision tree.

\n

6. Generate views from the final mapping#

\n

Open Settings → TaskNotes → General → Views & base files and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping.

\n

The update action replaces configured default Base files. Copy any customized Base to a new filename before updating it.

\n

7. Convert incrementally#

\n

Convert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default TaskNotes/Tasks folder if your storage and exclusion settings already cover their location.

\n","text":"TaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions. 1. Back up the vault# Make a complete vault backup, including the hidden .obsidian directory. The task notes themselves are Markdown, while TaskNotes settings live in .obsidian/plugins/tasknotes/data.json. 2. Inspect a representative note# Choose one existing task and record: The property or tag that distinguishes tasks from ordinary notes The property names used for title, status, priority, due date, and scheduled date Whether contexts and tags are stored with or without display prefixes The folder patterns that should be included or excluded Canonical frontmatter values do not include natural-language trigger characters. Store office, not @office, and review, not #review. --- type: task status: open contexts: - office tags: - review --- 3. Choose task identification# Open Settings → TaskNotes → General. Choose Tag if every task contains one identifying tag, such as task. Choose Property if a property/value pair identifies tasks, such as type: task. Add archive, template, attachment, or other non-task locations to Excluded folders. Task identification controls indexing and every generated Base filter. Confirm it before regenerating Base files. 4. Map properties# Open Settings → TaskNotes → Task properties and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both due and deadline. Start with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the property types reference to check value shapes. 5. Test one note# Open one existing note and confirm that TaskNotes recognizes it. Use TaskNotes: Quick actions for current task and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set. If the note is not recognized, use the troubleshooting decision tree. 6. Generate views from the final mapping# Open Settings → TaskNotes → General → Views & base files and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping. The update action replaces configured default Base files. Copy any customized Base to a new filename before updating it. 7. Convert incrementally# Convert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default TaskNotes/Tasks folder if your storage and exclusion settings already cover their location."},{"route":"/obsidian/getting-started/mobile/","title":"Obsidian mobile guide","description":"What is shared between TaskNotes desktop and mobile, and which integrations differ on mobile.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/getting-started/mobile.md","namespace":"obsidian","relativePath":"getting-started/mobile.md","raw":"---\ndescription: What is shared between TaskNotes desktop and mobile, and which integrations differ on mobile.\n---\n\n# Obsidian mobile guide\n\nTaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including `.base` files and `.obsidian/plugins/tasknotes/data.json`, when you want the same configuration on every device.\n\n## Before opening TaskNotes\n\n1. Install an Obsidian mobile version compatible with the current [TaskNotes requirement](../reference/compatibility.md).\n2. Enable the **Bases** core plugin.\n3. Confirm the TaskNotes plugin and its `data.json` have finished syncing before changing settings.\n4. Open a small default Base first and allow the initial index to finish.\n\n## Mobile differences\n\n| Area | Mobile behavior |\n| --- | --- |\n| HTTP API and MCP server | Desktop only. The HTTP API settings section is hidden on mobile. |\n| Calendar integrations | Available, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem. |\n| Settings layout | Uses the same six tabs. Desktop-only controls are omitted where they cannot run. |\n| Keyboard commands | Commands remain available in the command palette; desktop key bindings may not have a mobile equivalent. |\n| Wide views | Calendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration. |\n\n## A practical mobile setup\n\n- Keep task cards compact under **Settings → Appearance and UI**.\n- Limit visible Base columns and calendar event layers.\n- Increase remote calendar refresh intervals when mobile networking or battery use matters.\n- Use the task creation modal or command palette for predictable capture.\n- Keep HTTP automation on a desktop Obsidian instance.\n\n## If mobile stops loading tasks\n\nWait for vault sync to finish, confirm Bases is enabled, and run **TaskNotes: Refresh cache**. Then reopen the affected Base. If the problem is isolated to calendar data, enable **Disable calendar integration on mobile** and restart Obsidian before investigating the provider connection on desktop.\n","aliases":["/getting-started/mobile/"],"toc":[{"level":2,"id":"before-opening-tasknotes","text":"Before opening TaskNotes"},{"level":2,"id":"mobile-differences","text":"Mobile differences"},{"level":2,"id":"a-practical-mobile-setup","text":"A practical mobile setup"},{"level":2,"id":"if-mobile-stops-loading-tasks","text":"If mobile stops loading tasks"}],"html":"

TaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including .base files and .obsidian/plugins/tasknotes/data.json, when you want the same configuration on every device.

\n

Before opening TaskNotes#

\n
    \n
  1. Install an Obsidian mobile version compatible with the current TaskNotes requirement.
  2. \n
  3. Enable the Bases core plugin.
  4. \n
  5. Confirm the TaskNotes plugin and its data.json have finished syncing before changing settings.
  6. \n
  7. Open a small default Base first and allow the initial index to finish.
  8. \n
\n

Mobile differences#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
AreaMobile behavior
HTTP API and MCP serverDesktop only. The HTTP API settings section is hidden on mobile.
Calendar integrationsAvailable, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem.
Settings layoutUses the same six tabs. Desktop-only controls are omitted where they cannot run.
Keyboard commandsCommands remain available in the command palette; desktop key bindings may not have a mobile equivalent.
Wide viewsCalendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration.
\n

A practical mobile setup#

\n
    \n
  • Keep task cards compact under Settings → Appearance and UI.
  • \n
  • Limit visible Base columns and calendar event layers.
  • \n
  • Increase remote calendar refresh intervals when mobile networking or battery use matters.
  • \n
  • Use the task creation modal or command palette for predictable capture.
  • \n
  • Keep HTTP automation on a desktop Obsidian instance.
  • \n
\n

If mobile stops loading tasks#

\n

Wait for vault sync to finish, confirm Bases is enabled, and run TaskNotes: Refresh cache. Then reopen the affected Base. If the problem is isolated to calendar data, enable Disable calendar integration on mobile and restart Obsidian before investigating the provider connection on desktop.

\n","text":"TaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including .base files and .obsidian/plugins/tasknotes/data.json, when you want the same configuration on every device. Before opening TaskNotes# Install an Obsidian mobile version compatible with the current TaskNotes requirement. Enable the Bases core plugin. Confirm the TaskNotes plugin and its data.json have finished syncing before changing settings. Open a small default Base first and allow the initial index to finish. Mobile differences# Area Mobile behavior HTTP API and MCP server Desktop only. The HTTP API settings section is hidden on mobile. Calendar integrations Available, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem. Settings layout Uses the same six tabs. Desktop-only controls are omitted where they cannot run. Keyboard commands Commands remain available in the command palette; desktop key bindings may not have a mobile equivalent. Wide views Calendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration. A practical mobile setup# Keep task cards compact under Settings → Appearance and UI. Limit visible Base columns and calendar event layers. Increase remote calendar refresh intervals when mobile networking or battery use matters. Use the task creation modal or command palette for predictable capture. Keep HTTP automation on a desktop Obsidian instance. If mobile stops loading tasks# Wait for vault sync to finish, confirm Bases is enabled, and run TaskNotes: Refresh cache. Then reopen the affected Base. If the problem is isolated to calendar data, enable Disable calendar integration on mobile and restart Obsidian before investigating the provider connection on desktop."},{"route":"/obsidian/guides/backup-recovery/","title":"Backup, restore, and removal","description":"Back up, restore, reset, and uninstall TaskNotes while protecting task notes, views, settings, and integration data.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/guides/backup-recovery.md","namespace":"obsidian","relativePath":"guides/backup-recovery.md","raw":"---\ndescription: Back up, restore, reset, and uninstall TaskNotes while protecting task notes, views, settings, and integration data.\n---\n\n# Backup, restore, and removal\n\nTaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both.\n\n## What to back up\n\n| Data | Typical location | Why it matters |\n| --- | --- | --- |\n| Task notes | Your configured task folders | Titles, properties, details, recurrence, and time entries |\n| Base views | `TaskNotes/Views/` or custom paths | Filters, formulas, layout, and custom views |\n| Plugin settings | `.obsidian/plugins/tasknotes/data.json` | Field mapping, statuses, defaults, integrations, and view command paths |\n| Daily notes | Your daily-note folder | Pomodoro history when daily-note storage is enabled |\n| mdbase configuration | `tasknotes.yaml`, `mdbase.yaml`, or `.mdbase/` when configured | Shared collection and schema configuration |\n\nTreat `data.json` as sensitive because integration configuration can include credentials or tokens. Store backups accordingly.\n\n## Create a restorable backup\n\n1. Close Obsidian or disable TaskNotes so settings are not being written.\n2. Copy the entire vault, including hidden files.\n3. Verify the backup contains `.obsidian/plugins/tasknotes/data.json`.\n4. Keep at least one version from before a migration or bulk edit.\n\nFile-history sync is useful, but it is not a substitute for a separate tested backup.\n\n## Restore\n\n1. Close Obsidian.\n2. Restore task notes and Base files first.\n3. Restore `.obsidian/plugins/tasknotes/data.json` if you also need the previous settings.\n4. Reopen Obsidian and confirm Bases is enabled.\n5. Run **TaskNotes: Refresh cache** and open one default Base.\n\nIf provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens.\n\n## Reset configuration safely\n\nDo not delete `data.json` as a first troubleshooting step.\n\n1. Close Obsidian.\n2. Rename `data.json` to `data.json.backup-YYYY-MM-DD`.\n3. Reopen Obsidian and test with fresh defaults.\n4. Restore the backup while Obsidian is closed if the reset does not help.\n\nA reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files.\n\n## Uninstall\n\nDisabling or uninstalling TaskNotes leaves task notes and `.base` files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep.\n\nTo remove plugin settings as well, close Obsidian and remove `.obsidian/plugins/tasknotes/` after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render.\n\n## Recovery checklist\n\n- Missing tasks: restore the note files, then verify task identification and excluded folders.\n- Missing settings: restore `data.json` with Obsidian closed.\n- Broken default views: regenerate them from **General → Views & base files**.\n- Broken custom views: restore the individual `.base` files from history.\n- Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter.\n","aliases":["/guides/backup-recovery/"],"toc":[{"level":2,"id":"what-to-back-up","text":"What to back up"},{"level":2,"id":"create-a-restorable-backup","text":"Create a restorable backup"},{"level":2,"id":"restore","text":"Restore"},{"level":2,"id":"reset-configuration-safely","text":"Reset configuration safely"},{"level":2,"id":"uninstall","text":"Uninstall"},{"level":2,"id":"recovery-checklist","text":"Recovery checklist"}],"html":"

TaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both.

\n

What to back up#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DataTypical locationWhy it matters
Task notesYour configured task foldersTitles, properties, details, recurrence, and time entries
Base viewsTaskNotes/Views/ or custom pathsFilters, formulas, layout, and custom views
Plugin settings.obsidian/plugins/tasknotes/data.jsonField mapping, statuses, defaults, integrations, and view command paths
Daily notesYour daily-note folderPomodoro history when daily-note storage is enabled
mdbase configurationtasknotes.yaml, mdbase.yaml, or .mdbase/ when configuredShared collection and schema configuration
\n

Treat data.json as sensitive because integration configuration can include credentials or tokens. Store backups accordingly.

\n

Create a restorable backup#

\n
    \n
  1. Close Obsidian or disable TaskNotes so settings are not being written.
  2. \n
  3. Copy the entire vault, including hidden files.
  4. \n
  5. Verify the backup contains .obsidian/plugins/tasknotes/data.json.
  6. \n
  7. Keep at least one version from before a migration or bulk edit.
  8. \n
\n

File-history sync is useful, but it is not a substitute for a separate tested backup.

\n

Restore#

\n
    \n
  1. Close Obsidian.
  2. \n
  3. Restore task notes and Base files first.
  4. \n
  5. Restore .obsidian/plugins/tasknotes/data.json if you also need the previous settings.
  6. \n
  7. Reopen Obsidian and confirm Bases is enabled.
  8. \n
  9. Run TaskNotes: Refresh cache and open one default Base.
  10. \n
\n

If provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens.

\n

Reset configuration safely#

\n

Do not delete data.json as a first troubleshooting step.

\n
    \n
  1. Close Obsidian.
  2. \n
  3. Rename data.json to data.json.backup-YYYY-MM-DD.
  4. \n
  5. Reopen Obsidian and test with fresh defaults.
  6. \n
  7. Restore the backup while Obsidian is closed if the reset does not help.
  8. \n
\n

A reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files.

\n

Uninstall#

\n

Disabling or uninstalling TaskNotes leaves task notes and .base files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep.

\n

To remove plugin settings as well, close Obsidian and remove .obsidian/plugins/tasknotes/ after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render.

\n

Recovery checklist#

\n
    \n
  • Missing tasks: restore the note files, then verify task identification and excluded folders.
  • \n
  • Missing settings: restore data.json with Obsidian closed.
  • \n
  • Broken default views: regenerate them from General → Views & base files.
  • \n
  • Broken custom views: restore the individual .base files from history.
  • \n
  • Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter.
  • \n
\n","text":"TaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both. What to back up# Data Typical location Why it matters Task notes Your configured task folders Titles, properties, details, recurrence, and time entries Base views TaskNotes/Views/ or custom paths Filters, formulas, layout, and custom views Plugin settings .obsidian/plugins/tasknotes/data.json Field mapping, statuses, defaults, integrations, and view command paths Daily notes Your daily-note folder Pomodoro history when daily-note storage is enabled mdbase configuration tasknotes.yaml, mdbase.yaml, or .mdbase/ when configured Shared collection and schema configuration Treat data.json as sensitive because integration configuration can include credentials or tokens. Store backups accordingly. Create a restorable backup# Close Obsidian or disable TaskNotes so settings are not being written. Copy the entire vault, including hidden files. Verify the backup contains .obsidian/plugins/tasknotes/data.json. Keep at least one version from before a migration or bulk edit. File-history sync is useful, but it is not a substitute for a separate tested backup. Restore# Close Obsidian. Restore task notes and Base files first. Restore .obsidian/plugins/tasknotes/data.json if you also need the previous settings. Reopen Obsidian and confirm Bases is enabled. Run TaskNotes: Refresh cache and open one default Base. If provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens. Reset configuration safely# Do not delete data.json as a first troubleshooting step. Close Obsidian. Rename data.json to data.json.backup-YYYY-MM-DD. Reopen Obsidian and test with fresh defaults. Restore the backup while Obsidian is closed if the reset does not help. A reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files. Uninstall# Disabling or uninstalling TaskNotes leaves task notes and .base files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep. To remove plugin settings as well, close Obsidian and remove .obsidian/plugins/tasknotes/ after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render. Recovery checklist# Missing tasks: restore the note files, then verify task identification and excluded folders. Missing settings: restore data.json with Obsidian closed. Broken default views: regenerate them from General → Views & base files. Broken custom views: restore the individual .base files from history. Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter."},{"route":"/obsidian/guides/custom-bases/","title":"Build a custom Base","description":"Create a custom Obsidian Base for TaskNotes while keeping generated defaults safe and upgradeable.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/guides/custom-bases.md","namespace":"obsidian","relativePath":"guides/custom-bases.md","raw":"---\ndescription: Create a custom Obsidian Base for TaskNotes while keeping generated defaults safe and upgradeable.\n---\n\n# Build a custom Base\n\nTaskNotes views are ordinary Obsidian `.base` files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy.\n\n## Start from a copy\n\n1. Open `TaskNotes/Views/` in the file explorer.\n2. Duplicate the closest default, such as `tasks-default.base`.\n3. Rename the copy, for example `work-tasks.base`.\n4. Open the copy and make changes with the Bases interface or source editor.\n\nAvoid editing the only copy of a generated default. **Update default base files** replaces the files configured as defaults.\n\n## Preserve task identification\n\nEvery task view needs a filter that matches the identification method in **Settings → TaskNotes → General**.\n\nFor tag identification:\n\n```yaml\nfilters:\n and:\n - file.hasTag(\"task\")\n```\n\nFor property identification:\n\n```yaml\nfilters:\n and:\n - note[\"type\"] == \"task\"\n```\n\nAlso preserve any excluded-folder conditions generated from your settings.\n\n## Add a focused view\n\nThis example starts with recognized tasks, then limits the view to the `work` context:\n\n```yaml\nfilters:\n and:\n - file.hasTag(\"task\")\n - list(contexts).contains(\"work\")\n\nviews:\n - type: tasknotesTaskList\n name: Work\n order:\n - status\n - priority\n - due\n - file.name\n sort:\n - column: due\n direction: ASC\n```\n\nUse canonical stored values in filters. Natural-language prefixes such as `@` and `#` are input syntax, not part of stored context and tag values.\n\n## Point a command at the custom Base\n\nOpen **Settings → TaskNotes → General → View commands** and change the relevant command path. Resetting that mapping returns it to the generated default path.\n\n## Upgrade safely\n\nWhen TaskNotes ships improved templates:\n\n1. Keep your custom file at its own path.\n2. Run **Update default base files**.\n3. Compare the regenerated default with your copy.\n4. Bring across only the formulas, filters, or view options you want.\n\nThe [generated template reference](../reference/default-base-templates.md) always reflects the current source and default field mapping.\n\n## Recovery\n\nIf a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time.\n","aliases":["/guides/custom-bases/"],"toc":[{"level":2,"id":"start-from-a-copy","text":"Start from a copy"},{"level":2,"id":"preserve-task-identification","text":"Preserve task identification"},{"level":2,"id":"add-a-focused-view","text":"Add a focused view"},{"level":2,"id":"point-a-command-at-the-custom-base","text":"Point a command at the custom Base"},{"level":2,"id":"upgrade-safely","text":"Upgrade safely"},{"level":2,"id":"recovery","text":"Recovery"}],"html":"

TaskNotes views are ordinary Obsidian .base files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy.

\n

Start from a copy#

\n
    \n
  1. Open TaskNotes/Views/ in the file explorer.
  2. \n
  3. Duplicate the closest default, such as tasks-default.base.
  4. \n
  5. Rename the copy, for example work-tasks.base.
  6. \n
  7. Open the copy and make changes with the Bases interface or source editor.
  8. \n
\n

Avoid editing the only copy of a generated default. Update default base files replaces the files configured as defaults.

\n

Preserve task identification#

\n

Every task view needs a filter that matches the identification method in Settings → TaskNotes → General.

\n

For tag identification:

\n
filters:\n  and:\n    - file.hasTag("task")\n

For property identification:

\n
filters:\n  and:\n    - note["type"] == "task"\n

Also preserve any excluded-folder conditions generated from your settings.

\n

Add a focused view#

\n

This example starts with recognized tasks, then limits the view to the work context:

\n
filters:\n  and:\n    - file.hasTag("task")\n    - list(contexts).contains("work")\n\nviews:\n  - type: tasknotesTaskList\n    name: Work\n    order:\n      - status\n      - priority\n      - due\n      - file.name\n    sort:\n      - column: due\n        direction: ASC\n

Use canonical stored values in filters. Natural-language prefixes such as @ and # are input syntax, not part of stored context and tag values.

\n

Point a command at the custom Base#

\n

Open Settings → TaskNotes → General → View commands and change the relevant command path. Resetting that mapping returns it to the generated default path.

\n

Upgrade safely#

\n

When TaskNotes ships improved templates:

\n
    \n
  1. Keep your custom file at its own path.
  2. \n
  3. Run Update default base files.
  4. \n
  5. Compare the regenerated default with your copy.
  6. \n
  7. Bring across only the formulas, filters, or view options you want.
  8. \n
\n

The generated template reference always reflects the current source and default field mapping.

\n

Recovery#

\n

If a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time.

\n","text":"TaskNotes views are ordinary Obsidian .base files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy. Start from a copy# Open TaskNotes/Views/ in the file explorer. Duplicate the closest default, such as tasks-default.base. Rename the copy, for example work-tasks.base. Open the copy and make changes with the Bases interface or source editor. Avoid editing the only copy of a generated default. Update default base files replaces the files configured as defaults. Preserve task identification# Every task view needs a filter that matches the identification method in Settings → TaskNotes → General. For tag identification: filters: and: - file.hasTag(\"task\") For property identification: filters: and: - note[\"type\"] == \"task\" Also preserve any excluded-folder conditions generated from your settings. Add a focused view# This example starts with recognized tasks, then limits the view to the work context: filters: and: - file.hasTag(\"task\") - list(contexts).contains(\"work\") views: - type: tasknotesTaskList name: Work order: - status - priority - due - file.name sort: - column: due direction: ASC Use canonical stored values in filters. Natural-language prefixes such as @ and # are input syntax, not part of stored context and tag values. Point a command at the custom Base# Open Settings → TaskNotes → General → View commands and change the relevant command path. Resetting that mapping returns it to the generated default path. Upgrade safely# When TaskNotes ships improved templates: Keep your custom file at its own path. Run Update default base files. Compare the regenerated default with your copy. Bring across only the formulas, filters, or view options you want. The generated template reference always reflects the current source and default field mapping. Recovery# If a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time."},{"route":"/obsidian/HTTP_API/","title":"TaskNotes HTTP API","description":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/HTTP_API.md","namespace":"obsidian","relativePath":"HTTP_API.md","raw":"# TaskNotes HTTP API\n\nThe TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.\n\n## Availability\n\n- Desktop only\n- Disabled by default\n- Started when Obsidian starts and TaskNotes API is enabled\n- Bound to loopback (`127.0.0.1`) only, not the local network\n- Browser CORS requests are allowed only from loopback origins such as\n `localhost`, `127.0.0.1`, and `[::1]`\n- Not available on mobile\n\nEnable it in `Settings -> TaskNotes -> Integrations -> HTTP API`.\n\n## Base URL\n\n`http://localhost:{PORT}`\n\nDefault port is `8080`.\n\n## Authentication\n\nAuthentication is optional.\n\n- If `apiAuthToken` is empty, all API requests are accepted.\n- If `apiAuthToken` is set, send `Authorization: Bearer `.\n- Set a token for any workflow where local browser pages, scripts, or other\n desktop apps are not fully trusted.\n\nExample:\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_TOKEN\" http://localhost:8080/api/health\n```\n\n## Response Format\n\nSuccess:\n\n```json\n{\n \"success\": true,\n \"data\": {}\n}\n```\n\nError:\n\n```json\n{\n \"success\": false,\n \"error\": \"Error message\"\n}\n```\n\n## Endpoint Index\n\n### System\n\n- `GET /api/health`\n- `GET /api/docs`\n- `GET /api/docs/ui`\n- `POST /api/nlp/parse`\n- `POST /api/nlp/create`\n\n### Tasks\n\n- `GET /api/tasks`\n- `POST /api/tasks`\n- `GET /api/tasks/:id`\n- `PUT /api/tasks/:id`\n- `DELETE /api/tasks/:id`\n- `POST /api/tasks/:id/toggle-status`\n- `POST /api/tasks/:id/archive`\n- `POST /api/tasks/:id/complete-instance`\n- `POST /api/tasks/:id/materialize-occurrence`\n- `POST /api/tasks/query`\n- `GET /api/filter-options`\n- `GET /api/stats`\n\n### Bases\n\n- `POST /api/bases/default-files/update`\n\n### Time Tracking\n\n- `POST /api/tasks/:id/time/start`\n- `POST /api/tasks/:id/time/start-with-description`\n- `POST /api/tasks/:id/time/stop`\n- `GET /api/tasks/:id/time`\n- `GET /api/time/active`\n- `GET /api/time/summary`\n\n### Pomodoro\n\n- `POST /api/pomodoro/start`\n- `POST /api/pomodoro/stop`\n- `POST /api/pomodoro/pause`\n- `POST /api/pomodoro/resume`\n- `GET /api/pomodoro/status`\n- `GET /api/pomodoro/sessions`\n- `GET /api/pomodoro/stats`\n\n### Calendars\n\n- `GET /api/calendars`\n- `GET /api/calendars/google`\n- `GET /api/calendars/microsoft`\n- `GET /api/calendars/subscriptions`\n- `GET /api/calendars/events`\n\n### Webhooks\n\n- `POST /api/webhooks`\n- `GET /api/webhooks`\n- `DELETE /api/webhooks/:id`\n- `GET /api/webhooks/deliveries`\n\nSee `docs/webhooks.md` for event and transform details.\n\n## Route Details\n\n## Health\n\n### `GET /api/health`\n\nReturns service state plus vault metadata.\n\n```bash\ncurl http://localhost:8080/api/health\n```\n\n## Tasks\n\n### `GET /api/tasks`\n\nBasic task listing with pagination only.\n\nQuery params:\n\n- `limit` (default `50`, max `200`)\n- `offset` (default `0`)\n\nImportant:\n\n- Filtering params such as `status`, `priority`, `tag`, `project`, `context`, `due_before`, `due_after`, `overdue`, `completed`, `archived`, and `sort` are rejected on this endpoint with HTTP `400`.\n- Use `POST /api/tasks/query` for filtering.\n\nExample:\n\n```bash\ncurl \"http://localhost:8080/api/tasks?limit=25&offset=0\"\n```\n\nResponse fields:\n\n- `data.tasks`\n- `data.pagination` with `total`, `offset`, `limit`, `hasMore`\n- `data.vault`\n- `data.note`\n- Task objects include configured TaskNotes user fields in `customProperties`, keyed by their frontmatter property key.\n\n### `POST /api/tasks`\n\nCreate one task.\n\nRequired:\n\n- `title`\n\nCommon optional fields:\n\n- `details`, `status`, `priority`, `due`, `scheduled`\n- `tags`, `contexts`, `projects`\n- `recurrence`, `recurrence_anchor`, `timeEstimate`, `reminders`\n- `blockedBy`\n\n`blockedBy` accepts an array of dependency objects:\n\n- `uid`: link or identifier for the blocking task, such as `[[Project setup]]`\n- `reltype`: one of `FINISHTOSTART`, `FINISHTOFINISH`, `STARTTOSTART`, or `STARTTOFINISH`\n- `gap`: optional ISO 8601 duration, such as `P1D`\n\n`blocking` is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' `blockedBy` fields.\n\n```bash\ncurl -X POST http://localhost:8080/api/tasks \\\n -H \"Content-Type: application/json\" \\\n -d '{\"title\":\"Review docs\",\"priority\":\"high\",\"blockedBy\":[{\"uid\":\"[[Draft docs]]\",\"reltype\":\"FINISHTOSTART\"}]}'\n```\n\nReturns HTTP `201` with created task data.\n\n### `GET /api/tasks/:id`\n\nGet one task by path id.\n\n- `:id` must be URL-encoded task path.\n- Single-task reads include the task body in `details`.\n- Configured TaskNotes user fields are returned in `customProperties`, keyed by their frontmatter property key.\n\n```bash\ncurl \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\"\n```\n\n### `PUT /api/tasks/:id`\n\nUpdate task with partial payload.\n\nConfigured TaskNotes user fields can be updated either by their frontmatter property key or via `customProperties`.\n\n```bash\ncurl -X PUT \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"status\":\"in-progress\"}'\n```\n\n### `DELETE /api/tasks/:id`\n\nDelete task file.\n\n### `POST /api/tasks/:id/toggle-status`\n\nToggle task status via configured workflow.\n\n### `POST /api/tasks/:id/archive`\n\nToggle archive state.\n\n### `POST /api/tasks/:id/complete-instance`\n\nComplete recurring instance.\n\nRequest body:\n\n- Optional `date` (ISO string). If omitted, uses current date context.\n\nWhen the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to **Create next after completion** and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual `complete_instances` entry.\n\n### `POST /api/tasks/:id/materialize-occurrence`\n\nCreate or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date.\n\nRequest body:\n\n- Required `date` (ISO date string, for example `2026-06-01`)\n\n### `POST /api/tasks/query`\n\nAdvanced filtering.\n\nRequest body is a `FilterQuery` object. `FilterQuery` is still the supported advanced query shape for the HTTP API.\n\nThe root object is a group with:\n\n- `type: \"group\"`\n- `id`\n- `conjunction: \"and\" | \"or\"`\n- `children` (conditions or groups)\n\nOptional top-level query options:\n\n- `sortKey`, `sortDirection`\n- `groupKey`, `subgroupKey`\n\nExample:\n\n```json\n{\n \"type\": \"group\",\n \"id\": \"root\",\n \"conjunction\": \"and\",\n \"children\": [\n {\n \"type\": \"condition\",\n \"id\": \"c1\",\n \"property\": \"status\",\n \"operator\": \"is\",\n \"value\": \"open\"\n }\n ],\n \"sortKey\": \"due\",\n \"sortDirection\": \"asc\"\n}\n```\n\nFilter tasks by context:\n\n```json\n{\n \"type\": \"group\",\n \"id\": \"root\",\n \"conjunction\": \"and\",\n \"children\": [\n {\n \"type\": \"condition\",\n \"id\": \"context\",\n \"property\": \"contexts\",\n \"operator\": \"contains\",\n \"value\": \"@office\"\n }\n ],\n \"sortKey\": \"due\",\n \"sortDirection\": \"asc\"\n}\n```\n\nFilter active, unarchived tasks, similar to the default available-task view:\n\n```json\n{\n \"type\": \"group\",\n \"id\": \"root\",\n \"conjunction\": \"and\",\n \"children\": [\n {\n \"type\": \"condition\",\n \"id\": \"not-archived\",\n \"property\": \"archived\",\n \"operator\": \"is-not-checked\"\n },\n {\n \"type\": \"condition\",\n \"id\": \"not-completed\",\n \"property\": \"status.isCompleted\",\n \"operator\": \"is-not-checked\"\n }\n ],\n \"sortKey\": \"due\",\n \"sortDirection\": \"asc\",\n \"groupKey\": \"none\"\n}\n```\n\nCondition fields:\n\n- `type`: `\"condition\"`\n- `id`: any stable string for your client\n- `property`: a task property, such as `title`, `status`, `priority`, `tags`, `contexts`, `projects`, `blockedBy`, `blocking`, `due`, `scheduled`, `completedDate`, `dateCreated`, `dateModified`, `archived`, `hasSubtasks`, `dependencies.isBlocked`, `dependencies.isBlocking`, `timeEstimate`, `recurrence`, or `status.isCompleted`\n- `operator`: one of `is`, `is-not`, `contains`, `does-not-contain`, `is-before`, `is-after`, `is-on-or-before`, `is-on-or-after`, `is-empty`, `is-not-empty`, `is-checked`, `is-not-checked`, `is-greater-than`, `is-less-than`, `is-greater-than-or-equal`, or `is-less-than-or-equal`\n- `value`: required for comparison operators, omitted for empty/checked operators\n\nFor user-defined fields, use `property: \"user:\"`.\n\nResponse:\n\n- `data.tasks`\n- `data.total`\n- `data.filtered`\n- `data.vault`\n\n### `GET /api/filter-options`\n\nReturns filter options for UI builders.\n\n### `GET /api/stats`\n\nReturns summary counts:\n\n- `total`, `completed`, `active`, `overdue`, `archived`, `withTimeTracking`\n\n## Bases\n\n### `POST /api/bases/default-files/update`\n\nOverwrite the configured default TaskNotes `.base` files with templates generated from the current TaskNotes settings. This is the same write operation as **Settings -> TaskNotes -> Views & base files -> Update files** and replaces manual edits in those configured default files.\n\n```bash\ncurl -X POST http://localhost:8080/api/bases/default-files/update\n```\n\nResponse fields:\n\n- `data.created`: default files created because they were missing\n- `data.updated`: existing default files overwritten with current templates\n- `data.skipped`: configured default files skipped\n\n## Time Tracking\n\n### `POST /api/tasks/:id/time/start`\n\nStarts a new active time entry for that task.\n\n### `POST /api/tasks/:id/time/start-with-description`\n\nStarts time tracking and writes `description` on the new active entry.\n\nRequest body:\n\n```json\n{\n \"description\": \"Implementation\"\n}\n```\n\n### `POST /api/tasks/:id/time/stop`\n\nStops active time entry for that task.\n\n### `GET /api/tasks/:id/time`\n\nReturns per-task time summary and entries.\n\n### `GET /api/time/active`\n\nReturns currently active sessions across tasks.\n\nImportant:\n\n- Multiple active sessions can exist across different tasks.\n\n### `GET /api/time/summary`\n\nReturns aggregate time summary.\n\nQuery params:\n\n- `period` (for example `today`, `week`, `month`, `all`)\n- `from` (ISO date)\n- `to` (ISO date)\n\nExample:\n\n```bash\ncurl \"http://localhost:8080/api/time/summary?period=week\"\n```\n\n## Pomodoro\n\n### `POST /api/pomodoro/start`\n\nStarts a session.\n\nOptional request fields:\n\n- `taskId` (URL path of task)\n- `duration` (number)\n\n### `POST /api/pomodoro/stop`\n\nStops and resets current session.\n\n### `POST /api/pomodoro/pause`\n\nPauses running session.\n\n### `POST /api/pomodoro/resume`\n\nResumes paused session.\n\n### `GET /api/pomodoro/status`\n\nReturns current state plus computed totals (`totalPomodoros`, `currentStreak`, `totalMinutesToday`).\n\n### `GET /api/pomodoro/sessions`\n\nReturns history.\n\nQuery params:\n\n- `limit`\n- `date` (`YYYY-MM-DD`)\n\n### `GET /api/pomodoro/stats`\n\nReturns stats for today or provided date.\n\nQuery params:\n\n- `date` (`YYYY-MM-DD`)\n\n## Calendars\n\n### `GET /api/calendars`\n\nReturns provider connectivity overview and subscription counts.\n\n### `GET /api/calendars/google`\n\nReturns Google provider details.\n\n- If disconnected, returns `{ \"connected\": false }`.\n\n### `GET /api/calendars/microsoft`\n\nReturns Microsoft provider details.\n\n- If disconnected, returns `{ \"connected\": false }`.\n\n### `GET /api/calendars/subscriptions`\n\nReturns ICS subscriptions with runtime fields such as `lastFetched` and `lastError`.\n\n### `GET /api/calendars/events`\n\nReturns merged event list from connected providers and ICS subscriptions.\n\nQuery params:\n\n- `start` (ISO date/datetime)\n- `end` (ISO date/datetime)\n\nResponse includes:\n\n- `events`\n- `total`\n- `sources` (counts by provider)\n\n## Webhooks\n\n### `POST /api/webhooks`\n\nRegisters webhook.\n\nRequired fields:\n\n- `url`\n- `events` (non-empty array)\n\nOptional fields:\n\n- `id`\n- `secret`\n- `active`\n- `transformFile`\n- `corsHeaders`\n\n### `GET /api/webhooks`\n\nLists registered webhooks. Stored secrets are not returned.\n\n### `DELETE /api/webhooks/:id`\n\nDeletes webhook.\n\n### `GET /api/webhooks/deliveries`\n\nReturns last 100 delivery records.\n\n## OpenAPI Docs\n\n### `GET /api/docs`\n\nReturns OpenAPI JSON generated from registered controllers.\n\n### `GET /api/docs/ui`\n\nReturns Swagger UI.\n\n## Errors\n\nCommon status codes:\n\n- `400` invalid request or invalid state\n- `401` missing/invalid bearer token (when auth token is configured)\n- `404` missing task/webhook/resource\n- `500` internal error\n\n## Security Notes\n\nCurrent behavior:\n\n- CORS allows all origins (`*`).\n- Transport is HTTP only (no TLS).\n- Node server is started with `server.listen(port)` and does not explicitly bind to `127.0.0.1`.\n\nPractical guidance:\n\n- Set an auth token.\n- Treat API port as sensitive and keep it firewalled.\n- If you expose this port outside localhost, route through a trusted reverse proxy and TLS.\n\n## Troubleshooting\n\n### API unavailable\n\n1. Confirm API is enabled in settings.\n2. Confirm Obsidian is running.\n3. Confirm selected port is free.\n4. Reload plugin or restart Obsidian after changing API enable/port.\n\n### `401 Authentication required`\n\n1. Check token value.\n2. Check `Bearer ` prefix.\n3. Remove whitespace around token.\n\n### Unexpected task list behavior\n\nIf you pass filters to `GET /api/tasks`, the endpoint returns `400` by design. Use `POST /api/tasks/query`.\n","aliases":["/HTTP_API/"],"toc":[{"level":2,"id":"availability","text":"Availability"},{"level":2,"id":"base-url","text":"Base URL"},{"level":2,"id":"authentication","text":"Authentication"},{"level":2,"id":"response-format","text":"Response Format"},{"level":2,"id":"endpoint-index","text":"Endpoint Index"},{"level":3,"id":"system","text":"System"},{"level":3,"id":"tasks","text":"Tasks"},{"level":3,"id":"bases","text":"Bases"},{"level":3,"id":"time-tracking","text":"Time Tracking"},{"level":3,"id":"pomodoro","text":"Pomodoro"},{"level":3,"id":"calendars","text":"Calendars"},{"level":3,"id":"webhooks","text":"Webhooks"},{"level":2,"id":"route-details","text":"Route Details"},{"level":2,"id":"health","text":"Health"},{"level":3,"id":"get-apihealth","text":"GET /api/health"},{"level":2,"id":"tasks-2","text":"Tasks"},{"level":3,"id":"get-apitasks","text":"GET /api/tasks"},{"level":3,"id":"post-apitasks","text":"POST /api/tasks"},{"level":3,"id":"get-apitasksid","text":"GET /api/tasks/:id"},{"level":3,"id":"put-apitasksid","text":"PUT /api/tasks/:id"},{"level":3,"id":"delete-apitasksid","text":"DELETE /api/tasks/:id"},{"level":3,"id":"post-apitasksidtoggle-status","text":"POST /api/tasks/:id/toggle-status"},{"level":3,"id":"post-apitasksidarchive","text":"POST /api/tasks/:id/archive"},{"level":3,"id":"post-apitasksidcomplete-instance","text":"POST /api/tasks/:id/complete-instance"},{"level":3,"id":"post-apitasksidmaterialize-occurrence","text":"POST /api/tasks/:id/materialize-occurrence"},{"level":3,"id":"post-apitasksquery","text":"POST /api/tasks/query"},{"level":3,"id":"get-apifilter-options","text":"GET /api/filter-options"},{"level":3,"id":"get-apistats","text":"GET /api/stats"},{"level":2,"id":"bases-2","text":"Bases"},{"level":3,"id":"post-apibasesdefault-filesupdate","text":"POST /api/bases/default-files/update"},{"level":2,"id":"time-tracking-2","text":"Time Tracking"},{"level":3,"id":"post-apitasksidtimestart","text":"POST /api/tasks/:id/time/start"},{"level":3,"id":"post-apitasksidtimestart-with-description","text":"POST /api/tasks/:id/time/start-with-description"},{"level":3,"id":"post-apitasksidtimestop","text":"POST /api/tasks/:id/time/stop"},{"level":3,"id":"get-apitasksidtime","text":"GET /api/tasks/:id/time"},{"level":3,"id":"get-apitimeactive","text":"GET /api/time/active"},{"level":3,"id":"get-apitimesummary","text":"GET /api/time/summary"},{"level":2,"id":"pomodoro-2","text":"Pomodoro"},{"level":3,"id":"post-apipomodorostart","text":"POST /api/pomodoro/start"},{"level":3,"id":"post-apipomodorostop","text":"POST /api/pomodoro/stop"},{"level":3,"id":"post-apipomodoropause","text":"POST /api/pomodoro/pause"},{"level":3,"id":"post-apipomodororesume","text":"POST /api/pomodoro/resume"},{"level":3,"id":"get-apipomodorostatus","text":"GET /api/pomodoro/status"},{"level":3,"id":"get-apipomodorosessions","text":"GET /api/pomodoro/sessions"},{"level":3,"id":"get-apipomodorostats","text":"GET /api/pomodoro/stats"},{"level":2,"id":"calendars-2","text":"Calendars"},{"level":3,"id":"get-apicalendars","text":"GET /api/calendars"},{"level":3,"id":"get-apicalendarsgoogle","text":"GET /api/calendars/google"},{"level":3,"id":"get-apicalendarsmicrosoft","text":"GET /api/calendars/microsoft"},{"level":3,"id":"get-apicalendarssubscriptions","text":"GET /api/calendars/subscriptions"},{"level":3,"id":"get-apicalendarsevents","text":"GET /api/calendars/events"},{"level":2,"id":"webhooks-2","text":"Webhooks"},{"level":3,"id":"post-apiwebhooks","text":"POST /api/webhooks"},{"level":3,"id":"get-apiwebhooks","text":"GET /api/webhooks"},{"level":3,"id":"delete-apiwebhooksid","text":"DELETE /api/webhooks/:id"},{"level":3,"id":"get-apiwebhooksdeliveries","text":"GET /api/webhooks/deliveries"},{"level":2,"id":"openapi-docs","text":"OpenAPI Docs"},{"level":3,"id":"get-apidocs","text":"GET /api/docs"},{"level":3,"id":"get-apidocsui","text":"GET /api/docs/ui"},{"level":2,"id":"errors","text":"Errors"},{"level":2,"id":"security-notes","text":"Security Notes"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"api-unavailable","text":"API unavailable"},{"level":3,"id":"401-authentication-required","text":"401 Authentication required"},{"level":3,"id":"unexpected-task-list-behavior","text":"Unexpected task list behavior"}],"html":"

The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.

\n

Availability#

\n
    \n
  • Desktop only
  • \n
  • Disabled by default
  • \n
  • Started when Obsidian starts and TaskNotes API is enabled
  • \n
  • Bound to loopback (127.0.0.1) only, not the local network
  • \n
  • Browser CORS requests are allowed only from loopback origins such as\nlocalhost, 127.0.0.1, and [::1]
  • \n
  • Not available on mobile
  • \n
\n

Enable it in Settings -> TaskNotes -> Integrations -> HTTP API.

\n

Base URL#

\n

http://localhost:{PORT}

\n

Default port is 8080.

\n

Authentication#

\n

Authentication is optional.

\n
    \n
  • If apiAuthToken is empty, all API requests are accepted.
  • \n
  • If apiAuthToken is set, send Authorization: Bearer <token>.
  • \n
  • Set a token for any workflow where local browser pages, scripts, or other\ndesktop apps are not fully trusted.
  • \n
\n

Example:

\n
curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:8080/api/health\n

Response Format#

\n

Success:

\n
{\n  "success": true,\n  "data": {}\n}\n

Error:

\n
{\n  "success": false,\n  "error": "Error message"\n}\n

Endpoint Index#

\n

System#

\n
    \n
  • GET /api/health
  • \n
  • GET /api/docs
  • \n
  • GET /api/docs/ui
  • \n
  • POST /api/nlp/parse
  • \n
  • POST /api/nlp/create
  • \n
\n

Tasks#

\n
    \n
  • GET /api/tasks
  • \n
  • POST /api/tasks
  • \n
  • GET /api/tasks/:id
  • \n
  • PUT /api/tasks/:id
  • \n
  • DELETE /api/tasks/:id
  • \n
  • POST /api/tasks/:id/toggle-status
  • \n
  • POST /api/tasks/:id/archive
  • \n
  • POST /api/tasks/:id/complete-instance
  • \n
  • POST /api/tasks/:id/materialize-occurrence
  • \n
  • POST /api/tasks/query
  • \n
  • GET /api/filter-options
  • \n
  • GET /api/stats
  • \n
\n

Bases#

\n
    \n
  • POST /api/bases/default-files/update
  • \n
\n

Time Tracking#

\n
    \n
  • POST /api/tasks/:id/time/start
  • \n
  • POST /api/tasks/:id/time/start-with-description
  • \n
  • POST /api/tasks/:id/time/stop
  • \n
  • GET /api/tasks/:id/time
  • \n
  • GET /api/time/active
  • \n
  • GET /api/time/summary
  • \n
\n

Pomodoro#

\n
    \n
  • POST /api/pomodoro/start
  • \n
  • POST /api/pomodoro/stop
  • \n
  • POST /api/pomodoro/pause
  • \n
  • POST /api/pomodoro/resume
  • \n
  • GET /api/pomodoro/status
  • \n
  • GET /api/pomodoro/sessions
  • \n
  • GET /api/pomodoro/stats
  • \n
\n

Calendars#

\n
    \n
  • GET /api/calendars
  • \n
  • GET /api/calendars/google
  • \n
  • GET /api/calendars/microsoft
  • \n
  • GET /api/calendars/subscriptions
  • \n
  • GET /api/calendars/events
  • \n
\n

Webhooks#

\n
    \n
  • POST /api/webhooks
  • \n
  • GET /api/webhooks
  • \n
  • DELETE /api/webhooks/:id
  • \n
  • GET /api/webhooks/deliveries
  • \n
\n

See docs/webhooks.md for event and transform details.

\n

Route Details#

\n

Health#

\n

GET /api/health#

\n

Returns service state plus vault metadata.

\n
curl http://localhost:8080/api/health\n

Tasks#

\n

GET /api/tasks#

\n

Basic task listing with pagination only.

\n

Query params:

\n
    \n
  • limit (default 50, max 200)
  • \n
  • offset (default 0)
  • \n
\n

Important:

\n
    \n
  • Filtering params such as status, priority, tag, project, context, due_before, due_after, overdue, completed, archived, and sort are rejected on this endpoint with HTTP 400.
  • \n
  • Use POST /api/tasks/query for filtering.
  • \n
\n

Example:

\n
curl "http://localhost:8080/api/tasks?limit=25&offset=0"\n

Response fields:

\n
    \n
  • data.tasks
  • \n
  • data.pagination with total, offset, limit, hasMore
  • \n
  • data.vault
  • \n
  • data.note
  • \n
  • Task objects include configured TaskNotes user fields in customProperties, keyed by their frontmatter property key.
  • \n
\n

POST /api/tasks#

\n

Create one task.

\n

Required:

\n
    \n
  • title
  • \n
\n

Common optional fields:

\n
    \n
  • details, status, priority, due, scheduled
  • \n
  • tags, contexts, projects
  • \n
  • recurrence, recurrence_anchor, timeEstimate, reminders
  • \n
  • blockedBy
  • \n
\n

blockedBy accepts an array of dependency objects:

\n
    \n
  • uid: link or identifier for the blocking task, such as [[Project setup]]
  • \n
  • reltype: one of FINISHTOSTART, FINISHTOFINISH, STARTTOSTART, or STARTTOFINISH
  • \n
  • gap: optional ISO 8601 duration, such as P1D
  • \n
\n

blocking is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' blockedBy fields.

\n
curl -X POST http://localhost:8080/api/tasks \\\n  -H "Content-Type: application/json" \\\n  -d '{"title":"Review docs","priority":"high","blockedBy":[{"uid":"[[Draft docs]]","reltype":"FINISHTOSTART"}]}'\n

Returns HTTP 201 with created task data.

\n

GET /api/tasks/:id#

\n

Get one task by path id.

\n
    \n
  • :id must be URL-encoded task path.
  • \n
  • Single-task reads include the task body in details.
  • \n
  • Configured TaskNotes user fields are returned in customProperties, keyed by their frontmatter property key.
  • \n
\n
curl "http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md"\n

PUT /api/tasks/:id#

\n

Update task with partial payload.

\n

Configured TaskNotes user fields can be updated either by their frontmatter property key or via customProperties.

\n
curl -X PUT "http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md" \\\n  -H "Content-Type: application/json" \\\n  -d '{"status":"in-progress"}'\n

DELETE /api/tasks/:id#

\n

Delete task file.

\n

POST /api/tasks/:id/toggle-status#

\n

Toggle task status via configured workflow.

\n

POST /api/tasks/:id/archive#

\n

Toggle archive state.

\n

POST /api/tasks/:id/complete-instance#

\n

Complete recurring instance.

\n

Request body:

\n
    \n
  • Optional date (ISO string). If omitted, uses current date context.
  • \n
\n

When the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to Create next after completion and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual complete_instances entry.

\n

POST /api/tasks/:id/materialize-occurrence#

\n

Create or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date.

\n

Request body:

\n
    \n
  • Required date (ISO date string, for example 2026-06-01)
  • \n
\n

POST /api/tasks/query#

\n

Advanced filtering.

\n

Request body is a FilterQuery object. FilterQuery is still the supported advanced query shape for the HTTP API.

\n

The root object is a group with:

\n
    \n
  • type: "group"
  • \n
  • id
  • \n
  • conjunction: "and" | "or"
  • \n
  • children (conditions or groups)
  • \n
\n

Optional top-level query options:

\n
    \n
  • sortKey, sortDirection
  • \n
  • groupKey, subgroupKey
  • \n
\n

Example:

\n
{\n  "type": "group",\n  "id": "root",\n  "conjunction": "and",\n  "children": [\n    {\n      "type": "condition",\n      "id": "c1",\n      "property": "status",\n      "operator": "is",\n      "value": "open"\n    }\n  ],\n  "sortKey": "due",\n  "sortDirection": "asc"\n}\n

Filter tasks by context:

\n
{\n  "type": "group",\n  "id": "root",\n  "conjunction": "and",\n  "children": [\n    {\n      "type": "condition",\n      "id": "context",\n      "property": "contexts",\n      "operator": "contains",\n      "value": "@office"\n    }\n  ],\n  "sortKey": "due",\n  "sortDirection": "asc"\n}\n

Filter active, unarchived tasks, similar to the default available-task view:

\n
{\n  "type": "group",\n  "id": "root",\n  "conjunction": "and",\n  "children": [\n    {\n      "type": "condition",\n      "id": "not-archived",\n      "property": "archived",\n      "operator": "is-not-checked"\n    },\n    {\n      "type": "condition",\n      "id": "not-completed",\n      "property": "status.isCompleted",\n      "operator": "is-not-checked"\n    }\n  ],\n  "sortKey": "due",\n  "sortDirection": "asc",\n  "groupKey": "none"\n}\n

Condition fields:

\n
    \n
  • type: "condition"
  • \n
  • id: any stable string for your client
  • \n
  • property: a task property, such as title, status, priority, tags, contexts, projects, blockedBy, blocking, due, scheduled, completedDate, dateCreated, dateModified, archived, hasSubtasks, dependencies.isBlocked, dependencies.isBlocking, timeEstimate, recurrence, or status.isCompleted
  • \n
  • operator: one of is, is-not, contains, does-not-contain, is-before, is-after, is-on-or-before, is-on-or-after, is-empty, is-not-empty, is-checked, is-not-checked, is-greater-than, is-less-than, is-greater-than-or-equal, or is-less-than-or-equal
  • \n
  • value: required for comparison operators, omitted for empty/checked operators
  • \n
\n

For user-defined fields, use property: "user:<fieldId>".

\n

Response:

\n
    \n
  • data.tasks
  • \n
  • data.total
  • \n
  • data.filtered
  • \n
  • data.vault
  • \n
\n

GET /api/filter-options#

\n

Returns filter options for UI builders.

\n

GET /api/stats#

\n

Returns summary counts:

\n
    \n
  • total, completed, active, overdue, archived, withTimeTracking
  • \n
\n

Bases#

\n

POST /api/bases/default-files/update#

\n

Overwrite the configured default TaskNotes .base files with templates generated from the current TaskNotes settings. This is the same write operation as Settings -> TaskNotes -> Views & base files -> Update files and replaces manual edits in those configured default files.

\n
curl -X POST http://localhost:8080/api/bases/default-files/update\n

Response fields:

\n
    \n
  • data.created: default files created because they were missing
  • \n
  • data.updated: existing default files overwritten with current templates
  • \n
  • data.skipped: configured default files skipped
  • \n
\n

Time Tracking#

\n

POST /api/tasks/:id/time/start#

\n

Starts a new active time entry for that task.

\n

POST /api/tasks/:id/time/start-with-description#

\n

Starts time tracking and writes description on the new active entry.

\n

Request body:

\n
{\n  "description": "Implementation"\n}\n

POST /api/tasks/:id/time/stop#

\n

Stops active time entry for that task.

\n

GET /api/tasks/:id/time#

\n

Returns per-task time summary and entries.

\n

GET /api/time/active#

\n

Returns currently active sessions across tasks.

\n

Important:

\n
    \n
  • Multiple active sessions can exist across different tasks.
  • \n
\n

GET /api/time/summary#

\n

Returns aggregate time summary.

\n

Query params:

\n
    \n
  • period (for example today, week, month, all)
  • \n
  • from (ISO date)
  • \n
  • to (ISO date)
  • \n
\n

Example:

\n
curl "http://localhost:8080/api/time/summary?period=week"\n

Pomodoro#

\n

POST /api/pomodoro/start#

\n

Starts a session.

\n

Optional request fields:

\n
    \n
  • taskId (URL path of task)
  • \n
  • duration (number)
  • \n
\n

POST /api/pomodoro/stop#

\n

Stops and resets current session.

\n

POST /api/pomodoro/pause#

\n

Pauses running session.

\n

POST /api/pomodoro/resume#

\n

Resumes paused session.

\n

GET /api/pomodoro/status#

\n

Returns current state plus computed totals (totalPomodoros, currentStreak, totalMinutesToday).

\n

GET /api/pomodoro/sessions#

\n

Returns history.

\n

Query params:

\n
    \n
  • limit
  • \n
  • date (YYYY-MM-DD)
  • \n
\n

GET /api/pomodoro/stats#

\n

Returns stats for today or provided date.

\n

Query params:

\n
    \n
  • date (YYYY-MM-DD)
  • \n
\n

Calendars#

\n

GET /api/calendars#

\n

Returns provider connectivity overview and subscription counts.

\n

GET /api/calendars/google#

\n

Returns Google provider details.

\n
    \n
  • If disconnected, returns { "connected": false }.
  • \n
\n

GET /api/calendars/microsoft#

\n

Returns Microsoft provider details.

\n
    \n
  • If disconnected, returns { "connected": false }.
  • \n
\n

GET /api/calendars/subscriptions#

\n

Returns ICS subscriptions with runtime fields such as lastFetched and lastError.

\n

GET /api/calendars/events#

\n

Returns merged event list from connected providers and ICS subscriptions.

\n

Query params:

\n
    \n
  • start (ISO date/datetime)
  • \n
  • end (ISO date/datetime)
  • \n
\n

Response includes:

\n
    \n
  • events
  • \n
  • total
  • \n
  • sources (counts by provider)
  • \n
\n

Webhooks#

\n

POST /api/webhooks#

\n

Registers webhook.

\n

Required fields:

\n
    \n
  • url
  • \n
  • events (non-empty array)
  • \n
\n

Optional fields:

\n
    \n
  • id
  • \n
  • secret
  • \n
  • active
  • \n
  • transformFile
  • \n
  • corsHeaders
  • \n
\n

GET /api/webhooks#

\n

Lists registered webhooks. Stored secrets are not returned.

\n

DELETE /api/webhooks/:id#

\n

Deletes webhook.

\n

GET /api/webhooks/deliveries#

\n

Returns last 100 delivery records.

\n

OpenAPI Docs#

\n

GET /api/docs#

\n

Returns OpenAPI JSON generated from registered controllers.

\n

GET /api/docs/ui#

\n

Returns Swagger UI.

\n

Errors#

\n

Common status codes:

\n
    \n
  • 400 invalid request or invalid state
  • \n
  • 401 missing/invalid bearer token (when auth token is configured)
  • \n
  • 404 missing task/webhook/resource
  • \n
  • 500 internal error
  • \n
\n

Security Notes#

\n

Current behavior:

\n
    \n
  • CORS allows all origins (*).
  • \n
  • Transport is HTTP only (no TLS).
  • \n
  • Node server is started with server.listen(port) and does not explicitly bind to 127.0.0.1.
  • \n
\n

Practical guidance:

\n
    \n
  • Set an auth token.
  • \n
  • Treat API port as sensitive and keep it firewalled.
  • \n
  • If you expose this port outside localhost, route through a trusted reverse proxy and TLS.
  • \n
\n

Troubleshooting#

\n

API unavailable#

\n
    \n
  1. Confirm API is enabled in settings.
  2. \n
  3. Confirm Obsidian is running.
  4. \n
  5. Confirm selected port is free.
  6. \n
  7. Reload plugin or restart Obsidian after changing API enable/port.
  8. \n
\n

401 Authentication required#

\n
    \n
  1. Check token value.
  2. \n
  3. Check Bearer prefix.
  4. \n
  5. Remove whitespace around token.
  6. \n
\n

Unexpected task list behavior#

\n

If you pass filters to GET /api/tasks, the endpoint returns 400 by design. Use POST /api/tasks/query.

\n","text":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing. Availability# Desktop only Disabled by default Started when Obsidian starts and TaskNotes API is enabled Bound to loopback (127.0.0.1) only, not the local network Browser CORS requests are allowed only from loopback origins such as localhost, 127.0.0.1, and [::1] Not available on mobile Enable it in Settings -> TaskNotes -> Integrations -> HTTP API. Base URL# http://localhost:{PORT} Default port is 8080. Authentication# Authentication is optional. If apiAuthToken is empty, all API requests are accepted. If apiAuthToken is set, send Authorization: Bearer . Set a token for any workflow where local browser pages, scripts, or other desktop apps are not fully trusted. Example: curl -H \"Authorization: Bearer YOUR_TOKEN\" http://localhost:8080/api/health Response Format# Success: { \"success\": true, \"data\": {} } Error: { \"success\": false, \"error\": \"Error message\" } Endpoint Index# System# GET /api/health GET /api/docs GET /api/docs/ui POST /api/nlp/parse POST /api/nlp/create Tasks# GET /api/tasks POST /api/tasks GET /api/tasks/:id PUT /api/tasks/:id DELETE /api/tasks/:id POST /api/tasks/:id/toggle-status POST /api/tasks/:id/archive POST /api/tasks/:id/complete-instance POST /api/tasks/:id/materialize-occurrence POST /api/tasks/query GET /api/filter-options GET /api/stats Bases# POST /api/bases/default-files/update Time Tracking# POST /api/tasks/:id/time/start POST /api/tasks/:id/time/start-with-description POST /api/tasks/:id/time/stop GET /api/tasks/:id/time GET /api/time/active GET /api/time/summary Pomodoro# POST /api/pomodoro/start POST /api/pomodoro/stop POST /api/pomodoro/pause POST /api/pomodoro/resume GET /api/pomodoro/status GET /api/pomodoro/sessions GET /api/pomodoro/stats Calendars# GET /api/calendars GET /api/calendars/google GET /api/calendars/microsoft GET /api/calendars/subscriptions GET /api/calendars/events Webhooks# POST /api/webhooks GET /api/webhooks DELETE /api/webhooks/:id GET /api/webhooks/deliveries See docs/webhooks.md for event and transform details. Route Details# Health# GET /api/health# Returns service state plus vault metadata. curl http://localhost:8080/api/health Tasks# GET /api/tasks# Basic task listing with pagination only. Query params: limit (default 50, max 200) offset (default 0) Important: Filtering params such as status, priority, tag, project, context, due_before, due_after, overdue, completed, archived, and sort are rejected on this endpoint with HTTP 400. Use POST /api/tasks/query for filtering. Example: curl \"http://localhost:8080/api/tasks?limit=25&offset=0\" Response fields: data.tasks data.pagination with total, offset, limit, hasMore data.vault data.note Task objects include configured TaskNotes user fields in customProperties, keyed by their frontmatter property key. POST /api/tasks# Create one task. Required: title Common optional fields: details, status, priority, due, scheduled tags, contexts, projects recurrence, recurrence_anchor, timeEstimate, reminders blockedBy blockedBy accepts an array of dependency objects: uid: link or identifier for the blocking task, such as [[Project setup]] reltype: one of FINISHTOSTART, FINISHTOFINISH, STARTTOSTART, or STARTTOFINISH gap: optional ISO 8601 duration, such as P1D blocking is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' blockedBy fields. curl -X POST http://localhost:8080/api/tasks \\ -H \"Content-Type: application/json\" \\ -d '{\"title\":\"Review docs\",\"priority\":\"high\",\"blockedBy\":[{\"uid\":\"[[Draft docs]]\",\"reltype\":\"FINISHTOSTART\"}]}' Returns HTTP 201 with created task data. GET /api/tasks/:id# Get one task by path id. :id must be URL-encoded task path. Single-task reads include the task body in details. Configured TaskNotes user fields are returned in customProperties, keyed by their frontmatter property key. curl \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" PUT /api/tasks/:id# Update task with partial payload. Configured TaskNotes user fields can be updated either by their frontmatter property key or via customProperties. curl -X PUT \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" \\ -H \"Content-Type: application/json\" \\ -d '{\"status\":\"in-progress\"}' DELETE /api/tasks/:id# Delete task file. POST /api/tasks/:id/toggle-status# Toggle task status via configured workflow. POST /api/tasks/:id/archive# Toggle archive state. POST /api/tasks/:id/complete-instance# Complete recurring instance. Request body: Optional date (ISO string). If omitted, uses current date context. When the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to Create next after completion and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual complete_instances entry. POST /api/tasks/:id/materialize-occurrence# Create or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date. Request body: Required date (ISO date string, for example 2026-06-01) POST /api/tasks/query# Advanced filtering. Request body is a FilterQuery object. FilterQuery is still the supported advanced query shape for the HTTP API. The root object is a group with: type: \"group\" id conjunction: \"and\" | \"or\" children (conditions or groups) Optional top-level query options: sortKey, sortDirection groupKey, subgroupKey Example: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"c1\", \"property\": \"status\", \"operator\": \"is\", \"value\": \"open\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter tasks by context: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"context\", \"property\": \"contexts\", \"operator\": \"contains\", \"value\": \"@office\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter active, unarchived tasks, similar to the default available-task view: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"not-archived\", \"property\": \"archived\", \"operator\": \"is-not-checked\" }, { \"type\": \"condition\", \"id\": \"not-completed\", \"property\": \"status.isCompleted\", \"operator\": \"is-not-checked\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\", \"groupKey\": \"none\" } Condition fields: type: \"condition\" id: any stable string for your client property: a task property, such as title, status, priority, tags, contexts, projects, blockedBy, blocking, due, scheduled, completedDate, dateCreated, dateModified, archived, hasSubtasks, dependencies.isBlocked, dependencies.isBlocking, timeEstimate, recurrence, or status.isCompleted operator: one of is, is-not, contains, does-not-contain, is-before, is-after, is-on-or-before, is-on-or-after, is-empty, is-not-empty, is-checked, is-not-checked, is-greater-than, is-less-than, is-greater-than-or-equal, or is-less-than-or-equal value: required for comparison operators, omitted for empty/checked operators For user-defined fields, use property: \"user:\". Response: data.tasks data.total data.filtered data.vault GET /api/filter-options# Returns filter options for UI builders. GET /api/stats# Returns summary counts: total, completed, active, overdue, archived, withTimeTracking Bases# POST /api/bases/default-files/update# Overwrite the configured default TaskNotes .base files with templates generated from the current TaskNotes settings. This is the same write operation as Settings -> TaskNotes -> Views & base files -> Update files and replaces manual edits in those configured default files. curl -X POST http://localhost:8080/api/bases/default-files/update Response fields: data.created: default files created because they were missing data.updated: existing default files overwritten with current templates data.skipped: configured default files skipped Time Tracking# POST /api/tasks/:id/time/start# Starts a new active time entry for that task. POST /api/tasks/:id/time/start-with-description# Starts time tracking and writes description on the new active entry. Request body: { \"description\": \"Implementation\" } POST /api/tasks/:id/time/stop# Stops active time entry for that task. GET /api/tasks/:id/time# Returns per-task time summary and entries. GET /api/time/active# Returns currently active sessions across tasks. Important: Multiple active sessions can exist across different tasks. GET /api/time/summary# Returns aggregate time summary. Query params: period (for example today, week, month, all) from (ISO date) to (ISO date) Example: curl \"http://localhost:8080/api/time/summary?period=week\" Pomodoro# POST /api/pomodoro/start# Starts a session. Optional request fields: taskId (URL path of task) duration (number) POST /api/pomodoro/stop# Stops and resets current session. POST /api/pomodoro/pause# Pauses running session. POST /api/pomodoro/resume# Resumes paused session. GET /api/pomodoro/status# Returns current state plus computed totals (totalPomodoros, currentStreak, totalMinutesToday). GET /api/pomodoro/sessions# Returns history. Query params: limit date (YYYY-MM-DD) GET /api/pomodoro/stats# Returns stats for today or provided date. Query params: date (YYYY-MM-DD) Calendars# GET /api/calendars# Returns provider connectivity overview and subscription counts. GET /api/calendars/google# Returns Google provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/microsoft# Returns Microsoft provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/subscriptions# Returns ICS subscriptions with runtime fields such as lastFetched and lastError. GET /api/calendars/events# Returns merged event list from connected providers and ICS subscriptions. Query params: start (ISO date/datetime) end (ISO date/datetime) Response includes: events total sources (counts by provider) Webhooks# POST /api/webhooks# Registers webhook. Required fields: url events (non-empty array) Optional fields: id secret active transformFile corsHeaders GET /api/webhooks# Lists registered webhooks. Stored secrets are not returned. DELETE /api/webhooks/:id# Deletes webhook. GET /api/webhooks/deliveries# Returns last 100 delivery records. OpenAPI Docs# GET /api/docs# Returns OpenAPI JSON generated from registered controllers. GET /api/docs/ui# Returns Swagger UI. Errors# Common status codes: 400 invalid request or invalid state 401 missing/invalid bearer token (when auth token is configured) 404 missing task/webhook/resource 500 internal error Security Notes# Current behavior: CORS allows all origins (*). Transport is HTTP only (no TLS). Node server is started with server.listen(port) and does not explicitly bind to 127.0.0.1. Practical guidance: Set an auth token. Treat API port as sensitive and keep it firewalled. If you expose this port outside localhost, route through a trusted reverse proxy and TLS. Troubleshooting# API unavailable# Confirm API is enabled in settings. Confirm Obsidian is running. Confirm selected port is free. Reload plugin or restart Obsidian after changing API enable/port. 401 Authentication required# Check token value. Check Bearer prefix. Remove whitespace around token. Unexpected task list behavior# If you pass filters to GET /api/tasks, the endpoint returns 400 by design. Use POST /api/tasks/query."},{"route":"/obsidian/javascript-api/","title":"TaskNotes JavaScript Runtime API","description":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/javascript-api.md","namespace":"obsidian","relativePath":"javascript-api.md","raw":"# TaskNotes JavaScript Runtime API\n\nTaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n```\n\nThis API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI.\n\nThis is separate from the [HTTP API](HTTP_API.md). The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app.\n\nFor user-facing extensions built on this API, see [Companion Plugins](companion-plugins.md). For a concrete automation companion plugin, see [TaskNotes Workflows](companion-plugins/tasknotes-workflows.md).\n\nThe TypeScript contract lives in `src/api/runtime-api.ts`. It is intentionally small and type-focused so it can later become a standalone `@tasknotes/runtime-api` package for companion plugins.\n\n## Version and Capabilities\n\nCheck the API version and capabilities before using methods that may not exist in older TaskNotes versions:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n\nif (!api || api.apiVersion !== 1 || !api.hasCapability(\"tasks.write\")) {\n\tthrow new Error(\"This workflow requires TaskNotes runtime API v1 task writes\");\n}\n```\n\nCurrent capabilities:\n\n- `model.read`\n- `model.validate`\n- `catalog.read`\n- `extensions.read`\n- `extensions.register`\n- `tasks.read`\n- `tasks.write`\n- `tasks.delete`\n- `tasks.move`\n- `tasks.events`\n- `relationships.read`\n- `events.list`\n- `time.read`\n- `time.write`\n- `time.summary`\n- `pomodoro.read`\n- `pomodoro.write`\n- `pomodoro.events`\n- `recurring.write`\n- `recurring.materialize`\n- `recurring.events`\n- `settings.snapshot`\n- `bases.write`\n- `nlp.parse`\n- `ui.task-menu`\n- `query.tasks`\n- `query.validate`\n- `query.explain`\n- `query.filter-options`\n- `stats.tasks`\n- `system.health`\n- `lifecycle.events`\n- `errors.typed`\n\n## Namespaces\n\nPrefer the namespaced API for new code:\n\n```javascript\nawait api.tasks.update(\"Tasks/example.md\", { status: \"active\" });\nconst subtasks = await api.relationships.subtasks(\"Tasks/example.md\");\nawait api.time.start(\"Tasks/example.md\", { description: \"Deep work\" });\nawait api.pomodoro.start({ taskPath: \"Tasks/example.md\", duration: 25 });\n```\n\nThe older flat methods, such as `api.getTask(path)` and `api.parseNaturalLanguage(text)`, remain available as compatibility aliases.\n\n## Extension Registry\n\nCompanion plugins can publish their own runtime API namespace through `api.extensions`. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object.\n\n```javascript\nconst tasknotes = this.app.plugins.getPlugin(\"tasknotes\");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability(\"extensions.register\")) {\n\treturn;\n}\n\nconst handle = api.extensions.register({\n\tid: this.manifest.id,\n\tnamespace: \"tasknotes-workflows\",\n\tdisplayName: \"TaskNotes Workflows\",\n\tversion: this.manifest.version,\n\tcapabilities: [\"tasknotes-workflows.run\", \"tasknotes-workflows.events\"],\n\tapi: {\n\t\trunWorkflow: async (workflowId, input) => {\n\t\t\t// companion plugin implementation\n\t\t},\n\t},\n});\n\nthis.register(() => handle.unregister());\n```\n\nOther plugins can discover and consume extension namespaces:\n\n```javascript\nconst workflows = api.extensions.get(\"tasknotes-workflows\");\n\nif (api.hasCapability(\"tasknotes-workflows.run\")) {\n\tawait workflows.runWorkflow(\"start-timer-on-active\", { taskPath: \"Tasks/example.md\" });\n}\n```\n\nExtension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions.\n\n## Companion Plugin Access\n\nCompanion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry:\n\n```javascript\nconst tasknotes = this.app.plugins.getPlugin(\"tasknotes\");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability(\"tasks.events\")) {\n\treturn;\n}\n\nthis.registerEvent(\n\tapi.events.on(\"task.status.changed\", (event) => {\n\t\tconsole.log(event.taskPath, event.changes.status);\n\t})\n);\n```\n\nIf TaskNotes is disabled or has not loaded yet, `api` will be unavailable. Companion plugins should handle that case and retry after plugin load if needed.\n\n## TypeScript\n\nUse the exported runtime contract for type safety:\n\n```typescript\nimport type { TaskNotesRuntimeApiV1 } from \"tasknotes/src/api/runtime-api\";\n\ntype TaskNotesPluginInstance = {\n\tapi?: TaskNotesRuntimeApiV1;\n};\n\nconst tasknotes = app.plugins.getPlugin(\"tasknotes\") as TaskNotesPluginInstance | null;\nconst api = tasknotes?.api;\n\nif (api?.apiVersion === 1 && api.hasCapability(\"tasks.write\")) {\n\tawait api.tasks.setStatus(\"Tasks/example.md\", \"active\");\n}\n```\n\nTaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete.\n\n## Model\n\nThe runtime API exposes a small model namespace backed by `@tasknotes/model`:\n\n```javascript\nconst info = api.model.info();\nconst config = api.model.config();\nconst validation = api.model.validateTask(task);\n```\n\n| Method | Description |\n| -------------------------------- | ------------------------------------------------------------------------------------------------ |\n| `api.model.info()` | Returns the model package name, TaskNotes spec version, and runtime API version. |\n| `api.model.config()` | Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings. |\n| `api.model.validateTask(task)` | Validates a partial or complete task against the shared model schema and TaskNotes status rules. |\n| `api.model.validatePatch(patch)` | Validates a task patch before passing it to a runtime task mutation. |\n\n## Catalog\n\nUse `api.catalog` to build companion-plugin editors without hardcoding TaskNotes values:\n\n```javascript\nconst statuses = api.catalog.statuses();\nconst writableFields = api.catalog.writableFields();\nconst operators = api.catalog.filterOperators();\n```\n\n| Method | Description |\n| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- |\n| `api.catalog.statuses()` | Returns configured TaskNotes status definitions. |\n| `api.catalog.priorities()` | Returns configured TaskNotes priority definitions. |\n| `api.catalog.userFields()` | Returns configured user-defined field mappings. |\n| `api.catalog.fields()` | Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available. |\n| `api.catalog.writableFields()` | Returns only fields that runtime task mutations may write. |\n| `api.catalog.filterProperties()` | Returns canonical query fields, aliases, value types, and supported operators. |\n| `api.catalog.filterOperators()` | Returns canonical query operators, labels, value requirements, and accepted aliases. |\n| `api.catalog.relationships()` | Returns relationship categories supported by `api.relationships`. |\n| `api.catalog.dependencyRelTypes()` | Returns dependency relationship types accepted by `api.tasks.addDependency`. |\n| `api.catalog.events()` | Returns the same runtime event catalogue as `api.events.list()`. |\n\n## Tasks\n\nAll paths are vault-relative Markdown file paths.\n\n| Method | Description |\n| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |\n| `api.tasks.get(path)` | Returns a task by path, or `null` when no task is cached at that path. |\n| `api.tasks.list(query?)` | Returns all tasks, or tasks matching a runtime task query. Prefer `api.query.tasks()` when count and grouping metadata matters. |\n| `api.tasks.create(taskData, context?)` | Creates a task using the normal TaskNotes creation service. |\n| `api.tasks.update(path, patch, context?)` | Updates one or more task fields using the normal TaskNotes update service. |\n| `api.tasks.delete(path, context?)` | Deletes the task file through TaskNotes' delete service. |\n| `api.tasks.complete(path, options?, context?)` | Marks a task complete. |\n| `api.tasks.uncomplete(path, options?, context?)` | Moves a completed task back to a non-completed status. |\n| `api.tasks.setStatus(path, status, context?)` | Sets task status. |\n| `api.tasks.setPriority(path, priority, context?)` | Sets task priority. |\n| `api.tasks.setDue(path, date, context?)` / `clearDue(path, context?)` | Sets or clears due date. |\n| `api.tasks.setScheduled(path, date, context?)` / `clearScheduled(path, context?)` | Sets or clears scheduled date. |\n| `api.tasks.archive(path, archived, context?)` | Archives or unarchives a task, including archive-folder movement when configured. |\n| `api.tasks.move(path, targetFolder, context?)` | Moves the task note and refuses to overwrite an existing file. |\n| `api.tasks.addTag/removeTag` | Mutates task tags. |\n| `api.tasks.addProject/removeProject` | Mutates project links. |\n| `api.tasks.addContext/removeContext` | Mutates contexts. |\n| `api.tasks.setReminders/addReminder/removeReminder` | Mutates reminders. |\n| `api.tasks.addDependency/removeDependency` | Mutates blocking dependencies stored in `blockedBy`. |\n\nExample:\n\n```javascript\nconst task = await api.tasks.create(\n\t{\n\t\ttitle: \"Review automation design\",\n\t\tstatus: \"open\",\n\t\tpriority: \"normal\",\n\t\tscheduled: \"2026-06-01\",\n\t\ttags: [\"tasknotes\"],\n\t},\n\t{\n\t\tsource: \"my-companion-plugin\",\n\t\tcorrelationId: crypto.randomUUID(),\n\t\treason: \"manual workflow command\",\n\t}\n);\n\nawait api.tasks.complete(task.path);\n```\n\n## Relationships\n\nRelationship methods resolve TaskNotes' project-as-parent links and `blockedBy` dependencies into task records where possible.\n\n| Method | Description |\n| -------------------------------------- | -------------------------------------------------------------------------- |\n| `api.relationships.parents(path)` | Returns parent tasks referenced from the task's projects. |\n| `api.relationships.subtasks(path)` | Returns tasks that reference this task as a project. |\n| `api.relationships.dependencies(path)` | Returns `blockedBy` dependencies with resolved task data when available. |\n| `api.relationships.blocking(path)` | Returns tasks that are blocked by this task. |\n| `api.relationships.all(path)` | Returns the task plus parents, subtasks, dependencies, and blocking tasks. |\n\nExample:\n\n```javascript\nconst relationships = await api.relationships.all(\"Tasks/example.md\");\n\nfor (const subtask of relationships.subtasks) {\n\tawait api.tasks.setPriority(subtask.path, relationships.task.priority);\n}\n```\n\n## Time Tracking\n\n| Method | Description |\n| -------------------------------------------------- | -------------------------------------------------------------------- |\n| `api.time.start(path, options?, context?)` | Starts time tracking and returns the updated task. |\n| `api.time.stop(path, context?)` | Stops the active time entry and returns the updated task. |\n| `api.time.active()` | Returns active time entries with task, path, entry, and entry index. |\n| `api.time.summary(options?)` | Returns aggregate time totals, top tasks, projects, and tags. |\n| `api.time.task(path)` | Returns one task's time summary and normalized time entries. |\n| `api.time.append(path, entry, context?)` | Appends a time entry. |\n| `api.time.deleteEntry(path, entryIndex, context?)` | Deletes a time entry through TaskNotes' service. |\n\n## Query, Stats, And System\n\nThe query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state.\n\n```javascript\nconst result = await api.query.tasks({\n\twhere: {\n\t\tall: [\n\t\t\t{ field: \"task.status\", op: \"eq\", value: \"active\" },\n\t\t\t{ field: \"task.due\", op: \"lte\", value: { fn: \"today\" } },\n\t\t],\n\t},\n\tsort: [{ field: \"task.due\", direction: \"asc\" }],\n\tgroup: [{ field: \"task.status\" }],\n\tlimit: 25,\n\tscope: {\n\t\tincludeArchived: false,\n\t\tfolders: [\"Tasks\"],\n\t},\n});\n```\n\nRuntime query fields are canonical IDs such as `task.status`, `task.priority`, `task.due`, `task.projects`, `task.isBlocked`, `file.path`, and `user.`. `api.catalog.filterProperties()` returns the complete queryable field catalog, including aliases such as `status` and `user:`.\n\nCanonical operators are `eq`, `ne`, `contains`, `notContains`, `in`, `notIn`, `exists`, `missing`, `lt`, `lte`, `gt`, `gte`, `isTrue`, and `isFalse`. Legacy operator aliases such as `is`, `is-not`, `is-on-or-before`, and `is-not-empty` are accepted and normalized.\n\n`api.query.tasks()` returns explicit count semantics:\n\n- `total`: tasks in scope before filtering\n- `matched`: tasks matching `where` before `offset` and `limit`\n- `returned`: tasks returned after `offset` and `limit`\n- `tasks`: returned task records\n- `groups`: optional group details with task paths\n- `query`: the normalized canonical query\n- `warnings`: non-fatal normalization notes\n\n| Method | Description |\n| ---------------------------- | -------------------------------------------------------------------------------------------------- |\n| `api.query.tasks(query?)` | Validates, normalizes, and executes a runtime task query. |\n| `api.query.validate(query)` | Validates a query without executing it. |\n| `api.query.normalize(query)` | Returns the canonical normalized query, or throws a typed `invalid_input` API error. |\n| `api.query.explain(query)` | Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run. |\n| `api.query.filterOptions()` | Returns available statuses, priorities, contexts, projects, tags, folders, and user properties. |\n| `api.stats.tasks(query?)` | Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals. |\n| `api.system.health()` | Returns runtime status, API version, capabilities, vault identity, and task count. |\n\nTaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract.\n\n## Task Menu UI\n\nCompanion plugins can reuse the standard TaskNotes task context menu through `api.ui.taskMenu`. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals.\n\nThis surface is only available inside Obsidian. It is not exposed through the HTTP API.\n\n| Method | Description |\n| ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |\n| `api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? })` | Shows the standard TaskNotes task context menu at a mouse event. |\n| `api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... })` | Shows the standard TaskNotes task context menu anchored to an element. |\n| `api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... })` | Adds the standard TaskNotes task context menu items to an existing Obsidian `Menu` so plugins can extend it. |\n\nAll methods resolve `taskPath` through the TaskNotes task cache and throw a typed `task_not_found` error when the path does not point to a cached task.\n\n`targetDate` defaults to today and is used by date-sensitive recurring-task menu items. `onUpdate` is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. `promoteOccurrenceControls` moves recurring-instance controls to the top of the menu.\n\nExample context menu:\n\n```javascript\nnodeEl.addEventListener(\"contextmenu\", async (event) => {\n\tevent.preventDefault();\n\n\tawait api.ui.taskMenu.show({\n\t\ttaskPath: task.path,\n\t\tevent,\n\t\tonUpdate: () => refreshGraph(),\n\t});\n});\n```\n\nExample composed menu:\n\n```javascript\nconst menu = new Menu();\n\nawait api.ui.taskMenu.populate(menu, {\n\ttaskPath: task.path,\n\tonUpdate: () => refreshGraph(),\n});\n\nmenu.addSeparator();\nmenu.addItem((item) =>\n\titem\n\t\t.setTitle(\"Focus in graph\")\n\t\t.setIcon(\"network\")\n\t\t.onClick(() => selectGraphNode(task.path))\n);\n\nmenu.showAtMouseEvent(event);\n```\n\n## Pomodoro\n\n| Method | Description |\n| ----------------------------------------------- | --------------------------------------------- |\n| `api.pomodoro.status()` | Returns current Pomodoro state. |\n| `api.pomodoro.start(options?, context?)` | Starts a Pomodoro session. |\n| `api.pomodoro.stop(context?)` | Stops and resets the active Pomodoro session. |\n| `api.pomodoro.pause(context?)` | Pauses the current session. |\n| `api.pomodoro.resume(context?)` | Resumes a paused session. |\n| `api.pomodoro.assignTask(pathOrNull, context?)` | Assigns or clears the current session task. |\n| `api.pomodoro.sessions(options?)` | Returns Pomodoro session history. |\n| `api.pomodoro.stats(date?)` | Returns Pomodoro stats for a date or today. |\n\n## Recurring Tasks\n\n| Method | Description |\n| ------------------------------------------------------------- | ---------------------------------------------------- |\n| `api.recurring.toggleCompleteInstance(path, date?, context?)` | Toggles completion for a recurring task instance. |\n| `api.recurring.toggleSkippedInstance(path, date?, context?)` | Toggles skipped state for a recurring task instance. |\n| `api.recurring.materializeOccurrence(path, date, context?)` | Creates or returns an occurrence note for a recurring task date. |\n\n## Natural Language Parser\n\n```javascript\nconst parsed = api.nlp.parse(\"Write draft friday 2pm #writing @desk\");\n```\n\n`api.parseNaturalLanguage(text)` remains as a compatibility alias. Parsing does not create or modify task files.\n\nSee [NLP API](nlp-api.md) for HTTP endpoint details and parser behavior.\n\n## Settings Snapshot\n\n```javascript\nconst settings = api.settings.snapshot();\nconsole.log(settings.defaultTaskStatus);\n```\n\nThe returned object is a snapshot. Mutating it does not change TaskNotes settings. `api.getSettingsSnapshot()` remains available as a compatibility alias.\n\n## Bases\n\n`api.bases.updateDefaultFiles()` regenerates the configured default TaskNotes `.base` files from the current TaskNotes settings and returns the created, updated, and skipped file paths.\n\n```javascript\nconst result = await api.bases.updateDefaultFiles();\nconsole.log(result.updated);\n```\n\n## Mutation Context\n\nMutating methods accept an optional context object:\n\n```javascript\n{\n source: \"tasknotes-workflows\",\n correlationId: \"run-2026-06-01T09-00-00\",\n reason: \"status changed to active\"\n}\n```\n\nTaskNotes attaches this context to normalized events emitted during the mutation. Use it to make workflow runs debuggable, connect multiple API calls to one run, and prevent companion plugins from responding to their own writes.\n\n## Events\n\nSubscribe with `api.events.on(eventName, handler)` and unsubscribe with `api.events.off(ref)`. In an Obsidian plugin, pass the returned `EventRef` to `this.registerEvent(ref)`.\n\nUse `api.events.list()` to discover the event catalogue for companion-plugin UIs:\n\n```javascript\nconst events = api.events.list();\n// [{ name: \"task.status.changed\", label: \"Task status changed\", category: \"task\", ... }]\n```\n\nTask events:\n\n- `task.created`\n- `task.updated`\n- `task.deleted`\n- `task.moved`\n- `task.status.changed`\n- `task.completed`\n- `task.uncompleted`\n- `task.archived`\n- `task.unarchived`\n- `task.scheduled.changed`\n- `task.due.changed`\n- `task.priority.changed`\n- `task.tags.changed`\n- `task.contexts.changed`\n- `task.projects.changed`\n- `task.reminders.changed`\n- `task.dependencies.changed`\n- `task.recurrence.changed`\n\nTime, Pomodoro, and recurring events:\n\n- `time.started`\n- `time.stopped`\n- `pomodoro.started`\n- `pomodoro.completed`\n- `pomodoro.interrupted`\n- `recurring.instance.completed`\n- `recurring.instance.skipped`\n\nSpecific events are emitted in addition to `task.updated`. For example, changing a task from `open` to `done` emits `task.updated`, `task.status.changed`, and `task.completed`.\n\nEvent payloads have this shape:\n\n```javascript\n{\n event: \"task.status.changed\",\n timestamp: \"2026-06-01T09:00:00.000Z\",\n taskPath: \"Tasks/Review automation design.md\",\n task: { /* current task */ },\n before: { /* task before change */ },\n after: { /* task after change */ },\n deletedTask: undefined,\n changes: {\n status: {\n before: \"open\",\n after: \"done\"\n }\n },\n data: undefined,\n context: {\n source: \"tasknotes-workflows\",\n correlationId: \"run-2026-06-01T09-00-00\",\n reason: \"status changed to done\"\n },\n source: \"tasknotes-workflows\",\n correlationId: \"run-2026-06-01T09-00-00\",\n reason: \"status changed to done\",\n rawEvent: \"task-updated\"\n}\n```\n\nEvents caused outside the runtime API may not include `context`, `source`, `correlationId`, or `reason`.\n\nExample automation-style listener:\n\n```javascript\nconst source = \"my-workflow-plugin\";\n\nthis.registerEvent(\n\tapi.events.on(\"task.status.changed\", async (event) => {\n\t\tif (event.source === source) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.after?.status !== \"active\") {\n\t\t\treturn;\n\t\t}\n\n\t\tawait api.time.start(event.after.path, undefined, {\n\t\t\tsource,\n\t\t\tcorrelationId: event.correlationId ?? crypto.randomUUID(),\n\t\t\treason: \"status changed to active\",\n\t\t});\n\t})\n);\n```\n\n## Lifecycle\n\nUse `api.lifecycle` to coordinate companion plugin startup, reload, and cache-sensitive UI state:\n\n```javascript\nawait api.lifecycle.ready();\n\nthis.registerEvent(\n\tapi.lifecycle.on(\"settings.changed\", () => {\n\t\trefreshCompanionCatalogs();\n\t})\n);\n```\n\nLifecycle events:\n\n- `ready`\n- `layout.ready`\n- `settings.changed`\n- `cache.changed`\n- `cache.rebuilt`\n- `extension.registered`\n- `extension.unregistered`\n- `unloading`\n\n`api.lifecycle.list()` returns labels, descriptions, and categories for these events.\n\n## Error Handling\n\nAPI methods throw `TaskNotesApiError` for invalid input or failed operations that the runtime API can classify. The error object includes:\n\n- `name`: always `TaskNotesApiError`\n- `code`: a stable machine-readable code\n- `message`: a human-readable message for logs\n- `status`: an HTTP-style status code for tools that mirror runtime calls over HTTP or MCP\n- `details`: optional structured context such as the task path, extension namespace, or invalid status\n\nCommon examples:\n\n- The task path is empty or invalid.\n- No task exists at the requested path.\n- A target move folder already contains a file with the same name.\n- `complete` is called with a status that is not configured as completed.\n\nCurrent error codes:\n\n- `invalid_input`\n- `invalid_task_path`\n- `invalid_status`\n- `task_not_found`\n- `task_file_not_found`\n- `file_already_exists`\n- `extension_invalid`\n- `extension_namespace_reserved`\n- `extension_namespace_conflict`\n- `extension_not_registered`\n- `operation_failed`\n\nUse `api.errors` when workflow engines or background listeners need consistent result objects instead of thrown exceptions:\n\n```javascript\nconst result = await api.errors.toResult(() =>\n\tapi.tasks.complete(\"Tasks/example.md\", { status: \"done\" })\n);\n\nif (!result.ok) {\n\tconsole.warn(result.error.code, result.error.details);\n\treturn;\n}\n\nconsole.log(result.value.path);\n```\n\n`api.errors.normalize(error)` converts unknown thrown values into a `TaskNotesApiError` payload. Unknown JavaScript errors use `operation_failed` with status `500`.\n","aliases":["/javascript-api/"],"toc":[{"level":2,"id":"version-and-capabilities","text":"Version and Capabilities"},{"level":2,"id":"namespaces","text":"Namespaces"},{"level":2,"id":"extension-registry","text":"Extension Registry"},{"level":2,"id":"companion-plugin-access","text":"Companion Plugin Access"},{"level":2,"id":"typescript","text":"TypeScript"},{"level":2,"id":"model","text":"Model"},{"level":2,"id":"catalog","text":"Catalog"},{"level":2,"id":"tasks","text":"Tasks"},{"level":2,"id":"relationships","text":"Relationships"},{"level":2,"id":"time-tracking","text":"Time Tracking"},{"level":2,"id":"query-stats-and-system","text":"Query, Stats, And System"},{"level":2,"id":"task-menu-ui","text":"Task Menu UI"},{"level":2,"id":"pomodoro","text":"Pomodoro"},{"level":2,"id":"recurring-tasks","text":"Recurring Tasks"},{"level":2,"id":"natural-language-parser","text":"Natural Language Parser"},{"level":2,"id":"settings-snapshot","text":"Settings Snapshot"},{"level":2,"id":"bases","text":"Bases"},{"level":2,"id":"mutation-context","text":"Mutation Context"},{"level":2,"id":"events","text":"Events"},{"level":2,"id":"lifecycle","text":"Lifecycle"},{"level":2,"id":"error-handling","text":"Error Handling"}],"html":"

TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n

This API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI.

\n

This is separate from the HTTP API. The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app.

\n

For user-facing extensions built on this API, see Companion Plugins. For a concrete automation companion plugin, see TaskNotes Workflows.

\n

The TypeScript contract lives in src/api/runtime-api.ts. It is intentionally small and type-focused so it can later become a standalone @tasknotes/runtime-api package for companion plugins.

\n

Version and Capabilities#

\n

Check the API version and capabilities before using methods that may not exist in older TaskNotes versions:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n\nif (!api || api.apiVersion !== 1 || !api.hasCapability("tasks.write")) {\n    throw new Error("This workflow requires TaskNotes runtime API v1 task writes");\n}\n

Current capabilities:

\n
    \n
  • model.read
  • \n
  • model.validate
  • \n
  • catalog.read
  • \n
  • extensions.read
  • \n
  • extensions.register
  • \n
  • tasks.read
  • \n
  • tasks.write
  • \n
  • tasks.delete
  • \n
  • tasks.move
  • \n
  • tasks.events
  • \n
  • relationships.read
  • \n
  • events.list
  • \n
  • time.read
  • \n
  • time.write
  • \n
  • time.summary
  • \n
  • pomodoro.read
  • \n
  • pomodoro.write
  • \n
  • pomodoro.events
  • \n
  • recurring.write
  • \n
  • recurring.materialize
  • \n
  • recurring.events
  • \n
  • settings.snapshot
  • \n
  • bases.write
  • \n
  • nlp.parse
  • \n
  • ui.task-menu
  • \n
  • query.tasks
  • \n
  • query.validate
  • \n
  • query.explain
  • \n
  • query.filter-options
  • \n
  • stats.tasks
  • \n
  • system.health
  • \n
  • lifecycle.events
  • \n
  • errors.typed
  • \n
\n

Namespaces#

\n

Prefer the namespaced API for new code:

\n
await api.tasks.update("Tasks/example.md", { status: "active" });\nconst subtasks = await api.relationships.subtasks("Tasks/example.md");\nawait api.time.start("Tasks/example.md", { description: "Deep work" });\nawait api.pomodoro.start({ taskPath: "Tasks/example.md", duration: 25 });\n

The older flat methods, such as api.getTask(path) and api.parseNaturalLanguage(text), remain available as compatibility aliases.

\n

Extension Registry#

\n

Companion plugins can publish their own runtime API namespace through api.extensions. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object.

\n
const tasknotes = this.app.plugins.getPlugin("tasknotes");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability("extensions.register")) {\n    return;\n}\n\nconst handle = api.extensions.register({\n    id: this.manifest.id,\n    namespace: "tasknotes-workflows",\n    displayName: "TaskNotes Workflows",\n    version: this.manifest.version,\n    capabilities: ["tasknotes-workflows.run", "tasknotes-workflows.events"],\n    api: {\n        runWorkflow: async (workflowId, input) => {\n            // companion plugin implementation\n        },\n    },\n});\n\nthis.register(() => handle.unregister());\n

Other plugins can discover and consume extension namespaces:

\n
const workflows = api.extensions.get("tasknotes-workflows");\n\nif (api.hasCapability("tasknotes-workflows.run")) {\n    await workflows.runWorkflow("start-timer-on-active", { taskPath: "Tasks/example.md" });\n}\n

Extension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions.

\n

Companion Plugin Access#

\n

Companion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry:

\n
const tasknotes = this.app.plugins.getPlugin("tasknotes");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability("tasks.events")) {\n    return;\n}\n\nthis.registerEvent(\n    api.events.on("task.status.changed", (event) => {\n        console.log(event.taskPath, event.changes.status);\n    })\n);\n

If TaskNotes is disabled or has not loaded yet, api will be unavailable. Companion plugins should handle that case and retry after plugin load if needed.

\n

TypeScript#

\n

Use the exported runtime contract for type safety:

\n
import type { TaskNotesRuntimeApiV1 } from "tasknotes/src/api/runtime-api";\n\ntype TaskNotesPluginInstance = {\n    api?: TaskNotesRuntimeApiV1;\n};\n\nconst tasknotes = app.plugins.getPlugin("tasknotes") as TaskNotesPluginInstance | null;\nconst api = tasknotes?.api;\n\nif (api?.apiVersion === 1 && api.hasCapability("tasks.write")) {\n    await api.tasks.setStatus("Tasks/example.md", "active");\n}\n

TaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete.

\n

Model#

\n

The runtime API exposes a small model namespace backed by @tasknotes/model:

\n
const info = api.model.info();\nconst config = api.model.config();\nconst validation = api.model.validateTask(task);\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.model.info()Returns the model package name, TaskNotes spec version, and runtime API version.
api.model.config()Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings.
api.model.validateTask(task)Validates a partial or complete task against the shared model schema and TaskNotes status rules.
api.model.validatePatch(patch)Validates a task patch before passing it to a runtime task mutation.
\n

Catalog#

\n

Use api.catalog to build companion-plugin editors without hardcoding TaskNotes values:

\n
const statuses = api.catalog.statuses();\nconst writableFields = api.catalog.writableFields();\nconst operators = api.catalog.filterOperators();\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.catalog.statuses()Returns configured TaskNotes status definitions.
api.catalog.priorities()Returns configured TaskNotes priority definitions.
api.catalog.userFields()Returns configured user-defined field mappings.
api.catalog.fields()Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available.
api.catalog.writableFields()Returns only fields that runtime task mutations may write.
api.catalog.filterProperties()Returns canonical query fields, aliases, value types, and supported operators.
api.catalog.filterOperators()Returns canonical query operators, labels, value requirements, and accepted aliases.
api.catalog.relationships()Returns relationship categories supported by api.relationships.
api.catalog.dependencyRelTypes()Returns dependency relationship types accepted by api.tasks.addDependency.
api.catalog.events()Returns the same runtime event catalogue as api.events.list().
\n

Tasks#

\n

All paths are vault-relative Markdown file paths.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.tasks.get(path)Returns a task by path, or null when no task is cached at that path.
api.tasks.list(query?)Returns all tasks, or tasks matching a runtime task query. Prefer api.query.tasks() when count and grouping metadata matters.
api.tasks.create(taskData, context?)Creates a task using the normal TaskNotes creation service.
api.tasks.update(path, patch, context?)Updates one or more task fields using the normal TaskNotes update service.
api.tasks.delete(path, context?)Deletes the task file through TaskNotes' delete service.
api.tasks.complete(path, options?, context?)Marks a task complete.
api.tasks.uncomplete(path, options?, context?)Moves a completed task back to a non-completed status.
api.tasks.setStatus(path, status, context?)Sets task status.
api.tasks.setPriority(path, priority, context?)Sets task priority.
api.tasks.setDue(path, date, context?) / clearDue(path, context?)Sets or clears due date.
api.tasks.setScheduled(path, date, context?) / clearScheduled(path, context?)Sets or clears scheduled date.
api.tasks.archive(path, archived, context?)Archives or unarchives a task, including archive-folder movement when configured.
api.tasks.move(path, targetFolder, context?)Moves the task note and refuses to overwrite an existing file.
api.tasks.addTag/removeTagMutates task tags.
api.tasks.addProject/removeProjectMutates project links.
api.tasks.addContext/removeContextMutates contexts.
api.tasks.setReminders/addReminder/removeReminderMutates reminders.
api.tasks.addDependency/removeDependencyMutates blocking dependencies stored in blockedBy.
\n

Example:

\n
const task = await api.tasks.create(\n    {\n        title: "Review automation design",\n        status: "open",\n        priority: "normal",\n        scheduled: "2026-06-01",\n        tags: ["tasknotes"],\n    },\n    {\n        source: "my-companion-plugin",\n        correlationId: crypto.randomUUID(),\n        reason: "manual workflow command",\n    }\n);\n\nawait api.tasks.complete(task.path);\n

Relationships#

\n

Relationship methods resolve TaskNotes' project-as-parent links and blockedBy dependencies into task records where possible.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.relationships.parents(path)Returns parent tasks referenced from the task's projects.
api.relationships.subtasks(path)Returns tasks that reference this task as a project.
api.relationships.dependencies(path)Returns blockedBy dependencies with resolved task data when available.
api.relationships.blocking(path)Returns tasks that are blocked by this task.
api.relationships.all(path)Returns the task plus parents, subtasks, dependencies, and blocking tasks.
\n

Example:

\n
const relationships = await api.relationships.all("Tasks/example.md");\n\nfor (const subtask of relationships.subtasks) {\n    await api.tasks.setPriority(subtask.path, relationships.task.priority);\n}\n

Time Tracking#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.time.start(path, options?, context?)Starts time tracking and returns the updated task.
api.time.stop(path, context?)Stops the active time entry and returns the updated task.
api.time.active()Returns active time entries with task, path, entry, and entry index.
api.time.summary(options?)Returns aggregate time totals, top tasks, projects, and tags.
api.time.task(path)Returns one task's time summary and normalized time entries.
api.time.append(path, entry, context?)Appends a time entry.
api.time.deleteEntry(path, entryIndex, context?)Deletes a time entry through TaskNotes' service.
\n

Query, Stats, And System#

\n

The query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state.

\n
const result = await api.query.tasks({\n    where: {\n        all: [\n            { field: "task.status", op: "eq", value: "active" },\n            { field: "task.due", op: "lte", value: { fn: "today" } },\n        ],\n    },\n    sort: [{ field: "task.due", direction: "asc" }],\n    group: [{ field: "task.status" }],\n    limit: 25,\n    scope: {\n        includeArchived: false,\n        folders: ["Tasks"],\n    },\n});\n

Runtime query fields are canonical IDs such as task.status, task.priority, task.due, task.projects, task.isBlocked, file.path, and user.<id-or-key>. api.catalog.filterProperties() returns the complete queryable field catalog, including aliases such as status and user:<id>.

\n

Canonical operators are eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Legacy operator aliases such as is, is-not, is-on-or-before, and is-not-empty are accepted and normalized.

\n

api.query.tasks() returns explicit count semantics:

\n
    \n
  • total: tasks in scope before filtering
  • \n
  • matched: tasks matching where before offset and limit
  • \n
  • returned: tasks returned after offset and limit
  • \n
  • tasks: returned task records
  • \n
  • groups: optional group details with task paths
  • \n
  • query: the normalized canonical query
  • \n
  • warnings: non-fatal normalization notes
  • \n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.query.tasks(query?)Validates, normalizes, and executes a runtime task query.
api.query.validate(query)Validates a query without executing it.
api.query.normalize(query)Returns the canonical normalized query, or throws a typed invalid_input API error.
api.query.explain(query)Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run.
api.query.filterOptions()Returns available statuses, priorities, contexts, projects, tags, folders, and user properties.
api.stats.tasks(query?)Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals.
api.system.health()Returns runtime status, API version, capabilities, vault identity, and task count.
\n

TaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract.

\n

Task Menu UI#

\n

Companion plugins can reuse the standard TaskNotes task context menu through api.ui.taskMenu. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals.

\n

This surface is only available inside Obsidian. It is not exposed through the HTTP API.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? })Shows the standard TaskNotes task context menu at a mouse event.
api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... })Shows the standard TaskNotes task context menu anchored to an element.
api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... })Adds the standard TaskNotes task context menu items to an existing Obsidian Menu so plugins can extend it.
\n

All methods resolve taskPath through the TaskNotes task cache and throw a typed task_not_found error when the path does not point to a cached task.

\n

targetDate defaults to today and is used by date-sensitive recurring-task menu items. onUpdate is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. promoteOccurrenceControls moves recurring-instance controls to the top of the menu.

\n

Example context menu:

\n
nodeEl.addEventListener("contextmenu", async (event) => {\n    event.preventDefault();\n\n    await api.ui.taskMenu.show({\n        taskPath: task.path,\n        event,\n        onUpdate: () => refreshGraph(),\n    });\n});\n

Example composed menu:

\n
const menu = new Menu();\n\nawait api.ui.taskMenu.populate(menu, {\n    taskPath: task.path,\n    onUpdate: () => refreshGraph(),\n});\n\nmenu.addSeparator();\nmenu.addItem((item) =>\n    item\n        .setTitle("Focus in graph")\n        .setIcon("network")\n        .onClick(() => selectGraphNode(task.path))\n);\n\nmenu.showAtMouseEvent(event);\n

Pomodoro#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.pomodoro.status()Returns current Pomodoro state.
api.pomodoro.start(options?, context?)Starts a Pomodoro session.
api.pomodoro.stop(context?)Stops and resets the active Pomodoro session.
api.pomodoro.pause(context?)Pauses the current session.
api.pomodoro.resume(context?)Resumes a paused session.
api.pomodoro.assignTask(pathOrNull, context?)Assigns or clears the current session task.
api.pomodoro.sessions(options?)Returns Pomodoro session history.
api.pomodoro.stats(date?)Returns Pomodoro stats for a date or today.
\n

Recurring Tasks#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.recurring.toggleCompleteInstance(path, date?, context?)Toggles completion for a recurring task instance.
api.recurring.toggleSkippedInstance(path, date?, context?)Toggles skipped state for a recurring task instance.
api.recurring.materializeOccurrence(path, date, context?)Creates or returns an occurrence note for a recurring task date.
\n

Natural Language Parser#

\n
const parsed = api.nlp.parse("Write draft friday 2pm #writing @desk");\n

api.parseNaturalLanguage(text) remains as a compatibility alias. Parsing does not create or modify task files.

\n

See NLP API for HTTP endpoint details and parser behavior.

\n

Settings Snapshot#

\n
const settings = api.settings.snapshot();\nconsole.log(settings.defaultTaskStatus);\n

The returned object is a snapshot. Mutating it does not change TaskNotes settings. api.getSettingsSnapshot() remains available as a compatibility alias.

\n

Bases#

\n

api.bases.updateDefaultFiles() regenerates the configured default TaskNotes .base files from the current TaskNotes settings and returns the created, updated, and skipped file paths.

\n
const result = await api.bases.updateDefaultFiles();\nconsole.log(result.updated);\n

Mutation Context#

\n

Mutating methods accept an optional context object:

\n
{\n  source: "tasknotes-workflows",\n  correlationId: "run-2026-06-01T09-00-00",\n  reason: "status changed to active"\n}\n

TaskNotes attaches this context to normalized events emitted during the mutation. Use it to make workflow runs debuggable, connect multiple API calls to one run, and prevent companion plugins from responding to their own writes.

\n

Events#

\n

Subscribe with api.events.on(eventName, handler) and unsubscribe with api.events.off(ref). In an Obsidian plugin, pass the returned EventRef to this.registerEvent(ref).

\n

Use api.events.list() to discover the event catalogue for companion-plugin UIs:

\n
const events = api.events.list();\n// [{ name: "task.status.changed", label: "Task status changed", category: "task", ... }]\n

Task events:

\n
    \n
  • task.created
  • \n
  • task.updated
  • \n
  • task.deleted
  • \n
  • task.moved
  • \n
  • task.status.changed
  • \n
  • task.completed
  • \n
  • task.uncompleted
  • \n
  • task.archived
  • \n
  • task.unarchived
  • \n
  • task.scheduled.changed
  • \n
  • task.due.changed
  • \n
  • task.priority.changed
  • \n
  • task.tags.changed
  • \n
  • task.contexts.changed
  • \n
  • task.projects.changed
  • \n
  • task.reminders.changed
  • \n
  • task.dependencies.changed
  • \n
  • task.recurrence.changed
  • \n
\n

Time, Pomodoro, and recurring events:

\n
    \n
  • time.started
  • \n
  • time.stopped
  • \n
  • pomodoro.started
  • \n
  • pomodoro.completed
  • \n
  • pomodoro.interrupted
  • \n
  • recurring.instance.completed
  • \n
  • recurring.instance.skipped
  • \n
\n

Specific events are emitted in addition to task.updated. For example, changing a task from open to done emits task.updated, task.status.changed, and task.completed.

\n

Event payloads have this shape:

\n
{\n  event: "task.status.changed",\n  timestamp: "2026-06-01T09:00:00.000Z",\n  taskPath: "Tasks/Review automation design.md",\n  task: { /* current task */ },\n  before: { /* task before change */ },\n  after: { /* task after change */ },\n  deletedTask: undefined,\n  changes: {\n    status: {\n      before: "open",\n      after: "done"\n    }\n  },\n  data: undefined,\n  context: {\n    source: "tasknotes-workflows",\n    correlationId: "run-2026-06-01T09-00-00",\n    reason: "status changed to done"\n  },\n  source: "tasknotes-workflows",\n  correlationId: "run-2026-06-01T09-00-00",\n  reason: "status changed to done",\n  rawEvent: "task-updated"\n}\n

Events caused outside the runtime API may not include context, source, correlationId, or reason.

\n

Example automation-style listener:

\n
const source = "my-workflow-plugin";\n\nthis.registerEvent(\n    api.events.on("task.status.changed", async (event) => {\n        if (event.source === source) {\n            return;\n        }\n\n        if (event.after?.status !== "active") {\n            return;\n        }\n\n        await api.time.start(event.after.path, undefined, {\n            source,\n            correlationId: event.correlationId ?? crypto.randomUUID(),\n            reason: "status changed to active",\n        });\n    })\n);\n

Lifecycle#

\n

Use api.lifecycle to coordinate companion plugin startup, reload, and cache-sensitive UI state:

\n
await api.lifecycle.ready();\n\nthis.registerEvent(\n    api.lifecycle.on("settings.changed", () => {\n        refreshCompanionCatalogs();\n    })\n);\n

Lifecycle events:

\n
    \n
  • ready
  • \n
  • layout.ready
  • \n
  • settings.changed
  • \n
  • cache.changed
  • \n
  • cache.rebuilt
  • \n
  • extension.registered
  • \n
  • extension.unregistered
  • \n
  • unloading
  • \n
\n

api.lifecycle.list() returns labels, descriptions, and categories for these events.

\n

Error Handling#

\n

API methods throw TaskNotesApiError for invalid input or failed operations that the runtime API can classify. The error object includes:

\n
    \n
  • name: always TaskNotesApiError
  • \n
  • code: a stable machine-readable code
  • \n
  • message: a human-readable message for logs
  • \n
  • status: an HTTP-style status code for tools that mirror runtime calls over HTTP or MCP
  • \n
  • details: optional structured context such as the task path, extension namespace, or invalid status
  • \n
\n

Common examples:

\n
    \n
  • The task path is empty or invalid.
  • \n
  • No task exists at the requested path.
  • \n
  • A target move folder already contains a file with the same name.
  • \n
  • complete is called with a status that is not configured as completed.
  • \n
\n

Current error codes:

\n
    \n
  • invalid_input
  • \n
  • invalid_task_path
  • \n
  • invalid_status
  • \n
  • task_not_found
  • \n
  • task_file_not_found
  • \n
  • file_already_exists
  • \n
  • extension_invalid
  • \n
  • extension_namespace_reserved
  • \n
  • extension_namespace_conflict
  • \n
  • extension_not_registered
  • \n
  • operation_failed
  • \n
\n

Use api.errors when workflow engines or background listeners need consistent result objects instead of thrown exceptions:

\n
const result = await api.errors.toResult(() =>\n    api.tasks.complete("Tasks/example.md", { status: "done" })\n);\n\nif (!result.ok) {\n    console.warn(result.error.code, result.error.details);\n    return;\n}\n\nconsole.log(result.value.path);\n

api.errors.normalize(error) converts unknown thrown values into a TaskNotesApiError payload. Unknown JavaScript errors use operation_failed with status 500.

\n","text":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; This API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI. This is separate from the HTTP API. The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app. For user-facing extensions built on this API, see Companion Plugins. For a concrete automation companion plugin, see TaskNotes Workflows. The TypeScript contract lives in src/api/runtime-api.ts. It is intentionally small and type-focused so it can later become a standalone @tasknotes/runtime-api package for companion plugins. Version and Capabilities# Check the API version and capabilities before using methods that may not exist in older TaskNotes versions: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; if (!api || api.apiVersion !== 1 || !api.hasCapability(\"tasks.write\")) { throw new Error(\"This workflow requires TaskNotes runtime API v1 task writes\"); } Current capabilities: model.read model.validate catalog.read extensions.read extensions.register tasks.read tasks.write tasks.delete tasks.move tasks.events relationships.read events.list time.read time.write time.summary pomodoro.read pomodoro.write pomodoro.events recurring.write recurring.materialize recurring.events settings.snapshot bases.write nlp.parse ui.task-menu query.tasks query.validate query.explain query.filter-options stats.tasks system.health lifecycle.events errors.typed Namespaces# Prefer the namespaced API for new code: await api.tasks.update(\"Tasks/example.md\", { status: \"active\" }); const subtasks = await api.relationships.subtasks(\"Tasks/example.md\"); await api.time.start(\"Tasks/example.md\", { description: \"Deep work\" }); await api.pomodoro.start({ taskPath: \"Tasks/example.md\", duration: 25 }); The older flat methods, such as api.getTask(path) and api.parseNaturalLanguage(text), remain available as compatibility aliases. Extension Registry# Companion plugins can publish their own runtime API namespace through api.extensions. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object. const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"extensions.register\")) { return; } const handle = api.extensions.register({ id: this.manifest.id, namespace: \"tasknotes-workflows\", displayName: \"TaskNotes Workflows\", version: this.manifest.version, capabilities: [\"tasknotes-workflows.run\", \"tasknotes-workflows.events\"], api: { runWorkflow: async (workflowId, input) => { // companion plugin implementation }, }, }); this.register(() => handle.unregister()); Other plugins can discover and consume extension namespaces: const workflows = api.extensions.get(\"tasknotes-workflows\"); if (api.hasCapability(\"tasknotes-workflows.run\")) { await workflows.runWorkflow(\"start-timer-on-active\", { taskPath: \"Tasks/example.md\" }); } Extension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions. Companion Plugin Access# Companion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry: const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"tasks.events\")) { return; } this.registerEvent( api.events.on(\"task.status.changed\", (event) => { console.log(event.taskPath, event.changes.status); }) ); If TaskNotes is disabled or has not loaded yet, api will be unavailable. Companion plugins should handle that case and retry after plugin load if needed. TypeScript# Use the exported runtime contract for type safety: import type { TaskNotesRuntimeApiV1 } from \"tasknotes/src/api/runtime-api\"; type TaskNotesPluginInstance = { api?: TaskNotesRuntimeApiV1; }; const tasknotes = app.plugins.getPlugin(\"tasknotes\") as TaskNotesPluginInstance | null; const api = tasknotes?.api; if (api?.apiVersion === 1 && api.hasCapability(\"tasks.write\")) { await api.tasks.setStatus(\"Tasks/example.md\", \"active\"); } TaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete. Model# The runtime API exposes a small model namespace backed by @tasknotes/model: const info = api.model.info(); const config = api.model.config(); const validation = api.model.validateTask(task); Method Description api.model.info() Returns the model package name, TaskNotes spec version, and runtime API version. api.model.config() Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings. api.model.validateTask(task) Validates a partial or complete task against the shared model schema and TaskNotes status rules. api.model.validatePatch(patch) Validates a task patch before passing it to a runtime task mutation. Catalog# Use api.catalog to build companion-plugin editors without hardcoding TaskNotes values: const statuses = api.catalog.statuses(); const writableFields = api.catalog.writableFields(); const operators = api.catalog.filterOperators(); Method Description api.catalog.statuses() Returns configured TaskNotes status definitions. api.catalog.priorities() Returns configured TaskNotes priority definitions. api.catalog.userFields() Returns configured user-defined field mappings. api.catalog.fields() Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available. api.catalog.writableFields() Returns only fields that runtime task mutations may write. api.catalog.filterProperties() Returns canonical query fields, aliases, value types, and supported operators. api.catalog.filterOperators() Returns canonical query operators, labels, value requirements, and accepted aliases. api.catalog.relationships() Returns relationship categories supported by api.relationships. api.catalog.dependencyRelTypes() Returns dependency relationship types accepted by api.tasks.addDependency. api.catalog.events() Returns the same runtime event catalogue as api.events.list(). Tasks# All paths are vault-relative Markdown file paths. Method Description api.tasks.get(path) Returns a task by path, or null when no task is cached at that path. api.tasks.list(query?) Returns all tasks, or tasks matching a runtime task query. Prefer api.query.tasks() when count and grouping metadata matters. api.tasks.create(taskData, context?) Creates a task using the normal TaskNotes creation service. api.tasks.update(path, patch, context?) Updates one or more task fields using the normal TaskNotes update service. api.tasks.delete(path, context?) Deletes the task file through TaskNotes' delete service. api.tasks.complete(path, options?, context?) Marks a task complete. api.tasks.uncomplete(path, options?, context?) Moves a completed task back to a non-completed status. api.tasks.setStatus(path, status, context?) Sets task status. api.tasks.setPriority(path, priority, context?) Sets task priority. api.tasks.setDue(path, date, context?) / clearDue(path, context?) Sets or clears due date. api.tasks.setScheduled(path, date, context?) / clearScheduled(path, context?) Sets or clears scheduled date. api.tasks.archive(path, archived, context?) Archives or unarchives a task, including archive-folder movement when configured. api.tasks.move(path, targetFolder, context?) Moves the task note and refuses to overwrite an existing file. api.tasks.addTag/removeTag Mutates task tags. api.tasks.addProject/removeProject Mutates project links. api.tasks.addContext/removeContext Mutates contexts. api.tasks.setReminders/addReminder/removeReminder Mutates reminders. api.tasks.addDependency/removeDependency Mutates blocking dependencies stored in blockedBy. Example: const task = await api.tasks.create( { title: \"Review automation design\", status: \"open\", priority: \"normal\", scheduled: \"2026-06-01\", tags: [\"tasknotes\"], }, { source: \"my-companion-plugin\", correlationId: crypto.randomUUID(), reason: \"manual workflow command\", } ); await api.tasks.complete(task.path); Relationships# Relationship methods resolve TaskNotes' project-as-parent links and blockedBy dependencies into task records where possible. Method Description api.relationships.parents(path) Returns parent tasks referenced from the task's projects. api.relationships.subtasks(path) Returns tasks that reference this task as a project. api.relationships.dependencies(path) Returns blockedBy dependencies with resolved task data when available. api.relationships.blocking(path) Returns tasks that are blocked by this task. api.relationships.all(path) Returns the task plus parents, subtasks, dependencies, and blocking tasks. Example: const relationships = await api.relationships.all(\"Tasks/example.md\"); for (const subtask of relationships.subtasks) { await api.tasks.setPriority(subtask.path, relationships.task.priority); } Time Tracking# Method Description api.time.start(path, options?, context?) Starts time tracking and returns the updated task. api.time.stop(path, context?) Stops the active time entry and returns the updated task. api.time.active() Returns active time entries with task, path, entry, and entry index. api.time.summary(options?) Returns aggregate time totals, top tasks, projects, and tags. api.time.task(path) Returns one task's time summary and normalized time entries. api.time.append(path, entry, context?) Appends a time entry. api.time.deleteEntry(path, entryIndex, context?) Deletes a time entry through TaskNotes' service. Query, Stats, And System# The query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state. const result = await api.query.tasks({ where: { all: [ { field: \"task.status\", op: \"eq\", value: \"active\" }, { field: \"task.due\", op: \"lte\", value: { fn: \"today\" } }, ], }, sort: [{ field: \"task.due\", direction: \"asc\" }], group: [{ field: \"task.status\" }], limit: 25, scope: { includeArchived: false, folders: [\"Tasks\"], }, }); Runtime query fields are canonical IDs such as task.status, task.priority, task.due, task.projects, task.isBlocked, file.path, and user.. api.catalog.filterProperties() returns the complete queryable field catalog, including aliases such as status and user:. Canonical operators are eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Legacy operator aliases such as is, is-not, is-on-or-before, and is-not-empty are accepted and normalized. api.query.tasks() returns explicit count semantics: total: tasks in scope before filtering matched: tasks matching where before offset and limit returned: tasks returned after offset and limit tasks: returned task records groups: optional group details with task paths query: the normalized canonical query warnings: non-fatal normalization notes Method Description api.query.tasks(query?) Validates, normalizes, and executes a runtime task query. api.query.validate(query) Validates a query without executing it. api.query.normalize(query) Returns the canonical normalized query, or throws a typed invalid_input API error. api.query.explain(query) Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run. api.query.filterOptions() Returns available statuses, priorities, contexts, projects, tags, folders, and user properties. api.stats.tasks(query?) Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals. api.system.health() Returns runtime status, API version, capabilities, vault identity, and task count. TaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract. Task Menu UI# Companion plugins can reuse the standard TaskNotes task context menu through api.ui.taskMenu. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals. This surface is only available inside Obsidian. It is not exposed through the HTTP API. Method Description api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? }) Shows the standard TaskNotes task context menu at a mouse event. api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... }) Shows the standard TaskNotes task context menu anchored to an element. api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... }) Adds the standard TaskNotes task context menu items to an existing Obsidian Menu so plugins can extend it. All methods resolve taskPath through the TaskNotes task cache and throw a typed task_not_found error when the path does not point to a cached task. targetDate defaults to today and is used by date-sensitive recurring-task menu items. onUpdate is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. promoteOccurrenceControls moves recurring-instance controls to the top of the menu. Example context menu: nodeEl.addEventListener(\"contextmenu\", async (event) => { event.preventDefault(); await api.ui.taskMenu.show({ taskPath: task.path, event, onUpdate: () => refreshGraph(), }); }); Example composed menu: const menu = new Menu(); await api.ui.taskMenu.populate(menu, { taskPath: task.path, onUpdate: () => refreshGraph(), }); menu.addSeparator(); menu.addItem((item) => item .setTitle(\"Focus in graph\") .setIcon(\"network\") .onClick(() => selectGraphNode(task.path)) ); menu.showAtMouseEvent(event); Pomodoro# Method Description api.pomodoro.status() Returns current Pomodoro state. api.pomodoro.start(options?, context?) Starts a Pomodoro session. api.pomodoro.stop(context?) Stops and resets the active Pomodoro session. api.pomodoro.pause(context?) Pauses the current session. api.pomodoro.resume(context?) Resumes a paused session. api.pomodoro.assignTask(pathOrNull, context?) Assigns or clears the current session task. api.pomodoro.sessions(options?) Returns Pomodoro session history. api.pomodoro.stats(date?) Returns Pomodoro stats for a date or today. Recurring Tasks# Method Description api.recurring.toggleCompleteInstance(path, date?, context?) Toggles completion for a recurring task instance. api.recurring.toggleSkippedInstance(path, date?, context?) Toggles skipped state for a recurring task instance. api.recurring.materializeOccurrence(path, date, context?) Creates or returns an occurrence note for a recurring task date. Natural Language Parser# const parsed = api.nlp.parse(\"Write draft friday 2pm #writing @desk\"); api.parseNaturalLanguage(text) remains as a compatibility alias. Parsing does not create or modify task files. See NLP API for HTTP endpoint details and parser behavior. Settings Snapshot# const settings = api.settings.snapshot(); console.log(settings.defaultTaskStatus); The returned object is a snapshot. Mutating it does not change TaskNotes settings. api.getSettingsSnapshot() remains available as a compatibility alias. Bases# api.bases.updateDefaultFiles() regenerates the configured default TaskNotes .base files from the current TaskNotes settings and returns the created, updated, and skipped file paths. const result = await api.bases.updateDefaultFiles(); console.log(result.updated); Mutation Context# Mutating methods accept an optional context object: { source: \"tasknotes-workflows\", correlationId: \"run-2026-06-01T09-00-00\", reason: \"status chang"},{"route":"/obsidian/mdbase-tasknotes-cli/","title":"mdbase-tasknotes CLI","description":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-c...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/mdbase-tasknotes-cli.md","namespace":"obsidian","relativePath":"mdbase-tasknotes-cli.md","raw":"# mdbase-tasknotes CLI\n\n[mdbase-tasknotes](https://github.com/callumalpass/mdbase-tasknotes) (`mtn`) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses [mdbase](https://mdbase.dev) to read and write task files and [tasknotes-nlp-core](https://github.com/callumalpass/tasknotes-nlp-core) for natural language parsing.\n\n\n## When to use this vs TaskNotes Obsidian CLI\n\nIf you are looking for the built-in `obsidian tasknotes:*` commands exposed by the plugin itself, see [TaskNotes Obsidian CLI](obsidian-cli.md).\n\nTaskNotes ships with [tasknotes-cli](https://github.com/callumalpass/tasknotes-cli) (`tn`), which communicates with the Obsidian plugin over its HTTP API. `mdbase-tasknotes` operates directly on the markdown files instead.\n\n| | `tn` (tasknotes-cli) | `mtn` (mdbase-tasknotes) |\n|---|---|---|\n| **Requires Obsidian** | Yes — plugin must be running with API enabled | No |\n| **Operates on** | HTTP API | Markdown files directly via mdbase |\n| **Use when** | Obsidian is open and you want live sync | Obsidian is closed, on a server, or in scripts |\n| **Time tracking** | Via plugin API | Via frontmatter `timeEntries` |\n| **Task creation** | NLP via API | NLP via bundled `tasknotes-nlp-core` |\n| **Install** | `npm install -g tasknotes-cli` | `npm install -g mdbase-tasknotes` |\n\nUse `mtn` when:\n\n- Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines)\n- You want to manage tasks from the terminal without any background process\n- You're scripting task creation or querying in shell workflows\n- You're on a machine where Obsidian isn't installed\n\nBoth tools read and write the same task files, so they can be used interchangeably on the same vault.\n\n## Install\n\n```\nnpm install -g mdbase-tasknotes\n```\n\n## Setup\n\n### Using an existing TaskNotes vault\n\nIf you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point `mtn` at your vault root:\n\n```bash\nmtn config --set collectionPath=/path/to/your/vault\n```\n\nThe plugin generates `mdbase.yaml` and `_types/task.md` automatically — `mtn` reads these to understand your task schema, including your custom statuses and priorities.\n\n### Creating a standalone collection\n\nTo create a new collection without Obsidian:\n\n```bash\nmtn init ~/tasks\nmtn config --set collectionPath=~/tasks\n```\n\nThis generates `mdbase.yaml`, `_types/task.md`, and a `tasks/` folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent).\n\n## Creating tasks\n\nCreate tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically:\n\n```bash\nmtn create \"Buy groceries tomorrow #shopping @errands\"\nmtn create \"Write quarterly report due friday #work +quarterly-review\"\nmtn create \"Call dentist high priority @phone\"\nmtn create \"Water plants every monday #home\"\n```\n\n### Supported patterns\n\n| Pattern | Example | Extracted as |\n|---|---|---|\n| `#tag` | `#shopping` | Tag |\n| `@context` | `@errands` | Context |\n| `+project` | `+quarterly-review` | Project (stored as wikilink) |\n| Date words | `tomorrow`, `friday`, `next week` | Due date |\n| Priority words | `high priority`, `urgent` | Priority |\n| Recurrence | `every day`, `weekly`, `every monday` | Recurrence rule |\n| Estimate | `~30m`, `~2h` | Time estimate |\n\nThe NLP parser reads your collection's status and priority enum values from `_types/task.md`, so any custom values you define there are automatically recognized.\n\n## Querying tasks\n\n### List tasks\n\n```bash\n# Default: open tasks ordered by due date\nmtn list\n\n# Filter by status, priority, or tag\nmtn list --status in-progress\nmtn list --priority high\nmtn list --tag work\n\n# Show overdue tasks\nmtn list --overdue\n\n# Raw mdbase where expression\nmtn list --where 'due < \"2026-03-01\" && priority == \"urgent\"'\n\n# JSON output for scripting\nmtn list --json\n```\n\n### Show task detail\n\n```bash\nmtn show \"Buy groceries\"\nmtn show tasks/Buy\\ groceries.md\n```\n\nTasks can be referenced by title or file path. Title matching tries exact match first, then substring.\n\n### Search\n\nFull-text search across titles, body content, tags, contexts, and projects:\n\n```bash\nmtn search quarterly\n```\n\n## Updating tasks\n\n### Complete a task\n\n```bash\nmtn complete \"Buy groceries\"\n```\n\nSets status to `done` and records the completion date.\n\n### Update fields\n\n```bash\nmtn update \"Write report\" --status in-progress\nmtn update \"Write report\" --priority urgent --due 2026-03-01\nmtn update \"Write report\" --add-tag important --remove-tag draft\nmtn update \"Write report\" --add-context office\n```\n\n### Archive and delete\n\n```bash\nmtn archive \"Write report\" # Adds \"archive\" tag\nmtn delete \"Old task\" # Checks for backlinks first\nmtn delete \"Old task\" --force # Skip backlink check\n```\n\n## Time tracking\n\nTrack time spent on tasks via the `timeEntries` frontmatter field — the same format TaskNotes uses.\n\n```bash\n# Start a timer\nmtn timer start \"Write report\"\nmtn timer start \"Write report\" -d \"Drafting introduction\"\n\n# Check active timers\nmtn timer status\n\n# Stop the running timer\nmtn timer stop\n\n# View time log\nmtn timer log\nmtn timer log --period today\nmtn timer log --period week\nmtn timer log --from 2026-02-01 --to 2026-02-28\n```\n\n## Projects and statistics\n\n### Projects\n\n```bash\n# List all projects\nmtn projects list\nmtn projects list --stats # With completion percentages\n\n# Show tasks for a project\nmtn projects show quarterly-review\n```\n\n### Statistics\n\n```bash\nmtn stats\n```\n\nShows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked.\n\n## Interactive mode\n\nLaunch a REPL with live NLP preview that updates as you type:\n\n```bash\nmtn interactive\n# or\nmtn i\n```\n\nType a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task.\n\n## Configuration\n\nConfiguration is stored at `~/.config/mdbase-tasknotes/config.json`.\n\n```bash\nmtn config --list # Show all settings\nmtn config --set collectionPath=/path/to/vault # Set collection path\nmtn config --get collectionPath # Get a setting\n```\n\n### Collection path resolution\n\nThe collection path is resolved in order:\n\n1. `--path` / `-p` flag on any command\n2. `MDBASE_TASKNOTES_PATH` environment variable\n3. `collectionPath` in config file\n4. Current working directory\n\n## Command reference\n\n| Command | Alias | Description |\n|---|---|---|\n| `mtn init [path]` | | Initialize a new collection |\n| `mtn create ` | | Create a task from natural language |\n| `mtn list [options]` | `ls` | List tasks with filters |\n| `mtn show ` | | Show full task detail |\n| `mtn complete ` | `done` | Mark task as completed |\n| `mtn update [options]` | | Update task fields |\n| `mtn delete ` | `rm` | Delete a task |\n| `mtn archive ` | | Add archive tag |\n| `mtn search ` | | Full-text search |\n| `mtn timer start ` | | Start time tracking |\n| `mtn timer stop` | | Stop running timer |\n| `mtn timer status` | | Show active timers |\n| `mtn timer log` | | Show time entry log |\n| `mtn projects list` | | List projects |\n| `mtn projects show ` | | Show project tasks |\n| `mtn stats` | | Show task statistics |\n| `mtn interactive` | `i` | Interactive REPL |\n| `mtn config [options]` | | Manage configuration |\n","aliases":["/mdbase-tasknotes-cli/"],"toc":[{"level":2,"id":"when-to-use-this-vs-tasknotes-obsidian-cli","text":"When to use this vs TaskNotes Obsidian CLI"},{"level":2,"id":"install","text":"Install"},{"level":2,"id":"setup","text":"Setup"},{"level":3,"id":"using-an-existing-tasknotes-vault","text":"Using an existing TaskNotes vault"},{"level":3,"id":"creating-a-standalone-collection","text":"Creating a standalone collection"},{"level":2,"id":"creating-tasks","text":"Creating tasks"},{"level":3,"id":"supported-patterns","text":"Supported patterns"},{"level":2,"id":"querying-tasks","text":"Querying tasks"},{"level":3,"id":"list-tasks","text":"List tasks"},{"level":3,"id":"show-task-detail","text":"Show task detail"},{"level":3,"id":"search","text":"Search"},{"level":2,"id":"updating-tasks","text":"Updating tasks"},{"level":3,"id":"complete-a-task","text":"Complete a task"},{"level":3,"id":"update-fields","text":"Update fields"},{"level":3,"id":"archive-and-delete","text":"Archive and delete"},{"level":2,"id":"time-tracking","text":"Time tracking"},{"level":2,"id":"projects-and-statistics","text":"Projects and statistics"},{"level":3,"id":"projects","text":"Projects"},{"level":3,"id":"statistics","text":"Statistics"},{"level":2,"id":"interactive-mode","text":"Interactive mode"},{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"collection-path-resolution","text":"Collection path resolution"},{"level":2,"id":"command-reference","text":"Command reference"}],"html":"

mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-core for natural language parsing.

\n

When to use this vs TaskNotes Obsidian CLI#

\n

If you are looking for the built-in obsidian tasknotes:* commands exposed by the plugin itself, see TaskNotes Obsidian CLI.

\n

TaskNotes ships with tasknotes-cli (tn), which communicates with the Obsidian plugin over its HTTP API. mdbase-tasknotes operates directly on the markdown files instead.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
tn (tasknotes-cli)mtn (mdbase-tasknotes)
Requires ObsidianYes — plugin must be running with API enabledNo
Operates onHTTP APIMarkdown files directly via mdbase
Use whenObsidian is open and you want live syncObsidian is closed, on a server, or in scripts
Time trackingVia plugin APIVia frontmatter timeEntries
Task creationNLP via APINLP via bundled tasknotes-nlp-core
Installnpm install -g tasknotes-clinpm install -g mdbase-tasknotes
\n

Use mtn when:

\n
    \n
  • Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines)
  • \n
  • You want to manage tasks from the terminal without any background process
  • \n
  • You're scripting task creation or querying in shell workflows
  • \n
  • You're on a machine where Obsidian isn't installed
  • \n
\n

Both tools read and write the same task files, so they can be used interchangeably on the same vault.

\n

Install#

\n
npm install -g mdbase-tasknotes\n

Setup#

\n

Using an existing TaskNotes vault#

\n

If you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point mtn at your vault root:

\n
mtn config --set collectionPath=/path/to/your/vault\n

The plugin generates mdbase.yaml and _types/task.md automatically — mtn reads these to understand your task schema, including your custom statuses and priorities.

\n

Creating a standalone collection#

\n

To create a new collection without Obsidian:

\n
mtn init ~/tasks\nmtn config --set collectionPath=~/tasks\n

This generates mdbase.yaml, _types/task.md, and a tasks/ folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent).

\n

Creating tasks#

\n

Create tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically:

\n
mtn create "Buy groceries tomorrow #shopping @errands"\nmtn create "Write quarterly report due friday #work +quarterly-review"\nmtn create "Call dentist high priority @phone"\nmtn create "Water plants every monday #home"\n

Supported patterns#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PatternExampleExtracted as
#tag#shoppingTag
@context@errandsContext
+project+quarterly-reviewProject (stored as wikilink)
Date wordstomorrow, friday, next weekDue date
Priority wordshigh priority, urgentPriority
Recurrenceevery day, weekly, every mondayRecurrence rule
Estimate~30m, ~2hTime estimate
\n

The NLP parser reads your collection's status and priority enum values from _types/task.md, so any custom values you define there are automatically recognized.

\n

Querying tasks#

\n

List tasks#

\n
# Default: open tasks ordered by due date\nmtn list\n\n# Filter by status, priority, or tag\nmtn list --status in-progress\nmtn list --priority high\nmtn list --tag work\n\n# Show overdue tasks\nmtn list --overdue\n\n# Raw mdbase where expression\nmtn list --where 'due < "2026-03-01" && priority == "urgent"'\n\n# JSON output for scripting\nmtn list --json\n

Show task detail#

\n
mtn show "Buy groceries"\nmtn show tasks/Buy\\ groceries.md\n

Tasks can be referenced by title or file path. Title matching tries exact match first, then substring.

\n

Search#

\n

Full-text search across titles, body content, tags, contexts, and projects:

\n
mtn search quarterly\n

Updating tasks#

\n

Complete a task#

\n
mtn complete "Buy groceries"\n

Sets status to done and records the completion date.

\n

Update fields#

\n
mtn update "Write report" --status in-progress\nmtn update "Write report" --priority urgent --due 2026-03-01\nmtn update "Write report" --add-tag important --remove-tag draft\nmtn update "Write report" --add-context office\n

Archive and delete#

\n
mtn archive "Write report"     # Adds "archive" tag\nmtn delete "Old task"           # Checks for backlinks first\nmtn delete "Old task" --force   # Skip backlink check\n

Time tracking#

\n

Track time spent on tasks via the timeEntries frontmatter field — the same format TaskNotes uses.

\n
# Start a timer\nmtn timer start "Write report"\nmtn timer start "Write report" -d "Drafting introduction"\n\n# Check active timers\nmtn timer status\n\n# Stop the running timer\nmtn timer stop\n\n# View time log\nmtn timer log\nmtn timer log --period today\nmtn timer log --period week\nmtn timer log --from 2026-02-01 --to 2026-02-28\n

Projects and statistics#

\n

Projects#

\n
# List all projects\nmtn projects list\nmtn projects list --stats    # With completion percentages\n\n# Show tasks for a project\nmtn projects show quarterly-review\n

Statistics#

\n
mtn stats\n

Shows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked.

\n

Interactive mode#

\n

Launch a REPL with live NLP preview that updates as you type:

\n
mtn interactive\n# or\nmtn i\n

Type a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task.

\n

Configuration#

\n

Configuration is stored at ~/.config/mdbase-tasknotes/config.json.

\n
mtn config --list                              # Show all settings\nmtn config --set collectionPath=/path/to/vault  # Set collection path\nmtn config --get collectionPath                 # Get a setting\n

Collection path resolution#

\n

The collection path is resolved in order:

\n
    \n
  1. --path / -p flag on any command
  2. \n
  3. MDBASE_TASKNOTES_PATH environment variable
  4. \n
  5. collectionPath in config file
  6. \n
  7. Current working directory
  8. \n
\n

Command reference#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandAliasDescription
mtn init [path]Initialize a new collection
mtn create <text...>Create a task from natural language
mtn list [options]lsList tasks with filters
mtn show <task>Show full task detail
mtn complete <task>doneMark task as completed
mtn update <task> [options]Update task fields
mtn delete <task>rmDelete a task
mtn archive <task>Add archive tag
mtn search <query>Full-text search
mtn timer start <task>Start time tracking
mtn timer stopStop running timer
mtn timer statusShow active timers
mtn timer logShow time entry log
mtn projects listList projects
mtn projects show <name>Show project tasks
mtn statsShow task statistics
mtn interactiveiInteractive REPL
mtn config [options]Manage configuration
\n","text":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-core for natural language parsing. When to use this vs TaskNotes Obsidian CLI# If you are looking for the built-in obsidian tasknotes:* commands exposed by the plugin itself, see TaskNotes Obsidian CLI. TaskNotes ships with tasknotes-cli (tn), which communicates with the Obsidian plugin over its HTTP API. mdbase-tasknotes operates directly on the markdown files instead. tn (tasknotes-cli) mtn (mdbase-tasknotes) Requires Obsidian Yes — plugin must be running with API enabled No Operates on HTTP API Markdown files directly via mdbase Use when Obsidian is open and you want live sync Obsidian is closed, on a server, or in scripts Time tracking Via plugin API Via frontmatter timeEntries Task creation NLP via API NLP via bundled tasknotes-nlp-core Install npm install -g tasknotes-cli npm install -g mdbase-tasknotes Use mtn when: Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines) You want to manage tasks from the terminal without any background process You're scripting task creation or querying in shell workflows You're on a machine where Obsidian isn't installed Both tools read and write the same task files, so they can be used interchangeably on the same vault. Install# npm install -g mdbase-tasknotes Setup# Using an existing TaskNotes vault# If you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point mtn at your vault root: mtn config --set collectionPath=/path/to/your/vault The plugin generates mdbase.yaml and _types/task.md automatically — mtn reads these to understand your task schema, including your custom statuses and priorities. Creating a standalone collection# To create a new collection without Obsidian: mtn init ~/tasks mtn config --set collectionPath=~/tasks This generates mdbase.yaml, _types/task.md, and a tasks/ folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent). Creating tasks# Create tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically: mtn create \"Buy groceries tomorrow #shopping @errands\" mtn create \"Write quarterly report due friday #work +quarterly-review\" mtn create \"Call dentist high priority @phone\" mtn create \"Water plants every monday #home\" Supported patterns# Pattern Example Extracted as #tag #shopping Tag @context @errands Context +project +quarterly-review Project (stored as wikilink) Date words tomorrow, friday, next week Due date Priority words high priority, urgent Priority Recurrence every day, weekly, every monday Recurrence rule Estimate ~30m, ~2h Time estimate The NLP parser reads your collection's status and priority enum values from _types/task.md, so any custom values you define there are automatically recognized. Querying tasks# List tasks# # Default: open tasks ordered by due date mtn list # Filter by status, priority, or tag mtn list --status in-progress mtn list --priority high mtn list --tag work # Show overdue tasks mtn list --overdue # Raw mdbase where expression mtn list --where 'due < \"2026-03-01\" && priority == \"urgent\"' # JSON output for scripting mtn list --json Show task detail# mtn show \"Buy groceries\" mtn show tasks/Buy\\ groceries.md Tasks can be referenced by title or file path. Title matching tries exact match first, then substring. Search# Full-text search across titles, body content, tags, contexts, and projects: mtn search quarterly Updating tasks# Complete a task# mtn complete \"Buy groceries\" Sets status to done and records the completion date. Update fields# mtn update \"Write report\" --status in-progress mtn update \"Write report\" --priority urgent --due 2026-03-01 mtn update \"Write report\" --add-tag important --remove-tag draft mtn update \"Write report\" --add-context office Archive and delete# mtn archive \"Write report\" # Adds \"archive\" tag mtn delete \"Old task\" # Checks for backlinks first mtn delete \"Old task\" --force # Skip backlink check Time tracking# Track time spent on tasks via the timeEntries frontmatter field — the same format TaskNotes uses. # Start a timer mtn timer start \"Write report\" mtn timer start \"Write report\" -d \"Drafting introduction\" # Check active timers mtn timer status # Stop the running timer mtn timer stop # View time log mtn timer log mtn timer log --period today mtn timer log --period week mtn timer log --from 2026-02-01 --to 2026-02-28 Projects and statistics# Projects# # List all projects mtn projects list mtn projects list --stats # With completion percentages # Show tasks for a project mtn projects show quarterly-review Statistics# mtn stats Shows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked. Interactive mode# Launch a REPL with live NLP preview that updates as you type: mtn interactive # or mtn i Type a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task. Configuration# Configuration is stored at ~/.config/mdbase-tasknotes/config.json. mtn config --list # Show all settings mtn config --set collectionPath=/path/to/vault # Set collection path mtn config --get collectionPath # Get a setting Collection path resolution# The collection path is resolved in order: --path / -p flag on any command MDBASE_TASKNOTES_PATH environment variable collectionPath in config file Current working directory Command reference# Command Alias Description mtn init [path] Initialize a new collection mtn create Create a task from natural language mtn list [options] ls List tasks with filters mtn show Show full task detail mtn complete done Mark task as completed mtn update [options] Update task fields mtn delete rm Delete a task mtn archive Add archive tag mtn search Full-text search mtn timer start Start time tracking mtn timer stop Stop running timer mtn timer status Show active timers mtn timer log Show time entry log mtn projects list List projects mtn projects show Show project tasks mtn stats Show task statistics mtn interactive i Interactive REPL mtn config [options] Manage configuration"},{"route":"/obsidian/migration-v3-to-v4/","title":"Migrating from v3 to v4","description":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/migration-v3-to-v4.md","namespace":"obsidian","relativePath":"migration-v3-to-v4.md","raw":"# Migrating from v3 to v4\n\nTaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.\n\n!!! warning \"Back up before migrating\"\n Back up the complete vault, including the hidden `.obsidian` directory, before changing views or plugin data.\n\n## Requirements\n\n- **Obsidian 1.10.1 or later** for early TaskNotes v4 releases\n- **Obsidian 1.12.2 or later** for the current TaskNotes 4.11.1 release\n- **Bases core plugin enabled** (Settings → Core Plugins → Bases)\n\n## What Changed\n\n### Views are Now Bases Files\n\nAll task views (Task List, Kanban, Calendar, Agenda) are now `.base` files stored in `TaskNotes/Views/`. This replaces the custom view system in v3.\n\n| v3 | v4 |\n|----|-----|\n| Views stored in plugin settings | Views stored as `.base` files |\n| Custom filter UI | Bases filter syntax |\n| Saved views in settings | Default views are separate files; exported v3 saved views share one multi-view file |\n\n### Automatic Migration on First Launch\n\nWhen you first open TaskNotes v4:\n\n1. Default `.base` files are created in `TaskNotes/Views/`\n2. Ribbon icons and commands now open these `.base` files\n3. Your existing task files are unchanged\n\n### Converting Saved Filter Views\n\nIf you had saved filter views in v3, you can export them to one `.base` file:\n\n1. Go to **Settings → TaskNotes → General → Views & base files**.\n2. Find **Export v3 saved views to Bases**.\n3. Run the export.\n4. TaskNotes creates `TaskNotes/Views/all-saved-views.base` with one Base view for each saved v3 view.\n\nThis is a one-way conversion. The original saved views remain in settings until you delete them.\n\n## Breaking Changes\n\n### View Configuration\n\nv3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment.\n\n**v3 Filter Example:**\n```\nstatus: in-progress\npriority: high\n```\n\n**v4 Bases Syntax:**\n```yaml\nfilters:\n and:\n - status == \"in-progress\"\n - priority == \"high\"\n```\n\nSee the [Obsidian Bases documentation](https://help.obsidian.md/Bases/Introduction+to+Bases) for filter syntax details.\n\n### Minimum Obsidian Version\n\nEarly v4 releases required Obsidian 1.10.1. The current release requirement is generated on the [version compatibility](reference/compatibility.md) page. Use the manifest requirement for the exact TaskNotes version you install.\n\n## New Features in v4\n\n### OAuth Calendar Integration\n\nv4 adds Google Calendar and Microsoft Outlook integration:\n\n- View external calendar events alongside tasks\n- Drag events to reschedule (syncs back to calendar provider)\n- Events sync every 15 minutes\n\nSee [Calendar Setup](calendar-setup.md) for configuration.\n\n### Kanban Swimlanes\n\nThe Kanban view now supports horizontal swimlane grouping:\n\n```yaml\nviews:\n - type: tasknotesKanban\n groupBy:\n property: status\n config:\n swimLane: priority\n```\n\n### Time Entry Editor\n\nA dedicated modal for managing time entries:\n\n- Alt-drag on calendar to create time entries\n- View total tracked time per task\n- Edit and delete time entries\n\n## Troubleshooting\n\n### Views Not Loading\n\n1. Verify Bases core plugin is enabled (Settings → Core Plugins)\n2. Check that `.base` files exist in `TaskNotes/Views/`\n3. Restart Obsidian\n\n### Missing Saved Views After Upgrade\n\nSaved views from v3 are preserved in settings. Use **Export v3 saved views to Bases** in **Settings → TaskNotes → General → Views & base files** to create the multi-view `.base` file.\n\n### Filter Syntax Errors\n\nBases uses different filter syntax than v3. Common issues:\n\n| Problem | Solution |\n|---------|----------|\n| `status: done` | Use `status == \"done\"` |\n| Multiple conditions | Wrap in `and:` or `or:` block |\n| Date comparisons | Use `date(due) < today()` |\n\n### Downgrading to v3\n\nMigration is one-way. If you need to downgrade:\n\n1. Uninstall TaskNotes v4\n2. Install TaskNotes v3 from releases\n3. Reconfigure your saved views manually\n\nYour task files are unaffected—only view configurations change.\n\n## View Templates\n\nFor complete `.base` file examples, see [Default Base Templates](views/default-base-templates.md).\n","aliases":["/migration-v3-to-v4/"],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"what-changed","text":"What Changed"},{"level":3,"id":"views-are-now-bases-files","text":"Views are Now Bases Files"},{"level":3,"id":"automatic-migration-on-first-launch","text":"Automatic Migration on First Launch"},{"level":3,"id":"converting-saved-filter-views","text":"Converting Saved Filter Views"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"},{"level":3,"id":"view-configuration","text":"View Configuration"},{"level":3,"id":"minimum-obsidian-version","text":"Minimum Obsidian Version"},{"level":2,"id":"new-features-in-v4","text":"New Features in v4"},{"level":3,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"kanban-swimlanes","text":"Kanban Swimlanes"},{"level":3,"id":"time-entry-editor","text":"Time Entry Editor"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"views-not-loading","text":"Views Not Loading"},{"level":3,"id":"missing-saved-views-after-upgrade","text":"Missing Saved Views After Upgrade"},{"level":3,"id":"filter-syntax-errors","text":"Filter Syntax Errors"},{"level":3,"id":"downgrading-to-v3","text":"Downgrading to v3"},{"level":2,"id":"view-templates","text":"View Templates"}],"html":"

TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.

\n\n

Requirements#

\n
    \n
  • Obsidian 1.10.1 or later for early TaskNotes v4 releases
  • \n
  • Obsidian 1.12.2 or later for the current TaskNotes 4.11.1 release
  • \n
  • Bases core plugin enabled (Settings → Core Plugins → Bases)
  • \n
\n

What Changed#

\n

Views are Now Bases Files#

\n

All task views (Task List, Kanban, Calendar, Agenda) are now .base files stored in TaskNotes/Views/. This replaces the custom view system in v3.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
v3v4
Views stored in plugin settingsViews stored as .base files
Custom filter UIBases filter syntax
Saved views in settingsDefault views are separate files; exported v3 saved views share one multi-view file
\n

Automatic Migration on First Launch#

\n

When you first open TaskNotes v4:

\n
    \n
  1. Default .base files are created in TaskNotes/Views/
  2. \n
  3. Ribbon icons and commands now open these .base files
  4. \n
  5. Your existing task files are unchanged
  6. \n
\n

Converting Saved Filter Views#

\n

If you had saved filter views in v3, you can export them to one .base file:

\n
    \n
  1. Go to Settings → TaskNotes → General → Views & base files.
  2. \n
  3. Find Export v3 saved views to Bases.
  4. \n
  5. Run the export.
  6. \n
  7. TaskNotes creates TaskNotes/Views/all-saved-views.base with one Base view for each saved v3 view.
  8. \n
\n

This is a one-way conversion. The original saved views remain in settings until you delete them.

\n

Breaking Changes#

\n

View Configuration#

\n

v3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment.

\n

v3 Filter Example:

\n
status: in-progress\npriority: high\n

v4 Bases Syntax:

\n
filters:\n  and:\n    - status == "in-progress"\n    - priority == "high"\n

See the Obsidian Bases documentation for filter syntax details.

\n

Minimum Obsidian Version#

\n

Early v4 releases required Obsidian 1.10.1. The current release requirement is generated on the version compatibility page. Use the manifest requirement for the exact TaskNotes version you install.

\n

New Features in v4#

\n

OAuth Calendar Integration#

\n

v4 adds Google Calendar and Microsoft Outlook integration:

\n
    \n
  • View external calendar events alongside tasks
  • \n
  • Drag events to reschedule (syncs back to calendar provider)
  • \n
  • Events sync every 15 minutes
  • \n
\n

See Calendar Setup for configuration.

\n

Kanban Swimlanes#

\n

The Kanban view now supports horizontal swimlane grouping:

\n
views:\n  - type: tasknotesKanban\n    groupBy:\n      property: status\n    config:\n      swimLane: priority\n

Time Entry Editor#

\n

A dedicated modal for managing time entries:

\n
    \n
  • Alt-drag on calendar to create time entries
  • \n
  • View total tracked time per task
  • \n
  • Edit and delete time entries
  • \n
\n

Troubleshooting#

\n

Views Not Loading#

\n
    \n
  1. Verify Bases core plugin is enabled (Settings → Core Plugins)
  2. \n
  3. Check that .base files exist in TaskNotes/Views/
  4. \n
  5. Restart Obsidian
  6. \n
\n

Missing Saved Views After Upgrade#

\n

Saved views from v3 are preserved in settings. Use Export v3 saved views to Bases in Settings → TaskNotes → General → Views & base files to create the multi-view .base file.

\n

Filter Syntax Errors#

\n

Bases uses different filter syntax than v3. Common issues:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ProblemSolution
status: doneUse status == "done"
Multiple conditionsWrap in and: or or: block
Date comparisonsUse date(due) < today()
\n

Downgrading to v3#

\n

Migration is one-way. If you need to downgrade:

\n
    \n
  1. Uninstall TaskNotes v4
  2. \n
  3. Install TaskNotes v3 from releases
  4. \n
  5. Reconfigure your saved views manually
  6. \n
\n

Your task files are unaffected—only view configurations change.

\n

View Templates#

\n

For complete .base file examples, see Default Base Templates.

\n","text":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup. Back up before migratingBack up the complete vault, including the hidden .obsidian directory, before changing views or plugin data. Requirements# Obsidian 1.10.1 or later for early TaskNotes v4 releases Obsidian 1.12.2 or later for the current TaskNotes 4.11.1 release Bases core plugin enabled (Settings → Core Plugins → Bases) What Changed# Views are Now Bases Files# All task views (Task List, Kanban, Calendar, Agenda) are now .base files stored in TaskNotes/Views/. This replaces the custom view system in v3. v3 v4 Views stored in plugin settings Views stored as .base files Custom filter UI Bases filter syntax Saved views in settings Default views are separate files; exported v3 saved views share one multi-view file Automatic Migration on First Launch# When you first open TaskNotes v4: Default .base files are created in TaskNotes/Views/ Ribbon icons and commands now open these .base files Your existing task files are unchanged Converting Saved Filter Views# If you had saved filter views in v3, you can export them to one .base file: Go to Settings → TaskNotes → General → Views & base files. Find Export v3 saved views to Bases. Run the export. TaskNotes creates TaskNotes/Views/all-saved-views.base with one Base view for each saved v3 view. This is a one-way conversion. The original saved views remain in settings until you delete them. Breaking Changes# View Configuration# v3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment. v3 Filter Example: status: in-progress priority: high v4 Bases Syntax: filters: and: - status == \"in-progress\" - priority == \"high\" See the Obsidian Bases documentation for filter syntax details. Minimum Obsidian Version# Early v4 releases required Obsidian 1.10.1. The current release requirement is generated on the version compatibility page. Use the manifest requirement for the exact TaskNotes version you install. New Features in v4# OAuth Calendar Integration# v4 adds Google Calendar and Microsoft Outlook integration: View external calendar events alongside tasks Drag events to reschedule (syncs back to calendar provider) Events sync every 15 minutes See Calendar Setup for configuration. Kanban Swimlanes# The Kanban view now supports horizontal swimlane grouping: views: - type: tasknotesKanban groupBy: property: status config: swimLane: priority Time Entry Editor# A dedicated modal for managing time entries: Alt-drag on calendar to create time entries View total tracked time per task Edit and delete time entries Troubleshooting# Views Not Loading# Verify Bases core plugin is enabled (Settings → Core Plugins) Check that .base files exist in TaskNotes/Views/ Restart Obsidian Missing Saved Views After Upgrade# Saved views from v3 are preserved in settings. Use Export v3 saved views to Bases in Settings → TaskNotes → General → Views & base files to create the multi-view .base file. Filter Syntax Errors# Bases uses different filter syntax than v3. Common issues: Problem Solution status: done Use status == \"done\" Multiple conditions Wrap in and: or or: block Date comparisons Use date(due) < today() Downgrading to v3# Migration is one-way. If you need to downgrade: Uninstall TaskNotes v4 Install TaskNotes v3 from releases Reconfigure your saved views manually Your task files are unaffected—only view configurations change. View Templates# For complete .base file examples, see Default Base Templates."},{"route":"/obsidian/nlp-api/","title":"TaskNotes NLP API","description":"The NLP API parses natural-language task text and optionally creates a task.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/nlp-api.md","namespace":"obsidian","relativePath":"nlp-api.md","raw":"# TaskNotes NLP API\n\nThe NLP API parses natural-language task text and optionally creates a task.\n\nIn-vault scripts can also call the parser directly from the loaded plugin:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage(\"Review PR tomorrow #code @work\");\n```\n\nFor the full in-process API exposed at `tasknotes.api`, including task updates, time tracking, settings snapshots, and events, see [TaskNotes JavaScript API](javascript-api.md).\n\n## Endpoints\n\n- `POST /api/nlp/parse`\n- `POST /api/nlp/create`\n\nBoth endpoints require a JSON body with `text`.\n\n## Request Format\n\n```json\n{\n \"text\": \"Review PR #123 tomorrow high priority @work\"\n}\n```\n\nNotes:\n\n- `text` is required and must be a string.\n- Per-request `locale` is not currently supported.\n- Parser language comes from TaskNotes settings (`nlpLanguage`).\n\n## `POST /api/nlp/parse`\n\nParses text and returns two objects:\n\n- `parsed`: direct parser output\n- `taskData`: normalized task payload that would be used for creation\n\nExample response (shape):\n\n```json\n{\n \"success\": true,\n \"data\": {\n \"parsed\": {\n \"title\": \"Review PR\",\n \"tags\": [\"123\"],\n \"contexts\": [\"work\"],\n \"projects\": [],\n \"priority\": \"high\",\n \"status\": null,\n \"dueDate\": \"2026-02-22\",\n \"scheduledDate\": null,\n \"dueTime\": null,\n \"scheduledTime\": null,\n \"recurrence\": null,\n \"estimate\": null,\n \"isCompleted\": false\n },\n \"taskData\": {\n \"title\": \"Review PR\",\n \"priority\": \"high\",\n \"status\": \"open\",\n \"tags\": [\"123\"],\n \"contexts\": [\"work\"],\n \"due\": \"2026-02-22\",\n \"dateCreated\": \"2026-02-22T09:00:00.000Z\",\n \"dateModified\": \"2026-02-22T09:00:00.000Z\"\n }\n }\n}\n```\n\nIf parser does not detect status, `taskData.status` falls back to your configured default task status. Parsed due and scheduled date-times in `taskData` use the same `YYYY-MM-DDTHH:mm` format as created tasks, and NLP trigger values for user-defined fields are returned under `customFrontmatter`.\n\n## `POST /api/nlp/create`\n\nParses text and creates a task in one call.\n\nReturns HTTP `201` on success.\n\nExample:\n\n```bash\ncurl -X POST http://localhost:8080/api/nlp/create \\\n -H \"Content-Type: application/json\" \\\n -d '{\"text\":\"Call mom due friday 2pm #personal\"}'\n```\n\nResponse fields:\n\n- `data.task` (created task)\n- `data.parsed` (parser output)\n\n## What the Parser Extracts\n\nThe parser can extract:\n\n- Dates and times (`tomorrow`, `friday 2pm`, ISO dates)\n- Priority terms (`high priority`, `urgent`, symbol patterns)\n- Status terms (mapped to your configured statuses)\n- Tags (`#tag`)\n- Contexts (`@context`)\n- Projects (`+project`)\n- Time estimates (`2h`, `30min`, `estimate 45m`)\n- Recurrence (`daily`, `weekly`, `every monday`)\n\nExact parsing behavior depends on your TaskNotes NLP settings and trigger configuration.\n\n## In-Vault Parser Method\n\nTemplater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage(\"Write draft friday 2pm #writing @desk\");\n```\n\n`parseNaturalLanguage(text)` returns the same parser output shape as `data.parsed` from `POST /api/nlp/parse`. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale.\n\nThis method only parses text. It does not create or modify task files.\n\nFor task creation and updates from in-vault scripts or companion plugins, use the broader [TaskNotes JavaScript API](javascript-api.md).\n\nExample Templater use:\n\n```javascript\n<%*\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst text = await tp.system.prompt(\"Task\");\nconst parsed = tasknotes.api.parseNaturalLanguage(text);\ntR += `title: ${parsed.title}`;\n%>\n```\n\n## Error Responses\n\nCommon errors:\n\n- `400`: missing/invalid `text`\n- `401`: auth required (if API token is enabled)\n- `500`: parse/processing error\n\nError shape:\n\n```json\n{\n \"success\": false,\n \"error\": \"Text field is required and must be a string\"\n}\n```\n\n## Client Examples\n\n### JavaScript\n\n```javascript\nasync function parseTask(text) {\n const response = await fetch(\"http://localhost:8080/api/nlp/parse\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ text })\n });\n return response.json();\n}\n\nasync function createTaskFromText(text) {\n const response = await fetch(\"http://localhost:8080/api/nlp/create\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ text })\n });\n return response.json();\n}\n```\n\n### Python\n\n```python\nimport requests\n\n\ndef parse_task(text):\n response = requests.post(\n \"http://localhost:8080/api/nlp/parse\",\n json={\"text\": text},\n )\n return response.json()\n\n\ndef create_task_from_text(text):\n response = requests.post(\n \"http://localhost:8080/api/nlp/create\",\n json={\"text\": text},\n )\n return response.json()\n```\n\n## Authentication\n\nIf API auth token is enabled, include bearer token:\n\n```http\nAuthorization: Bearer YOUR_TOKEN\n```\n","aliases":["/nlp-api/"],"toc":[{"level":2,"id":"endpoints","text":"Endpoints"},{"level":2,"id":"request-format","text":"Request Format"},{"level":2,"id":"post-apinlpparse","text":"POST /api/nlp/parse"},{"level":2,"id":"post-apinlpcreate","text":"POST /api/nlp/create"},{"level":2,"id":"what-the-parser-extracts","text":"What the Parser Extracts"},{"level":2,"id":"in-vault-parser-method","text":"In-Vault Parser Method"},{"level":2,"id":"error-responses","text":"Error Responses"},{"level":2,"id":"client-examples","text":"Client Examples"},{"level":3,"id":"javascript","text":"JavaScript"},{"level":3,"id":"python","text":"Python"},{"level":2,"id":"authentication","text":"Authentication"}],"html":"

The NLP API parses natural-language task text and optionally creates a task.

\n

In-vault scripts can also call the parser directly from the loaded plugin:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage("Review PR tomorrow #code @work");\n

For the full in-process API exposed at tasknotes.api, including task updates, time tracking, settings snapshots, and events, see TaskNotes JavaScript API.

\n

Endpoints#

\n
    \n
  • POST /api/nlp/parse
  • \n
  • POST /api/nlp/create
  • \n
\n

Both endpoints require a JSON body with text.

\n

Request Format#

\n
{\n  "text": "Review PR #123 tomorrow high priority @work"\n}\n

Notes:

\n
    \n
  • text is required and must be a string.
  • \n
  • Per-request locale is not currently supported.
  • \n
  • Parser language comes from TaskNotes settings (nlpLanguage).
  • \n
\n

POST /api/nlp/parse#

\n

Parses text and returns two objects:

\n
    \n
  • parsed: direct parser output
  • \n
  • taskData: normalized task payload that would be used for creation
  • \n
\n

Example response (shape):

\n
{\n  "success": true,\n  "data": {\n    "parsed": {\n      "title": "Review PR",\n      "tags": ["123"],\n      "contexts": ["work"],\n      "projects": [],\n      "priority": "high",\n      "status": null,\n      "dueDate": "2026-02-22",\n      "scheduledDate": null,\n      "dueTime": null,\n      "scheduledTime": null,\n      "recurrence": null,\n      "estimate": null,\n      "isCompleted": false\n    },\n    "taskData": {\n      "title": "Review PR",\n      "priority": "high",\n      "status": "open",\n      "tags": ["123"],\n      "contexts": ["work"],\n      "due": "2026-02-22",\n      "dateCreated": "2026-02-22T09:00:00.000Z",\n      "dateModified": "2026-02-22T09:00:00.000Z"\n    }\n  }\n}\n

If parser does not detect status, taskData.status falls back to your configured default task status. Parsed due and scheduled date-times in taskData use the same YYYY-MM-DDTHH:mm format as created tasks, and NLP trigger values for user-defined fields are returned under customFrontmatter.

\n

POST /api/nlp/create#

\n

Parses text and creates a task in one call.

\n

Returns HTTP 201 on success.

\n

Example:

\n
curl -X POST http://localhost:8080/api/nlp/create \\\n  -H "Content-Type: application/json" \\\n  -d '{"text":"Call mom due friday 2pm #personal"}'\n

Response fields:

\n
    \n
  • data.task (created task)
  • \n
  • data.parsed (parser output)
  • \n
\n

What the Parser Extracts#

\n

The parser can extract:

\n
    \n
  • Dates and times (tomorrow, friday 2pm, ISO dates)
  • \n
  • Priority terms (high priority, urgent, symbol patterns)
  • \n
  • Status terms (mapped to your configured statuses)
  • \n
  • Tags (#tag)
  • \n
  • Contexts (@context)
  • \n
  • Projects (+project)
  • \n
  • Time estimates (2h, 30min, estimate 45m)
  • \n
  • Recurrence (daily, weekly, every monday)
  • \n
\n

Exact parsing behavior depends on your TaskNotes NLP settings and trigger configuration.

\n

In-Vault Parser Method#

\n

Templater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage("Write draft friday 2pm #writing @desk");\n

parseNaturalLanguage(text) returns the same parser output shape as data.parsed from POST /api/nlp/parse. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale.

\n

This method only parses text. It does not create or modify task files.

\n

For task creation and updates from in-vault scripts or companion plugins, use the broader TaskNotes JavaScript API.

\n

Example Templater use:

\n
<%*\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst text = await tp.system.prompt("Task");\nconst parsed = tasknotes.api.parseNaturalLanguage(text);\ntR += `title: ${parsed.title}`;\n%>\n

Error Responses#

\n

Common errors:

\n
    \n
  • 400: missing/invalid text
  • \n
  • 401: auth required (if API token is enabled)
  • \n
  • 500: parse/processing error
  • \n
\n

Error shape:

\n
{\n  "success": false,\n  "error": "Text field is required and must be a string"\n}\n

Client Examples#

\n

JavaScript#

\n
async function parseTask(text) {\n  const response = await fetch("http://localhost:8080/api/nlp/parse", {\n    method: "POST",\n    headers: { "Content-Type": "application/json" },\n    body: JSON.stringify({ text })\n  });\n  return response.json();\n}\n\nasync function createTaskFromText(text) {\n  const response = await fetch("http://localhost:8080/api/nlp/create", {\n    method: "POST",\n    headers: { "Content-Type": "application/json" },\n    body: JSON.stringify({ text })\n  });\n  return response.json();\n}\n

Python#

\n
import requests\n\n\ndef parse_task(text):\n    response = requests.post(\n        "http://localhost:8080/api/nlp/parse",\n        json={"text": text},\n    )\n    return response.json()\n\n\ndef create_task_from_text(text):\n    response = requests.post(\n        "http://localhost:8080/api/nlp/create",\n        json={"text": text},\n    )\n    return response.json()\n

Authentication#

\n

If API auth token is enabled, include bearer token:

\n
Authorization: Bearer YOUR_TOKEN\n
","text":"The NLP API parses natural-language task text and optionally creates a task. In-vault scripts can also call the parser directly from the loaded plugin: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Review PR tomorrow #code @work\"); For the full in-process API exposed at tasknotes.api, including task updates, time tracking, settings snapshots, and events, see TaskNotes JavaScript API. Endpoints# POST /api/nlp/parse POST /api/nlp/create Both endpoints require a JSON body with text. Request Format# { \"text\": \"Review PR #123 tomorrow high priority @work\" } Notes: text is required and must be a string. Per-request locale is not currently supported. Parser language comes from TaskNotes settings (nlpLanguage). POST /api/nlp/parse# Parses text and returns two objects: parsed: direct parser output taskData: normalized task payload that would be used for creation Example response (shape): { \"success\": true, \"data\": { \"parsed\": { \"title\": \"Review PR\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"projects\": [], \"priority\": \"high\", \"status\": null, \"dueDate\": \"2026-02-22\", \"scheduledDate\": null, \"dueTime\": null, \"scheduledTime\": null, \"recurrence\": null, \"estimate\": null, \"isCompleted\": false }, \"taskData\": { \"title\": \"Review PR\", \"priority\": \"high\", \"status\": \"open\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"due\": \"2026-02-22\", \"dateCreated\": \"2026-02-22T09:00:00.000Z\", \"dateModified\": \"2026-02-22T09:00:00.000Z\" } } } If parser does not detect status, taskData.status falls back to your configured default task status. Parsed due and scheduled date-times in taskData use the same YYYY-MM-DDTHH:mm format as created tasks, and NLP trigger values for user-defined fields are returned under customFrontmatter. POST /api/nlp/create# Parses text and creates a task in one call. Returns HTTP 201 on success. Example: curl -X POST http://localhost:8080/api/nlp/create \\ -H \"Content-Type: application/json\" \\ -d '{\"text\":\"Call mom due friday 2pm #personal\"}' Response fields: data.task (created task) data.parsed (parser output) What the Parser Extracts# The parser can extract: Dates and times (tomorrow, friday 2pm, ISO dates) Priority terms (high priority, urgent, symbol patterns) Status terms (mapped to your configured statuses) Tags (#tag) Contexts (@context) Projects (+project) Time estimates (2h, 30min, estimate 45m) Recurrence (daily, weekly, every monday) Exact parsing behavior depends on your TaskNotes NLP settings and trigger configuration. In-Vault Parser Method# Templater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Write draft friday 2pm #writing @desk\"); parseNaturalLanguage(text) returns the same parser output shape as data.parsed from POST /api/nlp/parse. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale. This method only parses text. It does not create or modify task files. For task creation and updates from in-vault scripts or companion plugins, use the broader TaskNotes JavaScript API. Example Templater use: <%* const tasknotes = app.plugins.plugins.tasknotes; const text = await tp.system.prompt(\"Task\"); const parsed = tasknotes.api.parseNaturalLanguage(text); tR += `title: ${parsed.title}`; %> Error Responses# Common errors: 400: missing/invalid text 401: auth required (if API token is enabled) 500: parse/processing error Error shape: { \"success\": false, \"error\": \"Text field is required and must be a string\" } Client Examples# JavaScript# async function parseTask(text) { const response = await fetch(\"http://localhost:8080/api/nlp/parse\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } async function createTaskFromText(text) { const response = await fetch(\"http://localhost:8080/api/nlp/create\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } Python# import requests def parse_task(text): response = requests.post( \"http://localhost:8080/api/nlp/parse\", json={\"text\": text}, ) return response.json() def create_task_from_text(text): response = requests.post( \"http://localhost:8080/api/nlp/create\", json={\"text\": text}, ) return response.json() Authentication# If API auth token is enabled, include bearer token: Authorization: Bearer YOUR_TOKEN"},{"route":"/obsidian/obsidian-cli/","title":"TaskNotes Obsidian CLI","description":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/obsidian-cli.md","namespace":"obsidian","relativePath":"obsidian-cli.md","raw":"# TaskNotes Obsidian CLI\n\nTaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API.\n\nUse this page for the built-in `obsidian ...` commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see [mdbase-tasknotes CLI](mdbase-tasknotes-cli.md).\n\n## Requirements\n\n- Obsidian desktop `1.12.2` or newer\n- TaskNotes installed and enabled in the target vault\n- Obsidian running when you invoke the CLI\n\nThe Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass `vault=` explicitly instead of relying on the default vault.\n\n## Discovering commands\n\nList available TaskNotes commands:\n\n```bash\nobsidian help | rg 'tasknotes:'\n```\n\nYou should see:\n\n- `tasknotes:capture`\n- `tasknotes:start-time`\n- `tasknotes:stop-time`\n- `tasknotes:time-status`\n- `tasknotes:pomodoro`\n\n## `tasknotes:capture`\n\nCreate a task from free text, explicit flags, or both.\n\n```bash\nobsidian tasknotes:capture vault=test text=\"Review PR tomorrow #work @desk\"\n```\n\nBy default, `text=` is parsed with TaskNotes NLP. Explicit flags override parsed values.\n\n### Literal title mode\n\nUse `literal` when you want the text treated as an exact title instead of being parsed.\n\n```bash\nobsidian tasknotes:capture vault=test text=\"Fix parser edge case\" literal\n```\n\n### Explicit fields\n\nSupported override flags:\n\n- `title`\n- `details`\n- `status`\n- `priority`\n- `due`\n- `scheduled`\n- `tags`\n- `contexts`\n- `projects`\n- `recurrence`\n- `recurrence-anchor`\n- `reminders`\n- `estimate`\n\nExample:\n\n```bash\nobsidian tasknotes:capture vault=test \\\n text=\"Write release notes tomorrow #docs\" \\\n priority=high \\\n status=in-progress \\\n reminders='due:-PT1H'\n```\n\n### Reminder format\n\n`reminders=` accepts either:\n\n- a semicolon-separated shorthand such as `due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00`\n- a JSON array in the same shape TaskNotes stores internally\n\n### Recurrence anchor\n\nUse `recurrence-anchor=scheduled` or `recurrence-anchor=completion` to control how recurring tasks advance.\n\n## `tasknotes:start-time`\n\nStart time tracking for a task.\n\nYou can target a task by:\n\n- `path`\n- exact `title`\n- fuzzy `query`\n\nExamples:\n\n```bash\nobsidian tasknotes:start-time vault=test title=\"Write release notes\"\nobsidian tasknotes:start-time vault=test query=\"release notes\" description=\"Drafting first pass\"\nobsidian tasknotes:start-time vault=test path=\"TaskNotes/Write release notes.md\"\n```\n\n## `tasknotes:stop-time`\n\nStop time tracking for a task.\n\nExamples:\n\n```bash\nobsidian tasknotes:stop-time vault=test title=\"Write release notes\"\nobsidian tasknotes:stop-time vault=test path=\"TaskNotes/Write release notes.md\"\n```\n\nIf you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous.\n\n## `tasknotes:time-status`\n\nShow time-tracking status for either:\n\n- all active sessions\n- one resolved task\n\nExamples:\n\n```bash\nobsidian tasknotes:time-status vault=test\nobsidian tasknotes:time-status vault=test title=\"Write release notes\"\nobsidian tasknotes:time-status vault=test path=\"TaskNotes/Write release notes.md\"\n```\n\nWhen a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault.\n\n## `tasknotes:pomodoro`\n\nControl Pomodoro state from the CLI.\n\nSupported actions:\n\n- `status`\n- `start`\n- `pause`\n- `resume`\n- `stop`\n- `short-break`\n- `long-break`\n\n### Inspect state\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=status\n```\n\n### Start a work session\n\nYou can start a Pomodoro with or without a linked task.\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=start duration=25\nobsidian tasknotes:pomodoro vault=test action=start title=\"Write release notes\" duration=25\n```\n\nTask lookup for `action=start` supports the same selectors as time tracking:\n\n- `path`\n- exact `title`\n- fuzzy `query`\n\n### Pause, resume, and stop\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=pause\nobsidian tasknotes:pomodoro vault=test action=resume\nobsidian tasknotes:pomodoro vault=test action=stop\n```\n\n### Breaks\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=short-break\nobsidian tasknotes:pomodoro vault=test action=long-break\n```\n\n## Choosing between CLI surfaces\n\nUse the built-in Obsidian CLI when:\n\n- Obsidian is already open\n- you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state\n- you are scripting on the same machine as the running vault\n\nUse [mdbase-tasknotes CLI](mdbase-tasknotes-cli.md) when:\n\n- Obsidian is not running\n- you need headless/server workflows\n- you want direct file-level automation over a task collection\n\n## Notes\n\n- `path` is the most reliable task selector for automation.\n- Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up.\n- These commands are desktop-only because they depend on the Obsidian desktop CLI.\n","aliases":["/obsidian-cli/"],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"discovering-commands","text":"Discovering commands"},{"level":2,"id":"tasknotescapture","text":"tasknotes:capture"},{"level":3,"id":"literal-title-mode","text":"Literal title mode"},{"level":3,"id":"explicit-fields","text":"Explicit fields"},{"level":3,"id":"reminder-format","text":"Reminder format"},{"level":3,"id":"recurrence-anchor","text":"Recurrence anchor"},{"level":2,"id":"tasknotesstart-time","text":"tasknotes:start-time"},{"level":2,"id":"tasknotesstop-time","text":"tasknotes:stop-time"},{"level":2,"id":"tasknotestime-status","text":"tasknotes:time-status"},{"level":2,"id":"tasknotespomodoro","text":"tasknotes:pomodoro"},{"level":3,"id":"inspect-state","text":"Inspect state"},{"level":3,"id":"start-a-work-session","text":"Start a work session"},{"level":3,"id":"pause-resume-and-stop","text":"Pause, resume, and stop"},{"level":3,"id":"breaks","text":"Breaks"},{"level":2,"id":"choosing-between-cli-surfaces","text":"Choosing between CLI surfaces"},{"level":2,"id":"notes","text":"Notes"}],"html":"

TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API.

\n

Use this page for the built-in obsidian ... commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see mdbase-tasknotes CLI.

\n

Requirements#

\n
    \n
  • Obsidian desktop 1.12.2 or newer
  • \n
  • TaskNotes installed and enabled in the target vault
  • \n
  • Obsidian running when you invoke the CLI
  • \n
\n

The Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass vault=<name> explicitly instead of relying on the default vault.

\n

Discovering commands#

\n

List available TaskNotes commands:

\n
obsidian help | rg 'tasknotes:'\n

You should see:

\n
    \n
  • tasknotes:capture
  • \n
  • tasknotes:start-time
  • \n
  • tasknotes:stop-time
  • \n
  • tasknotes:time-status
  • \n
  • tasknotes:pomodoro
  • \n
\n

tasknotes:capture#

\n

Create a task from free text, explicit flags, or both.

\n
obsidian tasknotes:capture vault=test text="Review PR tomorrow #work @desk"\n

By default, text= is parsed with TaskNotes NLP. Explicit flags override parsed values.

\n

Literal title mode#

\n

Use literal when you want the text treated as an exact title instead of being parsed.

\n
obsidian tasknotes:capture vault=test text="Fix parser edge case" literal\n

Explicit fields#

\n

Supported override flags:

\n
    \n
  • title
  • \n
  • details
  • \n
  • status
  • \n
  • priority
  • \n
  • due
  • \n
  • scheduled
  • \n
  • tags
  • \n
  • contexts
  • \n
  • projects
  • \n
  • recurrence
  • \n
  • recurrence-anchor
  • \n
  • reminders
  • \n
  • estimate
  • \n
\n

Example:

\n
obsidian tasknotes:capture vault=test \\\n  text="Write release notes tomorrow #docs" \\\n  priority=high \\\n  status=in-progress \\\n  reminders='due:-PT1H'\n

Reminder format#

\n

reminders= accepts either:

\n
    \n
  • a semicolon-separated shorthand such as due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00
  • \n
  • a JSON array in the same shape TaskNotes stores internally
  • \n
\n

Recurrence anchor#

\n

Use recurrence-anchor=scheduled or recurrence-anchor=completion to control how recurring tasks advance.

\n

tasknotes:start-time#

\n

Start time tracking for a task.

\n

You can target a task by:

\n
    \n
  • path
  • \n
  • exact title
  • \n
  • fuzzy query
  • \n
\n

Examples:

\n
obsidian tasknotes:start-time vault=test title="Write release notes"\nobsidian tasknotes:start-time vault=test query="release notes" description="Drafting first pass"\nobsidian tasknotes:start-time vault=test path="TaskNotes/Write release notes.md"\n

tasknotes:stop-time#

\n

Stop time tracking for a task.

\n

Examples:

\n
obsidian tasknotes:stop-time vault=test title="Write release notes"\nobsidian tasknotes:stop-time vault=test path="TaskNotes/Write release notes.md"\n

If you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous.

\n

tasknotes:time-status#

\n

Show time-tracking status for either:

\n
    \n
  • all active sessions
  • \n
  • one resolved task
  • \n
\n

Examples:

\n
obsidian tasknotes:time-status vault=test\nobsidian tasknotes:time-status vault=test title="Write release notes"\nobsidian tasknotes:time-status vault=test path="TaskNotes/Write release notes.md"\n

When a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault.

\n

tasknotes:pomodoro#

\n

Control Pomodoro state from the CLI.

\n

Supported actions:

\n
    \n
  • status
  • \n
  • start
  • \n
  • pause
  • \n
  • resume
  • \n
  • stop
  • \n
  • short-break
  • \n
  • long-break
  • \n
\n

Inspect state#

\n
obsidian tasknotes:pomodoro vault=test action=status\n

Start a work session#

\n

You can start a Pomodoro with or without a linked task.

\n
obsidian tasknotes:pomodoro vault=test action=start duration=25\nobsidian tasknotes:pomodoro vault=test action=start title="Write release notes" duration=25\n

Task lookup for action=start supports the same selectors as time tracking:

\n
    \n
  • path
  • \n
  • exact title
  • \n
  • fuzzy query
  • \n
\n

Pause, resume, and stop#

\n
obsidian tasknotes:pomodoro vault=test action=pause\nobsidian tasknotes:pomodoro vault=test action=resume\nobsidian tasknotes:pomodoro vault=test action=stop\n

Breaks#

\n
obsidian tasknotes:pomodoro vault=test action=short-break\nobsidian tasknotes:pomodoro vault=test action=long-break\n

Choosing between CLI surfaces#

\n

Use the built-in Obsidian CLI when:

\n
    \n
  • Obsidian is already open
  • \n
  • you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state
  • \n
  • you are scripting on the same machine as the running vault
  • \n
\n

Use mdbase-tasknotes CLI when:

\n
    \n
  • Obsidian is not running
  • \n
  • you need headless/server workflows
  • \n
  • you want direct file-level automation over a task collection
  • \n
\n

Notes#

\n
    \n
  • path is the most reliable task selector for automation.
  • \n
  • Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up.
  • \n
  • These commands are desktop-only because they depend on the Obsidian desktop CLI.
  • \n
\n","text":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API. Use this page for the built-in obsidian ... commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see mdbase-tasknotes CLI. Requirements# Obsidian desktop 1.12.2 or newer TaskNotes installed and enabled in the target vault Obsidian running when you invoke the CLI The Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass vault= explicitly instead of relying on the default vault. Discovering commands# List available TaskNotes commands: obsidian help | rg 'tasknotes:' You should see: tasknotes:capture tasknotes:start-time tasknotes:stop-time tasknotes:time-status tasknotes:pomodoro tasknotes:capture# Create a task from free text, explicit flags, or both. obsidian tasknotes:capture vault=test text=\"Review PR tomorrow #work @desk\" By default, text= is parsed with TaskNotes NLP. Explicit flags override parsed values. Literal title mode# Use literal when you want the text treated as an exact title instead of being parsed. obsidian tasknotes:capture vault=test text=\"Fix parser edge case\" literal Explicit fields# Supported override flags: title details status priority due scheduled tags contexts projects recurrence recurrence-anchor reminders estimate Example: obsidian tasknotes:capture vault=test \\ text=\"Write release notes tomorrow #docs\" \\ priority=high \\ status=in-progress \\ reminders='due:-PT1H' Reminder format# reminders= accepts either: a semicolon-separated shorthand such as due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00 a JSON array in the same shape TaskNotes stores internally Recurrence anchor# Use recurrence-anchor=scheduled or recurrence-anchor=completion to control how recurring tasks advance. tasknotes:start-time# Start time tracking for a task. You can target a task by: path exact title fuzzy query Examples: obsidian tasknotes:start-time vault=test title=\"Write release notes\" obsidian tasknotes:start-time vault=test query=\"release notes\" description=\"Drafting first pass\" obsidian tasknotes:start-time vault=test path=\"TaskNotes/Write release notes.md\" tasknotes:stop-time# Stop time tracking for a task. Examples: obsidian tasknotes:stop-time vault=test title=\"Write release notes\" obsidian tasknotes:stop-time vault=test path=\"TaskNotes/Write release notes.md\" If you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous. tasknotes:time-status# Show time-tracking status for either: all active sessions one resolved task Examples: obsidian tasknotes:time-status vault=test obsidian tasknotes:time-status vault=test title=\"Write release notes\" obsidian tasknotes:time-status vault=test path=\"TaskNotes/Write release notes.md\" When a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault. tasknotes:pomodoro# Control Pomodoro state from the CLI. Supported actions: status start pause resume stop short-break long-break Inspect state# obsidian tasknotes:pomodoro vault=test action=status Start a work session# You can start a Pomodoro with or without a linked task. obsidian tasknotes:pomodoro vault=test action=start duration=25 obsidian tasknotes:pomodoro vault=test action=start title=\"Write release notes\" duration=25 Task lookup for action=start supports the same selectors as time tracking: path exact title fuzzy query Pause, resume, and stop# obsidian tasknotes:pomodoro vault=test action=pause obsidian tasknotes:pomodoro vault=test action=resume obsidian tasknotes:pomodoro vault=test action=stop Breaks# obsidian tasknotes:pomodoro vault=test action=short-break obsidian tasknotes:pomodoro vault=test action=long-break Choosing between CLI surfaces# Use the built-in Obsidian CLI when: Obsidian is already open you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state you are scripting on the same machine as the running vault Use mdbase-tasknotes CLI when: Obsidian is not running you need headless/server workflows you want direct file-level automation over a task collection Notes# path is the most reliable task selector for automation. Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up. These commands are desktop-only because they depend on the Obsidian desktop CLI."},{"route":"/obsidian/reference/commands/","title":"Command reference","description":"Every TaskNotes command registered with Obsidian, generated from the plugin command definitions.","product":"obsidian","platforms":[],"version":"4.11.1","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/commands.md","raw":"---\ntitle: \"Command reference\"\ndescription: \"Every TaskNotes command registered with Obsidian, generated from the plugin command definitions.\"\ngenerated: true\nsource: [\"src/commands/taskNotesCommands.ts\",\"src/i18n/resources/en.ts\"]\n---\n# Command reference\n\nThis page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian.\n\n| Command | ID | Available in |\n| --- | --- | --- |\n| Open mini calendar view | `open-calendar-view` | Global |\n| Open calendar view | `open-advanced-calendar-view` | Global |\n| Open tasks view | `open-tasks-view` | Global |\n| Open agenda view | `open-agenda-view` | Global |\n| Open Pomodoro timer | `open-pomodoro-view` | Global |\n| Open Kanban board | `open-kanban-view` | Global |\n| Update default base files | `update-default-base-files` | Global |\n| Open Pomodoro statistics | `open-pomodoro-stats` | Global |\n| Open task & project statistics | `open-statistics` | Global |\n| Create new task | `create-new-task` | Global |\n| Convert current note to task | `convert-current-note-to-task` | Global |\n| Convert checkbox task to TaskNote | `convert-to-tasknote` | Editor |\n| Convert all tasks in note | `batch-convert-all-tasks` | Editor |\n| Insert tasknote link | `insert-tasknote-link` | Editor |\n| Create new inline task | `create-inline-task` | Editor |\n| Quick actions for current task | `quick-actions-current-task` | Global |\n| Quick actions for task under cursor | `quick-actions-task-under-cursor` | Editor |\n| Edit current task | `edit-current-task` | Global |\n| Cycle current task status | `cycle-current-task-status` | Global |\n| Cycle current task priority | `cycle-current-task-priority` | Global |\n| Add project to current task | `add-project-to-current-task` | Global |\n| Add subtask to current note | `add-subtask-to-current-note` | Global |\n| Go to today's note | `go-to-today` | Global |\n| Start Pomodoro timer | `start-pomodoro` | Global |\n| Stop Pomodoro timer | `stop-pomodoro` | Global |\n| Pause/resume Pomodoro timer | `pause-pomodoro` | Global |\n| Refresh cache | `refresh-cache` | Global |\n| Export all tasks as ICS file | `export-all-tasks-ics` | Global |\n| Sync all tasks to Google Calendar | `sync-all-tasks-google-calendar` | Global |\n| Sync current task to Google Calendar | `sync-current-task-google-calendar` | Global |\n| View release notes | `view-release-notes` | Global |\n| Start time tracking (select task) | `start-time-tracking-with-selector` | Global |\n| Edit time entries (select task) | `edit-time-entries` | Global |\n| Create or open task | `create-or-open-task` | Global |\n| Create or open task and start time tracking | `create-or-open-task-with-time-tracking` | Global |\n| Postpone overdue scheduled tasks to today | `rollover-overdue-scheduled-tasks` | Global |\n\n_Generated from 36 registered commands._\n","aliases":["/reference/commands/","/reference/commands/"],"toc":[],"html":"

This page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandIDAvailable in
Open mini calendar viewopen-calendar-viewGlobal
Open calendar viewopen-advanced-calendar-viewGlobal
Open tasks viewopen-tasks-viewGlobal
Open agenda viewopen-agenda-viewGlobal
Open Pomodoro timeropen-pomodoro-viewGlobal
Open Kanban boardopen-kanban-viewGlobal
Update default base filesupdate-default-base-filesGlobal
Open Pomodoro statisticsopen-pomodoro-statsGlobal
Open task & project statisticsopen-statisticsGlobal
Create new taskcreate-new-taskGlobal
Convert current note to taskconvert-current-note-to-taskGlobal
Convert checkbox task to TaskNoteconvert-to-tasknoteEditor
Convert all tasks in notebatch-convert-all-tasksEditor
Insert tasknote linkinsert-tasknote-linkEditor
Create new inline taskcreate-inline-taskEditor
Quick actions for current taskquick-actions-current-taskGlobal
Quick actions for task under cursorquick-actions-task-under-cursorEditor
Edit current taskedit-current-taskGlobal
Cycle current task statuscycle-current-task-statusGlobal
Cycle current task prioritycycle-current-task-priorityGlobal
Add project to current taskadd-project-to-current-taskGlobal
Add subtask to current noteadd-subtask-to-current-noteGlobal
Go to today's notego-to-todayGlobal
Start Pomodoro timerstart-pomodoroGlobal
Stop Pomodoro timerstop-pomodoroGlobal
Pause/resume Pomodoro timerpause-pomodoroGlobal
Refresh cacherefresh-cacheGlobal
Export all tasks as ICS fileexport-all-tasks-icsGlobal
Sync all tasks to Google Calendarsync-all-tasks-google-calendarGlobal
Sync current task to Google Calendarsync-current-task-google-calendarGlobal
View release notesview-release-notesGlobal
Start time tracking (select task)start-time-tracking-with-selectorGlobal
Edit time entries (select task)edit-time-entriesGlobal
Create or open taskcreate-or-open-taskGlobal
Create or open task and start time trackingcreate-or-open-task-with-time-trackingGlobal
Postpone overdue scheduled tasks to todayrollover-overdue-scheduled-tasksGlobal
\n

Generated from 36 registered commands.

\n","text":"This page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian. Command ID Available in Open mini calendar view open-calendar-view Global Open calendar view open-advanced-calendar-view Global Open tasks view open-tasks-view Global Open agenda view open-agenda-view Global Open Pomodoro timer open-pomodoro-view Global Open Kanban board open-kanban-view Global Update default base files update-default-base-files Global Open Pomodoro statistics open-pomodoro-stats Global Open task & project statistics open-statistics Global Create new task create-new-task Global Convert current note to task convert-current-note-to-task Global Convert checkbox task to TaskNote convert-to-tasknote Editor Convert all tasks in note batch-convert-all-tasks Editor Insert tasknote link insert-tasknote-link Editor Create new inline task create-inline-task Editor Quick actions for current task quick-actions-current-task Global Quick actions for task under cursor quick-actions-task-under-cursor Editor Edit current task edit-current-task Global Cycle current task status cycle-current-task-status Global Cycle current task priority cycle-current-task-priority Global Add project to current task add-project-to-current-task Global Add subtask to current note add-subtask-to-current-note Global Go to today's note go-to-today Global Start Pomodoro timer start-pomodoro Global Stop Pomodoro timer stop-pomodoro Global Pause/resume Pomodoro timer pause-pomodoro Global Refresh cache refresh-cache Global Export all tasks as ICS file export-all-tasks-ics Global Sync all tasks to Google Calendar sync-all-tasks-google-calendar Global Sync current task to Google Calendar sync-current-task-google-calendar Global View release notes view-release-notes Global Start time tracking (select task) start-time-tracking-with-selector Global Edit time entries (select task) edit-time-entries Global Create or open task create-or-open-task Global Create or open task and start time tracking create-or-open-task-with-time-tracking Global Postpone overdue scheduled tasks to today rollover-overdue-scheduled-tasks Global Generated from 36 registered commands."},{"route":"/obsidian/reference/compatibility/","title":"Version compatibility","description":"Current TaskNotes and Obsidian compatibility requirements, generated from the plugin manifest.","product":"obsidian","platforms":[],"version":"4.11.1","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/compatibility.md","raw":"---\ntitle: \"Version compatibility\"\ndescription: \"Current TaskNotes and Obsidian compatibility requirements, generated from the plugin manifest.\"\ngenerated: true\nsource: [\"manifest.json\",\"versions.json\"]\n---\n# Version compatibility\n\n## Current release\n\n| Item | Value |\n| --- | --- |\n| TaskNotes | `4.11.1` |\n| Minimum Obsidian version | `1.12.2` |\n| Desktop only | No |\n| Bases core plugin | Required |\n\nThe minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult `versions.json` or the relevant [release note](/releases/) when maintaining an older installation.\n","aliases":["/reference/compatibility/","/reference/compatibility/"],"toc":[{"level":2,"id":"current-release","text":"Current release"}],"html":"

Current release#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ItemValue
TaskNotes4.11.1
Minimum Obsidian version1.12.2
Desktop onlyNo
Bases core pluginRequired
\n

The minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult versions.json or the relevant release note when maintaining an older installation.

\n","text":"Current release# Item Value TaskNotes 4.11.1 Minimum Obsidian version 1.12.2 Desktop only No Bases core plugin Required The minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult versions.json or the relevant release note when maintaining an older installation."},{"route":"/obsidian/reference/default-base-templates/","title":"Generated default Base templates","description":"Exact default Obsidian Base files generated by the current TaskNotes source and default settings.","product":"obsidian","platforms":[],"version":"4.11.1","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/default-base-templates.md","raw":"---\ntitle: \"Generated default Base templates\"\ndescription: \"Exact default Obsidian Base files generated by the current TaskNotes source and default settings.\"\ngenerated: true\nsource: [\"src/templates/defaultBasesFiles.ts\",\"src/settings/defaults.ts\",\"src/core/FieldMapper.ts\"]\n---\n# Generated default Base templates\n\nThese are the exact templates TaskNotes 4.11.1 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ.\n\nRegenerating with **Update files** overwrites configured default Base files. Copy a customized file to a new path before updating it.\n\n## mini-calendar-default.base\n\nCommand/template ID: `open-calendar-view`\n\n```yaml\n# Mini Calendar\n# Generated with your TaskNotes settings\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesMiniCalendar\n name: \"Due\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - property: due\n direction: ASC\n dateProperty: due\n - type: tasknotesMiniCalendar\n name: \"Scheduled\"\n order: []\n dateProperty: scheduled\n - type: tasknotesMiniCalendar\n name: \"Created\"\n dateProperty: file.ctime\n - type: tasknotesMiniCalendar\n name: \"Modified\"\n dateProperty: file.mtime\n```\n\n## kanban-default.base\n\nCommand/template ID: `open-kanban-view`\n\n```yaml\n# Kanban Board\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesKanban\n name: \"Kanban Board\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: task.status\n direction: ASC\n config:\n columnWidth: 280\n hideEmptyColumns: false\n```\n\n## tasks-default.base\n\nCommand/template ID: `open-tasks-view`\n\n```yaml\n# All Tasks\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesTaskList\n name: \"Manual Order\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: status\n direction: ASC\n - type: tasknotesTaskList\n name: \"All Tasks\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: due\n direction: ASC\n - type: tasknotesTaskList\n name: \"Not Blocked\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Not blocked by any incomplete tasks\n - or:\n # No blocking dependencies at all\n - blockedBy.isEmpty()\n # All blocking tasks are completed (filter returns only incomplete, then check if empty)\n - 'list(blockedBy).filter(file(if(value.isType(\"object\"), value.uid, value)).properties.status != \"done\").isEmpty()'\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"Today\"\n filters:\n and:\n # Incomplete tasks (handles both recurring and non-recurring)\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Due or scheduled today\n - or:\n - and:\n - due.isEmpty() == false\n - date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")\n - and:\n - scheduled.isEmpty() == false\n - date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"Overdue\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Due or scheduled in the past\n - or:\n - and:\n - due.isEmpty() == false\n - date(due) < today()\n - and:\n - scheduled.isEmpty() == false\n - date(scheduled) < today()\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"This Week\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Due or scheduled this week\n - or:\n - and:\n - due.isEmpty() == false\n - date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\")\n - date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")\n - and:\n - scheduled.isEmpty() == false\n - date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\")\n - date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"Unscheduled\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # No due date and no scheduled date\n - date(due).isEmpty()\n - date(scheduled).isEmpty()\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: status\n direction: ASC\n```\n\n## calendar-default.base\n\nCommand/template ID: `open-advanced-calendar-view`\n\n```yaml\n# Calendar\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesCalendar\n name: \"Calendar\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n options:\n showScheduled: true\n showDue: true\n showRecurring: true\n showTimeEntries: true\n showTimeblocks: true\n showPropertyBasedEvents: true\n createDailyNotesFromDateLinks: true\n calendarView: \"timeGridWeek\"\n customDayCount: 3\n firstDay: 1\n```\n\n## agenda-default.base\n\nCommand/template ID: `open-agenda-view`\n\n```yaml\n# Agenda\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nproperties:\n formula.dueIn:\n displayName: Due in\n\n\nviews:\n - type: tasknotesCalendar\n name: \"Agenda\"\n order:\n - status\n - priority\n - due\n - formula.dueIn\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n options:\n showPropertyBasedEvents: false\n createDailyNotesFromDateLinks: true\n calendarView: \"listWeek\"\n startDateProperty: file.ctime\n listDayCount: 7\n titleProperty: file.basename\n```\n\n## pomodoro-stats.base\n\nCommand/template ID: `pomodoro-stats-base`\n\n```yaml\n# Pomodoro statistics\n# Generated with your TaskNotes settings\n# Requires Pomodoro data storage to be set to Daily notes.\n\nfilters:\n and:\n - file.hasProperty(\"pomodoros\")\n - list(note[\"pomodoros\"]).filter(value.startTime).isEmpty() == false\n\nformulas:\n pomodoroDate: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.startTime).map(date(value.startTime).format(\"YYYY-MM-DD\")).unique().join(\", \"), file.basename)'\n pomodoroMonth: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.startTime).map(date(value.startTime).format(\"YYYY-MM\")).unique().join(\", \"), \"\")'\n completedPomos: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\" && value.completed == true).length, 0)'\n attemptedPomos: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\").length, 0)'\n interruptedPomos: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\" && value.completed == false).length, 0)'\n focusMinutes: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)'\n focusTime: 'if(formula.focusMinutes >= 60, (formula.focusMinutes / 60).floor() + \"h \" + (formula.focusMinutes % 60).round() + \"m\", formula.focusMinutes + \"m\")'\n completionRate: 'if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round() + \"%\", \"0%\")'\n shortBreaks: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"short-break\").length, 0)'\n longBreaks: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"long-break\").length, 0)'\n\nproperties:\n formula.pomodoroDate:\n displayName: Date\n formula.pomodoroMonth:\n displayName: Month\n formula.completedPomos:\n displayName: Completed\n formula.attemptedPomos:\n displayName: Attempted\n formula.interruptedPomos:\n displayName: Interrupted\n formula.focusMinutes:\n displayName: Focus minutes\n formula.focusTime:\n displayName: Focus time\n formula.completionRate:\n displayName: Completion\n formula.shortBreaks:\n displayName: Short breaks\n formula.longBreaks:\n displayName: Long breaks\n\nviews:\n - type: table\n name: \"Daily\"\n order:\n - formula.pomodoroDate\n - formula.completedPomos\n - formula.focusTime\n - formula.attemptedPomos\n - formula.completionRate\n - formula.interruptedPomos\n - formula.shortBreaks\n - formula.longBreaks\n - file.name\n sort:\n - column: formula.pomodoroDate\n direction: DESC\n - type: table\n name: \"Monthly\"\n groupBy:\n property: formula.pomodoroMonth\n direction: DESC\n order:\n - formula.pomodoroDate\n - formula.completedPomos\n - formula.focusMinutes\n - formula.focusTime\n - formula.attemptedPomos\n - formula.completionRate\n - formula.interruptedPomos\n - formula.shortBreaks\n - formula.longBreaks\n - file.name\n summaries:\n formula.completedPomos: Sum\n formula.focusMinutes: Sum\n formula.attemptedPomos: Sum\n formula.interruptedPomos: Sum\n formula.shortBreaks: Sum\n formula.longBreaks: Sum\n sort:\n - column: formula.pomodoroDate\n direction: DESC\n```\n\n## relationships.base\n\nCommand/template ID: `relationships`\n\n```yaml\n# Relationships\n# This view shows all relationships for the current file\n# Dynamically shows/hides tabs based on available data\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesKanban\n name: \"Subtasks\"\n filters:\n and:\n - file.hasTag(\"task\")\n - file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, \"$1\").replace(/%20/g, \" \")).asLink()).contains(this.file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: task.status\n direction: ASC\n - type: tasknotesTaskList\n name: \"Occurrences\"\n filters:\n and:\n - file.hasTag(\"task\")\n - file.hasLink(this.file) && note.recurrence_parent && file(note.recurrence_parent.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, \"$1\").replace(/%20/g, \" \")).asLink() == this.file.asLink()\n order:\n - status\n - priority\n - due\n - scheduled\n - occurrence_date\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: occurrence_date\n direction: ASC\n - type: tasknotesTaskList\n name: \"Projects\"\n filters:\n and:\n - list(this.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, \"$1\").replace(/%20/g, \" \")).asLink()).contains(file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n - type: tasknotesTaskList\n name: \"Blocked By\"\n filters:\n and:\n - file.hasTag(\"task\")\n - list(this.note.blockedBy).map(file(if(value.isType(\"object\"), value.uid, value)).asLink()).contains(file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n - type: tasknotesKanban\n name: \"Blocking\"\n filters:\n and:\n - file.hasTag(\"task\")\n - list(note.blockedBy).map(file(if(value.isType(\"object\"), value.uid, value)).asLink()).contains(this.file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: task.status\n direction: ASC\n```\n","aliases":["/reference/default-base-templates/","/reference/default-base-templates/"],"toc":[{"level":2,"id":"mini-calendar-defaultbase","text":"mini-calendar-default.base"},{"level":2,"id":"kanban-defaultbase","text":"kanban-default.base"},{"level":2,"id":"tasks-defaultbase","text":"tasks-default.base"},{"level":2,"id":"calendar-defaultbase","text":"calendar-default.base"},{"level":2,"id":"agenda-defaultbase","text":"agenda-default.base"},{"level":2,"id":"pomodoro-statsbase","text":"pomodoro-stats.base"},{"level":2,"id":"relationshipsbase","text":"relationships.base"}],"html":"

These are the exact templates TaskNotes 4.11.1 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ.

\n

Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it.

\n

mini-calendar-default.base#

\n

Command/template ID: open-calendar-view

\n
# Mini Calendar\n# Generated with your TaskNotes settings\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesMiniCalendar\n    name: "Due"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - property: due\n        direction: ASC\n    dateProperty: due\n  - type: tasknotesMiniCalendar\n    name: "Scheduled"\n    order: []\n    dateProperty: scheduled\n  - type: tasknotesMiniCalendar\n    name: "Created"\n    dateProperty: file.ctime\n  - type: tasknotesMiniCalendar\n    name: "Modified"\n    dateProperty: file.mtime\n

kanban-default.base#

\n

Command/template ID: open-kanban-view

\n
# Kanban Board\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesKanban\n    name: "Kanban Board"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: task.status\n      direction: ASC\n    config:\n      columnWidth: 280\n      hideEmptyColumns: false\n

tasks-default.base#

\n

Command/template ID: open-tasks-view

\n
# All Tasks\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesTaskList\n    name: "Manual Order"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: status\n      direction: ASC\n  - type: tasknotesTaskList\n    name: "All Tasks"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: due\n        direction: ASC\n  - type: tasknotesTaskList\n    name: "Not Blocked"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Not blocked by any incomplete tasks\n        - or:\n          # No blocking dependencies at all\n          - blockedBy.isEmpty()\n          # All blocking tasks are completed (filter returns only incomplete, then check if empty)\n          - 'list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()'\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "Today"\n    filters:\n      and:\n        # Incomplete tasks (handles both recurring and non-recurring)\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Due or scheduled today\n        - or:\n          - and:\n            - due.isEmpty() == false\n            - date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")\n          - and:\n            - scheduled.isEmpty() == false\n            - date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "Overdue"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Due or scheduled in the past\n        - or:\n          - and:\n            - due.isEmpty() == false\n            - date(due) < today()\n          - and:\n            - scheduled.isEmpty() == false\n            - date(scheduled) < today()\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "This Week"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Due or scheduled this week\n        - or:\n          - and:\n            - due.isEmpty() == false\n            - date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")\n            - date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")\n          - and:\n            - scheduled.isEmpty() == false\n            - date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")\n            - date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "Unscheduled"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # No due date and no scheduled date\n        - date(due).isEmpty()\n        - date(scheduled).isEmpty()\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: status\n        direction: ASC\n

calendar-default.base#

\n

Command/template ID: open-advanced-calendar-view

\n
# Calendar\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesCalendar\n    name: "Calendar"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    options:\n      showScheduled: true\n      showDue: true\n      showRecurring: true\n      showTimeEntries: true\n      showTimeblocks: true\n      showPropertyBasedEvents: true\n      createDailyNotesFromDateLinks: true\n      calendarView: "timeGridWeek"\n      customDayCount: 3\n      firstDay: 1\n

agenda-default.base#

\n

Command/template ID: open-agenda-view

\n
# Agenda\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nproperties:\n  formula.dueIn:\n    displayName: Due in\n\n\nviews:\n  - type: tasknotesCalendar\n    name: "Agenda"\n    order:\n      - status\n      - priority\n      - due\n      - formula.dueIn\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    options:\n      showPropertyBasedEvents: false\n      createDailyNotesFromDateLinks: true\n    calendarView: "listWeek"\n    startDateProperty: file.ctime\n    listDayCount: 7\n    titleProperty: file.basename\n

pomodoro-stats.base#

\n

Command/template ID: pomodoro-stats-base

\n
# Pomodoro statistics\n# Generated with your TaskNotes settings\n# Requires Pomodoro data storage to be set to Daily notes.\n\nfilters:\n  and:\n    - file.hasProperty("pomodoros")\n    - list(note["pomodoros"]).filter(value.startTime).isEmpty() == false\n\nformulas:\n  pomodoroDate: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM-DD")).unique().join(", "), file.basename)'\n  pomodoroMonth: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM")).unique().join(", "), "")'\n  completedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).length, 0)'\n  attemptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work").length, 0)'\n  interruptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == false).length, 0)'\n  focusMinutes: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)'\n  focusTime: 'if(formula.focusMinutes >= 60, (formula.focusMinutes / 60).floor() + "h " + (formula.focusMinutes % 60).round() + "m", formula.focusMinutes + "m")'\n  completionRate: 'if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round() + "%", "0%")'\n  shortBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "short-break").length, 0)'\n  longBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "long-break").length, 0)'\n\nproperties:\n  formula.pomodoroDate:\n    displayName: Date\n  formula.pomodoroMonth:\n    displayName: Month\n  formula.completedPomos:\n    displayName: Completed\n  formula.attemptedPomos:\n    displayName: Attempted\n  formula.interruptedPomos:\n    displayName: Interrupted\n  formula.focusMinutes:\n    displayName: Focus minutes\n  formula.focusTime:\n    displayName: Focus time\n  formula.completionRate:\n    displayName: Completion\n  formula.shortBreaks:\n    displayName: Short breaks\n  formula.longBreaks:\n    displayName: Long breaks\n\nviews:\n  - type: table\n    name: "Daily"\n    order:\n      - formula.pomodoroDate\n      - formula.completedPomos\n      - formula.focusTime\n      - formula.attemptedPomos\n      - formula.completionRate\n      - formula.interruptedPomos\n      - formula.shortBreaks\n      - formula.longBreaks\n      - file.name\n    sort:\n      - column: formula.pomodoroDate\n        direction: DESC\n  - type: table\n    name: "Monthly"\n    groupBy:\n      property: formula.pomodoroMonth\n      direction: DESC\n    order:\n      - formula.pomodoroDate\n      - formula.completedPomos\n      - formula.focusMinutes\n      - formula.focusTime\n      - formula.attemptedPomos\n      - formula.completionRate\n      - formula.interruptedPomos\n      - formula.shortBreaks\n      - formula.longBreaks\n      - file.name\n    summaries:\n      formula.completedPomos: Sum\n      formula.focusMinutes: Sum\n      formula.attemptedPomos: Sum\n      formula.interruptedPomos: Sum\n      formula.shortBreaks: Sum\n      formula.longBreaks: Sum\n    sort:\n      - column: formula.pomodoroDate\n        direction: DESC\n

relationships.base#

\n

Command/template ID: relationships

\n
# Relationships\n# This view shows all relationships for the current file\n# Dynamically shows/hides tabs based on available data\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesKanban\n    name: "Subtasks"\n    filters:\n      and:\n        - file.hasTag("task")\n        - file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(this.file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: task.status\n      direction: ASC\n  - type: tasknotesTaskList\n    name: "Occurrences"\n    filters:\n      and:\n        - file.hasTag("task")\n        - file.hasLink(this.file) && note.recurrence_parent && file(note.recurrence_parent.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, "$1").replace(/%20/g, " ")).asLink() == this.file.asLink()\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - occurrence_date\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: occurrence_date\n        direction: ASC\n  - type: tasknotesTaskList\n    name: "Projects"\n    filters:\n      and:\n        - list(this.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n  - type: tasknotesTaskList\n    name: "Blocked By"\n    filters:\n      and:\n        - file.hasTag("task")\n        - list(this.note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n  - type: tasknotesKanban\n    name: "Blocking"\n    filters:\n      and:\n        - file.hasTag("task")\n        - list(note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(this.file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: task.status\n      direction: ASC\n
","text":"These are the exact templates TaskNotes 4.11.1 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ. Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it. mini-calendar-default.base# Command/template ID: open-calendar-view # Mini Calendar # Generated with your TaskNotes settings filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))' nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))' nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))' urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))' timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")' dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))' views: - type: tasknotesMiniCalendar name: \"Due\" order: - status - priority - due - scheduled - projects - contexts - file.tags - blockedBy - file.name - recurrence - complete_instances - file.tasks sort: - property: due direction: ASC dateProperty: due - type: tasknotesMiniCalendar name: \"Scheduled\" order: [] dateProperty: scheduled - type: tasknotesMiniCalendar name: \"Created\" dateProperty: file.ctime - type: tasknotesMiniCalendar name: \"Modified\" dateProperty: file.mtime kanban-default.base# Command/template ID: open-kanban-view # Kanban Board filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).fo"},{"route":"/obsidian/reference/http-routes/","title":"HTTP route index","description":"Implemented TaskNotes HTTP API routes generated from controller decorators.","product":"obsidian","platforms":[],"version":"4.11.1","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/http-routes.md","raw":"---\ntitle: \"HTTP route index\"\ndescription: \"Implemented TaskNotes HTTP API routes generated from controller decorators.\"\ngenerated: true\nsource: [\"src/api/*Controller.ts\",\"docs/HTTP_API.md\",\"docs/nlp-api.md\"]\n---\n# HTTP route index\n\nThis index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative [HTTP API guide](/HTTP_API/) or [NLP API guide](/nlp-api/).\n\n| Method | Path | Controller |\n| --- | --- | --- |\n| `POST` | `/api/bases/default-files/update` | `BasesController` |\n| `GET` | `/api/calendars` | `CalendarsController` |\n| `GET` | `/api/calendars/events` | `CalendarsController` |\n| `GET` | `/api/calendars/google` | `CalendarsController` |\n| `GET` | `/api/calendars/microsoft` | `CalendarsController` |\n| `GET` | `/api/calendars/subscriptions` | `CalendarsController` |\n| `GET` | `/api/docs` | `SystemController` |\n| `GET` | `/api/docs/ui` | `SystemController` |\n| `GET` | `/api/filter-options` | `TasksController` |\n| `GET` | `/api/health` | `SystemController` |\n| `POST` | `/api/nlp/create` | `SystemController` |\n| `POST` | `/api/nlp/parse` | `SystemController` |\n| `POST` | `/api/pomodoro/pause` | `PomodoroController` |\n| `POST` | `/api/pomodoro/resume` | `PomodoroController` |\n| `GET` | `/api/pomodoro/sessions` | `PomodoroController` |\n| `POST` | `/api/pomodoro/start` | `PomodoroController` |\n| `GET` | `/api/pomodoro/stats` | `PomodoroController` |\n| `GET` | `/api/pomodoro/status` | `PomodoroController` |\n| `POST` | `/api/pomodoro/stop` | `PomodoroController` |\n| `GET` | `/api/stats` | `TasksController` |\n| `GET` | `/api/tasks` | `TasksController` |\n| `POST` | `/api/tasks` | `TasksController` |\n| `DELETE` | `/api/tasks/:id` | `TasksController` |\n| `GET` | `/api/tasks/:id` | `TasksController` |\n| `PUT` | `/api/tasks/:id` | `TasksController` |\n| `POST` | `/api/tasks/:id/archive` | `TasksController` |\n| `POST` | `/api/tasks/:id/complete-instance` | `TasksController` |\n| `POST` | `/api/tasks/:id/materialize-occurrence` | `TasksController` |\n| `GET` | `/api/tasks/:id/time` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/time/start` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/time/start-with-description` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/time/stop` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/toggle-status` | `TasksController` |\n| `POST` | `/api/tasks/query` | `TasksController` |\n| `GET` | `/api/time/active` | `TimeTrackingController` |\n| `GET` | `/api/time/summary` | `TimeTrackingController` |\n| `GET` | `/api/webhooks` | `WebhookController` |\n| `POST` | `/api/webhooks` | `WebhookController` |\n| `DELETE` | `/api/webhooks/:id` | `WebhookController` |\n| `GET` | `/api/webhooks/deliveries` | `WebhookController` |\n\n_Generated from 40 implemented routes._\n","aliases":["/reference/http-routes/","/reference/http-routes/"],"toc":[],"html":"

This index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative HTTP API guide or NLP API guide.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathController
POST/api/bases/default-files/updateBasesController
GET/api/calendarsCalendarsController
GET/api/calendars/eventsCalendarsController
GET/api/calendars/googleCalendarsController
GET/api/calendars/microsoftCalendarsController
GET/api/calendars/subscriptionsCalendarsController
GET/api/docsSystemController
GET/api/docs/uiSystemController
GET/api/filter-optionsTasksController
GET/api/healthSystemController
POST/api/nlp/createSystemController
POST/api/nlp/parseSystemController
POST/api/pomodoro/pausePomodoroController
POST/api/pomodoro/resumePomodoroController
GET/api/pomodoro/sessionsPomodoroController
POST/api/pomodoro/startPomodoroController
GET/api/pomodoro/statsPomodoroController
GET/api/pomodoro/statusPomodoroController
POST/api/pomodoro/stopPomodoroController
GET/api/statsTasksController
GET/api/tasksTasksController
POST/api/tasksTasksController
DELETE/api/tasks/:idTasksController
GET/api/tasks/:idTasksController
PUT/api/tasks/:idTasksController
POST/api/tasks/:id/archiveTasksController
POST/api/tasks/:id/complete-instanceTasksController
POST/api/tasks/:id/materialize-occurrenceTasksController
GET/api/tasks/:id/timeTimeTrackingController
POST/api/tasks/:id/time/startTimeTrackingController
POST/api/tasks/:id/time/start-with-descriptionTimeTrackingController
POST/api/tasks/:id/time/stopTimeTrackingController
POST/api/tasks/:id/toggle-statusTasksController
POST/api/tasks/queryTasksController
GET/api/time/activeTimeTrackingController
GET/api/time/summaryTimeTrackingController
GET/api/webhooksWebhookController
POST/api/webhooksWebhookController
DELETE/api/webhooks/:idWebhookController
GET/api/webhooks/deliveriesWebhookController
\n

Generated from 40 implemented routes.

\n","text":"This index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative HTTP API guide or NLP API guide. Method Path Controller POST /api/bases/default-files/update BasesController GET /api/calendars CalendarsController GET /api/calendars/events CalendarsController GET /api/calendars/google CalendarsController GET /api/calendars/microsoft CalendarsController GET /api/calendars/subscriptions CalendarsController GET /api/docs SystemController GET /api/docs/ui SystemController GET /api/filter-options TasksController GET /api/health SystemController POST /api/nlp/create SystemController POST /api/nlp/parse SystemController POST /api/pomodoro/pause PomodoroController POST /api/pomodoro/resume PomodoroController GET /api/pomodoro/sessions PomodoroController POST /api/pomodoro/start PomodoroController GET /api/pomodoro/stats PomodoroController GET /api/pomodoro/status PomodoroController POST /api/pomodoro/stop PomodoroController GET /api/stats TasksController GET /api/tasks TasksController POST /api/tasks TasksController DELETE /api/tasks/:id TasksController GET /api/tasks/:id TasksController PUT /api/tasks/:id TasksController POST /api/tasks/:id/archive TasksController POST /api/tasks/:id/complete-instance TasksController POST /api/tasks/:id/materialize-occurrence TasksController GET /api/tasks/:id/time TimeTrackingController POST /api/tasks/:id/time/start TimeTrackingController POST /api/tasks/:id/time/start-with-description TimeTrackingController POST /api/tasks/:id/time/stop TimeTrackingController POST /api/tasks/:id/toggle-status TasksController POST /api/tasks/query TasksController GET /api/time/active TimeTrackingController GET /api/time/summary TimeTrackingController GET /api/webhooks WebhookController POST /api/webhooks WebhookController DELETE /api/webhooks/:id WebhookController GET /api/webhooks/deliveries WebhookController Generated from 40 implemented routes."},{"route":"/obsidian/reference/settings-source/","title":"Settings source reference","description":"The six TaskNotes settings tabs, their controls, and the complete default settings snapshot generated from source.","product":"obsidian","platforms":[],"version":"4.11.1","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/settings-source.md","raw":"---\ntitle: \"Settings source reference\"\ndescription: \"The six TaskNotes settings tabs, their controls, and the complete default settings snapshot generated from source.\"\ngenerated: true\nsource: [\"src/settings/TaskNotesSettingTab.ts\",\"src/settings/tabs/*.ts\",\"src/settings/defaults.ts\",\"src/i18n/resources/en.ts\"]\n---\n# Settings source reference\n\nTaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation.\n\n## General\n\nSource: `src/settings/tabs/generalTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Default tasks folder | Default location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD. |\n| Folder for inline-created tasks | Folder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note. |\n| Move archived tasks to folder | Automatically move archived tasks to an archive folder |\n| Archive folder | Folder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc. |\n| Identify tasks by | Choose whether to identify tasks by tag or by a frontmatter property |\n| Task tag | Tag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters. |\n| Hide identification tags in task cards | When enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays |\n| Hidden tag scope | Choose whether hiding identification tags also hides nested tags. |\n| Task property name | The frontmatter property name (e.g., \"category\") |\n| Task property value | The value that identifies a note as a task (e.g., \"task\") |\n| Auto-create default files | Automatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated. |\n| Create default files | Create the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten. |\n| Update default files | Overwrite the configured default .base files with templates generated from your current TaskNotes settings. |\n| Export v3 saved views to Bases | Convert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system. |\n| Excluded folders | Comma-separated list of folders to exclude from task indexing and project suggestions |\n| UI language | Select the language used for TaskNotes interface text |\n| Use Markdown links in frontmatter | Generate markdown links (`[text](path)`) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly. |\n| Show release notes after update | Automatically open release notes when TaskNotes is updated to a new version |\n| Check for new releases on startup | Check GitHub once when TaskNotes starts and show a notice when a newer compatible release is available |\n| View release notes | See what's new in the latest version of TaskNotes |\n\n## Task properties\n\nSource: `src/settings/tabs/taskPropertiesTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| No static controls detected | This tab is assembled dynamically. |\n\n## Modal fields\n\nSource: `src/settings/tabs/modalFieldsTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| No static controls detected | This tab is assembled dynamically. |\n\n## Appearance & UI\n\nSource: `src/settings/tabs/appearanceTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Default visible properties | Choose which properties appear on task cards by default. |\n| Time format | Display time in 12-hour or 24-hour format throughout the plugin |\n| Default view | The calendar view shown when opening the calendar tab |\n| Custom view day count | Number of days to show in custom multi-day view |\n| First day of week | Which day should be the first column in week views |\n| Show weekends | Display weekends in calendar views |\n| Show week numbers | Display week numbers in calendar views |\n| Show today highlight | Highlight the current day in calendar views |\n| Show current time indicator | Display a line showing the current time in timeline views |\n| Selection mirror | Show a visual preview while dragging to select time ranges |\n| Calendar locale | Calendar locale for date formatting and calendar system (e.g., \"en\", \"fa\" for Farsi/Persian, \"de\" for German). Leave empty to auto-detect from browser. |\n| Show scheduled tasks | Display tasks with scheduled dates by default |\n| Show due dates | Display task due dates by default |\n| Show due dates when scheduled | Display due dates even for tasks that already have scheduled dates |\n| Show time entries | Display completed time tracking entries by default |\n| Show recurring tasks | Display recurring task instances by default |\n| Show ICS events | Display events from ICS subscriptions by default |\n| Time slot duration | Duration of each time slot in timeline views |\n| Start time | Earliest time shown in timeline views (HH:MM format) |\n| End time | Latest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM. |\n| Initial scroll time | Time to scroll to when opening timeline views (HH:MM format) |\n| Event minimum height | Minimum height for events in timeline views (pixels) |\n| Show tracked tasks in status bar | Display currently tracked tasks in Obsidian's status bar |\n| Show relationships widget | Display a widget showing all relationships for the current note (subtasks, projects, dependencies) |\n| Relationships position | Where to position the relationships widget |\n| Show task card in note | Display a task card widget at the top of task notes showing the task details and actions |\n| Strike through completed task titles | Draw a line through completed task card titles. Turn off to keep completed tasks easier to read |\n| Show expandable subtasks | Allow expanding/collapsing subtask sections in task cards |\n| Expand subtasks by default | Show project subtasks expanded when task cards are rendered |\n| Subtask chevron position | Position of expand/collapse chevrons in task cards |\n| Views button alignment | Alignment of the views/filters button in the task interface |\n| Single-click action | Action performed when single-clicking a task card |\n| Double-click action | Action performed when double-clicking a task card |\n\n## Features\n\nSource: `src/settings/tabs/featuresTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Task link overlay | Show interactive overlays when hovering over task links |\n| Disable overlay for aliased links | Do not show the task widget if the link contains an alias (e.g. [[Task\\|Alias]]). |\n| Show convert button next to checkboxes | Display an inline button next to Markdown checkboxes that converts them to TaskNotes |\n| Keep checkbox when converting | Leave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link |\n| Enable natural language task input | Parse due dates, priorities, and contexts from natural language when creating tasks |\n| Default to scheduled | When NLP detects a date without context, treat it as scheduled rather than due |\n| NLP language | Language for natural language processing patterns and date parsing |\n| Open task after creation | Choose whether the task creation modal opens the new task note after saving. |\n| Use body template | Use a template file for task body content |\n| Body template file | Path to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc. |\n| Use occurrence note template | Use a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template |\n| Occurrence note template file | Path to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback. |\n| Template variables: | See the setting in Obsidian for contextual details. |\n| Use task defaults on instant convert | Apply default task settings when converting text to tasks instantly |\n| Work duration | Duration of work intervals in minutes |\n| Short break duration | Duration of short breaks in minutes |\n| Long break duration | Duration of long breaks in minutes |\n| Long break interval | Number of work sessions before a long break |\n| Auto-start breaks | Automatically start break timers after work sessions |\n| Auto-start work | Automatically start work sessions after breaks |\n| Pomodoro notifications | Show notifications when Pomodoro sessions end |\n| Show Pomodoro in status bar | Display the active Pomodoro countdown in Obsidian's status bar |\n| Sound enabled | Play sound when Pomodoro sessions end |\n| Sound volume | Volume for Pomodoro sounds (0-100) |\n| Pomodoro data storage | Configure where Pomodoro session data is stored and how it's managed. |\n| Mobile sidebar | Where to open the Pomodoro timer on mobile devices |\n| Enable notifications | Enable task reminder notifications |\n| Notification type | Type of notifications to show |\n| Send test reminder | Send a test reminder using the current notification type and sound settings. |\n| Notification sound | Play a sound when task reminders trigger |\n| Sound volume | Volume for task reminder sounds (0-100) |\n| Preview notification sound | Play the configured task reminder sound |\n| Hide completed tasks from overdue | Exclude completed tasks from overdue task calculations |\n| Disable note indexing | Disable automatic indexing of note content for better performance |\n| Suggestion debounce | Delay in milliseconds before showing suggestions |\n| Auto-stop time tracking | Automatically stop time tracking when a task is marked complete |\n| Time tracking stop notification | Show notification when time tracking is automatically stopped |\n| Maintain due date offset in recurring tasks | Keep the offset between due date and scheduled date when recurring tasks are completed |\n| Reset checkboxes on recurrence | Reset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled |\n| Enable timeblocking | Enable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu. |\n| Show timeblocks | Display timeblocks from daily notes by default |\n| Default timeblock color | The default color used when creating new timeblocks |\n| Enable debug logging | Log detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting. |\n\n## Integrations\n\nSource: `src/settings/tabs/integrationsTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Generate mdbase type definitions | See the setting in Obsidian for contextual details. |\n| Disable calendar integrations on mobile | Skip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged. |\n| Calendar integrations are disabled on this mobile device | See the setting in Obsidian for contextual details. |\n| Enable task export | When enabled, tasks with dates will be automatically synced to Google Calendar as events. |\n| Target calendar | See the setting in Obsidian for contextual details. |\n| Sync trigger | Which task date should trigger calendar event creation. |\n| Create as all-day events | When enabled, tasks are created as all-day events. When disabled, uses time estimate for duration. |\n| Default event duration | Duration in minutes for timed events (used when task has no time estimate). |\n| Event title template | Template for event titles. Available variables: {{title}}, {{status}}, {{priority}} |\n| Include task details in description | Add task metadata (priority, status, tags, etc.) to the event description. |\n| Include Obsidian link | Add a link back to the task in Obsidian in the event description. |\n| Default reminder | Add popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440. |\n| Automatic sync behavior | See the setting in Obsidian for contextual details. |\n| Sync on task create | Automatically create calendar event when a new task is created. |\n| Sync on task update | Automatically update calendar event when a task is modified. |\n| Sync on task complete | Update calendar event when a task is completed (adds checkmark to title). |\n| Delete event on task delete | Remove calendar event when the corresponding task is deleted. |\n| Manual sync actions | See the setting in Obsidian for contextual details. |\n| Sync all tasks | Sync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet. |\n| Unlink all tasks | Remove all task-event links without deleting calendar events. |\n| Default note template | Path to template file for notes created from ICS events |\n| Default note folder | Folder for notes created from ICS events |\n| ICS note filename format | How filenames are generated for notes created from ICS events |\n| Custom ICS filename template | Template for custom ICS event filenames |\n| Use ICS event end time as task due date | When enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time. |\n| Recurring event related notes | Choose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance. |\n| Add calendar subscription | Add a new calendar subscription from ICS/iCal URL or local file |\n| New calendar | See the setting in Obsidian for contextual details. |\n| Refresh all subscriptions | Manually refresh all enabled calendar subscriptions |\n| Enable automatic export | Automatically keep an ICS file updated with all your tasks |\n| Export file path | Path where the ICS file will be saved (relative to vault root) |\n| Update interval (between 5 and 1440 minutes) | How often to update the export file |\n| Use task duration for event length | When enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines. |\n| Exclude completed tasks | When enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings. |\n| Exclude archived tasks | When enabled, archived tasks are omitted from ICS exports. |\n| Require due date | When enabled, only tasks with a due date are included in ICS exports. |\n| Require scheduled date | When enabled, only tasks with a scheduled date are included in ICS exports. |\n| Export now | Manually trigger an immediate export |\n| Export status: | See the setting in Obsidian for contextual details. |\n| Enable HTTP API | Start local HTTP server for API access |\n| API port | Port number for the HTTP API server |\n| API authentication token | Token required for API authentication (leave empty for no auth) |\n| Enable MCP server | Expose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled. |\n| Add webhook | Register a new webhook endpoint |\n\n## Complete default settings snapshot\n\nThe following JSON is generated from `DEFAULT_SETTINGS`. Empty strings and disabled flags are intentional defaults.\n\n```json\n{\n \"tasksFolder\": \"TaskNotes/Tasks\",\n \"moveArchivedTasks\": false,\n \"archiveFolder\": \"TaskNotes/Archive\",\n \"taskTag\": \"task\",\n \"taskIdentificationMethod\": \"tag\",\n \"hideIdentifyingTagsInCards\": false,\n \"hideIdentifyingTagsMode\": \"all\",\n \"taskPropertyName\": \"\",\n \"taskPropertyValue\": \"\",\n \"excludedFolders\": \"\",\n \"defaultTaskPriority\": \"normal\",\n \"defaultTaskStatus\": \"open\",\n \"taskOrgFiltersCollapsed\": false,\n \"taskFilenameFormat\": \"zettel\",\n \"storeTitleInFilename\": true,\n \"customFilenameTemplate\": \"{{title}}\",\n \"occurrenceFilenameTemplate\": \"\",\n \"occurrenceFilenameTemplateProperty\": \"occurrenceFilenameTemplate\",\n \"taskCreationDefaults\": {\n \"defaultContexts\": \"\",\n \"defaultTags\": \"\",\n \"defaultProjects\": \"\",\n \"useParentNoteForTaskCreation\": false,\n \"useParentNoteAsProject\": false,\n \"useParentHeaderAsProject\": false,\n \"inheritParentTaskProperties\": false,\n \"defaultTimeEstimate\": 0,\n \"defaultRecurrence\": \"none\",\n \"defaultDueDate\": \"none\",\n \"defaultDueTime\": \"none\",\n \"defaultScheduledDate\": \"today\",\n \"defaultScheduledTime\": \"none\",\n \"bodyTemplate\": \"\",\n \"useBodyTemplate\": false,\n \"occurrenceBodyTemplate\": \"\",\n \"useOccurrenceBodyTemplate\": false,\n \"defaultReminders\": []\n },\n \"openTaskAfterCreation\": \"none\",\n \"calendarViewSettings\": {\n \"defaultView\": \"dayGridMonth\",\n \"customDayCount\": 3,\n \"slotDuration\": \"00:30:00\",\n \"slotMinTime\": \"00:00:00\",\n \"slotMaxTime\": \"24:00:00\",\n \"scrollTime\": \"08:00:00\",\n \"firstDay\": 1,\n \"timeFormat\": \"24\",\n \"showWeekends\": true,\n \"locale\": \"\",\n \"defaultShowScheduled\": true,\n \"defaultShowDue\": true,\n \"defaultShowDueWhenScheduled\": true,\n \"defaultShowScheduledToDueSpan\": false,\n \"defaultShowTimeEntries\": false,\n \"defaultShowRecurring\": true,\n \"defaultShowICSEvents\": true,\n \"enableTimeblocking\": false,\n \"defaultShowTimeblocks\": true,\n \"defaultTimeblockColor\": \"#6366f1\",\n \"timeblockAttachmentSearchOrder\": \"name-asc\",\n \"nowIndicator\": true,\n \"selectMirror\": true,\n \"weekNumbers\": false,\n \"showTodayHighlight\": true,\n \"eventMinHeight\": 15,\n \"slotEventOverlap\": true,\n \"eventMaxStack\": null,\n \"dayMaxEvents\": true,\n \"dayMaxEventRows\": false\n },\n \"pomodoroWorkDuration\": 25,\n \"pomodoroShortBreakDuration\": 5,\n \"pomodoroLongBreakDuration\": 15,\n \"pomodoroLongBreakInterval\": 4,\n \"pomodoroAutoStartBreaks\": true,\n \"pomodoroAutoStartWork\": false,\n \"pomodoroNotifications\": true,\n \"pomodoroSoundEnabled\": true,\n \"pomodoroSoundVolume\": 50,\n \"pomodoroStorageLocation\": \"plugin\",\n \"pomodoroMobileSidebar\": \"tab\",\n \"showPomodoroInStatusBar\": true,\n \"enableTaskLinkOverlay\": true,\n \"disableOverlayOnAlias\": false,\n \"enableInstantTaskConvert\": true,\n \"useDefaultsOnInstantConvert\": true,\n \"preserveCheckboxOnConvert\": false,\n \"taskModalTabMovesFocus\": true,\n \"enableNaturalLanguageInput\": true,\n \"nlpDefaultToScheduled\": true,\n \"nlpLanguage\": \"en\",\n \"uiLanguage\": \"system\",\n \"statusSuggestionTrigger\": \"*\",\n \"nlpTriggers\": {\n \"triggers\": [\n {\n \"propertyId\": \"tags\",\n \"trigger\": \"#\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"contexts\",\n \"trigger\": \"@\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"projects\",\n \"trigger\": \"+\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"status\",\n \"trigger\": \"*\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"priority\",\n \"trigger\": \"!\",\n \"enabled\": false\n }\n ]\n },\n \"singleClickAction\": \"edit\",\n \"doubleClickAction\": \"openNote\",\n \"projectAutosuggest\": {\n \"enableFuzzy\": false,\n \"rows\": [\n \"{title|n(Title)}\",\n \"{aliases|n(Aliases)}\",\n \"{file.path|n(Path)}\"\n ],\n \"showAdvanced\": false,\n \"requiredTags\": [],\n \"includeFolders\": [],\n \"propertyKey\": \"\",\n \"propertyValue\": \"\"\n },\n \"inlineTaskConvertFolder\": \"{{currentNotePath}}\",\n \"disableNoteIndexing\": false,\n \"suggestionDebounceMs\": 0,\n \"fieldMapping\": {\n \"title\": \"title\",\n \"status\": \"status\",\n \"priority\": \"priority\",\n \"due\": \"due\",\n \"scheduled\": \"scheduled\",\n \"contexts\": \"contexts\",\n \"projects\": \"projects\",\n \"timeEstimate\": \"timeEstimate\",\n \"completedDate\": \"completedDate\",\n \"dateCreated\": \"dateCreated\",\n \"dateModified\": \"dateModified\",\n \"recurrence\": \"recurrence\",\n \"recurrenceAnchor\": \"recurrence_anchor\",\n \"recurrenceParent\": \"recurrence_parent\",\n \"occurrenceDate\": \"occurrence_date\",\n \"occurrenceMaterialization\": \"occurrence_materialization\",\n \"occurrenceNextTrigger\": \"occurrence_next_trigger\",\n \"occurrenceTemplate\": \"occurrence_template\",\n \"occurrencePastHorizon\": \"occurrence_past_horizon\",\n \"occurrenceFutureHorizon\": \"occurrence_future_horizon\",\n \"archiveTag\": \"archived\",\n \"timeEntries\": \"timeEntries\",\n \"completeInstances\": \"complete_instances\",\n \"skippedInstances\": \"skipped_instances\",\n \"blockedBy\": \"blockedBy\",\n \"pomodoros\": \"pomodoros\",\n \"icsEventId\": \"icsEventId\",\n \"icsEventTag\": \"ics_event\",\n \"googleCalendarEventId\": \"googleCalendarEventId\",\n \"googleCalendarExceptionEventId\": \"googleCalendarExceptionEventId\",\n \"googleCalendarExceptionOriginalScheduled\": \"googleCalendarExceptionOriginalScheduled\",\n \"googleCalendarMovedOriginalDates\": \"googleCalendarMovedOriginalDates\",\n \"reminders\": \"reminders\",\n \"sortOrder\": \"tasknotes_manual_order\"\n },\n \"customStatuses\": [\n {\n \"id\": \"none\",\n \"value\": \"none\",\n \"label\": \"None\",\n \"color\": \"#cccccc\",\n \"isCompleted\": false,\n \"excludeFromCycle\": false,\n \"order\": 0,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n },\n {\n \"id\": \"open\",\n \"value\": \"open\",\n \"label\": \"Open\",\n \"color\": \"#808080\",\n \"isCompleted\": false,\n \"excludeFromCycle\": false,\n \"order\": 1,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n },\n {\n \"id\": \"in-progress\",\n \"value\": \"in-progress\",\n \"label\": \"In progress\",\n \"color\": \"#0066cc\",\n \"isCompleted\": false,\n \"excludeFromCycle\": false,\n \"order\": 2,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n },\n {\n \"id\": \"done\",\n \"value\": \"done\",\n \"label\": \"Done\",\n \"color\": \"#00aa00\",\n \"isCompleted\": true,\n \"excludeFromCycle\": false,\n \"order\": 3,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n }\n ],\n \"customPriorities\": [\n {\n \"id\": \"none\",\n \"value\": \"none\",\n \"label\": \"None\",\n \"color\": \"#cccccc\",\n \"weight\": 0\n },\n {\n \"id\": \"low\",\n \"value\": \"low\",\n \"label\": \"Low\",\n \"color\": \"#00aa00\",\n \"weight\": 1\n },\n {\n \"id\": \"normal\",\n \"value\": \"normal\",\n \"label\": \"Normal\",\n \"color\": \"#ffaa00\",\n \"weight\": 2\n },\n {\n \"id\": \"high\",\n \"value\": \"high\",\n \"label\": \"High\",\n \"color\": \"#ff0000\",\n \"weight\": 3\n }\n ],\n \"recurrenceMigrated\": false,\n \"showReleaseNotesOnUpdate\": true,\n \"checkForUpdatesOnStartup\": true,\n \"starterNoteCreated\": false,\n \"showTrackedTasksInStatusBar\": false,\n \"autoStopTimeTrackingOnComplete\": true,\n \"autoStopTimeTrackingNotification\": false,\n \"showRelationships\": true,\n \"relationshipsPosition\": \"bottom\",\n \"showTaskCardInNote\": true,\n \"showCompletedTaskStrikethrough\": true,\n \"showExpandableSubtasks\": true,\n \"expandSubtasksByDefault\": false,\n \"subtaskChevronPosition\": \"right\",\n \"viewsButtonAlignment\": \"right\",\n \"hideCompletedFromOverdue\": true,\n \"icsIntegration\": {\n \"defaultNoteTemplate\": \"\",\n \"defaultNoteFolder\": \"\",\n \"icsNoteFilenameFormat\": \"title\",\n \"customICSNoteFilenameTemplate\": \"{title}\",\n \"enableAutoExport\": false,\n \"autoExportPath\": \"tasknotes-calendar.ics\",\n \"autoExportInterval\": 60,\n \"useDurationForExport\": false,\n \"excludeArchivedFromExport\": false,\n \"excludeCompletedFromExport\": false,\n \"requireDueDateForExport\": false,\n \"requireScheduledDateForExport\": false,\n \"useICSEndAsDue\": false,\n \"recurringEventRelatedNotesMode\": \"series\"\n },\n \"savedViews\": [],\n \"enableNotifications\": true,\n \"notificationType\": \"system\",\n \"notificationSoundEnabled\": false,\n \"notificationSoundVolume\": 50,\n \"enableAPI\": false,\n \"apiPort\": 8080,\n \"apiAuthToken\": \"\",\n \"enableMCP\": false,\n \"webhooks\": [],\n \"userFields\": [],\n \"enableModalSplitLayout\": true,\n \"defaultVisibleProperties\": [\n \"status\",\n \"priority\",\n \"due\",\n \"scheduled\",\n \"projects\",\n \"contexts\",\n \"tags\",\n \"blocked\",\n \"blocking\"\n ],\n \"inlineVisibleProperties\": [\n \"status\",\n \"priority\",\n \"due\",\n \"scheduled\",\n \"recurrence\"\n ],\n \"enableBases\": true,\n \"enableMdbaseSpec\": false,\n \"autoCreateDefaultBasesFiles\": true,\n \"commandFileMapping\": {\n \"open-calendar-view\": \"TaskNotes/Views/mini-calendar-default.base\",\n \"open-kanban-view\": \"TaskNotes/Views/kanban-default.base\",\n \"open-tasks-view\": \"TaskNotes/Views/tasks-default.base\",\n \"open-advanced-calendar-view\": \"TaskNotes/Views/calendar-default.base\",\n \"open-agenda-view\": \"TaskNotes/Views/agenda-default.base\",\n \"pomodoro-stats-base\": \"TaskNotes/Views/pomodoro-stats.base\",\n \"relationships\": \"TaskNotes/Views/relationships.base\"\n },\n \"maintainDueDateOffsetInRecurring\": false,\n \"resetCheckboxesOnRecurrence\": false,\n \"useFrontmatterMarkdownLinks\": false,\n \"enableGoogleCalendar\": false,\n \"enableMicrosoftCalendar\": false,\n \"disableCalendarOnMobile\": false,\n \"enabledGoogleCalendars\": [],\n \"googleCalendarSyncTokens\": {},\n \"enabledMicrosoftCalendars\": [],\n \"microsoftCalendarSyncTokens\": {},\n \"googleCalendarExport\": {\n \"enabled\": false,\n \"targetCalendarId\": \"\",\n \"syncOnTaskCreate\": true,\n \"syncOnTaskUpdate\": true,\n \"syncOnTaskComplete\": true,\n \"syncOnTaskDelete\": true,\n \"eventTitleTemplate\": \"{{title}}\",\n \"includeDescription\": true,\n \"eventColorId\": null,\n \"syncTrigger\": \"scheduled\",\n \"createAsAllDay\": true,\n \"defaultEventDuration\": 60,\n \"includeObsidianLink\": true,\n \"defaultReminderMinutes\": null\n },\n \"enableDebugLogging\": false\n}\n```\n","aliases":["/reference/settings-source/","/reference/settings-source/"],"toc":[{"level":2,"id":"general","text":"General"},{"level":2,"id":"task-properties","text":"Task properties"},{"level":2,"id":"modal-fields","text":"Modal fields"},{"level":2,"id":"appearance-ui","text":"Appearance & UI"},{"level":2,"id":"features","text":"Features"},{"level":2,"id":"integrations","text":"Integrations"},{"level":2,"id":"complete-default-settings-snapshot","text":"Complete default settings snapshot"}],"html":"

TaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation.

\n

General#

\n

Source: src/settings/tabs/generalTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Default tasks folderDefault location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD.
Folder for inline-created tasksFolder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note.
Move archived tasks to folderAutomatically move archived tasks to an archive folder
Archive folderFolder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc.
Identify tasks byChoose whether to identify tasks by tag or by a frontmatter property
Task tagTag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters.
Hide identification tags in task cardsWhen enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays
Hidden tag scopeChoose whether hiding identification tags also hides nested tags.
Task property nameThe frontmatter property name (e.g., "category")
Task property valueThe value that identifies a note as a task (e.g., "task")
Auto-create default filesAutomatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated.
Create default filesCreate the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten.
Update default filesOverwrite the configured default .base files with templates generated from your current TaskNotes settings.
Export v3 saved views to BasesConvert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system.
Excluded foldersComma-separated list of folders to exclude from task indexing and project suggestions
UI languageSelect the language used for TaskNotes interface text
Use Markdown links in frontmatterGenerate markdown links ([text](path)) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly.
Show release notes after updateAutomatically open release notes when TaskNotes is updated to a new version
Check for new releases on startupCheck GitHub once when TaskNotes starts and show a notice when a newer compatible release is available
View release notesSee what's new in the latest version of TaskNotes
\n

Task properties#

\n

Source: src/settings/tabs/taskPropertiesTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
No static controls detectedThis tab is assembled dynamically.
\n

Modal fields#

\n

Source: src/settings/tabs/modalFieldsTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
No static controls detectedThis tab is assembled dynamically.
\n

Appearance & UI#

\n

Source: src/settings/tabs/appearanceTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Default visible propertiesChoose which properties appear on task cards by default.
Time formatDisplay time in 12-hour or 24-hour format throughout the plugin
Default viewThe calendar view shown when opening the calendar tab
Custom view day countNumber of days to show in custom multi-day view
First day of weekWhich day should be the first column in week views
Show weekendsDisplay weekends in calendar views
Show week numbersDisplay week numbers in calendar views
Show today highlightHighlight the current day in calendar views
Show current time indicatorDisplay a line showing the current time in timeline views
Selection mirrorShow a visual preview while dragging to select time ranges
Calendar localeCalendar locale for date formatting and calendar system (e.g., "en", "fa" for Farsi/Persian, "de" for German). Leave empty to auto-detect from browser.
Show scheduled tasksDisplay tasks with scheduled dates by default
Show due datesDisplay task due dates by default
Show due dates when scheduledDisplay due dates even for tasks that already have scheduled dates
Show time entriesDisplay completed time tracking entries by default
Show recurring tasksDisplay recurring task instances by default
Show ICS eventsDisplay events from ICS subscriptions by default
Time slot durationDuration of each time slot in timeline views
Start timeEarliest time shown in timeline views (HH:MM format)
End timeLatest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM.
Initial scroll timeTime to scroll to when opening timeline views (HH:MM format)
Event minimum heightMinimum height for events in timeline views (pixels)
Show tracked tasks in status barDisplay currently tracked tasks in Obsidian's status bar
Show relationships widgetDisplay a widget showing all relationships for the current note (subtasks, projects, dependencies)
Relationships positionWhere to position the relationships widget
Show task card in noteDisplay a task card widget at the top of task notes showing the task details and actions
Strike through completed task titlesDraw a line through completed task card titles. Turn off to keep completed tasks easier to read
Show expandable subtasksAllow expanding/collapsing subtask sections in task cards
Expand subtasks by defaultShow project subtasks expanded when task cards are rendered
Subtask chevron positionPosition of expand/collapse chevrons in task cards
Views button alignmentAlignment of the views/filters button in the task interface
Single-click actionAction performed when single-clicking a task card
Double-click actionAction performed when double-clicking a task card
\n

Features#

\n

Source: src/settings/tabs/featuresTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Task link overlayShow interactive overlays when hovering over task links
Disable overlay for aliased linksDo not show the task widget if the link contains an alias (e.g. [[Task|Alias]]).
Show convert button next to checkboxesDisplay an inline button next to Markdown checkboxes that converts them to TaskNotes
Keep checkbox when convertingLeave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link
Enable natural language task inputParse due dates, priorities, and contexts from natural language when creating tasks
Default to scheduledWhen NLP detects a date without context, treat it as scheduled rather than due
NLP languageLanguage for natural language processing patterns and date parsing
Open task after creationChoose whether the task creation modal opens the new task note after saving.
Use body templateUse a template file for task body content
Body template filePath to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc.
Use occurrence note templateUse a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template
Occurrence note template filePath to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback.
Template variables:See the setting in Obsidian for contextual details.
Use task defaults on instant convertApply default task settings when converting text to tasks instantly
Work durationDuration of work intervals in minutes
Short break durationDuration of short breaks in minutes
Long break durationDuration of long breaks in minutes
Long break intervalNumber of work sessions before a long break
Auto-start breaksAutomatically start break timers after work sessions
Auto-start workAutomatically start work sessions after breaks
Pomodoro notificationsShow notifications when Pomodoro sessions end
Show Pomodoro in status barDisplay the active Pomodoro countdown in Obsidian's status bar
Sound enabledPlay sound when Pomodoro sessions end
Sound volumeVolume for Pomodoro sounds (0-100)
Pomodoro data storageConfigure where Pomodoro session data is stored and how it's managed.
Mobile sidebarWhere to open the Pomodoro timer on mobile devices
Enable notificationsEnable task reminder notifications
Notification typeType of notifications to show
Send test reminderSend a test reminder using the current notification type and sound settings.
Notification soundPlay a sound when task reminders trigger
Sound volumeVolume for task reminder sounds (0-100)
Preview notification soundPlay the configured task reminder sound
Hide completed tasks from overdueExclude completed tasks from overdue task calculations
Disable note indexingDisable automatic indexing of note content for better performance
Suggestion debounceDelay in milliseconds before showing suggestions
Auto-stop time trackingAutomatically stop time tracking when a task is marked complete
Time tracking stop notificationShow notification when time tracking is automatically stopped
Maintain due date offset in recurring tasksKeep the offset between due date and scheduled date when recurring tasks are completed
Reset checkboxes on recurrenceReset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled
Enable timeblockingEnable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu.
Show timeblocksDisplay timeblocks from daily notes by default
Default timeblock colorThe default color used when creating new timeblocks
Enable debug loggingLog detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting.
\n

Integrations#

\n

Source: src/settings/tabs/integrationsTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Generate mdbase type definitionsSee the setting in Obsidian for contextual details.
Disable calendar integrations on mobileSkip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged.
Calendar integrations are disabled on this mobile deviceSee the setting in Obsidian for contextual details.
Enable task exportWhen enabled, tasks with dates will be automatically synced to Google Calendar as events.
Target calendarSee the setting in Obsidian for contextual details.
Sync triggerWhich task date should trigger calendar event creation.
Create as all-day eventsWhen enabled, tasks are created as all-day events. When disabled, uses time estimate for duration.
Default event durationDuration in minutes for timed events (used when task has no time estimate).
Event title templateTemplate for event titles. Available variables: {{title}}, {{status}}, {{priority}}
Include task details in descriptionAdd task metadata (priority, status, tags, etc.) to the event description.
Include Obsidian linkAdd a link back to the task in Obsidian in the event description.
Default reminderAdd popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440.
Automatic sync behaviorSee the setting in Obsidian for contextual details.
Sync on task createAutomatically create calendar event when a new task is created.
Sync on task updateAutomatically update calendar event when a task is modified.
Sync on task completeUpdate calendar event when a task is completed (adds checkmark to title).
Delete event on task deleteRemove calendar event when the corresponding task is deleted.
Manual sync actionsSee the setting in Obsidian for contextual details.
Sync all tasksSync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet.
Unlink all tasksRemove all task-event links without deleting calendar events.
Default note templatePath to template file for notes created from ICS events
Default note folderFolder for notes created from ICS events
ICS note filename formatHow filenames are generated for notes created from ICS events
Custom ICS filename templateTemplate for custom ICS event filenames
Use ICS event end time as task due dateWhen enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time.
Recurring event related notesChoose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance.
Add calendar subscriptionAdd a new calendar subscription from ICS/iCal URL or local file
New calendarSee the setting in Obsidian for contextual details.
Refresh all subscriptionsManually refresh all enabled calendar subscriptions
Enable automatic exportAutomatically keep an ICS file updated with all your tasks
Export file pathPath where the ICS file will be saved (relative to vault root)
Update interval (between 5 and 1440 minutes)How often to update the export file
Use task duration for event lengthWhen enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines.
Exclude completed tasksWhen enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings.
Exclude archived tasksWhen enabled, archived tasks are omitted from ICS exports.
Require due dateWhen enabled, only tasks with a due date are included in ICS exports.
Require scheduled dateWhen enabled, only tasks with a scheduled date are included in ICS exports.
Export nowManually trigger an immediate export
Export status:See the setting in Obsidian for contextual details.
Enable HTTP APIStart local HTTP server for API access
API portPort number for the HTTP API server
API authentication tokenToken required for API authentication (leave empty for no auth)
Enable MCP serverExpose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled.
Add webhookRegister a new webhook endpoint
\n

Complete default settings snapshot#

\n

The following JSON is generated from DEFAULT_SETTINGS. Empty strings and disabled flags are intentional defaults.

\n
{\n  "tasksFolder": "TaskNotes/Tasks",\n  "moveArchivedTasks": false,\n  "archiveFolder": "TaskNotes/Archive",\n  "taskTag": "task",\n  "taskIdentificationMethod": "tag",\n  "hideIdentifyingTagsInCards": false,\n  "hideIdentifyingTagsMode": "all",\n  "taskPropertyName": "",\n  "taskPropertyValue": "",\n  "excludedFolders": "",\n  "defaultTaskPriority": "normal",\n  "defaultTaskStatus": "open",\n  "taskOrgFiltersCollapsed": false,\n  "taskFilenameFormat": "zettel",\n  "storeTitleInFilename": true,\n  "customFilenameTemplate": "{{title}}",\n  "occurrenceFilenameTemplate": "",\n  "occurrenceFilenameTemplateProperty": "occurrenceFilenameTemplate",\n  "taskCreationDefaults": {\n    "defaultContexts": "",\n    "defaultTags": "",\n    "defaultProjects": "",\n    "useParentNoteForTaskCreation": false,\n    "useParentNoteAsProject": false,\n    "useParentHeaderAsProject": false,\n    "inheritParentTaskProperties": false,\n    "defaultTimeEstimate": 0,\n    "defaultRecurrence": "none",\n    "defaultDueDate": "none",\n    "defaultDueTime": "none",\n    "defaultScheduledDate": "today",\n    "defaultScheduledTime": "none",\n    "bodyTemplate": "",\n    "useBodyTemplate": false,\n    "occurrenceBodyTemplate": "",\n    "useOccurrenceBodyTemplate": false,\n    "defaultReminders": []\n  },\n  "openTaskAfterCreation": "none",\n  "calendarViewSettings": {\n    "defaultView": "dayGridMonth",\n    "customDayCount": 3,\n    "slotDuration": "00:30:00",\n    "slotMinTime": "00:00:00",\n    "slotMaxTime": "24:00:00",\n    "scrollTime": "08:00:00",\n    "firstDay": 1,\n    "timeFormat": "24",\n    "showWeekends": true,\n    "locale": "",\n    "defaultShowScheduled": true,\n    "defaultShowDue": true,\n    "defaultShowDueWhenScheduled": true,\n    "defaultShowScheduledToDueSpan": false,\n    "defaultShowTimeEntries": false,\n    "defaultShowRecurring": true,\n    "defaultShowICSEvents": true,\n    "enableTimeblocking": false,\n    "defaultShowTimeblocks": true,\n    "defaultTimeblockColor": "#6366f1",\n    "timeblockAttachmentSearchOrder": "name-asc",\n    "nowIndicator": true,\n    "selectMirror": true,\n    "weekNumbers": false,\n    "showTodayHighlight": true,\n    "eventMinHeight": 15,\n    "slotEventOverlap": true,\n    "eventMaxStack": null,\n    "dayMaxEvents": true,\n    "dayMaxEventRows": false\n  },\n  "pomodoroWorkDuration": 25,\n  "pomodoroShortBreakDuration": 5,\n  "pomodoroLongBreakDuration": 15,\n  "pomodoroLongBreakInterval": 4,\n  "pomodoroAutoStartBreaks": true,\n  "pomodoroAutoStartWork": false,\n  "pomodoroNotifications": true,\n  "pomodoroSoundEnabled": true,\n  "pomodoroSoundVolume": 50,\n  "pomodoroStorageLocation": "plugin",\n  "pomodoroMobileSidebar": "tab",\n  "showPomodoroInStatusBar": true,\n  "enableTaskLinkOverlay": true,\n  "disableOverlayOnAlias": false,\n  "enableInstantTaskConvert": true,\n  "useDefaultsOnInstantConvert": true,\n  "preserveCheckboxOnConvert": false,\n  "taskModalTabMovesFocus": true,\n  "enableNaturalLanguageInput": true,\n  "nlpDefaultToScheduled": true,\n  "nlpLanguage": "en",\n  "uiLanguage": "system",\n  "statusSuggestionTrigger": "*",\n  "nlpTriggers": {\n    "triggers": [\n      {\n        "propertyId": "tags",\n        "trigger": "#",\n        "enabled": true\n      },\n      {\n        "propertyId": "contexts",\n        "trigger": "@",\n        "enabled": true\n      },\n      {\n        "propertyId": "projects",\n        "trigger": "+",\n        "enabled": true\n      },\n      {\n        "propertyId": "status",\n        "trigger": "*",\n        "enabled": true\n      },\n      {\n        "propertyId": "priority",\n        "trigger": "!",\n        "enabled": false\n      }\n    ]\n  },\n  "singleClickAction": "edit",\n  "doubleClickAction": "openNote",\n  "projectAutosuggest": {\n    "enableFuzzy": false,\n    "rows": [\n      "{title|n(Title)}",\n      "{aliases|n(Aliases)}",\n      "{file.path|n(Path)}"\n    ],\n    "showAdvanced": false,\n    "requiredTags": [],\n    "includeFolders": [],\n    "propertyKey": "",\n    "propertyValue": ""\n  },\n  "inlineTaskConvertFolder": "{{currentNotePath}}",\n  "disableNoteIndexing": false,\n  "suggestionDebounceMs": 0,\n  "fieldMapping": {\n    "title": "title",\n    "status": "status",\n    "priority": "priority",\n    "due": "due",\n    "scheduled": "scheduled",\n    "contexts": "contexts",\n    "projects": "projects",\n    "timeEstimate": "timeEstimate",\n    "completedDate": "completedDate",\n    "dateCreated": "dateCreated",\n    "dateModified": "dateModified",\n    "recurrence": "recurrence",\n    "recurrenceAnchor": "recurrence_anchor",\n    "recurrenceParent": "recurrence_parent",\n    "occurrenceDate": "occurrence_date",\n    "occurrenceMaterialization": "occurrence_materialization",\n    "occurrenceNextTrigger": "occurrence_next_trigger",\n    "occurrenceTemplate": "occurrence_template",\n    "occurrencePastHorizon": "occurrence_past_horizon",\n    "occurrenceFutureHorizon": "occurrence_future_horizon",\n    "archiveTag": "archived",\n    "timeEntries": "timeEntries",\n    "completeInstances": "complete_instances",\n    "skippedInstances": "skipped_instances",\n    "blockedBy": "blockedBy",\n    "pomodoros": "pomodoros",\n    "icsEventId": "icsEventId",\n    "icsEventTag": "ics_event",\n    "googleCalendarEventId": "googleCalendarEventId",\n    "googleCalendarExceptionEventId": "googleCalendarExceptionEventId",\n    "googleCalendarExceptionOriginalScheduled": "googleCalendarExceptionOriginalScheduled",\n    "googleCalendarMovedOriginalDates": "googleCalendarMovedOriginalDates",\n    "reminders": "reminders",\n    "sortOrder": "tasknotes_manual_order"\n  },\n  "customStatuses": [\n    {\n      "id": "none",\n      "value": "none",\n      "label": "None",\n      "color": "#cccccc",\n      "isCompleted": false,\n      "excludeFromCycle": false,\n      "order": 0,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    },\n    {\n      "id": "open",\n      "value": "open",\n      "label": "Open",\n      "color": "#808080",\n      "isCompleted": false,\n      "excludeFromCycle": false,\n      "order": 1,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    },\n    {\n      "id": "in-progress",\n      "value": "in-progress",\n      "label": "In progress",\n      "color": "#0066cc",\n      "isCompleted": false,\n      "excludeFromCycle": false,\n      "order": 2,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    },\n    {\n      "id": "done",\n      "value": "done",\n      "label": "Done",\n      "color": "#00aa00",\n      "isCompleted": true,\n      "excludeFromCycle": false,\n      "order": 3,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    }\n  ],\n  "customPriorities": [\n    {\n      "id": "none",\n      "value": "none",\n      "label": "None",\n      "color": "#cccccc",\n      "weight": 0\n    },\n    {\n      "id": "low",\n      "value": "low",\n      "label": "Low",\n      "color": "#00aa00",\n      "weight": 1\n    },\n    {\n      "id": "normal",\n      "value": "normal",\n      "label": "Normal",\n      "color": "#ffaa00",\n      "weight": 2\n    },\n    {\n      "id": "high",\n      "value": "high",\n      "label": "High",\n      "color": "#ff0000",\n      "weight": 3\n    }\n  ],\n  "recurrenceMigrated": false,\n  "showReleaseNotesOnUpdate": true,\n  "checkForUpdatesOnStartup": true,\n  "starterNoteCreated": false,\n  "showTrackedTasksInStatusBar": false,\n  "autoStopTimeTrackingOnComplete": true,\n  "autoStopTimeTrackingNotification": false,\n  "showRelationships": true,\n  "relationshipsPosition": "bottom",\n  "showTaskCardInNote": true,\n  "showCompletedTaskStrikethrough": true,\n  "showExpandableSubtasks": true,\n  "expandSubtasksByDefault": false,\n  "subtaskChevronPosition": "right",\n  "viewsButtonAlignment": "right",\n  "hideCompletedFromOverdue": true,\n  "icsIntegration": {\n    "defaultNoteTemplate": "",\n    "defaultNoteFolder": "",\n    "icsNoteFilenameFormat": "title",\n    "customICSNoteFilenameTemplate": "{title}",\n    "enableAutoExport": false,\n    "autoExportPath": "tasknotes-calendar.ics",\n    "autoExportInterval": 60,\n    "useDurationForExport": false,\n    "excludeArchivedFromExport": false,\n    "excludeCompletedFromExport": false,\n    "requireDueDateForExport": false,\n    "requireScheduledDateForExport": false,\n    "useICSEndAsDue": false,\n    "recurringEventRelatedNotesMode": "series"\n  },\n  "savedViews": [],\n  "enableNotifications": true,\n  "notificationType": "system",\n  "notificationSoundEnabled": false,\n  "notificationSoundVolume": 50,\n  "enableAPI": false,\n  "apiPort": 8080,\n  "apiAuthToken": "",\n  "enableMCP": false,\n  "webhooks": [],\n  "userFields": [],\n  "enableModalSplitLayout": true,\n  "defaultVisibleProperties": [\n    "status",\n    "priority",\n    "due",\n    "scheduled",\n    "projects",\n    "contexts",\n    "tags",\n    "blocked",\n    "blocking"\n  ],\n  "inlineVisibleProperties": [\n    "status",\n    "priority",\n    "due",\n    "scheduled",\n    "recurrence"\n  ],\n  "enableBases": true,\n  "enableMdbaseSpec": false,\n  "autoCreateDefaultBasesFiles": true,\n  "commandFileMapping": {\n    "open-calendar-view": "TaskNotes/Views/mini-calendar-default.base",\n    "open-kanban-view": "TaskNotes/Views/kanban-default.base",\n    "open-tasks-view": "TaskNotes/Views/tasks-default.base",\n    "open-advanced-calendar-view": "TaskNotes/Views/calendar-default.base",\n    "open-agenda-view": "TaskNotes/Views/agenda-default.base",\n    "pomodoro-stats-base": "TaskNotes/Views/pomodoro-stats.base",\n    "relationships": "TaskNotes/Views/relationships.base"\n  },\n  "maintainDueDateOffsetInRecurring": false,\n  "resetCheckboxesOnRecurrence": false,\n  "useFrontmatterMarkdownLinks": false,\n  "enableGoogleCalendar": false,\n  "enableMicrosoftCalendar": false,\n  "disableCalendarOnMobile": false,\n  "enabledGoogleCalendars": [],\n  "googleCalendarSyncTokens": {},\n  "enabledMicrosoftCalendars": [],\n  "microsoftCalendarSyncTokens": {},\n  "googleCalendarExport": {\n    "enabled": false,\n    "targetCalendarId": "",\n    "syncOnTaskCreate": true,\n    "syncOnTaskUpdate": true,\n    "syncOnTaskComplete": true,\n    "syncOnTaskDelete": true,\n    "eventTitleTemplate": "{{title}}",\n    "includeDescription": true,\n    "eventColorId": null,\n    "syncTrigger": "scheduled",\n    "createAsAllDay": true,\n    "defaultEventDuration": 60,\n    "includeObsidianLink": true,\n    "defaultReminderMinutes": null\n  },\n  "enableDebugLogging": false\n}\n
","text":"TaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation. General# Source: src/settings/tabs/generalTab.ts Setting Purpose Default tasks folder Default location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD. Folder for inline-created tasks Folder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note. Move archived tasks to folder Automatically move archived tasks to an archive folder Archive folder Folder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc. Identify tasks by Choose whether to identify tasks by tag or by a frontmatter property Task tag Tag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters. Hide identification tags in task cards When enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays Hidden tag scope Choose whether hiding identification tags also hides nested tags. Task property name The frontmatter property name (e.g., \"category\") Task property value The value that identifies a note as a task (e.g., \"task\") Auto-create default files Automatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated. Create default files Create the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten. Update default files Overwrite the configured default .base files with templates generated from your current TaskNotes settings. Export v3 saved views to Bases Convert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system. Excluded folders Comma-separated list of folders to exclude from task indexing and project suggestions UI language Select the language used for TaskNotes interface text Use Markdown links in frontmatter Generate markdown links ([text](path)) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly. Show release notes after update Automatically open release notes when TaskNotes is updated to a new version Check for new releases on startup Check GitHub once when TaskNotes starts and show a notice when a newer compatible release is available View release notes See what's new in the latest version of TaskNotes Task properties# Source: src/settings/tabs/taskPropertiesTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Modal fields# Source: src/settings/tabs/modalFieldsTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Appearance & UI# Source: src/settings/tabs/appearanceTab.ts Setting Purpose Default visible properties Choose which properties appear on task cards by default. Time format Display time in 12-hour or 24-hour format throughout the plugin Default view The calendar view shown when opening the calendar tab Custom view day count Number of days to show in custom multi-day view First day of week Which day should be the first column in week views Show weekends Display weekends in calendar views Show week numbers Display week numbers in calendar views Show today highlight Highlight the current day in calendar views Show current time indicator Display a line showing the current time in timeline views Selection mirror Show a visual preview while dragging to select time ranges Calendar locale Calendar locale for date formatting and calendar system (e.g., \"en\", \"fa\" for Farsi/Persian, \"de\" for German). Leave empty to auto-detect from browser. Show scheduled tasks Display tasks with scheduled dates by default Show due dates Display task due dates by default Show due dates when scheduled Display due dates even for tasks that already have scheduled dates Show time entries Display completed time tracking entries by default Show recurring tasks Display recurring task instances by default Show ICS events Display events from ICS subscriptions by default Time slot duration Duration of each time slot in timeline views Start time Earliest time shown in timeline views (HH:MM format) End time Latest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM. Initial scroll time Time to scroll to when opening timeline views (HH:MM format) Event minimum height Minimum height for events in timeline views (pixels) Show tracked tasks in status bar Display currently tracked tasks in Obsidian's status bar Show relationships widget Display a widget showing all relationships for the current note (subtasks, projects, dependencies) Relationships position Where to position the relationships widget Show task card in note Display a task card widget at the top of task notes showing the task details and actions Strike through completed task titles Draw a line through completed task card titles. Turn off to keep completed tasks easier to read Show expandable subtasks Allow expanding/collapsing subtask sections in task cards Expand subtasks by default Show project subtasks expanded when task cards are rendered Subtask chevron position Position of expand/collapse chevrons in task cards Views button alignment Alignment of the views/filters button in the task interface Single-click action Action performed when single-clicking a task card Double-click action Action performed when double-clicking a task card Features# Source: src/settings/tabs/featuresTab.ts Setting Purpose Task link overlay Show interactive overlays when hovering over task links Disable overlay for aliased links Do not show the task widget if the link contains an alias (e.g. [[Task|Alias]]). Show convert button next to checkboxes Display an inline button next to Markdown checkboxes that converts them to TaskNotes Keep checkbox when converting Leave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link Enable natural language task input Parse due dates, priorities, and contexts from natural language when creating tasks Default to scheduled When NLP detects a date without context, treat it as scheduled rather than due NLP language Language for natural language processing patterns and date parsing Open task after creation Choose whether the task creation modal opens the new task note after saving. Use body template Use a template file for task body content Body template file Path to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc. Use occurrence note template Use a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template Occurrence note template file Path to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback. Template variables: See the setting in Obsidian for contextual details. Use task defaults on instant convert Apply default task settings when converting text to tasks instantly Work duration Duration of work intervals in minutes Short break duration Duration of short breaks in minutes Long break duration Duration of long breaks in minutes Long break interval Number of work sessions before a long break Auto-start breaks Automatically start break timers after work sessions Auto-start work Automatically start work sessions after breaks Pomodoro notifications Show notifications when Pomodoro sessions end Show Pomodoro in status bar Display the active Pomodoro countdown in Obsidian's status bar Sound enabled Play sound when Pomodoro sessions end Sound volume Volume for Pomodoro sounds (0-100) Pomodoro data storage Configure where Pomodoro session data is stored and how it's managed. Mobile sidebar Where to open the Pomodoro timer on mobile devices Enable notifications Enable task reminder notifications Notification type Type of notifications to show Send test reminder Send a test reminder using the current notification type and sound settings. Notification sound Play a sound when task reminders trigger Sound volume Volume for task reminder sounds (0-100) Preview notification sound Play the configured task reminder sound Hide completed tasks from overdue Exclude completed tasks from overdue task calculations Disable note indexing Disable automatic indexing of note content for better performance Suggestion debounce Delay in milliseconds before showing suggestions Auto-stop time tracking Automatically stop time tracking when a task is marked complete Time tracking stop notification Show notification when time tracking is automatically stopped Maintain due date offset in recurring tasks Keep the offset between due date and scheduled date when recurring tasks are completed Reset checkboxes on recurrence Reset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled Enable timeblocking Enable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu. Show timeblocks Display timeblocks from daily notes by default Default timeblock color The default color used when creating new timeblocks Enable debug logging Log detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting. Integrations# Source: src/settings/tabs/integrationsTab.ts Setting Purpose Generate mdbase type definitions See the setting in Obsidian for contextual details. Disable calendar integrations on mobile Skip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged. Calendar integrations are disabled on this mobile device See the setting in Obsidian for contextual details. Enable task export When enabled, tasks with dates will be automatically synced to Google Calendar as events. Target calendar See the setting in Obsidian for contextual details. Sync trigger Which task date should trigger calendar event creation. Create as all-day events When enabled, tasks are created as all-day events. When disabled, uses time estimate for duration. Default event duration Duration in minutes for timed events (used when task has no time estimate). Event title template Template for event titles. Available variables: {{title}}, {{status}}, {{priority}} Include task details in description Add task metadata (priority, status, tags, etc.) to the event description. Include Obsidian link Add a link back to the task in Obsidian in the event description. Default reminder Add popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440. Automatic sync behavior See the setting in Obsidian for contextual details. Sync on task create Automatically create calendar event when a new task is created. Sync on task update Automatically update calendar event when a task is modified. Sync on task complete Update calendar event when a task is completed (adds checkmark to title). Delete event on task delete Remove calendar event when the corresponding task is deleted. Manual sync actions See the setting in Obsidian for contextual details. Sync all tasks Sync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet. Unlink all tasks Remove all task-event links without deleting calendar events. Default note template Path to template file for notes created from ICS events Default note folder Folder for notes created from ICS events ICS note filename format How filenames are generated for notes created from ICS events Custom ICS filename template Template for custom ICS event filenames Use ICS event end time as task due date When enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time. Recurring event related notes Choose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance. Add calendar subscription Add a new calendar subscription from ICS/iCal URL or local file New calendar See the setting in Obsidian for contextual details. Refresh all subscriptions Manually refresh all enabled calendar subscriptions Enable automatic export Automatically keep an ICS file updated with all your tasks Export file path Path where the ICS file will be saved (relative to vault root) Update interval (between 5 and 1440 minutes) How often to update the export file Use task duration for event length When enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines. Exclude completed tasks When enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings. Exclude archived tasks When enabled, archived tasks are omitted from ICS exports. Require due date When enabled, only tasks with a due date are included in ICS exports. Require scheduled date When enabled, only tasks with a scheduled date are included in ICS exports. Export now Manually trigger an immediate export Export status: See the setting in Obsidian for contextual details. Enable HTTP API Start local HTTP server for API access API port Port number for the HTTP API server API authentication token Token required for API authentication (leave empty for no auth) Enable MCP server Expose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled. Add webhook Register a new webhook endpoint Complete default settings snapshot# The following JSON is generated from DEFAULT_SETTINGS. Empty strings and disabled flags are intentional defaults. { \"tasksFolder\": \"TaskNotes/Tasks\", \"moveArchivedTasks\": false, \"archiveFolder\": \"TaskNotes/Archive\", \"taskTag\": \"task\", \"taskIdentificationMethod\": \"tag\", \"hideIdentifyingTagsInCards\": false, \"hideIdentifyingTagsMode\": \"all\", \"taskPropertyName\": \"\", \"taskPropertyValue\": \"\", \"excludedFolders\": \"\", \"defaultTaskPriority\": \"normal\", \"defaultTaskStatus\": \"open\", \"taskOrgFiltersCollapsed\": false, \"taskFilenameFormat\": \"zettel\", \"storeTitleInFilename\": true, \"customFilenameTemplate\": \"{{title}}\", \"occurrenceFilenameTemplate\": \"\", \"occurrenceFilenameTemplateProperty\": \"occurrenceFilenameTemplate\", \"taskCreationDefaults\": { \"defaultContexts\": \"\", \"defaultTags\": \"\", \"defaultProjects\": \"\", \"useParentNoteForTaskCreation\": false, \"useParentNoteAsProject\": false, \"useParentHeaderAsProject\": false, \"inheritParentTaskProperties\": false, \"defaultTimeEstimate\": 0, \"defaultRecurrence\": \"none\", \"defaultDueDate\": \"none\", \"defaultDueTime\": \"none\", \"defaultScheduledDate\": \"today\", \"defaultScheduledTime\": \"none\", \"bodyTemplate\": \"\", \"useBodyTemplate\": false, \"occurrenceBodyTemplate\": \"\", \"useOccurrenceBodyTemplate\": false, \"defaultReminders\": [] }, \"openTaskAfterCreation\": \"none\", \"calendarViewSettings\": { \"defaultView\": \"dayGridMonth\", \"customDayCount\": 3, \"slotDuration\": \"00:30:00\", \"slotMinTime\": \"00:00:00\", \"slotMaxTime\": \"24:00:00\", \"scrollTime\": \"08:00:00\", \"firstDay\": 1, \"timeFormat\": \"24\", \"showWeekends\": true, \"locale\": \"\", \"defaultShowSchedu"},{"route":"/obsidian/releases/","title":"Release Notes","description":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases.md","namespace":"obsidian","relativePath":"releases.md","raw":"# Release Notes\n\nWelcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.\n\n## Latest Releases\n\n### Version 4.x (Current)\n\n- [4.11.1](releases/4.11.1.md)\n- [4.11.0](releases/4.11.0.md)\n- [4.10.2](releases/4.10.2.md)\n- [4.10.1](releases/4.10.1.md)\n- [4.10.0](releases/4.10.0.md)\n- [4.9.2](releases/4.9.2.md)\n- [4.9.1](releases/4.9.1.md)\n- [4.9.0](releases/4.9.0.md)\n- [4.8.1](releases/4.8.1.md)\n- [4.8.0](releases/4.8.0.md)\n- [4.7.2](releases/4.7.2.md)\n- [4.7.1](releases/4.7.1.md)\n- [4.7.0](releases/4.7.0.md)\n- [4.6.0](releases/4.6.0.md)\n- [4.5.3](releases/4.5.3.md)\n- [4.5.2](releases/4.5.2.md)\n- [4.5.1](releases/4.5.1.md)\n- [4.5.0](releases/4.5.0.md)\n- [4.4.0](releases/4.4.0.md)\n- [4.3.3](releases/4.3.3.md)\n- [4.3.2](releases/4.3.2.md)\n- [4.3.1](releases/4.3.1.md)\n- [4.3.0](releases/4.3.0.md)\n- [4.2.1](releases/4.2.1.md)\n- [4.2.0](releases/4.2.0.md)\n- [4.1.3](releases/4.1.3.md)\n- [4.1.2](releases/4.1.2.md)\n- [4.1.1](releases/4.1.1.md)\n- [4.1.0](releases/4.1.0.md)\n- [4.0.5](releases/4.0.5.md)\n- [4.0.4](releases/4.0.4.md)\n- [4.0.3](releases/4.0.3.md)\n- [4.0.2](releases/4.0.2.md)\n- [4.0.1](releases/4.0.1.md)\n- [4.0.0-beta.3](releases/4.0.0-beta.3.md)\n- [4.0.0-beta.2](releases/4.0.0-beta.2.md)\n- [4.0.0-beta.1](releases/4.0.0-beta.1.md)\n- [4.0.0-beta.0](releases/4.0.0-beta.0.md)\n\n### Version 3.x\n\n- [3.25.6](releases/3.25.6.md)\n- [3.25.4](releases/3.25.4.md)\n- [3.25.3](releases/3.25.3.md)\n- [3.25.2](releases/3.25.2.md)\n- [3.25.1](releases/3.25.1.md)\n- [3.25.0](releases/3.25.0.md)\n- [3.24.6](releases/3.24.6.md)\n- [3.24.5](releases/3.24.5.md)\n- [3.24.4](releases/3.24.4.md)\n- [3.24.3](releases/3.24.3.md)\n- [3.24.2](releases/3.24.2.md)\n- [3.24.1](releases/3.24.1.md)\n- [3.24.0](releases/3.24.0.md)\n- [3.23.4](releases/3.23.4.md)\n- [3.23.3](releases/3.23.3.md)\n- [3.23.2](releases/3.23.2.md)\n- [3.23.1](releases/3.23.1.md)\n- [3.23.0](releases/3.23.0.md)\n- [3.22.1](releases/3.22.1.md)\n- [3.22.0](releases/3.22.0.md)\n- [3.21.0](releases/3.21.0.md)\n- [3.20.1](releases/3.20.1.md)\n- [3.20.0](releases/3.20.0.md)\n- [3.19.1](releases/3.19.1.md)\n- [3.19.0](releases/3.19.0.md)\n- [3.18.2](releases/3.18.2.md)\n- [3.18.1](releases/3.18.1.md)\n- [3.18.0](releases/3.18.0.md)\n- [3.17.1](releases/3.17.1.md)\n- [3.17.0](releases/3.17.0.md)\n- [3.16.4](releases/3.16.4.md)\n- [3.16.3](releases/3.16.3.md)\n- [3.16.2](releases/3.16.2.md)\n- [3.16.1](releases/3.16.1.md)\n- [3.16.0](releases/3.16.0.md)\n- [3.15.1](releases/3.15.1.md)\n- [3.15.0](releases/3.15.0.md)\n- [3.14.0](releases/3.14.0.md)\n- [3.13.4](releases/3.13.4.md)\n- [3.13.3](releases/3.13.3.md)\n- [3.13.2](releases/3.13.2.md)\n- [3.13.1](releases/3.13.1.md)\n- [3.13.0](releases/3.13.0.md)\n- [3.12.2](releases/3.12.2.md)\n- [3.12.1](releases/3.12.1.md)\n- [3.12.0](releases/3.12.0.md)\n- [3.11.2](releases/3.11.2.md)\n- [3.11.1](releases/3.11.1.md)\n- [3.11.0](releases/3.11.0.md)\n- [3.10.0](releases/3.10.0.md)\n- [3.9.1](releases/3.9.1.md)\n- [3.9.0](releases/3.9.0.md)\n- [3.8.7](releases/3.8.7.md)\n- [3.8.6](releases/3.8.6.md)\n- [3.8.5](releases/3.8.5.md)\n- [3.8.1](releases/3.8.1.md)\n- [3.7.1](releases/3.7.1.md)\n- [3.7.0](releases/3.7.0.md)\n- [3.6.0](releases/3.6.0.md)\n- [3.5.1](releases/3.5.1.md)\n- [3.4.2](releases/3.4.2.md)\n- [3.4.1](releases/3.4.1.md)\n- [3.4.0](releases/3.4.0.md)\n- [3.3.0](releases/3.3.0.md)\n- [3.1.1](releases/3.1.1.md)\n- [3.1.0](releases/3.1.0.md)\n- [3.0.1](releases/3.0.1.md)\n- [3.0.0](releases/3.0.0.md)\n\n### Version 2.x\n\n- [2.2.3](releases/2.2.3.md)\n- [2.2.2](releases/2.2.2.md)\n- [2.2.1](releases/2.2.1.md)\n- [2.2.0](releases/2.2.0.md)\n- [2.1.0](releases/2.1.0.md)\n- [2.0.4](releases/2.0.4.md)\n- [2.0.3](releases/2.0.3.md)\n- [2.0.2](releases/2.0.2.md)\n- [2.0.1](releases/2.0.1.md)\n- [2.0.0](releases/2.0.0.md)\n\n### Version 1.x\n\n- [1.2.0](releases/1.2.0.md)\n- [1.1.0](releases/1.1.0.md)\n- [1.0.0](releases/1.0.0.md)\n\n### Early Versions (0.x)\n\n- [0.8.0](releases/0.8.0.md)\n- [0.7.0](releases/0.7.0.md)\n- [0.6.3](releases/0.6.3.md)\n- [0.6.2](releases/0.6.2.md)\n- [0.6.1](releases/0.6.1.md)\n- [0.6.0](releases/0.6.0.md)\n- [0.4.2](releases/0.4.2.md)\n- [0.4.1](releases/0.4.1.md)\n- [0.4.0](releases/0.4.0.md)\n- [0.3.0](releases/0.3.0.md)\n- [0.2.4](releases/0.2.4.md)\n- [0.2.3](releases/0.2.3.md)\n- [0.2.2](releases/0.2.2.md)\n\n## Getting Updates\n\nTo update TaskNotes:\n1. Open Obsidian\n2. Go to Settings → Community Plugins\n3. Find TaskNotes and click \"Update\"\n4. Restart Obsidian if prompted\n\n## Feedback\n\nFound a bug or have a feature request? Please:\n\n- Check existing [GitHub Issues](https://github.com/callumalpass/tasknotes/issues)\n- Create a new issue with details\n","aliases":["/releases/","/releases/"],"toc":[{"level":2,"id":"latest-releases","text":"Latest Releases"},{"level":3,"id":"version-4x-current","text":"Version 4.x (Current)"},{"level":3,"id":"version-3x","text":"Version 3.x"},{"level":3,"id":"version-2x","text":"Version 2.x"},{"level":3,"id":"version-1x","text":"Version 1.x"},{"level":3,"id":"early-versions-0x","text":"Early Versions (0.x)"},{"level":2,"id":"getting-updates","text":"Getting Updates"},{"level":2,"id":"feedback","text":"Feedback"}],"html":"

Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.

\n

Latest Releases#

\n

Version 4.x (Current)#

\n\n

Version 3.x#

\n\n

Version 2.x#

\n\n

Version 1.x#

\n\n

Early Versions (0.x)#

\n\n

Getting Updates#

\n

To update TaskNotes:

\n
    \n
  1. Open Obsidian
  2. \n
  3. Go to Settings → Community Plugins
  4. \n
  5. Find TaskNotes and click "Update"
  6. \n
  7. Restart Obsidian if prompted
  8. \n
\n

Feedback#

\n

Found a bug or have a feature request? Please:

\n
    \n
  • Check existing GitHub Issues
  • \n
  • Create a new issue with details
  • \n
\n","text":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements. Latest Releases# Version 4.x (Current)# 4.11.1 4.11.0 4.10.2 4.10.1 4.10.0 4.9.2 4.9.1 4.9.0 4.8.1 4.8.0 4.7.2 4.7.1 4.7.0 4.6.0 4.5.3 4.5.2 4.5.1 4.5.0 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.1 4.2.0 4.1.3 4.1.2 4.1.1 4.1.0 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0-beta.3 4.0.0-beta.2 4.0.0-beta.1 4.0.0-beta.0 Version 3.x# 3.25.6 3.25.4 3.25.3 3.25.2 3.25.1 3.25.0 3.24.6 3.24.5 3.24.4 3.24.3 3.24.2 3.24.1 3.24.0 3.23.4 3.23.3 3.23.2 3.23.1 3.23.0 3.22.1 3.22.0 3.21.0 3.20.1 3.20.0 3.19.1 3.19.0 3.18.2 3.18.1 3.18.0 3.17.1 3.17.0 3.16.4 3.16.3 3.16.2 3.16.1 3.16.0 3.15.1 3.15.0 3.14.0 3.13.4 3.13.3 3.13.2 3.13.1 3.13.0 3.12.2 3.12.1 3.12.0 3.11.2 3.11.1 3.11.0 3.10.0 3.9.1 3.9.0 3.8.7 3.8.6 3.8.5 3.8.1 3.7.1 3.7.0 3.6.0 3.5.1 3.4.2 3.4.1 3.4.0 3.3.0 3.1.1 3.1.0 3.0.1 3.0.0 Version 2.x# 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 Version 1.x# 1.2.0 1.1.0 1.0.0 Early Versions (0.x)# 0.8.0 0.7.0 0.6.3 0.6.2 0.6.1 0.6.0 0.4.2 0.4.1 0.4.0 0.3.0 0.2.4 0.2.3 0.2.2 Getting Updates# To update TaskNotes: Open Obsidian Go to Settings → Community Plugins Find TaskNotes and click \"Update\" Restart Obsidian if prompted Feedback# Found a bug or have a feature request? Please: Check existing GitHub Issues Create a new issue with details"},{"route":"/obsidian/releases/0.2.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.2.2.md","namespace":"obsidian","relativePath":"releases/0.2.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2\n","aliases":["/releases/0.2.2/","/releases/0.2.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2"},{"route":"/obsidian/releases/0.2.3/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.2.3.md","namespace":"obsidian","relativePath":"releases/0.2.3.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3\n","aliases":["/releases/0.2.3/","/releases/0.2.3/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3"},{"route":"/obsidian/releases/0.2.4/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.2.4.md","namespace":"obsidian","relativePath":"releases/0.2.4.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4\n","aliases":["/releases/0.2.4/","/releases/0.2.4/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4"},{"route":"/obsidian/releases/0.3.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.3.0.md","namespace":"obsidian","relativePath":"releases/0.3.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0\n","aliases":["/releases/0.3.0/","/releases/0.3.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0"},{"route":"/obsidian/releases/0.4.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.4.0.md","namespace":"obsidian","relativePath":"releases/0.4.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0\n","aliases":["/releases/0.4.0/","/releases/0.4.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0"},{"route":"/obsidian/releases/0.4.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.4.1.md","namespace":"obsidian","relativePath":"releases/0.4.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1\n","aliases":["/releases/0.4.1/","/releases/0.4.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1"},{"route":"/obsidian/releases/0.4.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.4.2.md","namespace":"obsidian","relativePath":"releases/0.4.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2\n","aliases":["/releases/0.4.2/","/releases/0.4.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2"},{"route":"/obsidian/releases/0.6.0/","title":"Untitled","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.0.md","namespace":"obsidian","relativePath":"releases/0.6.0.md","raw":"\n","aliases":["/releases/0.6.0/","/releases/0.6.0/"],"toc":[],"html":"","text":""},{"route":"/obsidian/releases/0.6.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.1.md","namespace":"obsidian","relativePath":"releases/0.6.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1\n","aliases":["/releases/0.6.1/","/releases/0.6.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1"},{"route":"/obsidian/releases/0.6.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.2.md","namespace":"obsidian","relativePath":"releases/0.6.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2\n","aliases":["/releases/0.6.2/","/releases/0.6.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2"},{"route":"/obsidian/releases/0.6.3/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.3.md","namespace":"obsidian","relativePath":"releases/0.6.3.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3\n","aliases":["/releases/0.6.3/","/releases/0.6.3/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3"},{"route":"/obsidian/releases/0.7.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.7.0.md","namespace":"obsidian","relativePath":"releases/0.7.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0\n","aliases":["/releases/0.7.0/","/releases/0.7.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0"},{"route":"/obsidian/releases/0.8.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.8.0.md","namespace":"obsidian","relativePath":"releases/0.8.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0\n","aliases":["/releases/0.8.0/","/releases/0.8.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0"},{"route":"/obsidian/releases/1.0.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/1.0.0.md","namespace":"obsidian","relativePath":"releases/1.0.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0\n","aliases":["/releases/1.0.0/","/releases/1.0.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0"},{"route":"/obsidian/releases/1.1.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/1.1.0.md","namespace":"obsidian","relativePath":"releases/1.1.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0\n","aliases":["/releases/1.1.0/","/releases/1.1.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0"},{"route":"/obsidian/releases/1.2.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/1.2.0.md","namespace":"obsidian","relativePath":"releases/1.2.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0\n","aliases":["/releases/1.2.0/","/releases/1.2.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0"},{"route":"/obsidian/releases/2.0.0/","title":"Untitled","description":"TaskNotes 2.0.0 - Major Feature Release","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.0.md","namespace":"obsidian","relativePath":"releases/2.0.0.md","raw":"TaskNotes 2.0.0 - Major Feature Release\n\nMajor New Features:\n\n**Kanban Board View**\n\n- Visual task management with drag-and-drop functionality\n- Dynamic grouping by status, priority, or context\n- Search filtering across all columns\n- Real-time updates and collapsible columns\n\n**Enhanced Pomodoro System**\n\n- SVG progress circle with refined visual timer\n- Persistent session history and statistics tracking\n- Dedicated Pomodoro Statistics view with completion metrics\n- Enhanced UI with improved controls and display\n\n**Advanced Task Filtering & Grouping**\n\n- Unified filtering system with search, status, context, priority filters\n- Date range filtering with overdue task support\n- Flexible grouping options (status, priority, context, due date)\n- Performance-optimized filtering using cache indexes\n\n**Enhanced Recurring Tasks**\n\n- Visual distinction with special styling and indicators\n- Per-date completion tracking with smart UI controls\n- Context menus filtered to prevent status conflicts\n- Clear completion status display for selected dates\n\nUI/UX Improvements:\n\n**Task Management**\n\n- Enhanced task edit modal with improved form layout\n- Context menu (right-click) for quick property changes\n- Autocomplete for contexts and tags in task forms\n- Optimistic UI updates for better responsiveness\n\n**View Enhancements**\n\n- Agenda view with improved layout and timeline organization\n- Enhanced note cards with consistent styling across views\n- Improved calendar integration with better visual indicators\n- Unified card styling system across all views\n\n**Performance & Reliability**\n\n- Migrated to unified CacheManager from legacy FileIndexer\n- DOM reconciliation system for efficient UI updates\n- Enhanced async handling and error management\n- Improved cache update handling and race condition prevention\n\nAdditional Improvements:\n\n- Enhanced due date modal with better styling\n- Improved time tracking UX with visual feedback\n- Better task archival feedback and UI consistency\n- Refined keyboard navigation and accessibility\n- Updated README with comprehensive feature documentation\n\nBug Fixes:\n\n- Fixed 'No due date' group positioning in task list\n- Resolved various UI spacing and alignment issues\n- Improved handling of edge cases in recurring task logic\n- Enhanced stability of cache operations and file handling\n\nThis major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions.\n","aliases":["/releases/2.0.0/","/releases/2.0.0/"],"toc":[],"html":"

TaskNotes 2.0.0 - Major Feature Release

\n

Major New Features:

\n

Kanban Board View

\n
    \n
  • Visual task management with drag-and-drop functionality
  • \n
  • Dynamic grouping by status, priority, or context
  • \n
  • Search filtering across all columns
  • \n
  • Real-time updates and collapsible columns
  • \n
\n

Enhanced Pomodoro System

\n
    \n
  • SVG progress circle with refined visual timer
  • \n
  • Persistent session history and statistics tracking
  • \n
  • Dedicated Pomodoro Statistics view with completion metrics
  • \n
  • Enhanced UI with improved controls and display
  • \n
\n

Advanced Task Filtering & Grouping

\n
    \n
  • Unified filtering system with search, status, context, priority filters
  • \n
  • Date range filtering with overdue task support
  • \n
  • Flexible grouping options (status, priority, context, due date)
  • \n
  • Performance-optimized filtering using cache indexes
  • \n
\n

Enhanced Recurring Tasks

\n
    \n
  • Visual distinction with special styling and indicators
  • \n
  • Per-date completion tracking with smart UI controls
  • \n
  • Context menus filtered to prevent status conflicts
  • \n
  • Clear completion status display for selected dates
  • \n
\n

UI/UX Improvements:

\n

Task Management

\n
    \n
  • Enhanced task edit modal with improved form layout
  • \n
  • Context menu (right-click) for quick property changes
  • \n
  • Autocomplete for contexts and tags in task forms
  • \n
  • Optimistic UI updates for better responsiveness
  • \n
\n

View Enhancements

\n
    \n
  • Agenda view with improved layout and timeline organization
  • \n
  • Enhanced note cards with consistent styling across views
  • \n
  • Improved calendar integration with better visual indicators
  • \n
  • Unified card styling system across all views
  • \n
\n

Performance & Reliability

\n
    \n
  • Migrated to unified CacheManager from legacy FileIndexer
  • \n
  • DOM reconciliation system for efficient UI updates
  • \n
  • Enhanced async handling and error management
  • \n
  • Improved cache update handling and race condition prevention
  • \n
\n

Additional Improvements:

\n
    \n
  • Enhanced due date modal with better styling
  • \n
  • Improved time tracking UX with visual feedback
  • \n
  • Better task archival feedback and UI consistency
  • \n
  • Refined keyboard navigation and accessibility
  • \n
  • Updated README with comprehensive feature documentation
  • \n
\n

Bug Fixes:

\n
    \n
  • Fixed 'No due date' group positioning in task list
  • \n
  • Resolved various UI spacing and alignment issues
  • \n
  • Improved handling of edge cases in recurring task logic
  • \n
  • Enhanced stability of cache operations and file handling
  • \n
\n

This major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions.

\n","text":"TaskNotes 2.0.0 - Major Feature Release Major New Features: Kanban Board View Visual task management with drag-and-drop functionality Dynamic grouping by status, priority, or context Search filtering across all columns Real-time updates and collapsible columns Enhanced Pomodoro System SVG progress circle with refined visual timer Persistent session history and statistics tracking Dedicated Pomodoro Statistics view with completion metrics Enhanced UI with improved controls and display Advanced Task Filtering & Grouping Unified filtering system with search, status, context, priority filters Date range filtering with overdue task support Flexible grouping options (status, priority, context, due date) Performance-optimized filtering using cache indexes Enhanced Recurring Tasks Visual distinction with special styling and indicators Per-date completion tracking with smart UI controls Context menus filtered to prevent status conflicts Clear completion status display for selected dates UI/UX Improvements: Task Management Enhanced task edit modal with improved form layout Context menu (right-click) for quick property changes Autocomplete for contexts and tags in task forms Optimistic UI updates for better responsiveness View Enhancements Agenda view with improved layout and timeline organization Enhanced note cards with consistent styling across views Improved calendar integration with better visual indicators Unified card styling system across all views Performance & Reliability Migrated to unified CacheManager from legacy FileIndexer DOM reconciliation system for efficient UI updates Enhanced async handling and error management Improved cache update handling and race condition prevention Additional Improvements: Enhanced due date modal with better styling Improved time tracking UX with visual feedback Better task archival feedback and UI consistency Refined keyboard navigation and accessibility Updated README with comprehensive feature documentation Bug Fixes: Fixed 'No due date' group positioning in task list Resolved various UI spacing and alignment issues Improved handling of edge cases in recurring task logic Enhanced stability of cache operations and file handling This major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions."},{"route":"/obsidian/releases/2.0.1/","title":"Untitled","description":"Bug Fixes and Enhancements:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.1.md","namespace":"obsidian","relativePath":"releases/2.0.1.md","raw":" ## TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements\r\n\r\n Bug Fixes and Enhancements:\r\n\r\n Recurring Task Improvements:\r\n - Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.)\r\n - Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern\r\n - Enhanced recurring task visual styling with distinctive indicators and backgrounds\r\n - Smart context menus for recurring tasks that prevent conflicting status changes\r\n - Fixed recurrence values not loading properly in task edit modal\r\n\r\n Task Filtering and Grouping:\r\n - Improved 'No due date' group positioning to appear at bottom of task list\r\n - Enhanced FilterService with target date awareness for intelligent recurring task grouping\r\n - Fixed cache integration issues where recurrence changes didn't trigger proper view updates\r\n - All views now properly refresh and regroup tasks when recurrence properties change\r\n\r\n UI and Data Consistency:\r\n - Fixed data format mismatch between stored abbreviations and UI display for day names\r\n - Improved task edit modal to properly convert between storage format and UI format\r\n - Enhanced cache workflow integration for seamless task property updates\r\n - Better synchronization between task edits and view refreshes\r\n\r\n Technical Improvements:\r\n - Added conversion helper methods for consistent day name handling\r\n - Enhanced cache manager with proper recurring task support\r\n - Improved event emission and handling for task updates\r\n - Better error handling and data validation in task modals\r\n\r\n This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving\r\n the overall user experience.\r\n\r\n","aliases":["/releases/2.0.1/","/releases/2.0.1/"],"toc":[{"level":2,"id":"tasknotes-201-recurring-tasks-and-filtering-improvements","text":"TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements"}],"html":"

TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements#

\n

Bug Fixes and Enhancements:

\n

Recurring Task Improvements:

\n
    \n
  • Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.)
  • \n
  • Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern
  • \n
  • Enhanced recurring task visual styling with distinctive indicators and backgrounds
  • \n
  • Smart context menus for recurring tasks that prevent conflicting status changes
  • \n
  • Fixed recurrence values not loading properly in task edit modal
  • \n
\n

Task Filtering and Grouping:

\n
    \n
  • Improved 'No due date' group positioning to appear at bottom of task list
  • \n
  • Enhanced FilterService with target date awareness for intelligent recurring task grouping
  • \n
  • Fixed cache integration issues where recurrence changes didn't trigger proper view updates
  • \n
  • All views now properly refresh and regroup tasks when recurrence properties change
  • \n
\n

UI and Data Consistency:

\n
    \n
  • Fixed data format mismatch between stored abbreviations and UI display for day names
  • \n
  • Improved task edit modal to properly convert between storage format and UI format
  • \n
  • Enhanced cache workflow integration for seamless task property updates
  • \n
  • Better synchronization between task edits and view refreshes
  • \n
\n

Technical Improvements:

\n
    \n
  • Added conversion helper methods for consistent day name handling
  • \n
  • Enhanced cache manager with proper recurring task support
  • \n
  • Improved event emission and handling for task updates
  • \n
  • Better error handling and data validation in task modals
  • \n
\n

This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving\n the overall user experience.

\n","text":"TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements# Bug Fixes and Enhancements: Recurring Task Improvements: Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.) Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern Enhanced recurring task visual styling with distinctive indicators and backgrounds Smart context menus for recurring tasks that prevent conflicting status changes Fixed recurrence values not loading properly in task edit modal Task Filtering and Grouping: Improved 'No due date' group positioning to appear at bottom of task list Enhanced FilterService with target date awareness for intelligent recurring task grouping Fixed cache integration issues where recurrence changes didn't trigger proper view updates All views now properly refresh and regroup tasks when recurrence properties change UI and Data Consistency: Fixed data format mismatch between stored abbreviations and UI display for day names Improved task edit modal to properly convert between storage format and UI format Enhanced cache workflow integration for seamless task property updates Better synchronization between task edits and view refreshes Technical Improvements: Added conversion helper methods for consistent day name handling Enhanced cache manager with proper recurring task support Improved event emission and handling for task updates Better error handling and data validation in task modals This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving the overall user experience."},{"route":"/obsidian/releases/2.0.2/","title":"Untitled","description":"Bug Fixes:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.2.md","namespace":"obsidian","relativePath":"releases/2.0.2.md","raw":"## TaskNotes v2.0.2\r\n\r\nBug Fixes:\r\n- Fixed recurring tasks without due dates not appearing in agenda view\r\n- Recurring tasks now properly show on their scheduled days in agenda view\r\n\r\nSettings Improvements:\r\n- Enhanced Priorities settings tab with comprehensive usability improvements\r\n- Added detailed descriptions, help sections, and column headers\r\n- Added input validation and better visual organization\r\n- Matches the improved usability of the Statuses settings tab\r\n\r\nTechnical Details:\r\n- Modified FilterService date range filtering to properly handle recurring tasks without due dates\r\n- Added logic to check if recurring tasks should appear on any date within the specified range\r\n- Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations\r\n- Maintains full backward compatibility for all existing functionality\n","aliases":["/releases/2.0.2/","/releases/2.0.2/"],"toc":[{"level":2,"id":"tasknotes-v202","text":"TaskNotes v2.0.2"}],"html":"

TaskNotes v2.0.2#

\n

Bug Fixes:

\n
    \n
  • Fixed recurring tasks without due dates not appearing in agenda view
  • \n
  • Recurring tasks now properly show on their scheduled days in agenda view
  • \n
\n

Settings Improvements:

\n
    \n
  • Enhanced Priorities settings tab with comprehensive usability improvements
  • \n
  • Added detailed descriptions, help sections, and column headers
  • \n
  • Added input validation and better visual organization
  • \n
  • Matches the improved usability of the Statuses settings tab
  • \n
\n

Technical Details:

\n
    \n
  • Modified FilterService date range filtering to properly handle recurring tasks without due dates
  • \n
  • Added logic to check if recurring tasks should appear on any date within the specified range
  • \n
  • Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations
  • \n
  • Maintains full backward compatibility for all existing functionality
  • \n
\n","text":"TaskNotes v2.0.2# Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Settings Improvements: Enhanced Priorities settings tab with comprehensive usability improvements Added detailed descriptions, help sections, and column headers Added input validation and better visual organization Matches the improved usability of the Statuses settings tab Technical Details: Modified FilterService date range filtering to properly handle recurring tasks without due dates Added logic to check if recurring tasks should appear on any date within the specified range Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations Maintains full backward compatibility for all existing functionality"},{"route":"/obsidian/releases/2.0.3/","title":"Untitled","description":"Bug Fixes:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.3.md","namespace":"obsidian","relativePath":"releases/2.0.3.md","raw":"\r\nBug Fixes:\r\n- Fixed recurring tasks without due dates not appearing in agenda view\r\n- Recurring tasks now properly show on their scheduled days in agenda view\r\n\r\nCommand Improvements:\r\n- Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout)\r\n- Removed popout window commands for cleaner command palette\r\n- Added 'Refresh TaskNotes cache' command for troubleshooting\r\n- Simplified ribbon icons to focus on core functionality\r\n\r\nTechnical Details:\r\n- Enhanced FilterService initial task set logic to include recurring tasks without due dates\r\n- Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion\r\n- Added async processing with batched performance optimizations\r\n- Maintained backward compatibility and existing performance characteristics\r\n- Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries\r\n\r\nThe agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days.\n","aliases":["/releases/2.0.3/","/releases/2.0.3/"],"toc":[],"html":"

Bug Fixes:

\n
    \n
  • Fixed recurring tasks without due dates not appearing in agenda view
  • \n
  • Recurring tasks now properly show on their scheduled days in agenda view
  • \n
\n

Command Improvements:

\n
    \n
  • Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout)
  • \n
  • Removed popout window commands for cleaner command palette
  • \n
  • Added 'Refresh TaskNotes cache' command for troubleshooting
  • \n
  • Simplified ribbon icons to focus on core functionality
  • \n
\n

Technical Details:

\n
    \n
  • Enhanced FilterService initial task set logic to include recurring tasks without due dates
  • \n
  • Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion
  • \n
  • Added async processing with batched performance optimizations
  • \n
  • Maintained backward compatibility and existing performance characteristics
  • \n
  • Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries
  • \n
\n

The agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days.

\n","text":"Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Command Improvements: Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout) Removed popout window commands for cleaner command palette Added 'Refresh TaskNotes cache' command for troubleshooting Simplified ribbon icons to focus on core functionality Technical Details: Enhanced FilterService initial task set logic to include recurring tasks without due dates Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion Added async processing with batched performance optimizations Maintained backward compatibility and existing performance characteristics Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries The agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days."},{"route":"/obsidian/releases/2.0.4/","title":"TaskNotes v2.0.4","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.4.md","namespace":"obsidian","relativePath":"releases/2.0.4.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4\r\n\r\n# TaskNotes v2.0.4\r\n\r\n- Allow multiple statuses to be filtered for at the same time, bringing\r\nstatus filtering in line with context and priority filtering\r\n- Fix flickering during kanban drag and drop\n","aliases":["/releases/2.0.4/","/releases/2.0.4/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4

\n
    \n
  • Allow multiple statuses to be filtered for at the same time, bringing\nstatus filtering in line with context and priority filtering
  • \n
  • Fix flickering during kanban drag and drop
  • \n
\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4 Allow multiple statuses to be filtered for at the same time, bringing status filtering in line with context and priority filtering Fix flickering during kanban drag and drop"},{"route":"/obsidian/releases/2.1.0/","title":"TaskNotes v2.1.0 - Major Feature Release","description":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.1.0.md","namespace":"obsidian","relativePath":"releases/2.1.0.md","raw":"# TaskNotes v2.1.0 - Major Feature Release\r\n\r\nThis release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.\r\n\r\n## NEW FEATURES:\r\n\r\n**Instant Task Conversion**\r\n- One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons\r\n- Streamlined workflow for transforming simple tasks into structured task files\r\n- Configurable via settings to enable/disable the feature\r\n\r\n**Interactive Task Link Overlays**\r\n- Live task previews displayed on wikilinks in live preview mode\r\n- Hover and click interactions for editing tasks without leaving the current note\r\n- Context menus and inline task information display\r\n- Smart detection of task-related wikilinks with automatic enhancement\r\n\r\n**Enhanced Date Handling**\r\n- Improved overdue task detection that considers both due and scheduled dates\r\n- Better date consistency across all views and components\r\n- Expanded field mapping support for time tracking and completion data\r\n\r\n## IMPROVEMENTS:\r\n\r\n**Performance & Reliability**\r\n- Comprehensive resource cleanup to prevent memory leaks\r\n- Enhanced error handling with better user feedback\r\n- Performance optimizations in calendar view and task rendering\r\n- Improved DOM reconciliation and widget management\r\n\r\n**Accessibility & UX**\r\n- Enhanced accessibility with ARIA attributes and keyboard navigation\r\n- Consistent BEM CSS naming across all components\r\n- Better input validation and security measures\r\n- Improved visual consistency throughout the interface\r\n\r\n**Technical Enhancements**\r\n- Fixed deprecated Obsidian API usage for better compatibility\r\n- Standardized date handling using date-fns library\r\n- Configurable pomodoro field mapping\r\n- Better separation of concerns in component architecture\r\n\r\nThis release maintains full backward compatibility while adding new features that enhance the daily task management workflow.\n","aliases":["/releases/2.1.0/","/releases/2.1.0/"],"toc":[{"level":2,"id":"new-features","text":"NEW FEATURES:"},{"level":2,"id":"improvements","text":"IMPROVEMENTS:"}],"html":"

This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.

\n

NEW FEATURES:#

\n

Instant Task Conversion

\n
    \n
  • One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons
  • \n
  • Streamlined workflow for transforming simple tasks into structured task files
  • \n
  • Configurable via settings to enable/disable the feature
  • \n
\n

Interactive Task Link Overlays

\n
    \n
  • Live task previews displayed on wikilinks in live preview mode
  • \n
  • Hover and click interactions for editing tasks without leaving the current note
  • \n
  • Context menus and inline task information display
  • \n
  • Smart detection of task-related wikilinks with automatic enhancement
  • \n
\n

Enhanced Date Handling

\n
    \n
  • Improved overdue task detection that considers both due and scheduled dates
  • \n
  • Better date consistency across all views and components
  • \n
  • Expanded field mapping support for time tracking and completion data
  • \n
\n

IMPROVEMENTS:#

\n

Performance & Reliability

\n
    \n
  • Comprehensive resource cleanup to prevent memory leaks
  • \n
  • Enhanced error handling with better user feedback
  • \n
  • Performance optimizations in calendar view and task rendering
  • \n
  • Improved DOM reconciliation and widget management
  • \n
\n

Accessibility & UX

\n
    \n
  • Enhanced accessibility with ARIA attributes and keyboard navigation
  • \n
  • Consistent BEM CSS naming across all components
  • \n
  • Better input validation and security measures
  • \n
  • Improved visual consistency throughout the interface
  • \n
\n

Technical Enhancements

\n
    \n
  • Fixed deprecated Obsidian API usage for better compatibility
  • \n
  • Standardized date handling using date-fns library
  • \n
  • Configurable pomodoro field mapping
  • \n
  • Better separation of concerns in component architecture
  • \n
\n

This release maintains full backward compatibility while adding new features that enhance the daily task management workflow.

\n","text":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience. NEW FEATURES:# Instant Task Conversion One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons Streamlined workflow for transforming simple tasks into structured task files Configurable via settings to enable/disable the feature Interactive Task Link Overlays Live task previews displayed on wikilinks in live preview mode Hover and click interactions for editing tasks without leaving the current note Context menus and inline task information display Smart detection of task-related wikilinks with automatic enhancement Enhanced Date Handling Improved overdue task detection that considers both due and scheduled dates Better date consistency across all views and components Expanded field mapping support for time tracking and completion data IMPROVEMENTS:# Performance & Reliability Comprehensive resource cleanup to prevent memory leaks Enhanced error handling with better user feedback Performance optimizations in calendar view and task rendering Improved DOM reconciliation and widget management Accessibility & UX Enhanced accessibility with ARIA attributes and keyboard navigation Consistent BEM CSS naming across all components Better input validation and security measures Improved visual consistency throughout the interface Technical Enhancements Fixed deprecated Obsidian API usage for better compatibility Standardized date handling using date-fns library Configurable pomodoro field mapping Better separation of concerns in component architecture This release maintains full backward compatibility while adding new features that enhance the daily task management workflow."},{"route":"/obsidian/releases/2.2.0/","title":"TaskNotes v2.2.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.0.md","namespace":"obsidian","relativePath":"releases/2.2.0.md","raw":"# TaskNotes v2.2.0\r\n\r\n## Major Features\r\n\r\n- Task Deletion: Added task deletion functionality with confirmation modal and proper event handling\r\n- Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data\r\n- Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic\r\n\r\n## Core Improvements\r\n\r\n- Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase\r\n- Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture\r\n- Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks\r\n- Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy\r\n\r\n## UI/UX Enhancements\r\n\r\n- Visual Consistency: Updated font sizes and UI element widths for better readability\r\n- Pomodoro Button Styling: Enhanced button styles with consistent visual feedback\r\n- Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles\r\n\r\n## Technical Improvements\r\n\r\n- Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling\r\n- ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset\r\n- Performance Optimizations: Various refactoring improvements for better code maintainability and performance\r\n\r\n","aliases":["/releases/2.2.0/","/releases/2.2.0/"],"toc":[{"level":2,"id":"major-features","text":"Major Features"},{"level":2,"id":"core-improvements","text":"Core Improvements"},{"level":2,"id":"uiux-enhancements","text":"UI/UX Enhancements"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"}],"html":"

Major Features#

\n
    \n
  • Task Deletion: Added task deletion functionality with confirmation modal and proper event handling
  • \n
  • Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data
  • \n
  • Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic
  • \n
\n

Core Improvements#

\n
    \n
  • Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase
  • \n
  • Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture
  • \n
  • Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks
  • \n
  • Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy
  • \n
\n

UI/UX Enhancements#

\n
    \n
  • Visual Consistency: Updated font sizes and UI element widths for better readability
  • \n
  • Pomodoro Button Styling: Enhanced button styles with consistent visual feedback
  • \n
  • Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles
  • \n
\n

Technical Improvements#

\n
    \n
  • Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling
  • \n
  • ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset
  • \n
  • Performance Optimizations: Various refactoring improvements for better code maintainability and performance
  • \n
\n","text":"Major Features# Task Deletion: Added task deletion functionality with confirmation modal and proper event handling Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic Core Improvements# Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy UI/UX Enhancements# Visual Consistency: Updated font sizes and UI element widths for better readability Pomodoro Button Styling: Enhanced button styles with consistent visual feedback Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles Technical Improvements# Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset Performance Optimizations: Various refactoring improvements for better code maintainability and performance"},{"route":"/obsidian/releases/2.2.1/","title":"Untitled","description":"Fix #22 and #24","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.1.md","namespace":"obsidian","relativePath":"releases/2.2.1.md","raw":"Fix #22 and #24 \n","aliases":["/releases/2.2.1/","/releases/2.2.1/"],"toc":[],"html":"

Fix #22 and #24

\n","text":"Fix #22 and #24"},{"route":"/obsidian/releases/2.2.2/","title":"Untitled","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.2.md","namespace":"obsidian","relativePath":"releases/2.2.2.md","raw":"\n","aliases":["/releases/2.2.2/","/releases/2.2.2/"],"toc":[],"html":"","text":""},{"route":"/obsidian/releases/2.2.3/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.3.md","namespace":"obsidian","relativePath":"releases/2.2.3.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3\n","aliases":["/releases/2.2.3/","/releases/2.2.3/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3"},{"route":"/obsidian/releases/3.0.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.0.0.md","namespace":"obsidian","relativePath":"releases/3.0.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0\n","aliases":["/releases/3.0.0/","/releases/3.0.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0"},{"route":"/obsidian/releases/3.0.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.0.1.md","namespace":"obsidian","relativePath":"releases/3.0.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1\n","aliases":["/releases/3.0.1/","/releases/3.0.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1"},{"route":"/obsidian/releases/3.1.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.1.0.md","namespace":"obsidian","relativePath":"releases/3.1.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0\n","aliases":["/releases/3.1.0/","/releases/3.1.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0"},{"route":"/obsidian/releases/3.1.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.1.1.md","namespace":"obsidian","relativePath":"releases/3.1.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1\n","aliases":["/releases/3.1.1/","/releases/3.1.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1"},{"route":"/obsidian/releases/3.10.0/","title":"Release Notes: 3.10.0","description":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.10.0.md","namespace":"obsidian","relativePath":"releases/3.10.0.md","raw":"# Release Notes: 3.10.0\r\n\r\n This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.\r\n\r\n## New Features\r\n\r\n### Option to Store Task Title in Filename\r\n\r\nA new setting, storeTitleInFilename, is available under \"Task Filenames\" in the settings tab. This feature changes how task titles are stored.\r\n\r\n**Implementation Details:**\r\n\r\n- When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter.\r\n- For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks.\r\n- When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity.\r\n- Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom).\r\n- This setting is disabled by default.\r\n\r\n### Status Bar Component for Tracked Tasks\r\n\r\nA new UI component has been added to the app's status bar to display tasks with active time-tracking sessions.\r\n\r\n**Functionality:**\r\n\r\n- When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip.\r\n- When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks.\r\n- The status bar item is hidden when no tasks are being tracked.\r\n- This feature is controlled by the \"Show tracked tasks in status bar\" setting and is disabled by default.\r\n\r\n### Customizable First Day of Week for Mini Calendar\r\n\r\nThe mini calendar view now respects the \"First day of the week\" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday).\r\n\r\n## Bug Fixes\r\n\r\n- Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations.\r\n- File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed.\r\n\r\n## Internal Improvements & Documentation\r\n\r\n- Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames.\r\n- `StatusBarService`: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling.\r\n- Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports.\r\n- Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail.\r\n","aliases":["/releases/3.10.0/","/releases/3.10.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"option-to-store-task-title-in-filename","text":"Option to Store Task Title in Filename"},{"level":3,"id":"status-bar-component-for-tracked-tasks","text":"Status Bar Component for Tracked Tasks"},{"level":3,"id":"customizable-first-day-of-week-for-mini-calendar","text":"Customizable First Day of Week for Mini Calendar"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":2,"id":"internal-improvements-documentation","text":"Internal Improvements & Documentation"}],"html":"

This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.

\n

New Features#

\n

Option to Store Task Title in Filename#

\n

A new setting, storeTitleInFilename, is available under "Task Filenames" in the settings tab. This feature changes how task titles are stored.

\n

Implementation Details:

\n
    \n
  • When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter.
  • \n
  • For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks.
  • \n
  • When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity.
  • \n
  • Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom).
  • \n
  • This setting is disabled by default.
  • \n
\n

Status Bar Component for Tracked Tasks#

\n

A new UI component has been added to the app's status bar to display tasks with active time-tracking sessions.

\n

Functionality:

\n
    \n
  • When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip.
  • \n
  • When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks.
  • \n
  • The status bar item is hidden when no tasks are being tracked.
  • \n
  • This feature is controlled by the "Show tracked tasks in status bar" setting and is disabled by default.
  • \n
\n

Customizable First Day of Week for Mini Calendar#

\n

The mini calendar view now respects the "First day of the week" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday).

\n

Bug Fixes#

\n
    \n
  • Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations.
  • \n
  • File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed.
  • \n
\n

Internal Improvements & Documentation#

\n
    \n
  • Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames.
  • \n
  • StatusBarService: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling.
  • \n
  • Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports.
  • \n
  • Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail.
  • \n
\n","text":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements. New Features# Option to Store Task Title in Filename# A new setting, storeTitleInFilename, is available under \"Task Filenames\" in the settings tab. This feature changes how task titles are stored. Implementation Details: When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter. For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks. When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity. Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom). This setting is disabled by default. Status Bar Component for Tracked Tasks# A new UI component has been added to the app's status bar to display tasks with active time-tracking sessions. Functionality: When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip. When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks. The status bar item is hidden when no tasks are being tracked. This feature is controlled by the \"Show tracked tasks in status bar\" setting and is disabled by default. Customizable First Day of Week for Mini Calendar# The mini calendar view now respects the \"First day of the week\" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday). Bug Fixes# Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations. File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed. Internal Improvements & Documentation# Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames. StatusBarService: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling. Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports. Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail."},{"route":"/obsidian/releases/3.11.0/","title":"Release Notes: 3.11.0","description":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.11.0.md","namespace":"obsidian","relativePath":"releases/3.11.0.md","raw":"# Release Notes: 3.11.0\r\n\r\nThis release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.\r\n\r\n## New Features\r\n\r\n### Project Management\r\n\r\nA new project management system has been integrated, allowing for better organization and tracking of tasks within projects.\r\n\r\n- **Note-Based Projects**: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note.\r\n- **Project Selection UI**: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes.\r\n- **Filtering and Grouping by Project**:\r\n - The Filter Bar in all views now includes a \"Project\" filter, allowing you to see tasks for one or more specific projects.\r\n - The \"Group By\" option now includes \"Project\", which organizes the Task List and Kanban views by project.\r\n- **Clickable Project Links**: In task cards and other views, project names are now clickable links that take you directly to the project note.\r\n\r\n### Workflow and UI Enhancements\r\n\r\n- **Redesigned Pomodoro Timer**: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience.\r\n - **New Interface**: A more compact and visually appealing interface.\r\n - **Time Adjustment**: You can now add or subtract time from the current session or the prepared timer.\r\n - **Skip Break**: A \"Skip break\" button is now available after a work session.\r\n- **Enhanced Pomodoro Stats**: The Pomodoro statistics view has been improved to provide more insights.\r\n - **Overview Section**: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance.\r\n- **Instant Task Conversion**: The \"Convert task to TaskNote\" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction.\r\n- **Quick Actions for Current Task**: A new command, \"Quick actions for current task,\" allows you to open the action palette for the currently active TaskNote, providing quick access to common operations.\r\n- **Improved Sorting Logic**: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: `scheduled date` -> `due date` -> `priority` -> `title`. This ensures a more predictable and logical ordering of tasks.\r\n- **Archive Button in Edit Modal**: An \"Archive\" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks.\r\n- **Week Start Day Setting**: All calendar views now respect the \"Start week on\" setting from Obsidian's calendar preferences.\r\n\r\n## Bug Fixes and Minor Improvements\r\n\r\n- **Recurring Task Date Consistency**: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views.\r\n- **Pomodoro Daily Note Integration**: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries.\r\n- **Template Processing**:\r\n - The `{{parentNote}}` template variable now correctly resolves to a properly formatted markdown link.\r\n - YAML frontmatter in templates is now processed more safely to avoid parsing errors.\r\n- **Date Validation**: The `complete_instances` field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity.\r\n- **Natural Language Processing**: The natural language parser now correctly applies scheduled times (e.g., \"do something at 5pm\") to created tasks.\r\n- **Agenda View Quick Select**: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed.\r\n- **Styling and CSS**: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals.\r\n- **Documentation**:\r\n - The documentation has been updated to reflect the new project management features.\r\n - New workflow guides for \"Habit Tracking\" and \"Project Management\" have been added.\r\n\r\n","aliases":["/releases/3.11.0/","/releases/3.11.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-management","text":"Project Management"},{"level":3,"id":"workflow-and-ui-enhancements","text":"Workflow and UI Enhancements"},{"level":2,"id":"bug-fixes-and-minor-improvements","text":"Bug Fixes and Minor Improvements"}],"html":"

This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.

\n

New Features#

\n

Project Management#

\n

A new project management system has been integrated, allowing for better organization and tracking of tasks within projects.

\n
    \n
  • Note-Based Projects: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note.
  • \n
  • Project Selection UI: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes.
  • \n
  • Filtering and Grouping by Project:
      \n
    • The Filter Bar in all views now includes a "Project" filter, allowing you to see tasks for one or more specific projects.
    • \n
    • The "Group By" option now includes "Project", which organizes the Task List and Kanban views by project.
    • \n
    \n
  • \n
  • Clickable Project Links: In task cards and other views, project names are now clickable links that take you directly to the project note.
  • \n
\n

Workflow and UI Enhancements#

\n
    \n
  • Redesigned Pomodoro Timer: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience.
      \n
    • New Interface: A more compact and visually appealing interface.
    • \n
    • Time Adjustment: You can now add or subtract time from the current session or the prepared timer.
    • \n
    • Skip Break: A "Skip break" button is now available after a work session.
    • \n
    \n
  • \n
  • Enhanced Pomodoro Stats: The Pomodoro statistics view has been improved to provide more insights.
      \n
    • Overview Section: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance.
    • \n
    \n
  • \n
  • Instant Task Conversion: The "Convert task to TaskNote" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction.
  • \n
  • Quick Actions for Current Task: A new command, "Quick actions for current task," allows you to open the action palette for the currently active TaskNote, providing quick access to common operations.
  • \n
  • Improved Sorting Logic: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: scheduled date -> due date -> priority -> title. This ensures a more predictable and logical ordering of tasks.
  • \n
  • Archive Button in Edit Modal: An "Archive" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks.
  • \n
  • Week Start Day Setting: All calendar views now respect the "Start week on" setting from Obsidian's calendar preferences.
  • \n
\n

Bug Fixes and Minor Improvements#

\n
    \n
  • Recurring Task Date Consistency: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views.
  • \n
  • Pomodoro Daily Note Integration: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries.
  • \n
  • Template Processing:
      \n
    • The {{parentNote}} template variable now correctly resolves to a properly formatted markdown link.
    • \n
    • YAML frontmatter in templates is now processed more safely to avoid parsing errors.
    • \n
    \n
  • \n
  • Date Validation: The complete_instances field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity.
  • \n
  • Natural Language Processing: The natural language parser now correctly applies scheduled times (e.g., "do something at 5pm") to created tasks.
  • \n
  • Agenda View Quick Select: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed.
  • \n
  • Styling and CSS: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals.
  • \n
  • Documentation:
      \n
    • The documentation has been updated to reflect the new project management features.
    • \n
    • New workflow guides for "Habit Tracking" and "Project Management" have been added.
    • \n
    \n
  • \n
\n","text":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes. New Features# Project Management# A new project management system has been integrated, allowing for better organization and tracking of tasks within projects. Note-Based Projects: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note. Project Selection UI: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes. Filtering and Grouping by Project: The Filter Bar in all views now includes a \"Project\" filter, allowing you to see tasks for one or more specific projects. The \"Group By\" option now includes \"Project\", which organizes the Task List and Kanban views by project. Clickable Project Links: In task cards and other views, project names are now clickable links that take you directly to the project note. Workflow and UI Enhancements# Redesigned Pomodoro Timer: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience. New Interface: A more compact and visually appealing interface. Time Adjustment: You can now add or subtract time from the current session or the prepared timer. Skip Break: A \"Skip break\" button is now available after a work session. Enhanced Pomodoro Stats: The Pomodoro statistics view has been improved to provide more insights. Overview Section: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance. Instant Task Conversion: The \"Convert task to TaskNote\" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction. Quick Actions for Current Task: A new command, \"Quick actions for current task,\" allows you to open the action palette for the currently active TaskNote, providing quick access to common operations. Improved Sorting Logic: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: scheduled date -> due date -> priority -> title. This ensures a more predictable and logical ordering of tasks. Archive Button in Edit Modal: An \"Archive\" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks. Week Start Day Setting: All calendar views now respect the \"Start week on\" setting from Obsidian's calendar preferences. Bug Fixes and Minor Improvements# Recurring Task Date Consistency: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views. Pomodoro Daily Note Integration: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries. Template Processing: The {{parentNote}} template variable now correctly resolves to a properly formatted markdown link. YAML frontmatter in templates is now processed more safely to avoid parsing errors. Date Validation: The complete_instances field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity. Natural Language Processing: The natural language parser now correctly applies scheduled times (e.g., \"do something at 5pm\") to created tasks. Agenda View Quick Select: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed. Styling and CSS: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals. Documentation: The documentation has been updated to reflect the new project management features. New workflow guides for \"Habit Tracking\" and \"Project Management\" have been added."},{"route":"/obsidian/releases/3.11.1/","title":"Release Notes 3.11.1","description":"This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.11.1.md","namespace":"obsidian","relativePath":"releases/3.11.1.md","raw":"# Release Notes 3.11.1\r\n\r\n## API Modernization & Performance Improvements\r\n\r\nThis release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.\r\n\r\n### Improved autocomplete\r\n\r\n- Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API\r\n - Better keyboard navigation and visual consistency\r\n - More responsive type-ahead support for contexts and tags in task modals\r\n\r\n### API modernization\r\n\r\n- Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications\r\n - Eliminates risk of data corruption during migration processes\r\n - More reliable handling of YAML frontmatter updates\r\n- Native Link Parsing: Switched to Obsidian's built-in parseLinktext API\r\n - More robust wikilink parsing with better edge case handling\r\n - Improved consistency with Obsidian's internal link processing\r\n- Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage\r\n - Fixes issue where settings were shared across different vaults\r\n - Each vault now maintains its own view state and preferences\r\n\r\n## Bug fixes & stability\r\n\r\n- Memory Leak Prevention: Properly register and cleanup event listeners\r\n - Event listeners are now tracked with EventRef objects for proper cleanup\r\n - Prevents memory leaks when plugin is disabled or reloaded\r\n- Debounce Optimization: Uses Obsidian's built-in debounce function\r\n - More efficient calendar refresh operations\r\n - Better performance consistency\r\n- UI Polish: Fixed sentence case issues throughout the interface\r\n\r\n## Security & reliability\r\n\r\n- Resource Cleanup: Enhanced plugin lifecycle management\r\n - Better cleanup of event listeners and cached data\r\n - Improved plugin disable/enable reliability\r\n\r\n","aliases":["/releases/3.11.1/","/releases/3.11.1/"],"toc":[{"level":2,"id":"api-modernization-performance-improvements","text":"API Modernization & Performance Improvements"},{"level":3,"id":"improved-autocomplete","text":"Improved autocomplete"},{"level":3,"id":"api-modernization","text":"API modernization"},{"level":2,"id":"bug-fixes-stability","text":"Bug fixes & stability"},{"level":2,"id":"security-reliability","text":"Security & reliability"}],"html":"

API Modernization & Performance Improvements#

\n

This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.

\n

Improved autocomplete#

\n
    \n
  • Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API
      \n
    • Better keyboard navigation and visual consistency
    • \n
    • More responsive type-ahead support for contexts and tags in task modals
    • \n
    \n
  • \n
\n

API modernization#

\n
    \n
  • Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications
      \n
    • Eliminates risk of data corruption during migration processes
    • \n
    • More reliable handling of YAML frontmatter updates
    • \n
    \n
  • \n
  • Native Link Parsing: Switched to Obsidian's built-in parseLinktext API
      \n
    • More robust wikilink parsing with better edge case handling
    • \n
    • Improved consistency with Obsidian's internal link processing
    • \n
    \n
  • \n
  • Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage
      \n
    • Fixes issue where settings were shared across different vaults
    • \n
    • Each vault now maintains its own view state and preferences
    • \n
    \n
  • \n
\n

Bug fixes & stability#

\n
    \n
  • Memory Leak Prevention: Properly register and cleanup event listeners
      \n
    • Event listeners are now tracked with EventRef objects for proper cleanup
    • \n
    • Prevents memory leaks when plugin is disabled or reloaded
    • \n
    \n
  • \n
  • Debounce Optimization: Uses Obsidian's built-in debounce function
      \n
    • More efficient calendar refresh operations
    • \n
    • Better performance consistency
    • \n
    \n
  • \n
  • UI Polish: Fixed sentence case issues throughout the interface
  • \n
\n

Security & reliability#

\n
    \n
  • Resource Cleanup: Enhanced plugin lifecycle management
      \n
    • Better cleanup of event listeners and cached data
    • \n
    • Improved plugin disable/enable reliability
    • \n
    \n
  • \n
\n","text":"API Modernization & Performance Improvements# This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management. Improved autocomplete# Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API Better keyboard navigation and visual consistency More responsive type-ahead support for contexts and tags in task modals API modernization# Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications Eliminates risk of data corruption during migration processes More reliable handling of YAML frontmatter updates Native Link Parsing: Switched to Obsidian's built-in parseLinktext API More robust wikilink parsing with better edge case handling Improved consistency with Obsidian's internal link processing Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage Fixes issue where settings were shared across different vaults Each vault now maintains its own view state and preferences Bug fixes & stability# Memory Leak Prevention: Properly register and cleanup event listeners Event listeners are now tracked with EventRef objects for proper cleanup Prevents memory leaks when plugin is disabled or reloaded Debounce Optimization: Uses Obsidian's built-in debounce function More efficient calendar refresh operations Better performance consistency UI Polish: Fixed sentence case issues throughout the interface Security & reliability# Resource Cleanup: Enhanced plugin lifecycle management Better cleanup of event listeners and cached data Improved plugin disable/enable reliability"},{"route":"/obsidian/releases/3.11.2/","title":"Release Notes - 3.11.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.11.2.md","namespace":"obsidian","relativePath":"releases/3.11.2.md","raw":"# Release Notes - 3.11.2\r\n\r\n## Internal Improvements\r\n\r\n### API Standardization\r\n\r\n- Replaced custom wikilink parsing with Obsidian's native `parseLinktext` API\r\n- Migrated from custom debounce function to Obsidian's built-in debounce utility\r\n\r\n### Files Updated\r\n\r\n- TaskLinkOverlay.ts: Updated wikilink parsing\r\n- FilterService.ts: Improved project link resolution\r\n- TaskLinkDetectionService.ts: Simplified link detection\r\n- MinimalNativeCache.ts: Standardized project link handling\r\n- KanbanView.ts: Replaced custom debounce implementation\r\n- Test files: Updated mocks accordingly\r\n","aliases":["/releases/3.11.2/","/releases/3.11.2/"],"toc":[{"level":2,"id":"internal-improvements","text":"Internal Improvements"},{"level":3,"id":"api-standardization","text":"API Standardization"},{"level":3,"id":"files-updated","text":"Files Updated"}],"html":"

Internal Improvements#

\n

API Standardization#

\n
    \n
  • Replaced custom wikilink parsing with Obsidian's native parseLinktext API
  • \n
  • Migrated from custom debounce function to Obsidian's built-in debounce utility
  • \n
\n

Files Updated#

\n
    \n
  • TaskLinkOverlay.ts: Updated wikilink parsing
  • \n
  • FilterService.ts: Improved project link resolution
  • \n
  • TaskLinkDetectionService.ts: Simplified link detection
  • \n
  • MinimalNativeCache.ts: Standardized project link handling
  • \n
  • KanbanView.ts: Replaced custom debounce implementation
  • \n
  • Test files: Updated mocks accordingly
  • \n
\n","text":"Internal Improvements# API Standardization# Replaced custom wikilink parsing with Obsidian's native parseLinktext API Migrated from custom debounce function to Obsidian's built-in debounce utility Files Updated# TaskLinkOverlay.ts: Updated wikilink parsing FilterService.ts: Improved project link resolution TaskLinkDetectionService.ts: Simplified link detection MinimalNativeCache.ts: Standardized project link handling KanbanView.ts: Replaced custom debounce implementation Test files: Updated mocks accordingly"},{"route":"/obsidian/releases/3.12.0/","title":"Release Notes - 3.12.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.12.0.md","namespace":"obsidian","relativePath":"releases/3.12.0.md","raw":"# Release Notes - 3.12.0\r\n\r\n## New Features\r\n\r\n### Project Subtasks Widget\r\n\r\n- Add a collapsible widget that displays tasks linked to the current project note\r\n- Widget appears automatically in project notes and shows all tasks that reference the rpoject\r\n- Includes collapsible interface with persistent state across sessions\r\n- Updates automatically when tasks are modified or deleted\r\n- Can be enabled or disabled in plugin settings under \"Show project subtasks widget\"\r\n\r\n## Bug Fixes\r\n\r\n### FilterBar Improvements\r\n\r\n- Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138)\r\n- Fixed archived tasks' contexts and projects still appearing in filter bar (#139)\r\n- Resolved FilterBar showing projects with [[]] brackets\r\n- Fixed empty status list display on initial load\r\n- Improved initialization reliability with better event handling\r\n\r\n### Task Display\r\n\r\n- Fixed wikilink alias handling in TaskCard and inline displays (#145, #147)\r\n- Fixed projects not loading correctly in task edit modal (#141)\r\n- Improved cursor positioning in live preview mode\r\n\r\n## Documentation\r\n\r\n- Added documentation for project subtasks widget feature\r\n- Updated inline task integration documentation\r\n- Added configuration settings documentation\r\n","aliases":["/releases/3.12.0/","/releases/3.12.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-subtasks-widget","text":"Project Subtasks Widget"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filterbar-improvements","text":"FilterBar Improvements"},{"level":3,"id":"task-display","text":"Task Display"},{"level":2,"id":"documentation","text":"Documentation"}],"html":"

New Features#

\n

Project Subtasks Widget#

\n
    \n
  • Add a collapsible widget that displays tasks linked to the current project note
  • \n
  • Widget appears automatically in project notes and shows all tasks that reference the rpoject
  • \n
  • Includes collapsible interface with persistent state across sessions
  • \n
  • Updates automatically when tasks are modified or deleted
  • \n
  • Can be enabled or disabled in plugin settings under "Show project subtasks widget"
  • \n
\n

Bug Fixes#

\n

FilterBar Improvements#

\n
    \n
  • Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138)
  • \n
  • Fixed archived tasks' contexts and projects still appearing in filter bar (#139)
  • \n
  • Resolved FilterBar showing projects with [[]] brackets
  • \n
  • Fixed empty status list display on initial load
  • \n
  • Improved initialization reliability with better event handling
  • \n
\n

Task Display#

\n
    \n
  • Fixed wikilink alias handling in TaskCard and inline displays (#145, #147)
  • \n
  • Fixed projects not loading correctly in task edit modal (#141)
  • \n
  • Improved cursor positioning in live preview mode
  • \n
\n

Documentation#

\n
    \n
  • Added documentation for project subtasks widget feature
  • \n
  • Updated inline task integration documentation
  • \n
  • Added configuration settings documentation
  • \n
\n","text":"New Features# Project Subtasks Widget# Add a collapsible widget that displays tasks linked to the current project note Widget appears automatically in project notes and shows all tasks that reference the rpoject Includes collapsible interface with persistent state across sessions Updates automatically when tasks are modified or deleted Can be enabled or disabled in plugin settings under \"Show project subtasks widget\" Bug Fixes# FilterBar Improvements# Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138) Fixed archived tasks' contexts and projects still appearing in filter bar (#139) Resolved FilterBar showing projects with [[]] brackets Fixed empty status list display on initial load Improved initialization reliability with better event handling Task Display# Fixed wikilink alias handling in TaskCard and inline displays (#145, #147) Fixed projects not loading correctly in task edit modal (#141) Improved cursor positioning in live preview mode Documentation# Added documentation for project subtasks widget feature Updated inline task integration documentation Added configuration settings documentation"},{"route":"/obsidian/releases/3.12.1/","title":"Release Notes - 3.12.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.12.1.md","namespace":"obsidian","relativePath":"releases/3.12.1.md","raw":"# Release Notes - 3.12.1\r\n\r\n## New Features\r\n\r\n### Project Subtasks Widget Enhancements\r\n\r\n- New button for task creation - Added \"New\" button to widget header for quick task creation\r\n- Auto-populated project field - New tasks automatically reference the current note as their project\r\n- Improved positioning - Widget now appears at the end of documents for better user experience\r\n- Improve visual design - Added dashed border to indicate virtual/generated content and improved styling\r\n\r\n## Bug Fixes\r\n\r\n### Timezone and Date Handling\r\n\r\n- Fixed timezone boundary issues in Agenda view date filtering (#153)\r\n- Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift\r\n- Enhanced date normalization in AgendaView for consistent behavior across timezones\r\n- Improved task filtering with better date handling in getTasksForDate()\r\n\r\n## UI and Display Improvements\r\n\r\n- Fixed cursor positioning to prevent cursor appearing after project subtasks widget\r\n- Resolved pre-populated projects not displaying correctly in task creation modal\r\n- Improved widget rendering with CSS-only styling approach for better performance\r\n\r\n## Settings Reorganization\r\n\r\n### New Misc Tab\r\n\r\n- Renamed \"Performance\" tab to \"Misc\" and moved to end of settings tab list\r\n- Consolidated miscellaneous features into a single organized location\r\n- Improved settings navigation by grouping related toggles together\r\n\r\n### Settings Moved to Misc Tab\r\n\r\n- Status bar toggle - Show tracked tasks in status bar\r\n- Project subtasks widget toggle - Show project subtasks widget in notes\r\n- Notes indexing toggle - Disable note indexing for performance optimization\r\n\r\n## Documentation Updates\r\n\r\n### Settings Documentation\r\n\r\n- Updated all documentation to reflect new settings organization\r\n- Created comprehensive Misc Settings documentation with detailed explanations\r\n- Removed outdated references from Advanced Settings documentation\r\n- Updated troubleshooting guides with correct setting locations\r\n\r\n## Reference Updates\r\n\r\n- Updated inline task feature documentation to reference new Misc tab location\r\n- Fixed all setting location references throughout documentation\r\n- Maintained backward compatibility information for users upgrading\r\n\r\n","aliases":["/releases/3.12.1/","/releases/3.12.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-subtasks-widget-enhancements","text":"Project Subtasks Widget Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"timezone-and-date-handling","text":"Timezone and Date Handling"},{"level":2,"id":"ui-and-display-improvements","text":"UI and Display Improvements"},{"level":2,"id":"settings-reorganization","text":"Settings Reorganization"},{"level":3,"id":"new-misc-tab","text":"New Misc Tab"},{"level":3,"id":"settings-moved-to-misc-tab","text":"Settings Moved to Misc Tab"},{"level":2,"id":"documentation-updates","text":"Documentation Updates"},{"level":3,"id":"settings-documentation","text":"Settings Documentation"},{"level":2,"id":"reference-updates","text":"Reference Updates"}],"html":"

New Features#

\n

Project Subtasks Widget Enhancements#

\n
    \n
  • New button for task creation - Added "New" button to widget header for quick task creation
  • \n
  • Auto-populated project field - New tasks automatically reference the current note as their project
  • \n
  • Improved positioning - Widget now appears at the end of documents for better user experience
  • \n
  • Improve visual design - Added dashed border to indicate virtual/generated content and improved styling
  • \n
\n

Bug Fixes#

\n

Timezone and Date Handling#

\n
    \n
  • Fixed timezone boundary issues in Agenda view date filtering (#153)
  • \n
  • Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift
  • \n
  • Enhanced date normalization in AgendaView for consistent behavior across timezones
  • \n
  • Improved task filtering with better date handling in getTasksForDate()
  • \n
\n

UI and Display Improvements#

\n
    \n
  • Fixed cursor positioning to prevent cursor appearing after project subtasks widget
  • \n
  • Resolved pre-populated projects not displaying correctly in task creation modal
  • \n
  • Improved widget rendering with CSS-only styling approach for better performance
  • \n
\n

Settings Reorganization#

\n

New Misc Tab#

\n
    \n
  • Renamed "Performance" tab to "Misc" and moved to end of settings tab list
  • \n
  • Consolidated miscellaneous features into a single organized location
  • \n
  • Improved settings navigation by grouping related toggles together
  • \n
\n

Settings Moved to Misc Tab#

\n
    \n
  • Status bar toggle - Show tracked tasks in status bar
  • \n
  • Project subtasks widget toggle - Show project subtasks widget in notes
  • \n
  • Notes indexing toggle - Disable note indexing for performance optimization
  • \n
\n

Documentation Updates#

\n

Settings Documentation#

\n
    \n
  • Updated all documentation to reflect new settings organization
  • \n
  • Created comprehensive Misc Settings documentation with detailed explanations
  • \n
  • Removed outdated references from Advanced Settings documentation
  • \n
  • Updated troubleshooting guides with correct setting locations
  • \n
\n

Reference Updates#

\n
    \n
  • Updated inline task feature documentation to reference new Misc tab location
  • \n
  • Fixed all setting location references throughout documentation
  • \n
  • Maintained backward compatibility information for users upgrading
  • \n
\n","text":"New Features# Project Subtasks Widget Enhancements# New button for task creation - Added \"New\" button to widget header for quick task creation Auto-populated project field - New tasks automatically reference the current note as their project Improved positioning - Widget now appears at the end of documents for better user experience Improve visual design - Added dashed border to indicate virtual/generated content and improved styling Bug Fixes# Timezone and Date Handling# Fixed timezone boundary issues in Agenda view date filtering (#153) Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift Enhanced date normalization in AgendaView for consistent behavior across timezones Improved task filtering with better date handling in getTasksForDate() UI and Display Improvements# Fixed cursor positioning to prevent cursor appearing after project subtasks widget Resolved pre-populated projects not displaying correctly in task creation modal Improved widget rendering with CSS-only styling approach for better performance Settings Reorganization# New Misc Tab# Renamed \"Performance\" tab to \"Misc\" and moved to end of settings tab list Consolidated miscellaneous features into a single organized location Improved settings navigation by grouping related toggles together Settings Moved to Misc Tab# Status bar toggle - Show tracked tasks in status bar Project subtasks widget toggle - Show project subtasks widget in notes Notes indexing toggle - Disable note indexing for performance optimization Documentation Updates# Settings Documentation# Updated all documentation to reflect new settings organization Created comprehensive Misc Settings documentation with detailed explanations Removed outdated references from Advanced Settings documentation Updated troubleshooting guides with correct setting locations Reference Updates# Updated inline task feature documentation to reference new Misc tab location Fixed all setting location references throughout documentation Maintained backward compatibility information for users upgrading"},{"route":"/obsidian/releases/3.12.2/","title":"Release Notes - 3.12.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.12.2.md","namespace":"obsidian","relativePath":"releases/3.12.2.md","raw":"# Release Notes - 3.12.2\r\n\r\n## Bug Fixes\r\n\r\n### Calendar & Date Handling\r\n- Fixed off-by-one date bugs in completion calendar (#160)\r\n - Resolved timezone inconsistency where calendar showed one date but completion was recorded for another\r\n - Calendar rendering now uses UTC dates consistently across all components\r\n - Fixed \"Friday tasks appearing on Saturday\" issue in completion tracking\r\n\r\n### Task Management\r\n- Fixed project filters not working in agenda view (#161)\r\n - Project filtering now works consistently across all views\r\n- Fixed edit modal crash when tasks have empty project properties\r\n - Added null checks to prevent \"Cannot read properties of null\" errors\r\n - Handles null, undefined, and empty string project values gracefully\r\n- Fixed autofill suggestions not updating internal state (#159)\r\n - Context and tag suggestions now properly sync with modal internal state\r\n - Clicking suggestions now correctly updates the task data\r\n\r\n## UI & Styling\r\n- Fixed consistent styling for priorities and statuses settings tabs (#130)\r\n - Added missing BEM classes for proper grid alignment\r\n - Priority inputs now use same styling as status inputs\r\n - Fixed table column misalignment issues\r\n\r\n## Documentation\r\n\r\n- Improved README and documentation\r\n - Enhanced overview section with better flow and natural language\r\n - Added time-tracking and pomodoro feature descriptions\r\n - Fixed broken documentation links\r\n - Updated Core Features section with more accurate descriptions\r\n\r\n ## Testing\r\n\r\n- Added comprehensive tests for date handling issues\r\n - Increased test coverage for calendar and completion functionality\r\n - Added tests reproducing and verifying fixes for off-by-one date bugs\r\n","aliases":["/releases/3.12.2/","/releases/3.12.2/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-date-handling","text":"Calendar & Date Handling"},{"level":3,"id":"task-management","text":"Task Management"},{"level":2,"id":"ui-styling","text":"UI & Styling"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"testing","text":"Testing"}],"html":"

Bug Fixes#

\n

Calendar & Date Handling#

\n
    \n
  • Fixed off-by-one date bugs in completion calendar (#160)
      \n
    • Resolved timezone inconsistency where calendar showed one date but completion was recorded for another
    • \n
    • Calendar rendering now uses UTC dates consistently across all components
    • \n
    • Fixed "Friday tasks appearing on Saturday" issue in completion tracking
    • \n
    \n
  • \n
\n

Task Management#

\n
    \n
  • Fixed project filters not working in agenda view (#161)
      \n
    • Project filtering now works consistently across all views
    • \n
    \n
  • \n
  • Fixed edit modal crash when tasks have empty project properties
      \n
    • Added null checks to prevent "Cannot read properties of null" errors
    • \n
    • Handles null, undefined, and empty string project values gracefully
    • \n
    \n
  • \n
  • Fixed autofill suggestions not updating internal state (#159)
      \n
    • Context and tag suggestions now properly sync with modal internal state
    • \n
    • Clicking suggestions now correctly updates the task data
    • \n
    \n
  • \n
\n

UI & Styling#

\n
    \n
  • Fixed consistent styling for priorities and statuses settings tabs (#130)
      \n
    • Added missing BEM classes for proper grid alignment
    • \n
    • Priority inputs now use same styling as status inputs
    • \n
    • Fixed table column misalignment issues
    • \n
    \n
  • \n
\n

Documentation#

\n
    \n
  • Improved README and documentation
      \n
    • Enhanced overview section with better flow and natural language
    • \n
    • Added time-tracking and pomodoro feature descriptions
    • \n
    • Fixed broken documentation links
    • \n
    • Updated Core Features section with more accurate descriptions
    • \n
    \n
  • \n
\n

Testing#

\n
    \n
  • Added comprehensive tests for date handling issues
      \n
    • Increased test coverage for calendar and completion functionality
    • \n
    • Added tests reproducing and verifying fixes for off-by-one date bugs
    • \n
    \n
  • \n
\n","text":"Bug Fixes# Calendar & Date Handling# Fixed off-by-one date bugs in completion calendar (#160) Resolved timezone inconsistency where calendar showed one date but completion was recorded for another Calendar rendering now uses UTC dates consistently across all components Fixed \"Friday tasks appearing on Saturday\" issue in completion tracking Task Management# Fixed project filters not working in agenda view (#161) Project filtering now works consistently across all views Fixed edit modal crash when tasks have empty project properties Added null checks to prevent \"Cannot read properties of null\" errors Handles null, undefined, and empty string project values gracefully Fixed autofill suggestions not updating internal state (#159) Context and tag suggestions now properly sync with modal internal state Clicking suggestions now correctly updates the task data UI & Styling# Fixed consistent styling for priorities and statuses settings tabs (#130) Added missing BEM classes for proper grid alignment Priority inputs now use same styling as status inputs Fixed table column misalignment issues Documentation# Improved README and documentation Enhanced overview section with better flow and natural language Added time-tracking and pomodoro feature descriptions Fixed broken documentation links Updated Core Features section with more accurate descriptions Testing# Added comprehensive tests for date handling issues Increased test coverage for calendar and completion functionality Added tests reproducing and verifying fixes for off-by-one date bugs"},{"route":"/obsidian/releases/3.13.0/","title":"Release Notes - 3.13.0","description":"##Technical Changes","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.0.md","namespace":"obsidian","relativePath":"releases/3.13.0.md","raw":"# Release Notes - 3.13.0 \r\n\r\n## Major Changes\r\n\r\n### Filtering System Overhaul\r\n\r\n- Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface\r\n- Saved Views: Users can save, manage, and switch between custom filter configurations\r\n- FilterBar Redesign: Updated to use Obsidian components with improved styling\r\n\r\n### UI Updates\r\n\r\n- FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management\r\n- Dropdown Improvements: Status and priority filters now use display labels\r\n- Dropdown Positioning: Fixed positioning and CSS styling issues\r\n\r\n## New Features\r\n\r\n### Natural Language Processing\r\n\r\n- Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask)\r\n\r\n### Interface\r\n\r\n- Project Note Decorations: Updated styling and visual elements\r\n- Task Modal Styling: Refined task creation and editing interfaces\r\n\r\n## Bug Fixes\r\n\r\n### Filter System\r\n\r\n- Fixed handling of empty arrays in \"Projects is not empty\" conditions\r\n- Fixed incomplete filter conditions handling\r\n- Fixed saved views dropdown persistence when filters change\r\n- Fixed view options disappearing on refresh\r\n- Fixed view selector dropdown behavior\r\n\r\n### Testing\r\n\r\n- Fixed multiple unit and integration test failures\r\n- Fixed migration workflow test for YAML parsing errors\r\n- Expanded test coverage for task service completion\r\n\r\n### Code Quality\r\n\r\n- Removed debug console.log statements\r\n- Improved async handling and import organization\r\n- Better search functionality implementation\r\n\r\n##Technical Changes\r\n\r\n### Refactoring\r\n\r\n- Refactored FilterBar with Obsidian components\r\n- Updated filter rule definitions and UI components\r\n- Improved state management across views\r\n- Updated ViewStateManager\r\n\r\n## Development\r\n\r\n- Updated Typescript configuration\r\n- Added new Filter Utils.ts utility module\r\n- Improved code organization\r\n\r\n","aliases":["/releases/3.13.0/","/releases/3.13.0/"],"toc":[{"level":2,"id":"major-changes","text":"Major Changes"},{"level":3,"id":"filtering-system-overhaul","text":"Filtering System Overhaul"},{"level":3,"id":"ui-updates","text":"UI Updates"},{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"natural-language-processing","text":"Natural Language Processing"},{"level":3,"id":"interface","text":"Interface"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filter-system","text":"Filter System"},{"level":3,"id":"testing","text":"Testing"},{"level":3,"id":"code-quality","text":"Code Quality"},{"level":3,"id":"refactoring","text":"Refactoring"},{"level":2,"id":"development","text":"Development"}],"html":"

Major Changes#

\n

Filtering System Overhaul#

\n
    \n
  • Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface
  • \n
  • Saved Views: Users can save, manage, and switch between custom filter configurations
  • \n
  • FilterBar Redesign: Updated to use Obsidian components with improved styling
  • \n
\n

UI Updates#

\n
    \n
  • FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management
  • \n
  • Dropdown Improvements: Status and priority filters now use display labels
  • \n
  • Dropdown Positioning: Fixed positioning and CSS styling issues
  • \n
\n

New Features#

\n

Natural Language Processing#

\n
    \n
  • Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask)
  • \n
\n

Interface#

\n
    \n
  • Project Note Decorations: Updated styling and visual elements
  • \n
  • Task Modal Styling: Refined task creation and editing interfaces
  • \n
\n

Bug Fixes#

\n

Filter System#

\n
    \n
  • Fixed handling of empty arrays in "Projects is not empty" conditions
  • \n
  • Fixed incomplete filter conditions handling
  • \n
  • Fixed saved views dropdown persistence when filters change
  • \n
  • Fixed view options disappearing on refresh
  • \n
  • Fixed view selector dropdown behavior
  • \n
\n

Testing#

\n
    \n
  • Fixed multiple unit and integration test failures
  • \n
  • Fixed migration workflow test for YAML parsing errors
  • \n
  • Expanded test coverage for task service completion
  • \n
\n

Code Quality#

\n
    \n
  • Removed debug console.log statements
  • \n
  • Improved async handling and import organization
  • \n
  • Better search functionality implementation
  • \n
\n

##Technical Changes

\n

Refactoring#

\n
    \n
  • Refactored FilterBar with Obsidian components
  • \n
  • Updated filter rule definitions and UI components
  • \n
  • Improved state management across views
  • \n
  • Updated ViewStateManager
  • \n
\n

Development#

\n
    \n
  • Updated Typescript configuration
  • \n
  • Added new Filter Utils.ts utility module
  • \n
  • Improved code organization
  • \n
\n","text":"Major Changes# Filtering System Overhaul# Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface Saved Views: Users can save, manage, and switch between custom filter configurations FilterBar Redesign: Updated to use Obsidian components with improved styling UI Updates# FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management Dropdown Improvements: Status and priority filters now use display labels Dropdown Positioning: Fixed positioning and CSS styling issues New Features# Natural Language Processing# Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask) Interface# Project Note Decorations: Updated styling and visual elements Task Modal Styling: Refined task creation and editing interfaces Bug Fixes# Filter System# Fixed handling of empty arrays in \"Projects is not empty\" conditions Fixed incomplete filter conditions handling Fixed saved views dropdown persistence when filters change Fixed view options disappearing on refresh Fixed view selector dropdown behavior Testing# Fixed multiple unit and integration test failures Fixed migration workflow test for YAML parsing errors Expanded test coverage for task service completion Code Quality# Removed debug console.log statements Improved async handling and import organization Better search functionality implementation ##Technical Changes Refactoring# Refactored FilterBar with Obsidian components Updated filter rule definitions and UI components Improved state management across views Updated ViewStateManager Development# Updated Typescript configuration Added new Filter Utils.ts utility module Improved code organization"},{"route":"/obsidian/releases/3.13.1/","title":"Release Notes - 3.13.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.1.md","namespace":"obsidian","relativePath":"releases/3.13.1.md","raw":"# Release Notes - 3.13.1 \r\n\r\n## New Features\r\n\r\n### Saved Filter Views Storage\r\n\r\n- Saved filter views now sync across devices with your vault\r\n- Views are stored in plugin data instead of browser localStorage\r\n- Automatic migration from previous storage system on first load\r\n\r\n### FilterBar Behavior\r\n\r\n- Filter panel now stays open when clicking elsewhere in the interface\r\n- Panel only closes when the filter button is clicked again\r\n- Eliminates accidental filter panel closures during normal use\r\n\r\n## Performance Improvements\r\n\r\n### Filter Operations\r\n\r\n- Adding and removing filters is now significantly faster\r\n- Reduced lag when building complex filter queries\r\n- Search input state preserved during filter modifications\r\n\r\n### Migration System\r\n\r\n- Early migration detection prevents DOM errors on first use\r\n- Better error handling during plugin initialization\r\n- Cleaner migration process for new users\r\n\r\n## Bug Fixes\r\n\r\n### First-Time User Experience\r\n\r\n- Fixed \"removeChild\" DOM errors when using filters for the first time\r\n- Resolved race conditions between migration and UI initialization\r\n- Added fallback UI states for improved reliability\r\n\r\n### FilterBar Stability\r\n\r\n- Added DOM connection checks before manipulation\r\n- Improved error boundaries in filter rendering\r\n- Better cleanup of event listeners on component destruction\r\n\r\n## Technical Changes\r\n\r\n### View State Management\r\n\r\n- Saved views migrate from localStorage to plugin data system\r\n- ViewStateManager now uses plugin settings for persistence\r\n- Enhanced migration detection and completion tracking\r\n\r\n### Error Handling\r\n\r\n- Added safety checks for DOM element manipulation\r\n- Graceful degradation when filter operations fail\r\n- Improved logging for troubleshooting migration issues\r\n\r\n","aliases":["/releases/3.13.1/","/releases/3.13.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"saved-filter-views-storage","text":"Saved Filter Views Storage"},{"level":3,"id":"filterbar-behavior","text":"FilterBar Behavior"},{"level":2,"id":"performance-improvements","text":"Performance Improvements"},{"level":3,"id":"filter-operations","text":"Filter Operations"},{"level":3,"id":"migration-system","text":"Migration System"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"first-time-user-experience","text":"First-Time User Experience"},{"level":3,"id":"filterbar-stability","text":"FilterBar Stability"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"view-state-management","text":"View State Management"},{"level":3,"id":"error-handling","text":"Error Handling"}],"html":"

New Features#

\n

Saved Filter Views Storage#

\n
    \n
  • Saved filter views now sync across devices with your vault
  • \n
  • Views are stored in plugin data instead of browser localStorage
  • \n
  • Automatic migration from previous storage system on first load
  • \n
\n

FilterBar Behavior#

\n
    \n
  • Filter panel now stays open when clicking elsewhere in the interface
  • \n
  • Panel only closes when the filter button is clicked again
  • \n
  • Eliminates accidental filter panel closures during normal use
  • \n
\n

Performance Improvements#

\n

Filter Operations#

\n
    \n
  • Adding and removing filters is now significantly faster
  • \n
  • Reduced lag when building complex filter queries
  • \n
  • Search input state preserved during filter modifications
  • \n
\n

Migration System#

\n
    \n
  • Early migration detection prevents DOM errors on first use
  • \n
  • Better error handling during plugin initialization
  • \n
  • Cleaner migration process for new users
  • \n
\n

Bug Fixes#

\n

First-Time User Experience#

\n
    \n
  • Fixed "removeChild" DOM errors when using filters for the first time
  • \n
  • Resolved race conditions between migration and UI initialization
  • \n
  • Added fallback UI states for improved reliability
  • \n
\n

FilterBar Stability#

\n
    \n
  • Added DOM connection checks before manipulation
  • \n
  • Improved error boundaries in filter rendering
  • \n
  • Better cleanup of event listeners on component destruction
  • \n
\n

Technical Changes#

\n

View State Management#

\n
    \n
  • Saved views migrate from localStorage to plugin data system
  • \n
  • ViewStateManager now uses plugin settings for persistence
  • \n
  • Enhanced migration detection and completion tracking
  • \n
\n

Error Handling#

\n
    \n
  • Added safety checks for DOM element manipulation
  • \n
  • Graceful degradation when filter operations fail
  • \n
  • Improved logging for troubleshooting migration issues
  • \n
\n","text":"New Features# Saved Filter Views Storage# Saved filter views now sync across devices with your vault Views are stored in plugin data instead of browser localStorage Automatic migration from previous storage system on first load FilterBar Behavior# Filter panel now stays open when clicking elsewhere in the interface Panel only closes when the filter button is clicked again Eliminates accidental filter panel closures during normal use Performance Improvements# Filter Operations# Adding and removing filters is now significantly faster Reduced lag when building complex filter queries Search input state preserved during filter modifications Migration System# Early migration detection prevents DOM errors on first use Better error handling during plugin initialization Cleaner migration process for new users Bug Fixes# First-Time User Experience# Fixed \"removeChild\" DOM errors when using filters for the first time Resolved race conditions between migration and UI initialization Added fallback UI states for improved reliability FilterBar Stability# Added DOM connection checks before manipulation Improved error boundaries in filter rendering Better cleanup of event listeners on component destruction Technical Changes# View State Management# Saved views migrate from localStorage to plugin data system ViewStateManager now uses plugin settings for persistence Enhanced migration detection and completion tracking Error Handling# Added safety checks for DOM element manipulation Graceful degradation when filter operations fail Improved logging for troubleshooting migration issues"},{"route":"/obsidian/releases/3.13.2/","title":"Release Notes - 3.13.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.2.md","namespace":"obsidian","relativePath":"releases/3.13.2.md","raw":"# Release Notes - 3.13.2\r\n\r\n## Performance Improvements\r\n\r\n### FilterBar and Saved Views\r\n- Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters\r\n- Added \"Select...\" placeholder option for new filter conditions to prevent premature filtering\r\n- Eliminated unnecessary cache re-indexing when saving or deleting saved views\r\n- Made settings system smarter to only trigger cache updates when indexing-related settings actually change\r\n\r\n### Filter Processing\r\n- Implemented index-backed filtering that processes significantly fewer tasks for filtered views\r\n- Added intelligent query result caching with automatic expiration to eliminate redundant operations\r\n- Improved candidate selection using existing status, date, and overdue task indexes\r\n- Enhanced set intersection logic for multiple AND conditions to further reduce processing\r\n\r\n## Bug Fixes\r\n\r\n### Filter Logic\r\n- Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions\r\n- Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups\r\n- Improved query structure analysis to ensure filter correctness\r\n\r\n### Saved Views\r\n- Fixed issue where modifying one saved view could affect others due to shared object references\r\n- Added proper deep cloning of FilterQuery objects throughout the ViewStateManager\r\n- Ensured saved views remain independent when modified\r\n\r\n## Technical Details\r\n\r\n### Index Optimization Safety\r\n- Index optimizations now only apply when provably safe (AND relationships between indexed conditions)\r\n- Added recursive query analysis to detect OR groups containing indexed conditions\r\n- Maintains filter correctness while providing performance benefits where safe\r\n\r\n### Cache Management\r\n- Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping\r\n- Query result caching with 30-second auto-expiration and immediate invalidation on data changes\r\n- Debug logging available for performance monitoring\r\n\r\n## Performance Impact\r\n\r\n- Filter building is now responsive with no lag when adding conditions\r\n- Saved view operations are instant with no unnecessary re-indexing\r\n- Repeated filter operations are nearly instant due to intelligent caching\r\n- Significant memory usage reduction for large vaults\r\n\r\n","aliases":["/releases/3.13.2/","/releases/3.13.2/"],"toc":[{"level":2,"id":"performance-improvements","text":"Performance Improvements"},{"level":3,"id":"filterbar-and-saved-views","text":"FilterBar and Saved Views"},{"level":3,"id":"filter-processing","text":"Filter Processing"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filter-logic","text":"Filter Logic"},{"level":3,"id":"saved-views","text":"Saved Views"},{"level":2,"id":"technical-details","text":"Technical Details"},{"level":3,"id":"index-optimization-safety","text":"Index Optimization Safety"},{"level":3,"id":"cache-management","text":"Cache Management"},{"level":2,"id":"performance-impact","text":"Performance Impact"}],"html":"

Performance Improvements#

\n

FilterBar and Saved Views#

\n
    \n
  • Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters
  • \n
  • Added "Select..." placeholder option for new filter conditions to prevent premature filtering
  • \n
  • Eliminated unnecessary cache re-indexing when saving or deleting saved views
  • \n
  • Made settings system smarter to only trigger cache updates when indexing-related settings actually change
  • \n
\n

Filter Processing#

\n
    \n
  • Implemented index-backed filtering that processes significantly fewer tasks for filtered views
  • \n
  • Added intelligent query result caching with automatic expiration to eliminate redundant operations
  • \n
  • Improved candidate selection using existing status, date, and overdue task indexes
  • \n
  • Enhanced set intersection logic for multiple AND conditions to further reduce processing
  • \n
\n

Bug Fixes#

\n

Filter Logic#

\n
    \n
  • Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions
  • \n
  • Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups
  • \n
  • Improved query structure analysis to ensure filter correctness
  • \n
\n

Saved Views#

\n
    \n
  • Fixed issue where modifying one saved view could affect others due to shared object references
  • \n
  • Added proper deep cloning of FilterQuery objects throughout the ViewStateManager
  • \n
  • Ensured saved views remain independent when modified
  • \n
\n

Technical Details#

\n

Index Optimization Safety#

\n
    \n
  • Index optimizations now only apply when provably safe (AND relationships between indexed conditions)
  • \n
  • Added recursive query analysis to detect OR groups containing indexed conditions
  • \n
  • Maintains filter correctness while providing performance benefits where safe
  • \n
\n

Cache Management#

\n
    \n
  • Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping
  • \n
  • Query result caching with 30-second auto-expiration and immediate invalidation on data changes
  • \n
  • Debug logging available for performance monitoring
  • \n
\n

Performance Impact#

\n
    \n
  • Filter building is now responsive with no lag when adding conditions
  • \n
  • Saved view operations are instant with no unnecessary re-indexing
  • \n
  • Repeated filter operations are nearly instant due to intelligent caching
  • \n
  • Significant memory usage reduction for large vaults
  • \n
\n","text":"Performance Improvements# FilterBar and Saved Views# Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters Added \"Select...\" placeholder option for new filter conditions to prevent premature filtering Eliminated unnecessary cache re-indexing when saving or deleting saved views Made settings system smarter to only trigger cache updates when indexing-related settings actually change Filter Processing# Implemented index-backed filtering that processes significantly fewer tasks for filtered views Added intelligent query result caching with automatic expiration to eliminate redundant operations Improved candidate selection using existing status, date, and overdue task indexes Enhanced set intersection logic for multiple AND conditions to further reduce processing Bug Fixes# Filter Logic# Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups Improved query structure analysis to ensure filter correctness Saved Views# Fixed issue where modifying one saved view could affect others due to shared object references Added proper deep cloning of FilterQuery objects throughout the ViewStateManager Ensured saved views remain independent when modified Technical Details# Index Optimization Safety# Index optimizations now only apply when provably safe (AND relationships between indexed conditions) Added recursive query analysis to detect OR groups containing indexed conditions Maintains filter correctness while providing performance benefits where safe Cache Management# Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping Query result caching with 30-second auto-expiration and immediate invalidation on data changes Debug logging available for performance monitoring Performance Impact# Filter building is now responsive with no lag when adding conditions Saved view operations are instant with no unnecessary re-indexing Repeated filter operations are nearly instant due to intelligent caching Significant memory usage reduction for large vaults"},{"route":"/obsidian/releases/3.13.3/","title":"Release Notes - 3.13.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.3.md","namespace":"obsidian","relativePath":"releases/3.13.3.md","raw":"# Release Notes - 3.13.3\r\n\r\n## Bug Fixes\r\n\r\n### Fixed recurring task completion date recording\r\n- Resolved issue where \"mark completed for this date\" context menu option recorded completion for the wrong date\r\n- Fixed timezone inconsistency between completion date storage and checking logic\r\n- Recurring tasks now properly track completion status per calendar date\r\n\r\n### Improved recurring task filtering\r\n- Fixed \"Is completed\" filter condition to respect per-date completion status for recurring tasks\r\n- Filter results now accurately reflect whether recurring tasks are completed for specific dates\r\n\r\n## Enhancements\r\n\r\n### AgendaView improvements\r\n- Restored Today button with improved header layout\r\n- Reorganized header into three sections: navigation controls, period title, and actions\r\n- Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates\r\n- Removed keyboard navigation shortcuts (left/right arrows)\r\n\r\n### Interface updates\r\n- Enhanced AgendaView header styling with better spacing and visual hierarchy\r\n- Added responsive design for mobile layouts\r\n- Improved button styling with proper hover and focus states\r\n\r\n## Technical Changes\r\n\r\n- Updated TaskService to use consistent local timezone formatting for completion dates\r\n- Enhanced FilterService to properly evaluate recurring task completion status\r\n- Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling\r\n\r\n## Testing\r\n\r\n- Added comprehensive test coverage for timezone handling and date formatting consistency\r\n- Added tests to verify recurring task completion behavior across different scenarios\r\n\r\n\r\n","aliases":["/releases/3.13.3/","/releases/3.13.3/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"fixed-recurring-task-completion-date-recording","text":"Fixed recurring task completion date recording"},{"level":3,"id":"improved-recurring-task-filtering","text":"Improved recurring task filtering"},{"level":2,"id":"enhancements","text":"Enhancements"},{"level":3,"id":"agendaview-improvements","text":"AgendaView improvements"},{"level":3,"id":"interface-updates","text":"Interface updates"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":2,"id":"testing","text":"Testing"}],"html":"

Bug Fixes#

\n

Fixed recurring task completion date recording#

\n
    \n
  • Resolved issue where "mark completed for this date" context menu option recorded completion for the wrong date
  • \n
  • Fixed timezone inconsistency between completion date storage and checking logic
  • \n
  • Recurring tasks now properly track completion status per calendar date
  • \n
\n

Improved recurring task filtering#

\n
    \n
  • Fixed "Is completed" filter condition to respect per-date completion status for recurring tasks
  • \n
  • Filter results now accurately reflect whether recurring tasks are completed for specific dates
  • \n
\n

Enhancements#

\n

AgendaView improvements#

\n
    \n
  • Restored Today button with improved header layout
  • \n
  • Reorganized header into three sections: navigation controls, period title, and actions
  • \n
  • Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates
  • \n
  • Removed keyboard navigation shortcuts (left/right arrows)
  • \n
\n

Interface updates#

\n
    \n
  • Enhanced AgendaView header styling with better spacing and visual hierarchy
  • \n
  • Added responsive design for mobile layouts
  • \n
  • Improved button styling with proper hover and focus states
  • \n
\n

Technical Changes#

\n
    \n
  • Updated TaskService to use consistent local timezone formatting for completion dates
  • \n
  • Enhanced FilterService to properly evaluate recurring task completion status
  • \n
  • Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling
  • \n
\n

Testing#

\n
    \n
  • Added comprehensive test coverage for timezone handling and date formatting consistency
  • \n
  • Added tests to verify recurring task completion behavior across different scenarios
  • \n
\n","text":"Bug Fixes# Fixed recurring task completion date recording# Resolved issue where \"mark completed for this date\" context menu option recorded completion for the wrong date Fixed timezone inconsistency between completion date storage and checking logic Recurring tasks now properly track completion status per calendar date Improved recurring task filtering# Fixed \"Is completed\" filter condition to respect per-date completion status for recurring tasks Filter results now accurately reflect whether recurring tasks are completed for specific dates Enhancements# AgendaView improvements# Restored Today button with improved header layout Reorganized header into three sections: navigation controls, period title, and actions Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates Removed keyboard navigation shortcuts (left/right arrows) Interface updates# Enhanced AgendaView header styling with better spacing and visual hierarchy Added responsive design for mobile layouts Improved button styling with proper hover and focus states Technical Changes# Updated TaskService to use consistent local timezone formatting for completion dates Enhanced FilterService to properly evaluate recurring task completion status Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling Testing# Added comprehensive test coverage for timezone handling and date formatting consistency Added tests to verify recurring task completion behavior across different scenarios"},{"route":"/obsidian/releases/3.13.4/","title":"Release Notes - 3.13.4","description":"Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.4.md","namespace":"obsidian","relativePath":"releases/3.13.4.md","raw":"# Release Notes - 3.13.4\r\n\r\n## Bug Fixes\r\n\r\n### FilterBar Migration Issues\r\n- Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0\r\n- Resolved `Cannot read properties of undefined (reading 'forEach')` and `Cannot read properties of undefined (reading 'find')` errors in FilterBar rendering\r\n- Added detection for old FilterQuery format and automatic replacement with fresh defaults\r\n- Users upgrading from older versions now get clean filter states instead of broken data structures\r\n- Preserved valid sort and grouping settings when replacing incompatible filter data\r\n- Added error boundaries with console warnings for better debugging\r\n\r\n*Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally [@bcohen44](https://github.com/callumalpass/tasknotes/issues/170#issuecomment-3066981483) for reporting the FilterBar crashes that led to identifying these migration issues.*\r\n\r\n## Features\r\n\r\n### Calendar View Improvements\r\n- Added ICS refresh button directly in the Advanced Calendar view toolbar\r\n- ICS calendar subscriptions can now be refreshed without opening settings\r\n- Button integrates with existing ICS subscription service and triggers immediate calendar re-render\r\n- Improved ICS settings layout with horizontal button arrangement\r\n- Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides\r\n- Extended today highlight disable to timegrid columns for visual consistency\r\n\r\n## Notes\r\n\r\nThis release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0.\r\n\r\nThe ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings.\r\n","aliases":["/releases/3.13.4/","/releases/3.13.4/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filterbar-migration-issues","text":"FilterBar Migration Issues"},{"level":2,"id":"features","text":"Features"},{"level":3,"id":"calendar-view-improvements","text":"Calendar View Improvements"},{"level":2,"id":"notes","text":"Notes"}],"html":"

Bug Fixes#

\n

FilterBar Migration Issues#

\n
    \n
  • Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0
  • \n
  • Resolved Cannot read properties of undefined (reading 'forEach') and Cannot read properties of undefined (reading 'find') errors in FilterBar rendering
  • \n
  • Added detection for old FilterQuery format and automatic replacement with fresh defaults
  • \n
  • Users upgrading from older versions now get clean filter states instead of broken data structures
  • \n
  • Preserved valid sort and grouping settings when replacing incompatible filter data
  • \n
  • Added error boundaries with console warnings for better debugging
  • \n
\n

Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues.

\n

Features#

\n

Calendar View Improvements#

\n
    \n
  • Added ICS refresh button directly in the Advanced Calendar view toolbar
  • \n
  • ICS calendar subscriptions can now be refreshed without opening settings
  • \n
  • Button integrates with existing ICS subscription service and triggers immediate calendar re-render
  • \n
  • Improved ICS settings layout with horizontal button arrangement
  • \n
  • Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides
  • \n
  • Extended today highlight disable to timegrid columns for visual consistency
  • \n
\n

Notes#

\n

This release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0.

\n

The ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings.

\n","text":"Bug Fixes# FilterBar Migration Issues# Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0 Resolved Cannot read properties of undefined (reading 'forEach') and Cannot read properties of undefined (reading 'find') errors in FilterBar rendering Added detection for old FilterQuery format and automatic replacement with fresh defaults Users upgrading from older versions now get clean filter states instead of broken data structures Preserved valid sort and grouping settings when replacing incompatible filter data Added error boundaries with console warnings for better debugging Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues. Features# Calendar View Improvements# Added ICS refresh button directly in the Advanced Calendar view toolbar ICS calendar subscriptions can now be refreshed without opening settings Button integrates with existing ICS subscription service and triggers immediate calendar re-render Improved ICS settings layout with horizontal button arrangement Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides Extended today highlight disable to timegrid columns for visual consistency Notes# This release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0. The ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings."},{"route":"/obsidian/releases/3.14.0/","title":"Release 3.14.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.14.0.md","namespace":"obsidian","relativePath":"releases/3.14.0.md","raw":"# Release 3.14.0\r\n\r\n## New Features\r\n\r\n### Project Management Enhancements\r\n\r\n- Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion\r\n- Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191]\r\n- Create Subtask Option: Added \"Create subtask\" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request\r\n- Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191]\r\n\r\n### User Interface Improvements\r\n\r\n- Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion\r\n- Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191]\r\n- Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR\r\n\r\n## Bug Fixes\r\n\r\n### Calendar and Recurring Tasks\r\n\r\n- Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations\r\n- All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting\r\n\r\n### Settings and State Management\r\n\r\n- Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report\r\n\r\n### Technical Changes\r\n\r\n### Performance and Stability\r\n\r\n- Enhanced cache management and event handling for project-related functionality\r\n- Improved error handling in project subtask operations\r\n- Optimized project detection algorithms for better performance\r\n\r\n### Code Organization\r\n\r\n- Refactored project-related services for better modularity\r\n- Enhanced TypeScript type definitions for project functionality\r\n- Improved service initialization and cleanup processes\r\n\r\n## Documentation\r\n\r\n- Updated README with new project assets and feature documentation\r\n","aliases":["/releases/3.14.0/","/releases/3.14.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-management-enhancements","text":"Project Management Enhancements"},{"level":3,"id":"user-interface-improvements","text":"User Interface Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-and-recurring-tasks","text":"Calendar and Recurring Tasks"},{"level":3,"id":"settings-and-state-management","text":"Settings and State Management"},{"level":3,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"performance-and-stability","text":"Performance and Stability"},{"level":3,"id":"code-organization","text":"Code Organization"},{"level":2,"id":"documentation","text":"Documentation"}],"html":"

New Features#

\n

Project Management Enhancements#

\n
    \n
  • Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion
  • \n
  • Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191]
  • \n
  • Create Subtask Option: Added "Create subtask" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request
  • \n
  • Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191]
  • \n
\n

User Interface Improvements#

\n
    \n
  • Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion
  • \n
  • Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191]
  • \n
  • Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR
  • \n
\n

Bug Fixes#

\n

Calendar and Recurring Tasks#

\n
    \n
  • Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations
  • \n
  • All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting
  • \n
\n

Settings and State Management#

\n
    \n
  • Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report
  • \n
\n

Technical Changes#

\n

Performance and Stability#

\n
    \n
  • Enhanced cache management and event handling for project-related functionality
  • \n
  • Improved error handling in project subtask operations
  • \n
  • Optimized project detection algorithms for better performance
  • \n
\n

Code Organization#

\n
    \n
  • Refactored project-related services for better modularity
  • \n
  • Enhanced TypeScript type definitions for project functionality
  • \n
  • Improved service initialization and cleanup processes
  • \n
\n

Documentation#

\n
    \n
  • Updated README with new project assets and feature documentation
  • \n
\n","text":"New Features# Project Management Enhancements# Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191] Create Subtask Option: Added \"Create subtask\" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191] User Interface Improvements# Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191] Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR Bug Fixes# Calendar and Recurring Tasks# Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting Settings and State Management# Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report Technical Changes# Performance and Stability# Enhanced cache management and event handling for project-related functionality Improved error handling in project subtask operations Optimized project detection algorithms for better performance Code Organization# Refactored project-related services for better modularity Enhanced TypeScript type definitions for project functionality Improved service initialization and cleanup processes Documentation# Updated README with new project assets and feature documentation"},{"route":"/obsidian/releases/3.15.0/","title":"Release 3.15.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.15.0.md","namespace":"obsidian","relativePath":"releases/3.15.0.md","raw":"# Release 3.15.0\n\n## New Features\n\n### NLP Input Enhancements\n\n- Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion\n- Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration\n- Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131]\n\n### Calendar Integration\n\n- ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests\n- ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220]\n- ICS Settings: Added ICS integration settings to calendar tab\n- Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this\n- Time Entry Interaction: Added time entry interaction functionality to advanced calendar\n\n### Time Management\n\n- Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184]\n- Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request\n- Pomodoro View: Added task card display and improved controls to pomodoro view [#184]\n- Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion\n\n### User Interface Improvements\n\n- Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback\n- Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion\n- Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request\n- UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements\n\n## Bug Fixes\n\n### Task Management\n\n- Nested Tags: Fixed support for nested tags in FilterBar\n- TypeError Resolution: Resolved TypeError when calling includes on non-array values\n\n### Calendar Integration\n\n- Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report\n- Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233]\n\n## Documentation\n\n- Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality\n- ICS Integration Guide: Created detailed ICS calendar integration documentation\n- Release Notes: Added comprehensive release notes documentation with links to all versions\n- Inline Task Widget: Added screenshots and documentation for inline task widgets\n\n## Technical Changes\n\n### Code Organization\n\n- Enhanced service architecture for ICS integration\n- Improved field mapping system for calendar events\n- Optimized auto-suggestion algorithms\n- Enhanced type definitions for new functionality\n\n### Performance\n\n- Improved rendering performance for pomodoro view\n- Optimized calendar event handling\n- Enhanced note picker search capabilities\n","aliases":["/releases/3.15.0/","/releases/3.15.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"nlp-input-enhancements","text":"NLP Input Enhancements"},{"level":3,"id":"calendar-integration","text":"Calendar Integration"},{"level":3,"id":"time-management","text":"Time Management"},{"level":3,"id":"user-interface-improvements","text":"User Interface Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-management","text":"Task Management"},{"level":3,"id":"calendar-integration-2","text":"Calendar Integration"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"code-organization","text":"Code Organization"},{"level":3,"id":"performance","text":"Performance"}],"html":"

New Features#

\n

NLP Input Enhancements#

\n
    \n
  • Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion
  • \n
  • Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration
  • \n
  • Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131]
  • \n
\n

Calendar Integration#

\n
    \n
  • ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests
  • \n
  • ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220]
  • \n
  • ICS Settings: Added ICS integration settings to calendar tab
  • \n
  • Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this
  • \n
  • Time Entry Interaction: Added time entry interaction functionality to advanced calendar
  • \n
\n

Time Management#

\n
    \n
  • Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184]
  • \n
  • Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request
  • \n
  • Pomodoro View: Added task card display and improved controls to pomodoro view [#184]
  • \n
  • Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion
  • \n
\n

User Interface Improvements#

\n
    \n
  • Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback
  • \n
  • Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion
  • \n
  • Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request
  • \n
  • UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements
  • \n
\n

Bug Fixes#

\n

Task Management#

\n
    \n
  • Nested Tags: Fixed support for nested tags in FilterBar
  • \n
  • TypeError Resolution: Resolved TypeError when calling includes on non-array values
  • \n
\n

Calendar Integration#

\n
    \n
  • Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report
  • \n
  • Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233]
  • \n
\n

Documentation#

\n
    \n
  • Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality
  • \n
  • ICS Integration Guide: Created detailed ICS calendar integration documentation
  • \n
  • Release Notes: Added comprehensive release notes documentation with links to all versions
  • \n
  • Inline Task Widget: Added screenshots and documentation for inline task widgets
  • \n
\n

Technical Changes#

\n

Code Organization#

\n
    \n
  • Enhanced service architecture for ICS integration
  • \n
  • Improved field mapping system for calendar events
  • \n
  • Optimized auto-suggestion algorithms
  • \n
  • Enhanced type definitions for new functionality
  • \n
\n

Performance#

\n
    \n
  • Improved rendering performance for pomodoro view
  • \n
  • Optimized calendar event handling
  • \n
  • Enhanced note picker search capabilities
  • \n
\n","text":"New Features# NLP Input Enhancements# Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131] Calendar Integration# ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220] ICS Settings: Added ICS integration settings to calendar tab Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this Time Entry Interaction: Added time entry interaction functionality to advanced calendar Time Management# Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184] Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request Pomodoro View: Added task card display and improved controls to pomodoro view [#184] Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion User Interface Improvements# Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements Bug Fixes# Task Management# Nested Tags: Fixed support for nested tags in FilterBar TypeError Resolution: Resolved TypeError when calling includes on non-array values Calendar Integration# Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233] Documentation# Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality ICS Integration Guide: Created detailed ICS calendar integration documentation Release Notes: Added comprehensive release notes documentation with links to all versions Inline Task Widget: Added screenshots and documentation for inline task widgets Technical Changes# Code Organization# Enhanced service architecture for ICS integration Improved field mapping system for calendar events Optimized auto-suggestion algorithms Enhanced type definitions for new functionality Performance# Improved rendering performance for pomodoro view Optimized calendar event handling Enhanced note picker search capabilities"},{"route":"/obsidian/releases/3.15.1/","title":"Release 3.15.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.15.1.md","namespace":"obsidian","relativePath":"releases/3.15.1.md","raw":"# Release 3.15.1\n\n## New Features\n\n### Kanban Board Enhancements\n\n- Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity\n- Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation\n\n### Calendar Improvements\n\n- All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR\n- Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., `fc-tag-meeting`, `fc-tag-work`), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation\n\n## Bug Fixes\n\n### Kanban Board\n\n- Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report\n\n### Subtask Widget Issues\n\n- Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234]\n- Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207]\n\n## Technical Changes\n\n### Documentation\n\n- Fixed line break formatting issues in documentation files\n\n### Code Organization\n\n- Improved task grouping architecture with new options interface\n- Enhanced calendar event rendering system for better tag-based customization\n- Refined subtask widget positioning logic for better editor integration\n","aliases":["/releases/3.15.1/","/releases/3.15.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"kanban-board-enhancements","text":"Kanban Board Enhancements"},{"level":3,"id":"calendar-improvements","text":"Calendar Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"kanban-board","text":"Kanban Board"},{"level":3,"id":"subtask-widget-issues","text":"Subtask Widget Issues"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"documentation","text":"Documentation"},{"level":3,"id":"code-organization","text":"Code Organization"}],"html":"

New Features#

\n

Kanban Board Enhancements#

\n
    \n
  • Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity
  • \n
  • Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation
  • \n
\n

Calendar Improvements#

\n
    \n
  • All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR
  • \n
  • Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., fc-tag-meeting, fc-tag-work), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation
  • \n
\n

Bug Fixes#

\n

Kanban Board#

\n
    \n
  • Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report
  • \n
\n

Subtask Widget Issues#

\n
    \n
  • Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234]
  • \n
  • Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207]
  • \n
\n

Technical Changes#

\n

Documentation#

\n
    \n
  • Fixed line break formatting issues in documentation files
  • \n
\n

Code Organization#

\n
    \n
  • Improved task grouping architecture with new options interface
  • \n
  • Enhanced calendar event rendering system for better tag-based customization
  • \n
  • Refined subtask widget positioning logic for better editor integration
  • \n
\n","text":"New Features# Kanban Board Enhancements# Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation Calendar Improvements# All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., fc-tag-meeting, fc-tag-work), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation Bug Fixes# Kanban Board# Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report Subtask Widget Issues# Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234] Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207] Technical Changes# Documentation# Fixed line break formatting issues in documentation files Code Organization# Improved task grouping architecture with new options interface Enhanced calendar event rendering system for better tag-based customization Refined subtask widget positioning logic for better editor integration"},{"route":"/obsidian/releases/3.16.0/","title":"TaskNotes 3.16.0","description":"Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.0.md","namespace":"obsidian","relativePath":"releases/3.16.0.md","raw":"# TaskNotes 3.16.0\n\n## New Features\n\n### Task Management\n\n- **Bulk Task Conversion**: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request\n- **Instant Task Conversion Enhancement**: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions\n- **Default Project Setting**: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request\n- **Advanced Tag and Project Parsing**: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug\n- **Enhanced Filter Bar Integration**: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion\n\n### Calendar and Views\n\n- **Custom Multi-Day Calendar View**: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request\n- **Responsive Calendar UI**: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion\n- **Locale-Aware Date Formatting**: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue\n- **Saved Views Enhancement**: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback\n\n### Task Organization\n\n- **Drag and Drop Status Reordering**: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion\n- **Overdue Tasks Filter**: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue\n- **Project Group Enhancements**: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion\n\n### Pomodoro Timer\n\n- **Background Timer Continuity**: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix\n- **System Notifications**: Convert Pomodoro notices to system notifications for better visibility (#136)\n- **Manual Duration Adjustment**: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing\n- **Task Completion Sorting**: Sort completed tasks to end of Pomodoro task selector for better organization\n\n## Bug Fixes\n\n### UI and Interaction\n\n- **Tooltip Standardization**: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report\n- **Open Note Button Stability**: Stabilized Open note button hover behavior and made font size consistent with other modal buttons\n- **Date Context Menu Clarity**: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion\n- **Project Removal**: Fixed project removal in edit modal not saving changes properly (#213)\n- **Advanced Calendar Resizing**: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix\n\n### Calendar and Recurring Tasks\n\n- **Timezone Bug Fixes**: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug\n- **Custom Calendar Display**: Fixed undefined days display in custom calendar view\n- **Calendar Recurrence**: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug\n\n### Task Management\n\n- **Pomodoro Task Tracking**: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report\n- **Plugin Conflict Protection**: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict\n- **Instant Conversion Improvements**: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues\n\n## Improvements\n\n### User Interface\n\n- **Minimalist Design System**: Implemented consistent borderless button design system across all components\n- **UI Polish**: Applied minimalist styling with cleaned up borders and shadows throughout the interface\n- **Settings Enhancement**: Enhanced settings explanatory sections with improved minimalist styling\n- **Advanced Calendar Title**: Made advanced calendar title smaller for better proportions\n\n### Search and Filtering\n\n- **Enhanced Search**: Improved search functionality to preserve existing filters when performing new searches\n- **Filter Preservation**: Better handling of filter states across different search operations\n\n### Development and Code Quality\n\n- **Code Documentation**: Improved code comments and documentation throughout the codebase\n- **Linting Cleanup**: Resolved various linting errors and improved code consistency\n- **Test Infrastructure**: Updated timezone-related tests to work reliably in CI environment\n- **GitHub Actions**: Added timeouts and offline preferences to improve CI reliability\n\n## Technical Improvements\n\n- Reduced excessive console logging from filter components\n- Updated Jest coverage thresholds to realistic levels\n- Improved error handling in various components\n- Improved defensive programming practices throughout the codebase\n\n## Contributors\n\nExtra thanks to **@Totobal5** for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes\n\n","aliases":["/releases/3.16.0/","/releases/3.16.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-management","text":"Task Management"},{"level":3,"id":"calendar-and-views","text":"Calendar and Views"},{"level":3,"id":"task-organization","text":"Task Organization"},{"level":3,"id":"pomodoro-timer","text":"Pomodoro Timer"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"ui-and-interaction","text":"UI and Interaction"},{"level":3,"id":"calendar-and-recurring-tasks","text":"Calendar and Recurring Tasks"},{"level":3,"id":"task-management-2","text":"Task Management"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"search-and-filtering","text":"Search and Filtering"},{"level":3,"id":"development-and-code-quality","text":"Development and Code Quality"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Task Management#

\n
    \n
  • Bulk Task Conversion: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request
  • \n
  • Instant Task Conversion Enhancement: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions
  • \n
  • Default Project Setting: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request
  • \n
  • Advanced Tag and Project Parsing: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug
  • \n
  • Enhanced Filter Bar Integration: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion
  • \n
\n

Calendar and Views#

\n
    \n
  • Custom Multi-Day Calendar View: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request
  • \n
  • Responsive Calendar UI: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion
  • \n
  • Locale-Aware Date Formatting: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue
  • \n
  • Saved Views Enhancement: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback
  • \n
\n

Task Organization#

\n
    \n
  • Drag and Drop Status Reordering: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion
  • \n
  • Overdue Tasks Filter: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue
  • \n
  • Project Group Enhancements: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion
  • \n
\n

Pomodoro Timer#

\n
    \n
  • Background Timer Continuity: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix
  • \n
  • System Notifications: Convert Pomodoro notices to system notifications for better visibility (#136)
  • \n
  • Manual Duration Adjustment: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing
  • \n
  • Task Completion Sorting: Sort completed tasks to end of Pomodoro task selector for better organization
  • \n
\n

Bug Fixes#

\n

UI and Interaction#

\n
    \n
  • Tooltip Standardization: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report
  • \n
  • Open Note Button Stability: Stabilized Open note button hover behavior and made font size consistent with other modal buttons
  • \n
  • Date Context Menu Clarity: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion
  • \n
  • Project Removal: Fixed project removal in edit modal not saving changes properly (#213)
  • \n
  • Advanced Calendar Resizing: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix
  • \n
\n

Calendar and Recurring Tasks#

\n
    \n
  • Timezone Bug Fixes: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug
  • \n
  • Custom Calendar Display: Fixed undefined days display in custom calendar view
  • \n
  • Calendar Recurrence: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug
  • \n
\n

Task Management#

\n
    \n
  • Pomodoro Task Tracking: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report
  • \n
  • Plugin Conflict Protection: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict
  • \n
  • Instant Conversion Improvements: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues
  • \n
\n

Improvements#

\n

User Interface#

\n
    \n
  • Minimalist Design System: Implemented consistent borderless button design system across all components
  • \n
  • UI Polish: Applied minimalist styling with cleaned up borders and shadows throughout the interface
  • \n
  • Settings Enhancement: Enhanced settings explanatory sections with improved minimalist styling
  • \n
  • Advanced Calendar Title: Made advanced calendar title smaller for better proportions
  • \n
\n

Search and Filtering#

\n
    \n
  • Enhanced Search: Improved search functionality to preserve existing filters when performing new searches
  • \n
  • Filter Preservation: Better handling of filter states across different search operations
  • \n
\n

Development and Code Quality#

\n
    \n
  • Code Documentation: Improved code comments and documentation throughout the codebase
  • \n
  • Linting Cleanup: Resolved various linting errors and improved code consistency
  • \n
  • Test Infrastructure: Updated timezone-related tests to work reliably in CI environment
  • \n
  • GitHub Actions: Added timeouts and offline preferences to improve CI reliability
  • \n
\n

Technical Improvements#

\n
    \n
  • Reduced excessive console logging from filter components
  • \n
  • Updated Jest coverage thresholds to realistic levels
  • \n
  • Improved error handling in various components
  • \n
  • Improved defensive programming practices throughout the codebase
  • \n
\n

Contributors#

\n

Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes

\n","text":"New Features# Task Management# Bulk Task Conversion: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request Instant Task Conversion Enhancement: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions Default Project Setting: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request Advanced Tag and Project Parsing: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug Enhanced Filter Bar Integration: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion Calendar and Views# Custom Multi-Day Calendar View: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request Responsive Calendar UI: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion Locale-Aware Date Formatting: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue Saved Views Enhancement: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback Task Organization# Drag and Drop Status Reordering: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion Overdue Tasks Filter: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue Project Group Enhancements: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion Pomodoro Timer# Background Timer Continuity: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix System Notifications: Convert Pomodoro notices to system notifications for better visibility (#136) Manual Duration Adjustment: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing Task Completion Sorting: Sort completed tasks to end of Pomodoro task selector for better organization Bug Fixes# UI and Interaction# Tooltip Standardization: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report Open Note Button Stability: Stabilized Open note button hover behavior and made font size consistent with other modal buttons Date Context Menu Clarity: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion Project Removal: Fixed project removal in edit modal not saving changes properly (#213) Advanced Calendar Resizing: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix Calendar and Recurring Tasks# Timezone Bug Fixes: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug Custom Calendar Display: Fixed undefined days display in custom calendar view Calendar Recurrence: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug Task Management# Pomodoro Task Tracking: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report Plugin Conflict Protection: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict Instant Conversion Improvements: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues Improvements# User Interface# Minimalist Design System: Implemented consistent borderless button design system across all components UI Polish: Applied minimalist styling with cleaned up borders and shadows throughout the interface Settings Enhancement: Enhanced settings explanatory sections with improved minimalist styling Advanced Calendar Title: Made advanced calendar title smaller for better proportions Search and Filtering# Enhanced Search: Improved search functionality to preserve existing filters when performing new searches Filter Preservation: Better handling of filter states across different search operations Development and Code Quality# Code Documentation: Improved code comments and documentation throughout the codebase Linting Cleanup: Resolved various linting errors and improved code consistency Test Infrastructure: Updated timezone-related tests to work reliably in CI environment GitHub Actions: Added timeouts and offline preferences to improve CI reliability Technical Improvements# Reduced excessive console logging from filter components Updated Jest coverage thresholds to realistic levels Improved error handling in various components Improved defensive programming practices throughout the codebase Contributors# Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes"},{"route":"/obsidian/releases/3.16.1/","title":"TaskNotes 3.16.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.1.md","namespace":"obsidian","relativePath":"releases/3.16.1.md","raw":"# TaskNotes 3.16.1\n\n## New Features\n\n### Task Management\n\n- **Visual Filter State Indicators**: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active\n\n## Bug Fixes\n\n### Link Generation and Consistency\n\n- **Obsidian Link Format Compliance**: Fixed \"Insert tasknote link\" and \"Convert task to TaskNote\" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support\n- **Consistent Link Formatting**: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred\n\n### Timezone and Date Handling\n\n- **Recurring Task Completion Fix**: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views\n- **UTC Date Consistency**: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking\n- **Calendar Date Normalization**: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling\n\n### User Interface\n\n- **Sort Arrow Visibility**: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode\n- **Duplicate Tooltip Prevention**: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes\n- **Pointer Cursor Consistency**: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution\n\n### Error Handling and Stability\n\n- **Daily Note Creation Protection**: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing \"Cannot read properties of undefined\" errors\n- **Security Compliance**: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations\n\n## Improvements\n\n### User Interface\n\n- **Calendar Styling Enhancements**: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency\n- **Enhanced Visual Definition**: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance\n\n### Development and Code Quality\n\n- **Test Infrastructure**: Added missing setTooltip mock to resolve 39 failing TaskCard tests\n- **Documentation Updates**: Improved documentation formatting and appearance\n\n## Technical Improvements\n\n- Enhanced date handling throughout the codebase with UTC method standardization\n- Improved defensive programming practices for timezone-sensitive operations\n- Better error messaging for daily note creation failures\n- Code security improvements with ESLint compliance\n\n","aliases":["/releases/3.16.1/","/releases/3.16.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-management","text":"Task Management"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"link-generation-and-consistency","text":"Link Generation and Consistency"},{"level":3,"id":"timezone-and-date-handling","text":"Timezone and Date Handling"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"error-handling-and-stability","text":"Error Handling and Stability"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"user-interface-2","text":"User Interface"},{"level":3,"id":"development-and-code-quality","text":"Development and Code Quality"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"}],"html":"

New Features#

\n

Task Management#

\n
    \n
  • Visual Filter State Indicators: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active
  • \n
\n

Bug Fixes#

\n\n
    \n
  • Obsidian Link Format Compliance: Fixed "Insert tasknote link" and "Convert task to TaskNote" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support
  • \n
  • Consistent Link Formatting: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred
  • \n
\n

Timezone and Date Handling#

\n
    \n
  • Recurring Task Completion Fix: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views
  • \n
  • UTC Date Consistency: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking
  • \n
  • Calendar Date Normalization: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling
  • \n
\n

User Interface#

\n
    \n
  • Sort Arrow Visibility: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode
  • \n
  • Duplicate Tooltip Prevention: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes
  • \n
  • Pointer Cursor Consistency: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution
  • \n
\n

Error Handling and Stability#

\n
    \n
  • Daily Note Creation Protection: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing "Cannot read properties of undefined" errors
  • \n
  • Security Compliance: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations
  • \n
\n

Improvements#

\n

User Interface#

\n
    \n
  • Calendar Styling Enhancements: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency
  • \n
  • Enhanced Visual Definition: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance
  • \n
\n

Development and Code Quality#

\n
    \n
  • Test Infrastructure: Added missing setTooltip mock to resolve 39 failing TaskCard tests
  • \n
  • Documentation Updates: Improved documentation formatting and appearance
  • \n
\n

Technical Improvements#

\n
    \n
  • Enhanced date handling throughout the codebase with UTC method standardization
  • \n
  • Improved defensive programming practices for timezone-sensitive operations
  • \n
  • Better error messaging for daily note creation failures
  • \n
  • Code security improvements with ESLint compliance
  • \n
\n","text":"New Features# Task Management# Visual Filter State Indicators: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active Bug Fixes# Link Generation and Consistency# Obsidian Link Format Compliance: Fixed \"Insert tasknote link\" and \"Convert task to TaskNote\" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support Consistent Link Formatting: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred Timezone and Date Handling# Recurring Task Completion Fix: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views UTC Date Consistency: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking Calendar Date Normalization: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling User Interface# Sort Arrow Visibility: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode Duplicate Tooltip Prevention: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes Pointer Cursor Consistency: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution Error Handling and Stability# Daily Note Creation Protection: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing \"Cannot read properties of undefined\" errors Security Compliance: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations Improvements# User Interface# Calendar Styling Enhancements: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency Enhanced Visual Definition: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance Development and Code Quality# Test Infrastructure: Added missing setTooltip mock to resolve 39 failing TaskCard tests Documentation Updates: Improved documentation formatting and appearance Technical Improvements# Enhanced date handling throughout the codebase with UTC method standardization Improved defensive programming practices for timezone-sensitive operations Better error messaging for daily note creation failures Code security improvements with ESLint compliance"},{"route":"/obsidian/releases/3.16.2/","title":"TaskNotes 3.16.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.2.md","namespace":"obsidian","relativePath":"releases/3.16.2.md","raw":"# TaskNotes 3.16.2\n\n## New Features\n\n### Task Link Integration\n\n- **Markdown Link Support for Inline Task Widgets**: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders `[text](path)` markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links\n\n## Improvements\n\n### Link Processing\n\n- **Link Detection**: Improved TaskLinkDetectionService to detect both `[[wikilinks]]` and `[markdown](links)` with proper URL decoding for paths containing spaces\n- **Link Rendering**: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently\n- **API Integration**: Uses proper Obsidian API functions (`parseLinktext()` and `getFirstLinkpathDest()`) for reliable link resolution\n","aliases":["/releases/3.16.2/","/releases/3.16.2/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-link-integration","text":"Task Link Integration"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"link-processing","text":"Link Processing"}],"html":"

New Features#

\n\n
    \n
  • Markdown Link Support for Inline Task Widgets: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders [text](path) markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links
  • \n
\n

Improvements#

\n\n
    \n
  • Link Detection: Improved TaskLinkDetectionService to detect both [[wikilinks]] and [markdown](links) with proper URL decoding for paths containing spaces
  • \n
  • Link Rendering: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently
  • \n
  • API Integration: Uses proper Obsidian API functions (parseLinktext() and getFirstLinkpathDest()) for reliable link resolution
  • \n
\n","text":"New Features# Task Link Integration# Markdown Link Support for Inline Task Widgets: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders [text](path) markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links Improvements# Link Processing# Link Detection: Improved TaskLinkDetectionService to detect both [[wikilinks]] and [markdown](links) with proper URL decoding for paths containing spaces Link Rendering: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently API Integration: Uses proper Obsidian API functions (parseLinktext() and getFirstLinkpathDest()) for reliable link resolution"},{"route":"/obsidian/releases/3.16.3/","title":"TaskNotes 3.16.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.3.md","namespace":"obsidian","relativePath":"releases/3.16.3.md","raw":"# TaskNotes 3.16.3\n\n## Bug Fixes\n\n### User Interface\n\n- **Create Task Modal Accessibility**: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue\n\n### Timezone Handling\n\n- **Recurring Task Calendar Display**: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view\n- **Task Completion Calendar**: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones\n\n### Task Conversion\n\n- **Context Detection in Instant Tasks**: Fixed instant task conversion to properly detect and preserve contexts specified with \"@context\" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue\n- **Time Preservation**: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process\n\n## Improvements\n\n### Code Quality\n\n- **Test Coverage**: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases","aliases":["/releases/3.16.3/","/releases/3.16.3/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"timezone-handling","text":"Timezone Handling"},{"level":3,"id":"task-conversion","text":"Task Conversion"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"code-quality","text":"Code Quality"}],"html":"

Bug Fixes#

\n

User Interface#

\n
    \n
  • Create Task Modal Accessibility: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue
  • \n
\n

Timezone Handling#

\n
    \n
  • Recurring Task Calendar Display: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view
  • \n
  • Task Completion Calendar: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones
  • \n
\n

Task Conversion#

\n
    \n
  • Context Detection in Instant Tasks: Fixed instant task conversion to properly detect and preserve contexts specified with "@context" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue
  • \n
  • Time Preservation: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process
  • \n
\n

Improvements#

\n

Code Quality#

\n
    \n
  • Test Coverage: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases
  • \n
\n","text":"Bug Fixes# User Interface# Create Task Modal Accessibility: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue Timezone Handling# Recurring Task Calendar Display: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view Task Completion Calendar: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones Task Conversion# Context Detection in Instant Tasks: Fixed instant task conversion to properly detect and preserve contexts specified with \"@context\" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue Time Preservation: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process Improvements# Code Quality# Test Coverage: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases"},{"route":"/obsidian/releases/3.16.4/","title":"TaskNotes 3.16.4","description":"This ensures users can always edit task titles regardless of the modal type or natural language input settings.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.4.md","namespace":"obsidian","relativePath":"releases/3.16.4.md","raw":"# TaskNotes 3.16.4\n\n## Bug Fixes\n\n### User Interface\n\n- **Task Modal Title Field**: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic:\n - Edit modals: Title field always visible in the details section\n - Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea)\n - Create modals with natural language input disabled: Title field only appears at the top of the modal\n\nThis ensures users can always edit task titles regardless of the modal type or natural language input settings.","aliases":["/releases/3.16.4/","/releases/3.16.4/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"user-interface","text":"User Interface"}],"html":"

Bug Fixes#

\n

User Interface#

\n
    \n
  • Task Modal Title Field: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic:
      \n
    • Edit modals: Title field always visible in the details section
    • \n
    • Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea)
    • \n
    • Create modals with natural language input disabled: Title field only appears at the top of the modal
    • \n
    \n
  • \n
\n

This ensures users can always edit task titles regardless of the modal type or natural language input settings.

\n","text":"Bug Fixes# User Interface# Task Modal Title Field: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic: Edit modals: Title field always visible in the details section Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea) Create modals with natural language input disabled: Title field only appears at the top of the modal This ensures users can always edit task titles regardless of the modal type or natural language input settings."},{"route":"/obsidian/releases/3.17.0/","title":"TaskNotes 3.17.0","description":"This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.17.0.md","namespace":"obsidian","relativePath":"releases/3.17.0.md","raw":"# TaskNotes 3.17.0\n\n## Major Features\n\n### Enhanced Recurring Tasks with DTSTART Support\n\nThis release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering.\n\n**Background and Motivation:**\n\nThe previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior.\n\n**Key Improvements:**\n\n- **DTSTART Integration**: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern\n- **Dynamic Date Updates**: The `task.scheduled` field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates\n- **Flexible Next Occurrence Scheduling**: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling\n- **Visual Hierarchy**: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task\n- **Independent Time Control**: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern\n- **Dual Drag Behavior**: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance\n- **Automatic DTSTART Addition**: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions\n- **Manual Rescheduling Support**: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications\n\n### Expandable Project Subtasks\n\nA new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy.\n\n**Features:**\n\n- **Chevron Controls**: Click chevron icons on project task cards to expand/collapse subtask display\n- **Configurable**: New \"Show expandable subtasks\" setting allows users to enable/disable the feature\n\n### Responsive Pomodoro View\n\nThe Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design.\n\nThanks to @oliverlalan for requesting this improvement (#339).\n\n### Enhanced Filename Templates\n\nSignificant expansion of available template variables for task creation, providing much greater flexibility in filename patterns.\n\n**New Template Variables:**\n\n- **Date/Time Variations**: shortDate, monthName, dayName, week, quarter, time12, time24\n- **Unix Timestamps**: unix (seconds), unixMs (milliseconds) \n- **Title Case Variations**: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal\n- **Short Forms**: priorityShort, statusShort for single-letter representations\n- **Unique Identifiers**: zettel (Zettelkasten ID), nano (high-precision unique ID)\n\nThe settings UI now documents all 40+ available template variables for easy reference.\n\nThanks to @fastrick for the original unix timestamp request.\n\n## Bug Fixes\n\n### Critical Timezone Handling Fixes\n\nThis release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the \"UTC Anchor\" principle for consistent date handling.\n\n**Major Timezone Bugs Fixed:**\n\n- **Recurring Task Completion**: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314\n- **Calendar Date Misalignment**: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec)\n- **Weekly Task Display**: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322\n- **Task Completion Date Bug**: Resolved bug where `complete_instances` was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314\n- **Date Parsing Inconsistencies**: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application\n- **Filter Date Handling**: Fixed date filtering to work consistently across all timezones\n- **Agenda View \"Today\" Detection**: Corrected timezone-sensitive today detection that affected agenda headers\n- **ICS Import Timezone Issues**: Resolved timezone problems with both recurring and single events from ICS imports\n\n**Technical Implementation:**\n\n- Introduced `parseDateToUTC()` function for consistent UTC anchoring of date-only strings\n- Updated date comparison functions to use UTC anchors throughout\n- Replaced timezone-sensitive date operations with consistent UTC-based alternatives\n- Comprehensive audit and fix of all date handling patterns in the codebase\n\n### Project Filtering Improvements\n\nResolved critical bugs in project filtering that prevented proper task display and project selection.\n\n**Fixes:**\n- **Wikilink Resolution**: Fixed handling of relative vs absolute project wikilinks (e.g., `[[../Projects/My Project]]` vs `[[My Project]]`) - thanks to @xorander00 for the detailed bug report\n- **Filter Grouping Logic**: Corrected AND/OR grouping in project filters to prevent showing too many tasks\n- **Missing Projects**: Fixed issue where not all projects appeared in filter dropdown selection\n- **Cache Management**: Improved cache invalidation and project name extraction with better validation\n\n### Subtask Widget Improvements\n\nFixed several issues with the project subtasks widget affecting user experience and reliability.\n\n**Widget Fixes:**\n\n- **View State Persistence**: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329)\n- **Filter State Isolation**: Prevented filter settings from bleeding between different notes' subtask widgets\n- **Configurable Positioning**: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164)\n- **Event Listener Management**: Improved cleanup to prevent memory leaks and event accumulation\n- **Event Bubbling**: Fixed issue where clicking subtasks would trigger both subtask and parent task modals\n- **Styling Isolation**: Prevented completion styles from affecting nested subtasks incorrectly\n\n### ICS Calendar Integration\n\n**Timezone Processing**: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events.\n\n### Performance and Reliability\n\n**Cache Optimization**: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness.\n\n**Type Safety**: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues.\n\n**Error Handling**: Enhanced error handling and null safety checks throughout project filtering and service initialization.\n\n## Technical Improvements\n\n### UTC Anchor Implementation\n\nComprehensive implementation of the UTC Anchor principle for robust timezone handling:\n\n- All date-only strings now consistently parsed as UTC anchors\n- Date comparison operations standardized using UTC methods\n- Eliminated timezone-dependent date creation patterns\n- Added comprehensive timezone test coverage\n\n### Service Architecture\n\n**Expanded Projects Service**: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management.\n\n**View State Manager**: Improved view state persistence across different contexts and note switches.\n\n### Documentation Updates\n\n- Updated recurring tasks documentation to reflect new behavior\n- Added timezone handling guides for developers\n- Enhanced calendar views documentation with drag behavior explanations\n- Comprehensive template variable documentation\n\n## Breaking Changes\n\n**Date Handling**: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle.\n\n## Migration Notes\n\nExisting recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling).\n\n","aliases":["/releases/3.17.0/","/releases/3.17.0/"],"toc":[{"level":2,"id":"major-features","text":"Major Features"},{"level":3,"id":"enhanced-recurring-tasks-with-dtstart-support","text":"Enhanced Recurring Tasks with DTSTART Support"},{"level":3,"id":"expandable-project-subtasks","text":"Expandable Project Subtasks"},{"level":3,"id":"responsive-pomodoro-view","text":"Responsive Pomodoro View"},{"level":3,"id":"enhanced-filename-templates","text":"Enhanced Filename Templates"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"critical-timezone-handling-fixes","text":"Critical Timezone Handling Fixes"},{"level":3,"id":"project-filtering-improvements","text":"Project Filtering Improvements"},{"level":3,"id":"subtask-widget-improvements","text":"Subtask Widget Improvements"},{"level":3,"id":"ics-calendar-integration","text":"ICS Calendar Integration"},{"level":3,"id":"performance-and-reliability","text":"Performance and Reliability"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"},{"level":3,"id":"utc-anchor-implementation","text":"UTC Anchor Implementation"},{"level":3,"id":"service-architecture","text":"Service Architecture"},{"level":3,"id":"documentation-updates","text":"Documentation Updates"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"},{"level":2,"id":"migration-notes","text":"Migration Notes"}],"html":"

Major Features#

\n

Enhanced Recurring Tasks with DTSTART Support#

\n

This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering.

\n

Background and Motivation:

\n

The previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior.

\n

Key Improvements:

\n
    \n
  • DTSTART Integration: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern
  • \n
  • Dynamic Date Updates: The task.scheduled field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates
  • \n
  • Flexible Next Occurrence Scheduling: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling
  • \n
  • Visual Hierarchy: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task
  • \n
  • Independent Time Control: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern
  • \n
  • Dual Drag Behavior: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance
  • \n
  • Automatic DTSTART Addition: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions
  • \n
  • Manual Rescheduling Support: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications
  • \n
\n

Expandable Project Subtasks#

\n

A new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy.

\n

Features:

\n
    \n
  • Chevron Controls: Click chevron icons on project task cards to expand/collapse subtask display
  • \n
  • Configurable: New "Show expandable subtasks" setting allows users to enable/disable the feature
  • \n
\n

Responsive Pomodoro View#

\n

The Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design.

\n

Thanks to @oliverlalan for requesting this improvement (#339).

\n

Enhanced Filename Templates#

\n

Significant expansion of available template variables for task creation, providing much greater flexibility in filename patterns.

\n

New Template Variables:

\n
    \n
  • Date/Time Variations: shortDate, monthName, dayName, week, quarter, time12, time24
  • \n
  • Unix Timestamps: unix (seconds), unixMs (milliseconds)
  • \n
  • Title Case Variations: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal
  • \n
  • Short Forms: priorityShort, statusShort for single-letter representations
  • \n
  • Unique Identifiers: zettel (Zettelkasten ID), nano (high-precision unique ID)
  • \n
\n

The settings UI now documents all 40+ available template variables for easy reference.

\n

Thanks to @fastrick for the original unix timestamp request.

\n

Bug Fixes#

\n

Critical Timezone Handling Fixes#

\n

This release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the "UTC Anchor" principle for consistent date handling.

\n

Major Timezone Bugs Fixed:

\n
    \n
  • Recurring Task Completion: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314
  • \n
  • Calendar Date Misalignment: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec)
  • \n
  • Weekly Task Display: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322
  • \n
  • Task Completion Date Bug: Resolved bug where complete_instances was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314
  • \n
  • Date Parsing Inconsistencies: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application
  • \n
  • Filter Date Handling: Fixed date filtering to work consistently across all timezones
  • \n
  • Agenda View "Today" Detection: Corrected timezone-sensitive today detection that affected agenda headers
  • \n
  • ICS Import Timezone Issues: Resolved timezone problems with both recurring and single events from ICS imports
  • \n
\n

Technical Implementation:

\n
    \n
  • Introduced parseDateToUTC() function for consistent UTC anchoring of date-only strings
  • \n
  • Updated date comparison functions to use UTC anchors throughout
  • \n
  • Replaced timezone-sensitive date operations with consistent UTC-based alternatives
  • \n
  • Comprehensive audit and fix of all date handling patterns in the codebase
  • \n
\n

Project Filtering Improvements#

\n

Resolved critical bugs in project filtering that prevented proper task display and project selection.

\n

Fixes:

\n
    \n
  • Wikilink Resolution: Fixed handling of relative vs absolute project wikilinks (e.g., [[../Projects/My Project]] vs [[My Project]]) - thanks to @xorander00 for the detailed bug report
  • \n
  • Filter Grouping Logic: Corrected AND/OR grouping in project filters to prevent showing too many tasks
  • \n
  • Missing Projects: Fixed issue where not all projects appeared in filter dropdown selection
  • \n
  • Cache Management: Improved cache invalidation and project name extraction with better validation
  • \n
\n

Subtask Widget Improvements#

\n

Fixed several issues with the project subtasks widget affecting user experience and reliability.

\n

Widget Fixes:

\n
    \n
  • View State Persistence: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329)
  • \n
  • Filter State Isolation: Prevented filter settings from bleeding between different notes' subtask widgets
  • \n
  • Configurable Positioning: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164)
  • \n
  • Event Listener Management: Improved cleanup to prevent memory leaks and event accumulation
  • \n
  • Event Bubbling: Fixed issue where clicking subtasks would trigger both subtask and parent task modals
  • \n
  • Styling Isolation: Prevented completion styles from affecting nested subtasks incorrectly
  • \n
\n

ICS Calendar Integration#

\n

Timezone Processing: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events.

\n

Performance and Reliability#

\n

Cache Optimization: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness.

\n

Type Safety: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues.

\n

Error Handling: Enhanced error handling and null safety checks throughout project filtering and service initialization.

\n

Technical Improvements#

\n

UTC Anchor Implementation#

\n

Comprehensive implementation of the UTC Anchor principle for robust timezone handling:

\n
    \n
  • All date-only strings now consistently parsed as UTC anchors
  • \n
  • Date comparison operations standardized using UTC methods
  • \n
  • Eliminated timezone-dependent date creation patterns
  • \n
  • Added comprehensive timezone test coverage
  • \n
\n

Service Architecture#

\n

Expanded Projects Service: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management.

\n

View State Manager: Improved view state persistence across different contexts and note switches.

\n

Documentation Updates#

\n
    \n
  • Updated recurring tasks documentation to reflect new behavior
  • \n
  • Added timezone handling guides for developers
  • \n
  • Enhanced calendar views documentation with drag behavior explanations
  • \n
  • Comprehensive template variable documentation
  • \n
\n

Breaking Changes#

\n

Date Handling: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle.

\n

Migration Notes#

\n

Existing recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling).

\n","text":"Major Features# Enhanced Recurring Tasks with DTSTART Support# This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering. Background and Motivation: The previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior. Key Improvements: DTSTART Integration: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern Dynamic Date Updates: The task.scheduled field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates Flexible Next Occurrence Scheduling: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling Visual Hierarchy: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task Independent Time Control: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern Dual Drag Behavior: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance Automatic DTSTART Addition: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions Manual Rescheduling Support: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications Expandable Project Subtasks# A new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy. Features: Chevron Controls: Click chevron icons on project task cards to expand/collapse subtask display Configurable: New \"Show expandable subtasks\" setting allows users to enable/disable the feature Responsive Pomodoro View# The Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design. Thanks to @oliverlalan for requesting this improvement (#339). Enhanced Filename Templates# Significant expansion of available template variables for task creation, providing much greater flexibility in filename patterns. New Template Variables: Date/Time Variations: shortDate, monthName, dayName, week, quarter, time12, time24 Unix Timestamps: unix (seconds), unixMs (milliseconds) Title Case Variations: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal Short Forms: priorityShort, statusShort for single-letter representations Unique Identifiers: zettel (Zettelkasten ID), nano (high-precision unique ID) The settings UI now documents all 40+ available template variables for easy reference. Thanks to @fastrick for the original unix timestamp request. Bug Fixes# Critical Timezone Handling Fixes# This release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the \"UTC Anchor\" principle for consistent date handling. Major Timezone Bugs Fixed: Recurring Task Completion: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314 Calendar Date Misalignment: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec) Weekly Task Display: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322 Task Completion Date Bug: Resolved bug where complete_instances was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314 Date Parsing Inconsistencies: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application Filter Date Handling: Fixed date filtering to work consistently across all timezones Agenda View \"Today\" Detection: Corrected timezone-sensitive today detection that affected agenda headers ICS Import Timezone Issues: Resolved timezone problems with both recurring and single events from ICS imports Technical Implementation: Introduced parseDateToUTC() function for consistent UTC anchoring of date-only strings Updated date comparison functions to use UTC anchors throughout Replaced timezone-sensitive date operations with consistent UTC-based alternatives Comprehensive audit and fix of all date handling patterns in the codebase Project Filtering Improvements# Resolved critical bugs in project filtering that prevented proper task display and project selection. Fixes: Wikilink Resolution: Fixed handling of relative vs absolute project wikilinks (e.g., [[../Projects/My Project]] vs [[My Project]]) - thanks to @xorander00 for the detailed bug report Filter Grouping Logic: Corrected AND/OR grouping in project filters to prevent showing too many tasks Missing Projects: Fixed issue where not all projects appeared in filter dropdown selection Cache Management: Improved cache invalidation and project name extraction with better validation Subtask Widget Improvements# Fixed several issues with the project subtasks widget affecting user experience and reliability. Widget Fixes: View State Persistence: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329) Filter State Isolation: Prevented filter settings from bleeding between different notes' subtask widgets Configurable Positioning: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164) Event Listener Management: Improved cleanup to prevent memory leaks and event accumulation Event Bubbling: Fixed issue where clicking subtasks would trigger both subtask and parent task modals Styling Isolation: Prevented completion styles from affecting nested subtasks incorrectly ICS Calendar Integration# Timezone Processing: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events. Performance and Reliability# Cache Optimization: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness. Type Safety: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues. Error Handling: Enhanced error handling and null safety checks throughout project filtering and service initialization. Technical Improvements# UTC Anchor Implementation# Comprehensive implementation of the UTC Anchor principle for robust timezone handling: All date-only strings now consistently parsed as UTC anchors Date comparison operations standardized using UTC methods Eliminated timezone-dependent date creation patterns Added comprehensive timezone test coverage Service Architecture# Expanded Projects Service: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management. View State Manager: Improved view state persistence across different contexts and note switches. Documentation Updates# Updated recurring tasks documentation to reflect new behavior Added timezone handling guides for developers Enhanced calendar views documentation with drag behavior explanations Comprehensive template variable documentation Breaking Changes# Date Handling: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle. Migration Notes# Existing recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling)."},{"route":"/obsidian/releases/3.17.1/","title":"TaskNotes 3.17.1","description":"This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.17.1.md","namespace":"obsidian","relativePath":"releases/3.17.1.md","raw":"# TaskNotes 3.17.1\n\n## Bug Fixes\n\n### Critical Timezone Handling Fixes\n\nThis patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones.\n\n#### Completions Calendar Rendering (#322)\n\nFixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC:\n\n- **Day Number Display**: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction\n- **Month Comparison Logic**: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection\n- **Calendar Navigation**: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months\n\nThese fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users.\n\n#### Advanced Calendar Drag-and-Drop Operations (#344)\n\nResolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC.\n\nThanks to @trang-ngn for reporting this issue with clear reproduction steps.\n\n**Root Cause**: The drag-and-drop system was using `formatDateForStorage()` which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI.\n\n**Fixed Operations**:\n\n- All-day and timed event drag-and-drop (`handleEventDrop`)\n- External task drag-and-drop from outside the calendar (`handleExternalDrop`)\n- Modal-based task scheduling (`scheduleTask`)\n- Date selection task creation (`handleDateSelect`)\n- Timeblock creation and event resizing operations\n- Event context menu date handling\n\nThe fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data.\n\n#### Task Completion Status Checks (#322)\n\nFixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in `getEffectiveTaskStatus()`. \n\n**Root Cause**: The function was using timezone-sensitive `date-fns format()` for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users).\n\n**Solution**: Replaced timezone-sensitive formatting with `formatDateForStorage()` to ensure consistent UTC-anchored date strings that match the format used in `complete_instances`.\n\nThis fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete.\n\n## Technical Implementation\n\nAll fixes implement the established \"UTC Anchor\" principle for consistent timezone handling:\n\n- Consistent use of UTC-anchored date operations for date-only comparisons\n- Replacement of timezone-sensitive date formatting with UTC-based alternatives \n- Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)\n\n","aliases":["/releases/3.17.1/","/releases/3.17.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"critical-timezone-handling-fixes","text":"Critical Timezone Handling Fixes"},{"level":2,"id":"technical-implementation","text":"Technical Implementation"}],"html":"

Bug Fixes#

\n

Critical Timezone Handling Fixes#

\n

This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones.

\n

Completions Calendar Rendering (#322)#

\n

Fixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC:

\n
    \n
  • Day Number Display: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction
  • \n
  • Month Comparison Logic: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection
  • \n
  • Calendar Navigation: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months
  • \n
\n

These fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users.

\n

Advanced Calendar Drag-and-Drop Operations (#344)#

\n

Resolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC.

\n

Thanks to @trang-ngn for reporting this issue with clear reproduction steps.

\n

Root Cause: The drag-and-drop system was using formatDateForStorage() which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI.

\n

Fixed Operations:

\n
    \n
  • All-day and timed event drag-and-drop (handleEventDrop)
  • \n
  • External task drag-and-drop from outside the calendar (handleExternalDrop)
  • \n
  • Modal-based task scheduling (scheduleTask)
  • \n
  • Date selection task creation (handleDateSelect)
  • \n
  • Timeblock creation and event resizing operations
  • \n
  • Event context menu date handling
  • \n
\n

The fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data.

\n

Task Completion Status Checks (#322)#

\n

Fixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in getEffectiveTaskStatus().

\n

Root Cause: The function was using timezone-sensitive date-fns format() for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users).

\n

Solution: Replaced timezone-sensitive formatting with formatDateForStorage() to ensure consistent UTC-anchored date strings that match the format used in complete_instances.

\n

This fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete.

\n

Technical Implementation#

\n

All fixes implement the established "UTC Anchor" principle for consistent timezone handling:

\n
    \n
  • Consistent use of UTC-anchored date operations for date-only comparisons
  • \n
  • Replacement of timezone-sensitive date formatting with UTC-based alternatives
  • \n
  • Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)
  • \n
\n","text":"Bug Fixes# Critical Timezone Handling Fixes# This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones. Completions Calendar Rendering (#322)# Fixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC: Day Number Display: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction Month Comparison Logic: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection Calendar Navigation: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months These fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users. Advanced Calendar Drag-and-Drop Operations (#344)# Resolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC. Thanks to @trang-ngn for reporting this issue with clear reproduction steps. Root Cause: The drag-and-drop system was using formatDateForStorage() which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI. Fixed Operations: All-day and timed event drag-and-drop (handleEventDrop) External task drag-and-drop from outside the calendar (handleExternalDrop) Modal-based task scheduling (scheduleTask) Date selection task creation (handleDateSelect) Timeblock creation and event resizing operations Event context menu date handling The fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data. Task Completion Status Checks (#322)# Fixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in getEffectiveTaskStatus(). Root Cause: The function was using timezone-sensitive date-fns format() for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users). Solution: Replaced timezone-sensitive formatting with formatDateForStorage() to ensure consistent UTC-anchored date strings that match the format used in complete_instances. This fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete. Technical Implementation# All fixes implement the established \"UTC Anchor\" principle for consistent timezone handling: Consistent use of UTC-anchored date operations for date-only comparisons Replacement of timezone-sensitive date formatting with UTC-based alternatives Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)"},{"route":"/obsidian/releases/3.18.0/","title":"TaskNotes 3.18.0","description":"A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.18.0.md","namespace":"obsidian","relativePath":"releases/3.18.0.md","raw":"# TaskNotes 3.18.0\n\n## New Features\n\n### Task Reminders System\n\nA complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.\n\n**Core Features:**\n\n- Support for both relative reminders (e.g., \"15 minutes before due date\") and absolute reminders (specific date/time)\n- Visual reminder indicators on task cards with clickable bell icons\n- Integration with task creation and editing workflows\n\n**User Interface:**\n\n- **Reminder Modal**: Modal for managing task reminders with form validation and real-time preview\n- **Reminder Context Menu**: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates)\n- Reminder management accessible from task creation modal, edit modal, and task cards\n\n**Default Reminders:**\n\n- Configure default reminders that automatically apply to new tasks\n- Support for multiple default reminders per task type\n- Applies to both manual task creation and instant conversion workflows\n\n### Property-Based Task Identification\n\nTasks can now be identified using frontmatter properties instead of requiring tags.\n\n- Configure property name and value for task identification (e.g., `categories: [[Tasks]]`)\n- Full backward compatibility with existing tag-based workflows\n- Addresses modern Obsidian property-based vault organization patterns\n\n*Thanks to @mdbraber for the feature request (#340)*\n\n### Enhanced Saved Views\n- Clicking an active saved view now clears all filters, providing quick access to unfiltered task list\n- Preserves sort and group settings while resetting filters\n\n*Thanks to @oldjove for the suggestion (#351)*\n\n### Parent Note as Project Option\n- New setting to automatically use parent note as project during instant task conversion\n- Useful for users who organize tasks within project-specific notes\n- Merges with existing default projects to avoid duplicates\n\n*Thanks to @FindingJohnny for the feature request (#348)*\n\n## Bug Fixes\n\n### ICS Calendar Integration\n\n- **Fixed recurring event exceptions**: Properly handle EXDATE properties and RECURRENCE-ID for modified instances\n- **Eliminated duplicate events**: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared\n\n*Thanks to @robmikulec for reporting the recurring events issue (#342)*\n\n### Settings Persistence\n\n- **Fixed settings reset during updates**: Prevent user configuration loss when plugin updates introduce new default settings\n- Apply deep merge strategy to preserve customizations in nested configuration objects\n\n## Improvements\n\n### User Interface\n\n- Reminder modal uses consistent design patterns with task creation/edit modals\n- Fixed task card icon overlap issues with proper spacing for multiple indicators\n\n### Code Quality\n\n- Added unit test coverage for new reminder functionality\n- Improved type safety with proper TypeScript interfaces for reminder data structures\n- Improved error handling and user feedback across reminder operations\n\n## Technical Details\n\n### Data Model Changes\n\n- Added optional `reminders` array field to TaskInfo interface\n- Extended field mapping support for custom reminder property names\n- Enhanced cache system to include reminder data in task extraction\n\n","aliases":["/releases/3.18.0/","/releases/3.18.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-reminders-system","text":"Task Reminders System"},{"level":3,"id":"property-based-task-identification","text":"Property-Based Task Identification"},{"level":3,"id":"enhanced-saved-views","text":"Enhanced Saved Views"},{"level":3,"id":"parent-note-as-project-option","text":"Parent Note as Project Option"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"ics-calendar-integration","text":"ICS Calendar Integration"},{"level":3,"id":"settings-persistence","text":"Settings Persistence"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"code-quality","text":"Code Quality"},{"level":2,"id":"technical-details","text":"Technical Details"},{"level":3,"id":"data-model-changes","text":"Data Model Changes"}],"html":"

New Features#

\n

Task Reminders System#

\n

A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.

\n

Core Features:

\n
    \n
  • Support for both relative reminders (e.g., "15 minutes before due date") and absolute reminders (specific date/time)
  • \n
  • Visual reminder indicators on task cards with clickable bell icons
  • \n
  • Integration with task creation and editing workflows
  • \n
\n

User Interface:

\n
    \n
  • Reminder Modal: Modal for managing task reminders with form validation and real-time preview
  • \n
  • Reminder Context Menu: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates)
  • \n
  • Reminder management accessible from task creation modal, edit modal, and task cards
  • \n
\n

Default Reminders:

\n
    \n
  • Configure default reminders that automatically apply to new tasks
  • \n
  • Support for multiple default reminders per task type
  • \n
  • Applies to both manual task creation and instant conversion workflows
  • \n
\n

Property-Based Task Identification#

\n

Tasks can now be identified using frontmatter properties instead of requiring tags.

\n
    \n
  • Configure property name and value for task identification (e.g., categories: [[Tasks]])
  • \n
  • Full backward compatibility with existing tag-based workflows
  • \n
  • Addresses modern Obsidian property-based vault organization patterns
  • \n
\n

Thanks to @mdbraber for the feature request (#340)

\n

Enhanced Saved Views#

\n
    \n
  • Clicking an active saved view now clears all filters, providing quick access to unfiltered task list
  • \n
  • Preserves sort and group settings while resetting filters
  • \n
\n

Thanks to @oldjove for the suggestion (#351)

\n

Parent Note as Project Option#

\n
    \n
  • New setting to automatically use parent note as project during instant task conversion
  • \n
  • Useful for users who organize tasks within project-specific notes
  • \n
  • Merges with existing default projects to avoid duplicates
  • \n
\n

Thanks to @FindingJohnny for the feature request (#348)

\n

Bug Fixes#

\n

ICS Calendar Integration#

\n
    \n
  • Fixed recurring event exceptions: Properly handle EXDATE properties and RECURRENCE-ID for modified instances
  • \n
  • Eliminated duplicate events: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared
  • \n
\n

Thanks to @robmikulec for reporting the recurring events issue (#342)

\n

Settings Persistence#

\n
    \n
  • Fixed settings reset during updates: Prevent user configuration loss when plugin updates introduce new default settings
  • \n
  • Apply deep merge strategy to preserve customizations in nested configuration objects
  • \n
\n

Improvements#

\n

User Interface#

\n
    \n
  • Reminder modal uses consistent design patterns with task creation/edit modals
  • \n
  • Fixed task card icon overlap issues with proper spacing for multiple indicators
  • \n
\n

Code Quality#

\n
    \n
  • Added unit test coverage for new reminder functionality
  • \n
  • Improved type safety with proper TypeScript interfaces for reminder data structures
  • \n
  • Improved error handling and user feedback across reminder operations
  • \n
\n

Technical Details#

\n

Data Model Changes#

\n
    \n
  • Added optional reminders array field to TaskInfo interface
  • \n
  • Extended field mapping support for custom reminder property names
  • \n
  • Enhanced cache system to include reminder data in task extraction
  • \n
\n","text":"New Features# Task Reminders System# A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality. Core Features: Support for both relative reminders (e.g., \"15 minutes before due date\") and absolute reminders (specific date/time) Visual reminder indicators on task cards with clickable bell icons Integration with task creation and editing workflows User Interface: Reminder Modal: Modal for managing task reminders with form validation and real-time preview Reminder Context Menu: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates) Reminder management accessible from task creation modal, edit modal, and task cards Default Reminders: Configure default reminders that automatically apply to new tasks Support for multiple default reminders per task type Applies to both manual task creation and instant conversion workflows Property-Based Task Identification# Tasks can now be identified using frontmatter properties instead of requiring tags. Configure property name and value for task identification (e.g., categories: [[Tasks]]) Full backward compatibility with existing tag-based workflows Addresses modern Obsidian property-based vault organization patterns Thanks to @mdbraber for the feature request (#340) Enhanced Saved Views# Clicking an active saved view now clears all filters, providing quick access to unfiltered task list Preserves sort and group settings while resetting filters Thanks to @oldjove for the suggestion (#351) Parent Note as Project Option# New setting to automatically use parent note as project during instant task conversion Useful for users who organize tasks within project-specific notes Merges with existing default projects to avoid duplicates Thanks to @FindingJohnny for the feature request (#348) Bug Fixes# ICS Calendar Integration# Fixed recurring event exceptions: Properly handle EXDATE properties and RECURRENCE-ID for modified instances Eliminated duplicate events: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared Thanks to @robmikulec for reporting the recurring events issue (#342) Settings Persistence# Fixed settings reset during updates: Prevent user configuration loss when plugin updates introduce new default settings Apply deep merge strategy to preserve customizations in nested configuration objects Improvements# User Interface# Reminder modal uses consistent design patterns with task creation/edit modals Fixed task card icon overlap issues with proper spacing for multiple indicators Code Quality# Added unit test coverage for new reminder functionality Improved type safety with proper TypeScript interfaces for reminder data structures Improved error handling and user feedback across reminder operations Technical Details# Data Model Changes# Added optional reminders array field to TaskInfo interface Extended field mapping support for custom reminder property names Enhanced cache system to include reminder data in task extraction"},{"route":"/obsidian/releases/3.18.1/","title":"TaskNotes 3.18.1","description":"Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.18.1.md","namespace":"obsidian","relativePath":"releases/3.18.1.md","raw":"# TaskNotes 3.18.1\n\n## Bug Fixes\n\n### Cache Synchronization Race Conditions (#358)\n\nFixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations.\n\n*Thanks to @willgraham345 for reporting the calendar auto-refresh issue*\n\n## Code Quality Improvements\n\n### Event Listener Management\n\nSimplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array.\n\n## Technical Details\n\n**Cache Synchronization Strategy**: The implementation follows a \"wait-then-update\" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times.\n\n","aliases":["/releases/3.18.1/","/releases/3.18.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"cache-synchronization-race-conditions-358","text":"Cache Synchronization Race Conditions (#358)"},{"level":2,"id":"code-quality-improvements","text":"Code Quality Improvements"},{"level":3,"id":"event-listener-management","text":"Event Listener Management"},{"level":2,"id":"technical-details","text":"Technical Details"}],"html":"

Bug Fixes#

\n

Cache Synchronization Race Conditions (#358)#

\n

Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations.

\n

Thanks to @willgraham345 for reporting the calendar auto-refresh issue

\n

Code Quality Improvements#

\n

Event Listener Management#

\n

Simplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array.

\n

Technical Details#

\n

Cache Synchronization Strategy: The implementation follows a "wait-then-update" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times.

\n","text":"Bug Fixes# Cache Synchronization Race Conditions (#358)# Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations. Thanks to @willgraham345 for reporting the calendar auto-refresh issue Code Quality Improvements# Event Listener Management# Simplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array. Technical Details# Cache Synchronization Strategy: The implementation follows a \"wait-then-update\" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times."},{"route":"/obsidian/releases/3.18.2/","title":"TaskNotes 3.18.2","description":"Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.18.2.md","namespace":"obsidian","relativePath":"releases/3.18.2.md","raw":"# TaskNotes 3.18.2\n\n## Bug Fixes\n\n### Timeblock Date Shift Issue (#368)\n\nFixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs.\n\nTimeblocks now appear on the correct calendar day regardless of user timezone or DST transitions.\n\n*Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information.*\n\n### Performance Issues with Task Views\n\nEliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing.\n\n## New Features\n\n### Enhanced Filename Template Variables (#370)\n\nAdded new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility:\n\n- `{milliseconds}`, `{ms}` - 3-digit milliseconds (000-999)\n- `{timezone}`, `{utcOffset}` - UTC offset in ±HH:MM format \n- `{timezoneShort}`, `{utcOffsetShort}` - UTC offset in ±HHMM format\n\n*Thanks to @mnipritom for requesting these variables*. \n\n### Boolean Property Identification\n\nEnhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter.\n\n*A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage*\n\n### Boolean Status Field Support (#108)\n\nAdded automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values:\n\n- String \"true\" → boolean true (in frontmatter)\n- String \"false\" → boolean false (in frontmatter) \n- Boolean true → string \"true\" (when read back)\n- Boolean false → string \"false\" (when read back)\n- Other status values remain unchanged as strings\n\n*Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling.*\n*And thanks again to @renatomen--the boolean property identification fix inspired this change!*","aliases":["/releases/3.18.2/","/releases/3.18.2/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"timeblock-date-shift-issue-368","text":"Timeblock Date Shift Issue (#368)"},{"level":3,"id":"performance-issues-with-task-views","text":"Performance Issues with Task Views"},{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"enhanced-filename-template-variables-370","text":"Enhanced Filename Template Variables (#370)"},{"level":3,"id":"boolean-property-identification","text":"Boolean Property Identification"},{"level":3,"id":"boolean-status-field-support-108","text":"Boolean Status Field Support (#108)"}],"html":"

Bug Fixes#

\n

Timeblock Date Shift Issue (#368)#

\n

Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs.

\n

Timeblocks now appear on the correct calendar day regardless of user timezone or DST transitions.

\n

Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information.

\n

Performance Issues with Task Views#

\n

Eliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing.

\n

New Features#

\n

Enhanced Filename Template Variables (#370)#

\n

Added new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility:

\n
    \n
  • {milliseconds}, {ms} - 3-digit milliseconds (000-999)
  • \n
  • {timezone}, {utcOffset} - UTC offset in ±HH:MM format
  • \n
  • {timezoneShort}, {utcOffsetShort} - UTC offset in ±HHMM format
  • \n
\n

Thanks to @mnipritom for requesting these variables.

\n

Boolean Property Identification#

\n

Enhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter.

\n

A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage

\n

Boolean Status Field Support (#108)#

\n

Added automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values:

\n
    \n
  • String "true" → boolean true (in frontmatter)
  • \n
  • String "false" → boolean false (in frontmatter)
  • \n
  • Boolean true → string "true" (when read back)
  • \n
  • Boolean false → string "false" (when read back)
  • \n
  • Other status values remain unchanged as strings
  • \n
\n

Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling.\nAnd thanks again to @renatomen--the boolean property identification fix inspired this change!

\n","text":"Bug Fixes# Timeblock Date Shift Issue (#368)# Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs. Timeblocks now appear on the correct calendar day regardless of user timezone or DST transitions. Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information. Performance Issues with Task Views# Eliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing. New Features# Enhanced Filename Template Variables (#370)# Added new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility: {milliseconds}, {ms} - 3-digit milliseconds (000-999) {timezone}, {utcOffset} - UTC offset in ±HH:MM format {timezoneShort}, {utcOffsetShort} - UTC offset in ±HHMM format Thanks to @mnipritom for requesting these variables. Boolean Property Identification# Enhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter. A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage Boolean Status Field Support (#108)# Added automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values: String \"true\" → boolean true (in frontmatter) String \"false\" → boolean false (in frontmatter) Boolean true → string \"true\" (when read back) Boolean false → string \"false\" (when read back) Other status values remain unchanged as strings Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling. And thanks again to @renatomen--the boolean property identification fix inspired this change!"},{"route":"/obsidian/releases/3.19.0/","title":"TaskNotes 3.19.0","description":"TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natu...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.19.0.md","namespace":"obsidian","relativePath":"releases/3.19.0.md","raw":"# TaskNotes 3.19.0\n\n## New Features\n\n### HTTP REST API with Natural Language Processing\n\nTaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing.\n\n**Key API Features:**\n\n- Complete CRUD operations for tasks\n- Time tracking endpoints\n- Task statistics and filtering\n- Bearer token authentication\n- CORS support for browser extensions\n- Desktop-only implementation with mobile-safe architecture\n\n**Natural Language Processing Endpoints:**\n\n- `/api/nlp/parse` - Parse natural language into structured task data\n- `/api/nlp/create` - Create tasks directly from natural language input\n- Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence\n- Intelligent parsing of expressions like \"Review PR #123 tomorrow high priority @work\"\n\n**Companion Project Integration:**\n\nThe HTTP API enables two new companion projects:\n- [tasknotes-cli](https://github.com/callumalpass/tasknotes-cli) - Command-line interface for TaskNotes task management\n- [tasknotes-browser-extension](https://github.com/callumalpass/tasknotes-browser-extension) - Browser extension for quick task creation\n\n**Configuration:**\n\n- Enable via Settings → HTTP API tab (desktop only)\n- Configurable port (default 8080) and optional authentication token\n- Documentation at `/docs/HTTP_API.md` and `/docs/nlp-api.md`\n\n### Enhanced Calendar Integration\n\n#### Calendar Export and Context Menu System\n\n**Task Calendar Export:**\n\n- Add tasks to external calendars (Google, Outlook, Yahoo)\n- Download ICS files\n- Right-click context menu support for quick calendar actions\n\n#### Agenda View Calendar Improvements\n\n**ICS Integration in Agenda:**\n\n- Calendar event cards now display in Agenda view\n- Toggle calendar subscriptions visibility via FilterBar\n- Always-available \"Refresh calendars\" button\n- Normalized scheduled date handling for all-day and timed events\n\n*Thanks @scottaltham-payroc for the feature request!*\n\n## Bug Fixes\n\n### Task Styling Enhancement (#355)\n\nAdded CSS class `task-card--has-projects` to task cards that contain projects.\n\n*Thanks @mdbraber for the suggestion*\n\n### Calendar Event Scheduling\n\nFixed scheduled date normalization when creating tasks from ICS events:\n\n- All-day events: Use YYYY-MM-DD format\n- Timed events: Use YYYY-MM-DDTHH:mm format\n- Consistent behavior across all calendar interfaces\n\n### File Copy Script Improvements\n\nEnhanced copy-files script with better error handling:\n\n- Improved default path handling\n- Destination directory creation\n- Better ENOENT error handling\n\n## API Documentation\n\n### New Documentation Files\n\n- **HTTP_API.md** - Complete API reference with examples\n- **nlp-api.md** - Natural language processing capabilities and usage\n\n## Technical Enhancements\n\n### Core Infrastructure\n\n**API Service Architecture:**\n\n- Mobile-compatible implementation using Node.js http module\n- Platform detection prevents mobile loading\n- Express.js alternative for lightweight operation\n- Full error handling and validation\n\n**Calendar Service Integration:**\n- Extracted reusable CalendarExportService\n- Unified TaskContextMenu component\n- Enhanced event listener management\n\n### Development Improvements\n\n**Code Organization:**\n\n- Modular component extraction for better reusability\n- Consistent API response formats\n- Comprehensive test coverage for new features\n- TypeScript improvements for icon handling\n\n## Migration Notes\n\n### HTTP API Setup\n\nFor users wanting to enable the new HTTP API:\n\n1. Navigate to Settings → HTTP API tab (desktop only)\n2. Configure desired port (default 8080)\n3. Optionally set authentication token for security\n4. Restart Obsidian to start the API server\n5. Test with: `curl http://localhost:8080/api/health`\n\n","aliases":["/releases/3.19.0/","/releases/3.19.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"http-rest-api-with-natural-language-processing","text":"HTTP REST API with Natural Language Processing"},{"level":3,"id":"enhanced-calendar-integration","text":"Enhanced Calendar Integration"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-styling-enhancement-355","text":"Task Styling Enhancement (#355)"},{"level":3,"id":"calendar-event-scheduling","text":"Calendar Event Scheduling"},{"level":3,"id":"file-copy-script-improvements","text":"File Copy Script Improvements"},{"level":2,"id":"api-documentation","text":"API Documentation"},{"level":3,"id":"new-documentation-files","text":"New Documentation Files"},{"level":2,"id":"technical-enhancements","text":"Technical Enhancements"},{"level":3,"id":"core-infrastructure","text":"Core Infrastructure"},{"level":3,"id":"development-improvements","text":"Development Improvements"},{"level":2,"id":"migration-notes","text":"Migration Notes"},{"level":3,"id":"http-api-setup","text":"HTTP API Setup"}],"html":"

New Features#

\n

HTTP REST API with Natural Language Processing#

\n

TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing.

\n

Key API Features:

\n
    \n
  • Complete CRUD operations for tasks
  • \n
  • Time tracking endpoints
  • \n
  • Task statistics and filtering
  • \n
  • Bearer token authentication
  • \n
  • CORS support for browser extensions
  • \n
  • Desktop-only implementation with mobile-safe architecture
  • \n
\n

Natural Language Processing Endpoints:

\n
    \n
  • /api/nlp/parse - Parse natural language into structured task data
  • \n
  • /api/nlp/create - Create tasks directly from natural language input
  • \n
  • Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence
  • \n
  • Intelligent parsing of expressions like "Review PR #123 tomorrow high priority @work"
  • \n
\n

Companion Project Integration:

\n

The HTTP API enables two new companion projects:

\n\n

Configuration:

\n
    \n
  • Enable via Settings → HTTP API tab (desktop only)
  • \n
  • Configurable port (default 8080) and optional authentication token
  • \n
  • Documentation at /docs/HTTP_API.md and /docs/nlp-api.md
  • \n
\n

Enhanced Calendar Integration#

\n

Calendar Export and Context Menu System#

\n

Task Calendar Export:

\n
    \n
  • Add tasks to external calendars (Google, Outlook, Yahoo)
  • \n
  • Download ICS files
  • \n
  • Right-click context menu support for quick calendar actions
  • \n
\n

Agenda View Calendar Improvements#

\n

ICS Integration in Agenda:

\n
    \n
  • Calendar event cards now display in Agenda view
  • \n
  • Toggle calendar subscriptions visibility via FilterBar
  • \n
  • Always-available "Refresh calendars" button
  • \n
  • Normalized scheduled date handling for all-day and timed events
  • \n
\n

Thanks @scottaltham-payroc for the feature request!

\n

Bug Fixes#

\n

Task Styling Enhancement (#355)#

\n

Added CSS class task-card--has-projects to task cards that contain projects.

\n

Thanks @mdbraber for the suggestion

\n

Calendar Event Scheduling#

\n

Fixed scheduled date normalization when creating tasks from ICS events:

\n
    \n
  • All-day events: Use YYYY-MM-DD format
  • \n
  • Timed events: Use YYYY-MM-DDTHH:mm format
  • \n
  • Consistent behavior across all calendar interfaces
  • \n
\n

File Copy Script Improvements#

\n

Enhanced copy-files script with better error handling:

\n
    \n
  • Improved default path handling
  • \n
  • Destination directory creation
  • \n
  • Better ENOENT error handling
  • \n
\n

API Documentation#

\n

New Documentation Files#

\n
    \n
  • HTTP_API.md - Complete API reference with examples
  • \n
  • nlp-api.md - Natural language processing capabilities and usage
  • \n
\n

Technical Enhancements#

\n

Core Infrastructure#

\n

API Service Architecture:

\n
    \n
  • Mobile-compatible implementation using Node.js http module
  • \n
  • Platform detection prevents mobile loading
  • \n
  • Express.js alternative for lightweight operation
  • \n
  • Full error handling and validation
  • \n
\n

Calendar Service Integration:

\n
    \n
  • Extracted reusable CalendarExportService
  • \n
  • Unified TaskContextMenu component
  • \n
  • Enhanced event listener management
  • \n
\n

Development Improvements#

\n

Code Organization:

\n
    \n
  • Modular component extraction for better reusability
  • \n
  • Consistent API response formats
  • \n
  • Comprehensive test coverage for new features
  • \n
  • TypeScript improvements for icon handling
  • \n
\n

Migration Notes#

\n

HTTP API Setup#

\n

For users wanting to enable the new HTTP API:

\n
    \n
  1. Navigate to Settings → HTTP API tab (desktop only)
  2. \n
  3. Configure desired port (default 8080)
  4. \n
  5. Optionally set authentication token for security
  6. \n
  7. Restart Obsidian to start the API server
  8. \n
  9. Test with: curl http://localhost:8080/api/health
  10. \n
\n","text":"New Features# HTTP REST API with Natural Language Processing# TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing. Key API Features: Complete CRUD operations for tasks Time tracking endpoints Task statistics and filtering Bearer token authentication CORS support for browser extensions Desktop-only implementation with mobile-safe architecture Natural Language Processing Endpoints: /api/nlp/parse - Parse natural language into structured task data /api/nlp/create - Create tasks directly from natural language input Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence Intelligent parsing of expressions like \"Review PR #123 tomorrow high priority @work\" Companion Project Integration: The HTTP API enables two new companion projects: tasknotes-cli - Command-line interface for TaskNotes task management tasknotes-browser-extension - Browser extension for quick task creation Configuration: Enable via Settings → HTTP API tab (desktop only) Configurable port (default 8080) and optional authentication token Documentation at /docs/HTTP_API.md and /docs/nlp-api.md Enhanced Calendar Integration# Calendar Export and Context Menu System# Task Calendar Export: Add tasks to external calendars (Google, Outlook, Yahoo) Download ICS files Right-click context menu support for quick calendar actions Agenda View Calendar Improvements# ICS Integration in Agenda: Calendar event cards now display in Agenda view Toggle calendar subscriptions visibility via FilterBar Always-available \"Refresh calendars\" button Normalized scheduled date handling for all-day and timed events Thanks @scottaltham-payroc for the feature request! Bug Fixes# Task Styling Enhancement (#355)# Added CSS class task-card--has-projects to task cards that contain projects. Thanks @mdbraber for the suggestion Calendar Event Scheduling# Fixed scheduled date normalization when creating tasks from ICS events: All-day events: Use YYYY-MM-DD format Timed events: Use YYYY-MM-DDTHH:mm format Consistent behavior across all calendar interfaces File Copy Script Improvements# Enhanced copy-files script with better error handling: Improved default path handling Destination directory creation Better ENOENT error handling API Documentation# New Documentation Files# HTTP_API.md - Complete API reference with examples nlp-api.md - Natural language processing capabilities and usage Technical Enhancements# Core Infrastructure# API Service Architecture: Mobile-compatible implementation using Node.js http module Platform detection prevents mobile loading Express.js alternative for lightweight operation Full error handling and validation Calendar Service Integration: Extracted reusable CalendarExportService Unified TaskContextMenu component Enhanced event listener management Development Improvements# Code Organization: Modular component extraction for better reusability Consistent API response formats Comprehensive test coverage for new features TypeScript improvements for icon handling Migration Notes# HTTP API Setup# For users wanting to enable the new HTTP API: Navigate to Settings → HTTP API tab (desktop only) Configure desired port (default 8080) Optionally set authentication token for security Restart Obsidian to start the API server Test with: curl http://localhost:8080/api/health"},{"route":"/obsidian/releases/3.19.1/","title":"TaskNotes 3.19.1","description":"Added webhook system enabling integrations with external services and automation workflows.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.19.1.md","namespace":"obsidian","relativePath":"releases/3.19.1.md","raw":"# TaskNotes 3.19.1\n\n## New Features\n\n### Webhook Support\n\nAdded webhook system enabling integrations with external services and automation workflows.\n\n**Webhook Management:**\n\n- CRUD operations for webhook configuration\n- HTTP API endpoints for webhook management (`POST /api/webhooks`, `GET /api/webhooks`, `DELETE /api/webhooks/{id}`)\n- Delivery history tracking (`GET /api/webhooks/deliveries`)\n- Settings UI integration with event subscription controls\n\n**Event Types:**\n\n- **Task events:** created, updated, deleted, completed, archived, unarchived\n- **Time tracking:** started, stopped\n- **Pomodoro:** started, completed, interrupted \n- **Recurring tasks:** instance completed\n- **Reminders:** triggered\n\n**Security and Reliability:**\n\n- HMAC-SHA256 signature verification for payload authentication\n- Automatic retries with exponential backoff (3 attempts)\n- 10-second delivery timeout with failure monitoring\n- Auto-disable webhooks after repeated failures\n- Non-blocking async delivery maintains TaskNotes responsiveness\n\nDocumentation and testing utilities included in `docs/webhooks.md` and `test-webhook.js`.\n\n## Bug Fixes\n\n### Boolean Property Identification Regression (#367)\n\nFixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification.\n\nDuring code refactoring, the `comparePropertyValues` function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean `true`/`false` frontmatter values to correctly match `\"true\"`/`\"false\"` setting values.\n\n*Thanks to @renatomen for reporting this regression*\n","aliases":["/releases/3.19.1/","/releases/3.19.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"webhook-support","text":"Webhook Support"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"boolean-property-identification-regression-367","text":"Boolean Property Identification Regression (#367)"}],"html":"

New Features#

\n

Webhook Support#

\n

Added webhook system enabling integrations with external services and automation workflows.

\n

Webhook Management:

\n
    \n
  • CRUD operations for webhook configuration
  • \n
  • HTTP API endpoints for webhook management (POST /api/webhooks, GET /api/webhooks, DELETE /api/webhooks/{id})
  • \n
  • Delivery history tracking (GET /api/webhooks/deliveries)
  • \n
  • Settings UI integration with event subscription controls
  • \n
\n

Event Types:

\n
    \n
  • Task events: created, updated, deleted, completed, archived, unarchived
  • \n
  • Time tracking: started, stopped
  • \n
  • Pomodoro: started, completed, interrupted
  • \n
  • Recurring tasks: instance completed
  • \n
  • Reminders: triggered
  • \n
\n

Security and Reliability:

\n
    \n
  • HMAC-SHA256 signature verification for payload authentication
  • \n
  • Automatic retries with exponential backoff (3 attempts)
  • \n
  • 10-second delivery timeout with failure monitoring
  • \n
  • Auto-disable webhooks after repeated failures
  • \n
  • Non-blocking async delivery maintains TaskNotes responsiveness
  • \n
\n

Documentation and testing utilities included in docs/webhooks.md and test-webhook.js.

\n

Bug Fixes#

\n

Boolean Property Identification Regression (#367)#

\n

Fixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification.

\n

During code refactoring, the comparePropertyValues function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean true/false frontmatter values to correctly match "true"/"false" setting values.

\n

Thanks to @renatomen for reporting this regression

\n","text":"New Features# Webhook Support# Added webhook system enabling integrations with external services and automation workflows. Webhook Management: CRUD operations for webhook configuration HTTP API endpoints for webhook management (POST /api/webhooks, GET /api/webhooks, DELETE /api/webhooks/{id}) Delivery history tracking (GET /api/webhooks/deliveries) Settings UI integration with event subscription controls Event Types: Task events: created, updated, deleted, completed, archived, unarchived Time tracking: started, stopped Pomodoro: started, completed, interrupted Recurring tasks: instance completed Reminders: triggered Security and Reliability: HMAC-SHA256 signature verification for payload authentication Automatic retries with exponential backoff (3 attempts) 10-second delivery timeout with failure monitoring Auto-disable webhooks after repeated failures Non-blocking async delivery maintains TaskNotes responsiveness Documentation and testing utilities included in docs/webhooks.md and test-webhook.js. Bug Fixes# Boolean Property Identification Regression (#367)# Fixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification. During code refactoring, the comparePropertyValues function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean true/false frontmatter values to correctly match \"true\"/\"false\" setting values. Thanks to @renatomen for reporting this regression"},{"route":"/obsidian/releases/3.20.0/","title":"TaskNotes 3.20.0","description":"Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for conta...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.20.0.md","namespace":"obsidian","relativePath":"releases/3.20.0.md","raw":"# TaskNotes 3.20.0\n\n## New Features\n\n### Task Organization and Filtering\n\n**Folder-Based Task Filtering** - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. *Addresses issue #369 reported by kmaustral*\n\n**Dynamic Task Folder Organization** - Added template variable support for default task folder setting with task variables (`{{context}}`, `{{project}}`, `{{priority}}`, `{{status}}`, `{{title}}`) and date variables (`{{year}}`, `{{month}}`, `{{day}}`, `{{date}}`). Supports automatic folder creation and title sanitization. *Addresses feature request #376 by Mara-Li*\n\n**Archive Task Organization** - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (`moveArchivedTasks`, `archiveFolder`). *Addresses feature request #402 by anareaty*\n\n### Enhanced UI and Controls\n\n**Enhanced Filter Bar** - Improved filter bar with instant badge updates, right-click clear functionality, \"Clear All Filters\" button, and better UI synchronization across main and subtask views. *Contributed by renatomen*\n\n**Collapsible Groups** - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. *Contributed by renatomen*\n\n**Expand/Collapse All Controls** - Added \"Expand All\" and \"Collapse All\" buttons to task list toolbar that appear when grouping is active. *Contributed by renatomen*\n\n**Configurable UI Elements** - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. *Contributed by renatomen*\n\n### Advanced API Architecture and Webhook System\n\nRefactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility.\n\n**Webhook System** - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders.\n\n**Webhook Testing and Development** - Included standalone webhook testing server (`test-webhook.js`) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging.\n\n## Improvements\n\n### UI and Visual Enhancements\n\n**TaskNotes Icons** - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets.\n\n**Task Card Polish** - Improved status and priority dot alignment and reordered context menu (\"Copy task title\" moved to top). *Addresses alignment issue #410 reported by kmaustral*\n\n**Button Styling** - Fixed agenda view and filter popup button backgrounds with improved styling consistency.\n\n### Technical Improvements\n\n**Settings Architecture** - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability.\n\n**Documentation** - Added extensive webhook documentation in `docs/examples/webhook-transforms/` with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification.\n\n**Webhook Integration Services** - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring.\n\n## Bug Fixes\n\n**Mobile Modal Close Button** - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. *Addresses issue #404 reported by anareaty*\n\n**Test Suite Stabilization** - Resolved test failures and linting errors\n\n**HTTP API Field Consistency** - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. *Addresses issue #393 reported by @nightroman*\n\n**Missing Webhook Trigger** - Added webhook trigger for recurring task completion events.\n\n## Documentation Updates\n\n- Task defaults documentation with template variables\n- Miscellaneous settings documentation \n- Webhook transform documentation and examples\n- Demo GIFs for new features\n\nThanks @renatomen!\n\n## Contributors\n\nSpecial thanks to the following contributors:\n\n- **@Mara-Li** - Feature request for template variables in task folders\n- **@kmaustral** - Feature requests for folder filtering and UI alignment improvements\n- **@anareaty** - Bug report for mobile modal close button issue\n- **@nightroman** - Reported mislead API documentation\n\nA really big thanks to @renatomen whose very polished contributions form the bulk of this update!\n\n\n","aliases":["/releases/3.20.0/","/releases/3.20.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-organization-and-filtering","text":"Task Organization and Filtering"},{"level":3,"id":"enhanced-ui-and-controls","text":"Enhanced UI and Controls"},{"level":3,"id":"advanced-api-architecture-and-webhook-system","text":"Advanced API Architecture and Webhook System"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"ui-and-visual-enhancements","text":"UI and Visual Enhancements"},{"level":3,"id":"technical-improvements","text":"Technical Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":2,"id":"documentation-updates","text":"Documentation Updates"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Task Organization and Filtering#

\n

Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. Addresses issue #369 reported by kmaustral

\n

Dynamic Task Folder Organization - Added template variable support for default task folder setting with task variables ({{context}}, {{project}}, {{priority}}, {{status}}, {{title}}) and date variables ({{year}}, {{month}}, {{day}}, {{date}}). Supports automatic folder creation and title sanitization. Addresses feature request #376 by Mara-Li

\n

Archive Task Organization - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (moveArchivedTasks, archiveFolder). Addresses feature request #402 by anareaty

\n

Enhanced UI and Controls#

\n

Enhanced Filter Bar - Improved filter bar with instant badge updates, right-click clear functionality, "Clear All Filters" button, and better UI synchronization across main and subtask views. Contributed by renatomen

\n

Collapsible Groups - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. Contributed by renatomen

\n

Expand/Collapse All Controls - Added "Expand All" and "Collapse All" buttons to task list toolbar that appear when grouping is active. Contributed by renatomen

\n

Configurable UI Elements - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. Contributed by renatomen

\n

Advanced API Architecture and Webhook System#

\n

Refactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility.

\n

Webhook System - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders.

\n

Webhook Testing and Development - Included standalone webhook testing server (test-webhook.js) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging.

\n

Improvements#

\n

UI and Visual Enhancements#

\n

TaskNotes Icons - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets.

\n

Task Card Polish - Improved status and priority dot alignment and reordered context menu ("Copy task title" moved to top). Addresses alignment issue #410 reported by kmaustral

\n

Button Styling - Fixed agenda view and filter popup button backgrounds with improved styling consistency.

\n

Technical Improvements#

\n

Settings Architecture - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability.

\n

Documentation - Added extensive webhook documentation in docs/examples/webhook-transforms/ with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification.

\n

Webhook Integration Services - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring.

\n

Bug Fixes#

\n

Mobile Modal Close Button - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. Addresses issue #404 reported by anareaty

\n

Test Suite Stabilization - Resolved test failures and linting errors

\n

HTTP API Field Consistency - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. Addresses issue #393 reported by @nightroman

\n

Missing Webhook Trigger - Added webhook trigger for recurring task completion events.

\n

Documentation Updates#

\n
    \n
  • Task defaults documentation with template variables
  • \n
  • Miscellaneous settings documentation
  • \n
  • Webhook transform documentation and examples
  • \n
  • Demo GIFs for new features
  • \n
\n

Thanks @renatomen!

\n

Contributors#

\n

Special thanks to the following contributors:

\n
    \n
  • @Mara-Li - Feature request for template variables in task folders
  • \n
  • @kmaustral - Feature requests for folder filtering and UI alignment improvements
  • \n
  • @anareaty - Bug report for mobile modal close button issue
  • \n
  • @nightroman - Reported mislead API documentation
  • \n
\n

A really big thanks to @renatomen whose very polished contributions form the bulk of this update!

\n","text":"New Features# Task Organization and Filtering# Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. Addresses issue #369 reported by kmaustral Dynamic Task Folder Organization - Added template variable support for default task folder setting with task variables ({{context}}, {{project}}, {{priority}}, {{status}}, {{title}}) and date variables ({{year}}, {{month}}, {{day}}, {{date}}). Supports automatic folder creation and title sanitization. Addresses feature request #376 by Mara-Li Archive Task Organization - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (moveArchivedTasks, archiveFolder). Addresses feature request #402 by anareaty Enhanced UI and Controls# Enhanced Filter Bar - Improved filter bar with instant badge updates, right-click clear functionality, \"Clear All Filters\" button, and better UI synchronization across main and subtask views. Contributed by renatomen Collapsible Groups - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. Contributed by renatomen Expand/Collapse All Controls - Added \"Expand All\" and \"Collapse All\" buttons to task list toolbar that appear when grouping is active. Contributed by renatomen Configurable UI Elements - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. Contributed by renatomen Advanced API Architecture and Webhook System# Refactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility. Webhook System - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders. Webhook Testing and Development - Included standalone webhook testing server (test-webhook.js) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging. Improvements# UI and Visual Enhancements# TaskNotes Icons - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets. Task Card Polish - Improved status and priority dot alignment and reordered context menu (\"Copy task title\" moved to top). Addresses alignment issue #410 reported by kmaustral Button Styling - Fixed agenda view and filter popup button backgrounds with improved styling consistency. Technical Improvements# Settings Architecture - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability. Documentation - Added extensive webhook documentation in docs/examples/webhook-transforms/ with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification. Webhook Integration Services - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring. Bug Fixes# Mobile Modal Close Button - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. Addresses issue #404 reported by anareaty Test Suite Stabilization - Resolved test failures and linting errors HTTP API Field Consistency - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. Addresses issue #393 reported by @nightroman Missing Webhook Trigger - Added webhook trigger for recurring task completion events. Documentation Updates# Task defaults documentation with template variables Miscellaneous settings documentation Webhook transform documentation and examples Demo GIFs for new features Thanks @renatomen! Contributors# Special thanks to the following contributors: @Mara-Li - Feature request for template variables in task folders @kmaustral - Feature requests for folder filtering and UI alignment improvements @anareaty - Bug report for mobile modal close button issue @nightroman - Reported mislead API documentation A really big thanks to @renatomen whose very polished contributions form the bulk of this update!"},{"route":"/obsidian/releases/3.20.1/","title":"TaskNotes 3.20.1","description":"Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.20.1.md","namespace":"obsidian","relativePath":"releases/3.20.1.md","raw":"# TaskNotes 3.20.1\n\n## New Features\n\n### Enhanced View Organization and Visual Feedback\n\n**Saved View Headings with Completion Counts** - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in \"completed / total\" format. Shows \"All\" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. *Contributed by @renatomen*\n\n**Consistent Group Count Badges** - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified \"completed / total\" format. Removed redundant bracketed counts for cleaner presentation. *Contributed by @renatomen*\n\n**Collapsible Agenda Date Groups** - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via \"Expand All\" / \"Collapse All\" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. *Contributed by @renatomen*\n\n### Improved User Interface\n\n**Reorganized Task Context Menu** - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality. \n\n## Bug Fixes\n\n### Calendar Integration Fixes\n\n**Outlook Calendar 500 Errors** - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. *Fixes issue #458 reported by @girisumit and @heinzochsner*\n\n**Recurring Tasks Date Display** - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. *Fixes issue #439 reported by @brianarn and @jpmoo*\n\n### Task Management Fixes \n\n**Project Suggestions Crash Prevention** - Fixed crash in Task Creation modal when typing \"+\" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with \", \", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. *Contributed by @renatomen*\n\n## Documentation Updates\n\n- Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget\n- Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality \n- Updated view documentation with new visual features\n- Enhanced inline task documentation for Subtask Widget improvements\n\n*Contributed by @renatomen*\n\n## Contributors\n\nSpecial recognition goes to **@renatomen** for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality.\n\nThanks to the following community members for their bug reports and feedback:\n\n- **@girisumit and @heinzochsner** - Reported Outlook calendar integration issues\n- **@brianarn and @jpmoo** - Identified recurring tasks date display bug with detailed reproduction steps\n","aliases":["/releases/3.20.1/","/releases/3.20.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"enhanced-view-organization-and-visual-feedback","text":"Enhanced View Organization and Visual Feedback"},{"level":3,"id":"improved-user-interface","text":"Improved User Interface"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-integration-fixes","text":"Calendar Integration Fixes"},{"level":3,"id":"task-management-fixes","text":"Task Management Fixes"},{"level":2,"id":"documentation-updates","text":"Documentation Updates"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Enhanced View Organization and Visual Feedback#

\n

Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in "completed / total" format. Shows "All" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. Contributed by @renatomen

\n

Consistent Group Count Badges - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified "completed / total" format. Removed redundant bracketed counts for cleaner presentation. Contributed by @renatomen

\n

Collapsible Agenda Date Groups - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via "Expand All" / "Collapse All" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. Contributed by @renatomen

\n

Improved User Interface#

\n

Reorganized Task Context Menu - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality.

\n

Bug Fixes#

\n

Calendar Integration Fixes#

\n

Outlook Calendar 500 Errors - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. Fixes issue #458 reported by @girisumit and @heinzochsner

\n

Recurring Tasks Date Display - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. Fixes issue #439 reported by @brianarn and @jpmoo

\n

Task Management Fixes#

\n

Project Suggestions Crash Prevention - Fixed crash in Task Creation modal when typing "+" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with ", ", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. Contributed by @renatomen

\n

Documentation Updates#

\n
    \n
  • Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget
  • \n
  • Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality
  • \n
  • Updated view documentation with new visual features
  • \n
  • Enhanced inline task documentation for Subtask Widget improvements
  • \n
\n

Contributed by @renatomen

\n

Contributors#

\n

Special recognition goes to @renatomen for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality.

\n

Thanks to the following community members for their bug reports and feedback:

\n
    \n
  • @girisumit and @heinzochsner - Reported Outlook calendar integration issues
  • \n
  • @brianarn and @jpmoo - Identified recurring tasks date display bug with detailed reproduction steps
  • \n
\n","text":"New Features# Enhanced View Organization and Visual Feedback# Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in \"completed / total\" format. Shows \"All\" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. Contributed by @renatomen Consistent Group Count Badges - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified \"completed / total\" format. Removed redundant bracketed counts for cleaner presentation. Contributed by @renatomen Collapsible Agenda Date Groups - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via \"Expand All\" / \"Collapse All\" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. Contributed by @renatomen Improved User Interface# Reorganized Task Context Menu - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality. Bug Fixes# Calendar Integration Fixes# Outlook Calendar 500 Errors - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. Fixes issue #458 reported by @girisumit and @heinzochsner Recurring Tasks Date Display - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. Fixes issue #439 reported by @brianarn and @jpmoo Task Management Fixes# Project Suggestions Crash Prevention - Fixed crash in Task Creation modal when typing \"+\" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with \", \", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. Contributed by @renatomen Documentation Updates# Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality Updated view documentation with new visual features Enhanced inline task documentation for Subtask Widget improvements Contributed by @renatomen Contributors# Special recognition goes to @renatomen for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality. Thanks to the following community members for their bug reports and feedback: @girisumit and @heinzochsner - Reported Outlook calendar integration issues @brianarn and @jpmoo - Identified recurring tasks date display bug with detailed reproduction steps"},{"route":"/obsidian/releases/3.21.0/","title":"TaskNotes 3.21.0","description":"Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Ad...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.21.0.md","namespace":"obsidian","relativePath":"releases/3.21.0.md","raw":"# TaskNotes 3.21.0\n\n## New Features\n\n### Custom User Fields System\n\n**Custom User Fields Mapping** - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like \"2-Medium\" as numeric 2. *Contributed by @renatomen*\n\n**Group and Sort by Custom User Fields** - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. *Contributed by @renatomen*\n\n**User Fields in Task Modals** - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. *Contributed by @callumalpass*\n\n### Enhanced Task Interaction\n\n**Configurable Click Behavior** - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. *Contributed by @fastrick*\n\n### Calendar Integration Enhancements\n\n**Calendar Event Filename Templates** - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including `{icsEventTitle}`, `{icsEventLocation}`, `{icsEventDescription}`, and `{icsEventTitleWithDate}`. The `{title}` variable now uses clean event titles without date suffixes. *Fixes issue #362 reported by @bepolymathe*\n\n**Chronological ICS Event Sorting** - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. *Fixes issue #472 reported by @Crunchnuggetz*\n\n## Bug Fixes\n\n### API Endpoint Improvements\n\n**Custom Status Configuration Support** - Fixed API endpoints (`/api/nlp/parse` and `/api/nlp/create`) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. *Fixes issue #487 reported by @23maverick23*\n\n**Task Creation Defaults** - Fixed REST API endpoint (`POST /api/tasks`) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. *Fixes issue reported by @nightroman*\n\n### Project Management Fixes\n\n**Project Consolidation and Display** - Fixed project grouping to consolidate different formats pointing to the same file (e.g., `[[project]]` and `[[project|alias]]` now group together). Improved display formatting with clickable headers showing absolute paths without `.md` extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. *Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty*\n\n### User Experience Improvements\n\n**Tag Input Sanitization** - Added automatic sanitization to remove `#` prefixes from tag input, preventing duplicate tags like `#tag1` and `##tag1`. Applied to task creation, editing, and real-time input handling. *Fixes issue #331 reported by @AndreMonthy*\n\n## Contributors\n\nSpecial recognition goes to **@renatomen** for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities.\n\nThanks to **@fastrick** for implementing the configurable click behavior feature.\n\nThanks to the following community members for their bug reports and feature requests:\n\n- **@23maverick23** - Reported API custom status configuration issues with detailed technical analysis\n- **@Crunchnuggetz** - Identified ICS calendar event sorting problem in agenda view\n- **@minchinweb** - Reported project consolidation issues with wikilink variations \n- **@anareaty** - Identified project display formatting problems in kanban view\n- **@bepolymathe** - Requested calendar event filename template functionality\n- **@AndreMonthy** - Reported tag input sanitization issues with clear examples\n- **@nightroman** - Reported API issues where defaults were not being applied","aliases":["/releases/3.21.0/","/releases/3.21.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"custom-user-fields-system","text":"Custom User Fields System"},{"level":3,"id":"enhanced-task-interaction","text":"Enhanced Task Interaction"},{"level":3,"id":"calendar-integration-enhancements","text":"Calendar Integration Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"api-endpoint-improvements","text":"API Endpoint Improvements"},{"level":3,"id":"project-management-fixes","text":"Project Management Fixes"},{"level":3,"id":"user-experience-improvements","text":"User Experience Improvements"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Custom User Fields System#

\n

Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like "2-Medium" as numeric 2. Contributed by @renatomen

\n

Group and Sort by Custom User Fields - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. Contributed by @renatomen

\n

User Fields in Task Modals - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. Contributed by @callumalpass

\n

Enhanced Task Interaction#

\n

Configurable Click Behavior - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. Contributed by @fastrick

\n

Calendar Integration Enhancements#

\n

Calendar Event Filename Templates - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including {icsEventTitle}, {icsEventLocation}, {icsEventDescription}, and {icsEventTitleWithDate}. The {title} variable now uses clean event titles without date suffixes. Fixes issue #362 reported by @bepolymathe

\n

Chronological ICS Event Sorting - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. Fixes issue #472 reported by @Crunchnuggetz

\n

Bug Fixes#

\n

API Endpoint Improvements#

\n

Custom Status Configuration Support - Fixed API endpoints (/api/nlp/parse and /api/nlp/create) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. Fixes issue #487 reported by @23maverick23

\n

Task Creation Defaults - Fixed REST API endpoint (POST /api/tasks) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. Fixes issue reported by @nightroman

\n

Project Management Fixes#

\n

Project Consolidation and Display - Fixed project grouping to consolidate different formats pointing to the same file (e.g., [[project]] and [[project|alias]] now group together). Improved display formatting with clickable headers showing absolute paths without .md extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty

\n

User Experience Improvements#

\n

Tag Input Sanitization - Added automatic sanitization to remove # prefixes from tag input, preventing duplicate tags like #tag1 and ##tag1. Applied to task creation, editing, and real-time input handling. Fixes issue #331 reported by @AndreMonthy

\n

Contributors#

\n

Special recognition goes to @renatomen for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities.

\n

Thanks to @fastrick for implementing the configurable click behavior feature.

\n

Thanks to the following community members for their bug reports and feature requests:

\n
    \n
  • @23maverick23 - Reported API custom status configuration issues with detailed technical analysis
  • \n
  • @Crunchnuggetz - Identified ICS calendar event sorting problem in agenda view
  • \n
  • @minchinweb - Reported project consolidation issues with wikilink variations
  • \n
  • @anareaty - Identified project display formatting problems in kanban view
  • \n
  • @bepolymathe - Requested calendar event filename template functionality
  • \n
  • @AndreMonthy - Reported tag input sanitization issues with clear examples
  • \n
  • @nightroman - Reported API issues where defaults were not being applied
  • \n
\n","text":"New Features# Custom User Fields System# Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like \"2-Medium\" as numeric 2. Contributed by @renatomen Group and Sort by Custom User Fields - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. Contributed by @renatomen User Fields in Task Modals - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. Contributed by @callumalpass Enhanced Task Interaction# Configurable Click Behavior - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. Contributed by @fastrick Calendar Integration Enhancements# Calendar Event Filename Templates - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including {icsEventTitle}, {icsEventLocation}, {icsEventDescription}, and {icsEventTitleWithDate}. The {title} variable now uses clean event titles without date suffixes. Fixes issue #362 reported by @bepolymathe Chronological ICS Event Sorting - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. Fixes issue #472 reported by @Crunchnuggetz Bug Fixes# API Endpoint Improvements# Custom Status Configuration Support - Fixed API endpoints (/api/nlp/parse and /api/nlp/create) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. Fixes issue #487 reported by @23maverick23 Task Creation Defaults - Fixed REST API endpoint (POST /api/tasks) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. Fixes issue reported by @nightroman Project Management Fixes# Project Consolidation and Display - Fixed project grouping to consolidate different formats pointing to the same file (e.g., [[project]] and [[project|alias]] now group together). Improved display formatting with clickable headers showing absolute paths without .md extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty User Experience Improvements# Tag Input Sanitization - Added automatic sanitization to remove # prefixes from tag input, preventing duplicate tags like #tag1 and ##tag1. Applied to task creation, editing, and real-time input handling. Fixes issue #331 reported by @AndreMonthy Contributors# Special recognition goes to @renatomen for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities. Thanks to @fastrick for implementing the configurable click behavior feature. Thanks to the following community members for their bug reports and feature requests: @23maverick23 - Reported API custom status configuration issues with detailed technical analysis @Crunchnuggetz - Identified ICS calendar event sorting problem in agenda view @minchinweb - Reported project consolidation issues with wikilink variations @anareaty - Identified project display formatting problems in kanban view @bepolymathe - Requested calendar event filename template functionality @AndreMonthy - Reported tag input sanitization issues with clear examples @nightroman - Reported API issues where defaults were not being applied"},{"route":"/obsidian/releases/3.22.0/","title":"TaskNotes 3.22.0","description":"Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total t...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.22.0.md","namespace":"obsidian","relativePath":"releases/3.22.0.md","raw":"# TaskNotes 3.22.0\n\n## Major Features\n\n### Modular Properties System\n\n- Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. *Thanks to @renatomen for the initial implementation of this feature*\n\n- Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users.\n\n- Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled.\n\n### Bases-style Filter Bar Redesign\n\n- Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability.\n- Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization.\n- Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability.\n- Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience.\n- Added dedicated \"+ New\" task creation button to filter bar with neutral styling and proper view context awareness.\n\n### Statistics view\n\n- Implement a new view to track statistics about projects and time tracking. \n\n## UX\n\n### Task Interaction Improvements\n\n- Changed \"This Week\" grouping label to \"Next seven days\" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. *Fixes issue #516 reported by @anareaty*\n\n### External Contributions\n\n- Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. *Contributed by @renatomen*\n- Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. *Contributed by @renatomen* \n- Fixed project names containing commas (e.g., `[[Money, Org & Adm]]`) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. *Contributed by @renatomen*\n- Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. *Contributed by @renatomen*\n- Fixed User Fields column order in settings to match Field mapping configuration for consistency. *Contributed by @renatomen*\n\n## Bug Fixes\n\n### Timezone and Date Handling\n\n- Fixed timezone-dependent \"Today\" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. *Fixes issue #452 reported by @MinchinWeb*\n\n\n### User Interface Fixes\n\n- Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings.\n- Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. *Fixes issue #529 reported by @motusira*\n- Removed title length limits that were causing text truncation, allowing full title display. *Fixes issue #378 reported by @nsstrickland*\n- Added all-day slot toggle to calendar view for better event organization. *Fixes issue #242 requested by @Crunchnuggetz*\n- Added calendar locale configuration for international calendar support with proper localization. *Contributed by @pixeler*\n- Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. *Fixes issue #527 reported by @jordandrako*\n- Fixed inline task overlay title wrapping using `white-space: break-spaces` for proper text display. *Fixes issue #517 reported by @cathywu*\n\n### New Capabilities\n\n- Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. *Fixes issue #238 requested by @girisumit*\n- Added tags to available sorting and grouping options for more flexible task organization. *Fixes issue #169 requested by @bce283c*\n- Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. *Fixes issue #299 requested by @0dfa1bc*\n- Added filename template variables to folder templates including support for additional customization options. *Fixes issue #473 requested by @oliverlalan*\n- Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing.\n\n## Infrastructure Improvements\n\n### Development and Testing\n\n- Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility.\n- Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality.\n- Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions.\n\n## Contributors\n\nSpecial recognition goes to **@renatomen** for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment.\n\nThanks to the following community members for their bug reports and feature requests:\n\n- **@anareaty** - Reported grouping label confusion with clear examples\n- **@MinchinWeb** - Identified timezone handling inconsistencies across multiple views\n- **@motusira** - Reported contrast issues with INTERRUPTED status badge\n- **@nsstrickland** - Identified title truncation problems\n- **@Crunchnuggetz** - Requested all-day slot toggle for calendar views\n- **@jordandrako** - Reported task state refresh issues at midnight\n- **@cathywu** - Identified text wrapping problems in overlays \n- **@girisumit** - Requested enhanced date picker functionality\n- **@oliverlalan** - Requested template variable enhancements","aliases":["/releases/3.22.0/","/releases/3.22.0/"],"toc":[{"level":2,"id":"major-features","text":"Major Features"},{"level":3,"id":"modular-properties-system","text":"Modular Properties System"},{"level":3,"id":"bases-style-filter-bar-redesign","text":"Bases-style Filter Bar Redesign"},{"level":3,"id":"statistics-view","text":"Statistics view"},{"level":2,"id":"ux","text":"UX"},{"level":3,"id":"task-interaction-improvements","text":"Task Interaction Improvements"},{"level":3,"id":"external-contributions","text":"External Contributions"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"timezone-and-date-handling","text":"Timezone and Date Handling"},{"level":3,"id":"user-interface-fixes","text":"User Interface Fixes"},{"level":3,"id":"new-capabilities","text":"New Capabilities"},{"level":2,"id":"infrastructure-improvements","text":"Infrastructure Improvements"},{"level":3,"id":"development-and-testing","text":"Development and Testing"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

Major Features#

\n

Modular Properties System#

\n
    \n
  • Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. Thanks to @renatomen for the initial implementation of this feature

    \n
  • \n
  • Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users.

    \n
  • \n
  • Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled.

    \n
  • \n
\n

Bases-style Filter Bar Redesign#

\n
    \n
  • Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability.
  • \n
  • Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization.
  • \n
  • Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability.
  • \n
  • Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience.
  • \n
  • Added dedicated "+ New" task creation button to filter bar with neutral styling and proper view context awareness.
  • \n
\n

Statistics view#

\n
    \n
  • Implement a new view to track statistics about projects and time tracking.
  • \n
\n

UX#

\n

Task Interaction Improvements#

\n
    \n
  • Changed "This Week" grouping label to "Next seven days" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. Fixes issue #516 reported by @anareaty
  • \n
\n

External Contributions#

\n
    \n
  • Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. Contributed by @renatomen
  • \n
  • Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. Contributed by @renatomen
  • \n
  • Fixed project names containing commas (e.g., [[Money, Org & Adm]]) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. Contributed by @renatomen
  • \n
  • Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. Contributed by @renatomen
  • \n
  • Fixed User Fields column order in settings to match Field mapping configuration for consistency. Contributed by @renatomen
  • \n
\n

Bug Fixes#

\n

Timezone and Date Handling#

\n
    \n
  • Fixed timezone-dependent "Today" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. Fixes issue #452 reported by @MinchinWeb
  • \n
\n

User Interface Fixes#

\n
    \n
  • Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings.
  • \n
  • Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. Fixes issue #529 reported by @motusira
  • \n
  • Removed title length limits that were causing text truncation, allowing full title display. Fixes issue #378 reported by @nsstrickland
  • \n
  • Added all-day slot toggle to calendar view for better event organization. Fixes issue #242 requested by @Crunchnuggetz
  • \n
  • Added calendar locale configuration for international calendar support with proper localization. Contributed by @pixeler
  • \n
  • Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. Fixes issue #527 reported by @jordandrako
  • \n
  • Fixed inline task overlay title wrapping using white-space: break-spaces for proper text display. Fixes issue #517 reported by @cathywu
  • \n
\n

New Capabilities#

\n
    \n
  • Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. Fixes issue #238 requested by @girisumit
  • \n
  • Added tags to available sorting and grouping options for more flexible task organization. Fixes issue #169 requested by @bce283c
  • \n
  • Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. Fixes issue #299 requested by @0dfa1bc
  • \n
  • Added filename template variables to folder templates including support for additional customization options. Fixes issue #473 requested by @oliverlalan
  • \n
  • Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing.
  • \n
\n

Infrastructure Improvements#

\n

Development and Testing#

\n
    \n
  • Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility.
  • \n
  • Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality.
  • \n
  • Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions.
  • \n
\n

Contributors#

\n

Special recognition goes to @renatomen for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment.

\n

Thanks to the following community members for their bug reports and feature requests:

\n
    \n
  • @anareaty - Reported grouping label confusion with clear examples
  • \n
  • @MinchinWeb - Identified timezone handling inconsistencies across multiple views
  • \n
  • @motusira - Reported contrast issues with INTERRUPTED status badge
  • \n
  • @nsstrickland - Identified title truncation problems
  • \n
  • @Crunchnuggetz - Requested all-day slot toggle for calendar views
  • \n
  • @jordandrako - Reported task state refresh issues at midnight
  • \n
  • @cathywu - Identified text wrapping problems in overlays
  • \n
  • @girisumit - Requested enhanced date picker functionality
  • \n
  • @oliverlalan - Requested template variable enhancements
  • \n
\n","text":"Major Features# Modular Properties System# Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. Thanks to @renatomen for the initial implementation of this feature Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users. Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled. Bases-style Filter Bar Redesign# Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability. Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization. Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability. Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience. Added dedicated \"+ New\" task creation button to filter bar with neutral styling and proper view context awareness. Statistics view# Implement a new view to track statistics about projects and time tracking. UX# Task Interaction Improvements# Changed \"This Week\" grouping label to \"Next seven days\" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. Fixes issue #516 reported by @anareaty External Contributions# Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. Contributed by @renatomen Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. Contributed by @renatomen Fixed project names containing commas (e.g., [[Money, Org & Adm]]) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. Contributed by @renatomen Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. Contributed by @renatomen Fixed User Fields column order in settings to match Field mapping configuration for consistency. Contributed by @renatomen Bug Fixes# Timezone and Date Handling# Fixed timezone-dependent \"Today\" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. Fixes issue #452 reported by @MinchinWeb User Interface Fixes# Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings. Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. Fixes issue #529 reported by @motusira Removed title length limits that were causing text truncation, allowing full title display. Fixes issue #378 reported by @nsstrickland Added all-day slot toggle to calendar view for better event organization. Fixes issue #242 requested by @Crunchnuggetz Added calendar locale configuration for international calendar support with proper localization. Contributed by @pixeler Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. Fixes issue #527 reported by @jordandrako Fixed inline task overlay title wrapping using white-space: break-spaces for proper text display. Fixes issue #517 reported by @cathywu New Capabilities# Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. Fixes issue #238 requested by @girisumit Added tags to available sorting and grouping options for more flexible task organization. Fixes issue #169 requested by @bce283c Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. Fixes issue #299 requested by @0dfa1bc Added filename template variables to folder templates including support for additional customization options. Fixes issue #473 requested by @oliverlalan Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing. Infrastructure Improvements# Development and Testing# Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility. Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality. Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions. Contributors# Special recognition goes to @renatomen for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment. Thanks to the following community members for their bug reports and feature requests: @anareaty - Reported grouping label confusion with clear examples @MinchinWeb - Identified timezone handling inconsistencies across multiple views @motusira - Reported contrast issues with INTERRUPTED status badge @nsstrickland - Identified title truncation problems @Crunchnuggetz - Requested all-day slot toggle for calendar views @jordandrako - Reported task state refresh issues at midnight @cathywu - Identified text wrapping problems in overlays @girisumit - Requested enhanced date picker functionality @oliverlalan - Requested template variable enhancements"},{"route":"/obsidian/releases/3.22.1/","title":"TaskNotes 3.22.1","description":"Thanks to @jhedlund for implementing the configurable recurring task due date feature.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.22.1.md","namespace":"obsidian","relativePath":"releases/3.22.1.md","raw":"# TaskNotes 3.22.1\n\n## New Features\n\n### Configurable Recurring Task Due Date Behavior\n\n- Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new \"Maintain due date offset in recurring tasks\" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. *Contributed by @jhedlund, fixes issue #470*\n\n## Bug Fixes\n\n### Calendar and Task Display\n\n- Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved `timeEntries.filter is not a function` errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. *Fixes issue #520 reported by @cathywu*\n\n### Saved Views and Property Management\n\n- Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. *Fixes issue #545 reported by @anareaty*\n- Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving.\n- Added proper null safety checks for FilterBar interactions to prevent errors during view save operations.\n\n### User Interface Improvements\n\n- Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. *Fixes issue #549 reported by @TonyAtlas*\n\n## Development Improvements\n\n- Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting.\n\n## Contributors\n\nThanks to **@jhedlund** for implementing the configurable recurring task due date feature.\n\nThanks to the following community members for their bug reports:\n\n- **@cathywu** - Reported calendar view task display issues with detailed technical information\n- **@anareaty** - Identified property visibility persistence problems in saved views \n- **@TonyAtlas** - Reported filter bar overflow issues in narrow sidebars with helpful screenshots","aliases":["/releases/3.22.1/","/releases/3.22.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"configurable-recurring-task-due-date-behavior","text":"Configurable Recurring Task Due Date Behavior"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-and-task-display","text":"Calendar and Task Display"},{"level":3,"id":"saved-views-and-property-management","text":"Saved Views and Property Management"},{"level":3,"id":"user-interface-improvements","text":"User Interface Improvements"},{"level":2,"id":"development-improvements","text":"Development Improvements"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Configurable Recurring Task Due Date Behavior#

\n
    \n
  • Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new "Maintain due date offset in recurring tasks" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. Contributed by @jhedlund, fixes issue #470
  • \n
\n

Bug Fixes#

\n

Calendar and Task Display#

\n
    \n
  • Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved timeEntries.filter is not a function errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. Fixes issue #520 reported by @cathywu
  • \n
\n

Saved Views and Property Management#

\n
    \n
  • Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. Fixes issue #545 reported by @anareaty
  • \n
  • Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving.
  • \n
  • Added proper null safety checks for FilterBar interactions to prevent errors during view save operations.
  • \n
\n

User Interface Improvements#

\n
    \n
  • Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. Fixes issue #549 reported by @TonyAtlas
  • \n
\n

Development Improvements#

\n
    \n
  • Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting.
  • \n
\n

Contributors#

\n

Thanks to @jhedlund for implementing the configurable recurring task due date feature.

\n

Thanks to the following community members for their bug reports:

\n
    \n
  • @cathywu - Reported calendar view task display issues with detailed technical information
  • \n
  • @anareaty - Identified property visibility persistence problems in saved views
  • \n
  • @TonyAtlas - Reported filter bar overflow issues in narrow sidebars with helpful screenshots
  • \n
\n","text":"New Features# Configurable Recurring Task Due Date Behavior# Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new \"Maintain due date offset in recurring tasks\" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. Contributed by @jhedlund, fixes issue #470 Bug Fixes# Calendar and Task Display# Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved timeEntries.filter is not a function errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. Fixes issue #520 reported by @cathywu Saved Views and Property Management# Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. Fixes issue #545 reported by @anareaty Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving. Added proper null safety checks for FilterBar interactions to prevent errors during view save operations. User Interface Improvements# Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. Fixes issue #549 reported by @TonyAtlas Development Improvements# Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting. Contributors# Thanks to @jhedlund for implementing the configurable recurring task due date feature. Thanks to the following community members for their bug reports: @cathywu - Reported calendar view task display issues with detailed technical information @anareaty - Identified property visibility persistence problems in saved views @TonyAtlas - Reported filter bar overflow issues in narrow sidebars with helpful screenshots"},{"route":"/obsidian/releases/3.23.0/","title":"TaskNotes 3.23.0","description":"We extend special thanks to @renatomen for his exceptional contributions to this release:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.0.md","namespace":"obsidian","relativePath":"releases/3.23.0.md","raw":"# TaskNotes 3.23.0\n\n## New Features\n\n### ICS Export and Calendar Integration\n\n- Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility\n- Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows\n- Added manual \"Export all tasks as ICS file\" command for bulk export operations\n- *Thanks to @mdbraber for requesting this feature (#422)*\n\n### Status-Based Auto-Archive\n\n- Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes)\n- Added persistent queue that survives plugin restarts for reliable task archiving\n- Implemented settings UI for fine-grained control over auto-archive behavior\n- *Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions*\n\n### Multi-Language Natural Language Processing\n\n- Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian\n- Implemented locale-specific date parsing using chrono-node language support\n- Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts\n- *Thanks to @pschoenbach for requesting German language support (#563)*\n\n### Enhanced Project Autosuggest\n\n- Implemented configurable multi-row project cards with customizable display fields\n- Added selective search functionality across chosen fields with simple flag system\n- Introduced fuzzy search option for broader, multi-word matching capabilities\n- Enhanced project selection with clear metadata display (title, aliases, path)\n- *Thanks to @renatomen for implementing this feature (#555)*\n\n### Bases Plugin Integration\n\n- Added experimental integration with the Bases plugin for enhanced task management workflows\n- Implemented direct formula computation and custom property support\n- Added clickable tags and contexts with accessibility support\n- Created simplified kanban view integration with proper lifecycle management\n- *Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature*\n\n### Settings UI Modernization\n\n- Complete redesign of settings interface with card-based design system\n- Added collapsible functionality and live API documentation\n- Enhanced calendar subscription interface with local file support\n\n## Bug Fixes\n\n### Task Creation and File Handling\n\n- Fixed startup crash when templates contain empty reminders property (*reported by @glpayson, #583*)\n- Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (*reported by @glpayson, #590*)\n- Added support for platform-specific filename characters (hash, square brackets)\n- Resolved inconsistent behavior between instant convert and manual task creation\n\n### Project and Link Functionality \n\n- Added clickable project links in task edit modal for better navigation (*requested by @anareaty, #432*)\n- Fixed completion date timezone handling to ensure consistent local time recording\n- Corrected frontmatter property naming in Bases kanban drag-and-drop operations\n\n### Property Display and Performance\n\n- Fixed custom property duplication when configured in both settings and filter bar\n- Resolved unwanted total tracked time display showing zero values\n- Standardized custom property identifiers with consistent prefix format\n\n### Plugin Integration and Stability\n\n- Resolved Bases plugin integration issues and view switching problems\n- Fixed kanban view loading with proper static imports and interface consistency\n- Improved error handling and cleanup patterns for better stability\n- Fixed API endpoints to respect custom status configurations (*reported by @23maverick23, #487*)\n\n## Acknowledgments\n\n### Special Recognition\n\nWe extend special thanks to **@renatomen** for his exceptional contributions to this release:\n\n- Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555)\n- Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration\n- His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible!\n\n### Community Contributors\n\nWe're grateful to the community members whose issues were resolved in this release:\n\n- **@glpayson** for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590)\n- **@mdbraber** for requesting ICS export functionality that became a major feature in this release (#422)\n- **@TonyAtlas** for the auto-archive feature request that resulted in the new status-based auto-archive system (#547)\n- **@anareaty** for requesting clickable project links (#432) and reporting the \"This Week\" grouping label issue (#516)\n- **@pschoenbach** for requesting multi-language NLP support, specifically German language support (#563)\n- **@23maverick23** for reporting API status configuration issues that improved custom status handling (#487)\n- **@Burrish** for the documentation correction (#597)\n\n---\n\n**Full Changelog**: [3.22.1...3.23.0](https://github.com/callumalpass/tasknotes/compare/3.22.1...3.23.0)\n\n","aliases":["/releases/3.23.0/","/releases/3.23.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"ics-export-and-calendar-integration","text":"ICS Export and Calendar Integration"},{"level":3,"id":"status-based-auto-archive","text":"Status-Based Auto-Archive"},{"level":3,"id":"multi-language-natural-language-processing","text":"Multi-Language Natural Language Processing"},{"level":3,"id":"enhanced-project-autosuggest","text":"Enhanced Project Autosuggest"},{"level":3,"id":"bases-plugin-integration","text":"Bases Plugin Integration"},{"level":3,"id":"settings-ui-modernization","text":"Settings UI Modernization"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-creation-and-file-handling","text":"Task Creation and File Handling"},{"level":3,"id":"project-and-link-functionality","text":"Project and Link Functionality"},{"level":3,"id":"property-display-and-performance","text":"Property Display and Performance"},{"level":3,"id":"plugin-integration-and-stability","text":"Plugin Integration and Stability"},{"level":2,"id":"acknowledgments","text":"Acknowledgments"},{"level":3,"id":"special-recognition","text":"Special Recognition"},{"level":3,"id":"community-contributors","text":"Community Contributors"}],"html":"

New Features#

\n

ICS Export and Calendar Integration#

\n
    \n
  • Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility
  • \n
  • Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows
  • \n
  • Added manual "Export all tasks as ICS file" command for bulk export operations
  • \n
  • Thanks to @mdbraber for requesting this feature (#422)
  • \n
\n

Status-Based Auto-Archive#

\n
    \n
  • Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes)
  • \n
  • Added persistent queue that survives plugin restarts for reliable task archiving
  • \n
  • Implemented settings UI for fine-grained control over auto-archive behavior
  • \n
  • Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions
  • \n
\n

Multi-Language Natural Language Processing#

\n
    \n
  • Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian
  • \n
  • Implemented locale-specific date parsing using chrono-node language support
  • \n
  • Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts
  • \n
  • Thanks to @pschoenbach for requesting German language support (#563)
  • \n
\n

Enhanced Project Autosuggest#

\n
    \n
  • Implemented configurable multi-row project cards with customizable display fields
  • \n
  • Added selective search functionality across chosen fields with simple flag system
  • \n
  • Introduced fuzzy search option for broader, multi-word matching capabilities
  • \n
  • Enhanced project selection with clear metadata display (title, aliases, path)
  • \n
  • Thanks to @renatomen for implementing this feature (#555)
  • \n
\n

Bases Plugin Integration#

\n
    \n
  • Added experimental integration with the Bases plugin for enhanced task management workflows
  • \n
  • Implemented direct formula computation and custom property support
  • \n
  • Added clickable tags and contexts with accessibility support
  • \n
  • Created simplified kanban view integration with proper lifecycle management
  • \n
  • Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature
  • \n
\n

Settings UI Modernization#

\n
    \n
  • Complete redesign of settings interface with card-based design system
  • \n
  • Added collapsible functionality and live API documentation
  • \n
  • Enhanced calendar subscription interface with local file support
  • \n
\n

Bug Fixes#

\n

Task Creation and File Handling#

\n
    \n
  • Fixed startup crash when templates contain empty reminders property (reported by @glpayson, #583)
  • \n
  • Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (reported by @glpayson, #590)
  • \n
  • Added support for platform-specific filename characters (hash, square brackets)
  • \n
  • Resolved inconsistent behavior between instant convert and manual task creation
  • \n
\n\n
    \n
  • Added clickable project links in task edit modal for better navigation (requested by @anareaty, #432)
  • \n
  • Fixed completion date timezone handling to ensure consistent local time recording
  • \n
  • Corrected frontmatter property naming in Bases kanban drag-and-drop operations
  • \n
\n

Property Display and Performance#

\n
    \n
  • Fixed custom property duplication when configured in both settings and filter bar
  • \n
  • Resolved unwanted total tracked time display showing zero values
  • \n
  • Standardized custom property identifiers with consistent prefix format
  • \n
\n

Plugin Integration and Stability#

\n
    \n
  • Resolved Bases plugin integration issues and view switching problems
  • \n
  • Fixed kanban view loading with proper static imports and interface consistency
  • \n
  • Improved error handling and cleanup patterns for better stability
  • \n
  • Fixed API endpoints to respect custom status configurations (reported by @23maverick23, #487)
  • \n
\n

Acknowledgments#

\n

Special Recognition#

\n

We extend special thanks to @renatomen for his exceptional contributions to this release:

\n
    \n
  • Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555)
  • \n
  • Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration
  • \n
  • His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible!
  • \n
\n

Community Contributors#

\n

We're grateful to the community members whose issues were resolved in this release:

\n
    \n
  • @glpayson for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590)
  • \n
  • @mdbraber for requesting ICS export functionality that became a major feature in this release (#422)
  • \n
  • @TonyAtlas for the auto-archive feature request that resulted in the new status-based auto-archive system (#547)
  • \n
  • @anareaty for requesting clickable project links (#432) and reporting the "This Week" grouping label issue (#516)
  • \n
  • @pschoenbach for requesting multi-language NLP support, specifically German language support (#563)
  • \n
  • @23maverick23 for reporting API status configuration issues that improved custom status handling (#487)
  • \n
  • @Burrish for the documentation correction (#597)
  • \n
\n
\n

Full Changelog: 3.22.1...3.23.0

\n","text":"New Features# ICS Export and Calendar Integration# Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows Added manual \"Export all tasks as ICS file\" command for bulk export operations Thanks to @mdbraber for requesting this feature (#422) Status-Based Auto-Archive# Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes) Added persistent queue that survives plugin restarts for reliable task archiving Implemented settings UI for fine-grained control over auto-archive behavior Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions Multi-Language Natural Language Processing# Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian Implemented locale-specific date parsing using chrono-node language support Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts Thanks to @pschoenbach for requesting German language support (#563) Enhanced Project Autosuggest# Implemented configurable multi-row project cards with customizable display fields Added selective search functionality across chosen fields with simple flag system Introduced fuzzy search option for broader, multi-word matching capabilities Enhanced project selection with clear metadata display (title, aliases, path) Thanks to @renatomen for implementing this feature (#555) Bases Plugin Integration# Added experimental integration with the Bases plugin for enhanced task management workflows Implemented direct formula computation and custom property support Added clickable tags and contexts with accessibility support Created simplified kanban view integration with proper lifecycle management Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature Settings UI Modernization# Complete redesign of settings interface with card-based design system Added collapsible functionality and live API documentation Enhanced calendar subscription interface with local file support Bug Fixes# Task Creation and File Handling# Fixed startup crash when templates contain empty reminders property (reported by @glpayson, #583) Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (reported by @glpayson, #590) Added support for platform-specific filename characters (hash, square brackets) Resolved inconsistent behavior between instant convert and manual task creation Project and Link Functionality# Added clickable project links in task edit modal for better navigation (requested by @anareaty, #432) Fixed completion date timezone handling to ensure consistent local time recording Corrected frontmatter property naming in Bases kanban drag-and-drop operations Property Display and Performance# Fixed custom property duplication when configured in both settings and filter bar Resolved unwanted total tracked time display showing zero values Standardized custom property identifiers with consistent prefix format Plugin Integration and Stability# Resolved Bases plugin integration issues and view switching problems Fixed kanban view loading with proper static imports and interface consistency Improved error handling and cleanup patterns for better stability Fixed API endpoints to respect custom status configurations (reported by @23maverick23, #487) Acknowledgments# Special Recognition# We extend special thanks to @renatomen for his exceptional contributions to this release: Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555) Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible! Community Contributors# We're grateful to the community members whose issues were resolved in this release: @glpayson for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590) @mdbraber for requesting ICS export functionality that became a major feature in this release (#422) @TonyAtlas for the auto-archive feature request that resulted in the new status-based auto-archive system (#547) @anareaty for requesting clickable project links (#432) and reporting the \"This Week\" grouping label issue (#516) @pschoenbach for requesting multi-language NLP support, specifically German language support (#563) @23maverick23 for reporting API status configuration issues that improved custom status handling (#487) @Burrish for the documentation correction (#597) Full Changelog: 3.22.1...3.23.0"},{"route":"/obsidian/releases/3.23.1/","title":"TaskNotes 3.23.1","description":"Full Changelog: 3.23.0...3.23.1","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.1.md","namespace":"obsidian","relativePath":"releases/3.23.1.md","raw":"# TaskNotes 3.23.1\n\n## Bug Fixes\n\n### Bases Plugin Integration\n\n- Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. *Thanks to @anareaty for reporting this issue (#607)*\n\n---\n\n**Full Changelog**: [3.23.0...3.23.1](https://github.com/callumalpass/tasknotes/compare/3.23.0...3.23.1)","aliases":["/releases/3.23.1/","/releases/3.23.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"bases-plugin-integration","text":"Bases Plugin Integration"}],"html":"

Bug Fixes#

\n

Bases Plugin Integration#

\n
    \n
  • Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. Thanks to @anareaty for reporting this issue (#607)
  • \n
\n
\n

Full Changelog: 3.23.0...3.23.1

\n","text":"Bug Fixes# Bases Plugin Integration# Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. Thanks to @anareaty for reporting this issue (#607) Full Changelog: 3.23.0...3.23.1"},{"route":"/obsidian/releases/3.23.2/","title":"TaskNotes v3.23.2 Release Notes","description":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.2.md","namespace":"obsidian","relativePath":"releases/3.23.2.md","raw":"# TaskNotes v3.23.2 Release Notes\n\nThis release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks. \n\n## New Features\n\n- Added agenda/list view to Advanced Calendar \n- New `{{contexts}}` template variable for joining multiple context values\n- New `{{projects}}` template variable for joining multiple project values *Thanks to @Mara-Li for these additions*\n\n### Time Format Consistency\n\n- Plugin-wide 12hr/24hr time format preference support\n- Consistent time display across all calendar views and components\n- *Thanks to @anareaty and @Astrusia for this suggestion #431*\n\n### Performance Architecture\n\n- Centralized ViewPerformanceService for all TaskNotes views\n- Global task version cache with change detection\n- Debounced updates with configurable batching\n- View-specific update handlers with selective refresh logic\n- Memory management and automatic cache cleanup\n\n## Bug Fixes\n\n- Fixed cursor positioning issues when creating subtask widgets *Thanks to @jhedlund for this fix!*\n\n## Contributors\n\nSpecial thanks to contributors:\n- @jhedlund for fixing cursor positioning with subtasks\n- @Mara-Li for implementing context/project template variables and bracket fixes\n- @anareaty for reporting time format inconsistencies\n","aliases":["/releases/3.23.2/","/releases/3.23.2/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"time-format-consistency","text":"Time Format Consistency"},{"level":3,"id":"performance-architecture","text":"Performance Architecture"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks.

\n

New Features#

\n
    \n
  • Added agenda/list view to Advanced Calendar
  • \n
  • New {{contexts}} template variable for joining multiple context values
  • \n
  • New {{projects}} template variable for joining multiple project values Thanks to @Mara-Li for these additions
  • \n
\n

Time Format Consistency#

\n
    \n
  • Plugin-wide 12hr/24hr time format preference support
  • \n
  • Consistent time display across all calendar views and components
  • \n
  • Thanks to @anareaty and @Astrusia for this suggestion #431
  • \n
\n

Performance Architecture#

\n
    \n
  • Centralized ViewPerformanceService for all TaskNotes views
  • \n
  • Global task version cache with change detection
  • \n
  • Debounced updates with configurable batching
  • \n
  • View-specific update handlers with selective refresh logic
  • \n
  • Memory management and automatic cache cleanup
  • \n
\n

Bug Fixes#

\n
    \n
  • Fixed cursor positioning issues when creating subtask widgets Thanks to @jhedlund for this fix!
  • \n
\n

Contributors#

\n

Special thanks to contributors:

\n
    \n
  • @jhedlund for fixing cursor positioning with subtasks
  • \n
  • @Mara-Li for implementing context/project template variables and bracket fixes
  • \n
  • @anareaty for reporting time format inconsistencies
  • \n
\n","text":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks. New Features# Added agenda/list view to Advanced Calendar New {{contexts}} template variable for joining multiple context values New {{projects}} template variable for joining multiple project values Thanks to @Mara-Li for these additions Time Format Consistency# Plugin-wide 12hr/24hr time format preference support Consistent time display across all calendar views and components Thanks to @anareaty and @Astrusia for this suggestion #431 Performance Architecture# Centralized ViewPerformanceService for all TaskNotes views Global task version cache with change detection Debounced updates with configurable batching View-specific update handlers with selective refresh logic Memory management and automatic cache cleanup Bug Fixes# Fixed cursor positioning issues when creating subtask widgets Thanks to @jhedlund for this fix! Contributors# Special thanks to contributors: @jhedlund for fixing cursor positioning with subtasks @Mara-Li for implementing context/project template variables and bracket fixes @anareaty for reporting time format inconsistencies"},{"route":"/obsidian/releases/3.23.3/","title":"TaskNotes v3.23.3 Release Notes","description":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.3.md","namespace":"obsidian","relativePath":"releases/3.23.3.md","raw":"# TaskNotes v3.23.3 Release Notes\n\nThis release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.\n\n## New Features\n\n### Project Property Filter Support\n\n- Added property-based filtering for project picker dropdown\n- Configure projects to appear in picker based on frontmatter properties (e.g., `type: project`)\n- Complements existing folder and tag filtering options\n- *Thanks to @aubreyz for requesting this feature enhancement (#660)*\n\n## Bug Fixes\n\n### Project/Subtask Field Mapping\n\n- Fixed project and subtask functionality not working when users customize project field names\n- ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration\n- Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings\n- *Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues*\n\n### Test Infrastructure\n\n- Added missing test mocks for `isTaskUsedAsProjectSync` and `formatDateForStorage` functions\n- Ensures test suite stability for project-related functionality\n","aliases":["/releases/3.23.3/","/releases/3.23.3/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-property-filter-support","text":"Project Property Filter Support"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"projectsubtask-field-mapping","text":"Project/Subtask Field Mapping"},{"level":3,"id":"test-infrastructure","text":"Test Infrastructure"}],"html":"

This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.

\n

New Features#

\n

Project Property Filter Support#

\n
    \n
  • Added property-based filtering for project picker dropdown
  • \n
  • Configure projects to appear in picker based on frontmatter properties (e.g., type: project)
  • \n
  • Complements existing folder and tag filtering options
  • \n
  • Thanks to @aubreyz for requesting this feature enhancement (#660)
  • \n
\n

Bug Fixes#

\n

Project/Subtask Field Mapping#

\n
    \n
  • Fixed project and subtask functionality not working when users customize project field names
  • \n
  • ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration
  • \n
  • Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings
  • \n
  • Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues
  • \n
\n

Test Infrastructure#

\n
    \n
  • Added missing test mocks for isTaskUsedAsProjectSync and formatDateForStorage functions
  • \n
  • Ensures test suite stability for project-related functionality
  • \n
\n","text":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities. New Features# Project Property Filter Support# Added property-based filtering for project picker dropdown Configure projects to appear in picker based on frontmatter properties (e.g., type: project) Complements existing folder and tag filtering options Thanks to @aubreyz for requesting this feature enhancement (#660) Bug Fixes# Project/Subtask Field Mapping# Fixed project and subtask functionality not working when users customize project field names ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues Test Infrastructure# Added missing test mocks for isTaskUsedAsProjectSync and formatDateForStorage functions Ensures test suite stability for project-related functionality"},{"route":"/obsidian/releases/3.23.4/","title":"TaskNotes 3.23.4","description":"Special thanks to contributors:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.4.md","namespace":"obsidian","relativePath":"releases/3.23.4.md","raw":"# TaskNotes 3.23.4\n\n## Bug Fixes\n\n### Task Scheduling & Natural Language Processing\n\n- Fixed Russian weekday scheduling conflict where single weekdays (e.g., \"воскресенье\") were incorrectly interpreted as recurring tasks instead of single-day scheduling ([#665](https://github.com/callumalpass/tasknotes/issues/665), thanks to @anareaty for the report)\n- Fixed issue where natural language processing failed to save parsed time estimates in task creation modal ([#682](https://github.com/callumalpass/tasknotes/issues/682), thanks to @RumiaKitinari for the detailed report)\n- Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under \"Past Scheduled\" instead of \"Today\" ([#384](https://github.com/callumalpass/tasknotes/issues/384), thanks to @jcromwell for the report)\n\n### Settings & Configuration\n\n- Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings ([#664](https://github.com/callumalpass/tasknotes/issues/664), thanks to @Yoav6 for identifying this issue)\n\n### Calendar & Time Management\n\n- Fixed calendar not refreshing when task duration or time tracking changes ([#382](https://github.com/callumalpass/tasknotes/issues/382), thanks to @mdbraber)\n- Fixed calendar not refreshing after task archive or move operations\n- Fixed timeblock editing using stored date instead of current date for past day modifications ([#647](https://github.com/callumalpass/tasknotes/issues/647), thanks to @RumiaKitinari)\n- Fixed Pomodoro timer not preserving task context when auto-starting sessions ([#641](https://github.com/callumalpass/tasknotes/issues/641), thanks to @RumiaKitinari)\n- Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to [Danny Talks Tech](https://www.youtube.com/watch?v=SRavkMUYWzo) for reporting this in his video review)\n\n### User Interface\n\n- Fixed mini calendar header overflow issue in sidebar view ([#459](https://github.com/callumalpass/tasknotes/issues/459), with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report)\n\n## New Features & Enhancements\n\n### Visual Improvements\n\n- Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons ([#662](https://github.com/callumalpass/tasknotes/issues/662), thanks to @ras0q for the suggestion)\n- Improved mini calendar styling, interactions, and legend display\n- Enhanced task dot visualization to reflect accurate matching dates\n\n### Settings Organization\n\n- Moved timeblocking settings to Features tab with improved usage instructions for better discoverability\n\n## Documentation\n\n- Updated documentation to fix auto-archiving settings reference ([#673](https://github.com/callumalpass/tasknotes/issues/673), thanks to @antonio for pointing out the inconsistency)\n\n## Contributors\n\nSpecial thanks to contributors:\n\n- @anareaty for reporting the Russian weekday scheduling conflict\n- @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues\n- @jcromwell for reporting the scheduled task grouping UTC regression\n- @Yoav6 for identifying the excluded folders trailing comma issue\n- @mdbraber for reporting calendar refresh issues with time tracking changes\n- @girisumit for reporting the mini calendar header overflow issue\n- @jsonshanks for providing CSS improvement suggestions for the mini calendar\n- @ras0q for suggesting the file-text icon addition to agenda view\n- @antonio for pointing out the auto-archiving documentation inconsistency\n- [Danny Talks Tech](https://www.youtube.com/watch?v=SRavkMUYWzo) for reporting the all-day task rendering issue in his video review\n\n---\n\nThis release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish.","aliases":["/releases/3.23.4/","/releases/3.23.4/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-scheduling-natural-language-processing","text":"Task Scheduling & Natural Language Processing"},{"level":3,"id":"settings-configuration","text":"Settings & Configuration"},{"level":3,"id":"calendar-time-management","text":"Calendar & Time Management"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":2,"id":"new-features-enhancements","text":"New Features & Enhancements"},{"level":3,"id":"visual-improvements","text":"Visual Improvements"},{"level":3,"id":"settings-organization","text":"Settings Organization"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

Bug Fixes#

\n

Task Scheduling & Natural Language Processing#

\n
    \n
  • Fixed Russian weekday scheduling conflict where single weekdays (e.g., "воскресенье") were incorrectly interpreted as recurring tasks instead of single-day scheduling (#665, thanks to @anareaty for the report)
  • \n
  • Fixed issue where natural language processing failed to save parsed time estimates in task creation modal (#682, thanks to @RumiaKitinari for the detailed report)
  • \n
  • Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under "Past Scheduled" instead of "Today" (#384, thanks to @jcromwell for the report)
  • \n
\n

Settings & Configuration#

\n
    \n
  • Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings (#664, thanks to @Yoav6 for identifying this issue)
  • \n
\n

Calendar & Time Management#

\n
    \n
  • Fixed calendar not refreshing when task duration or time tracking changes (#382, thanks to @mdbraber)
  • \n
  • Fixed calendar not refreshing after task archive or move operations
  • \n
  • Fixed timeblock editing using stored date instead of current date for past day modifications (#647, thanks to @RumiaKitinari)
  • \n
  • Fixed Pomodoro timer not preserving task context when auto-starting sessions (#641, thanks to @RumiaKitinari)
  • \n
  • Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to Danny Talks Tech for reporting this in his video review)
  • \n
\n

User Interface#

\n
    \n
  • Fixed mini calendar header overflow issue in sidebar view (#459, with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report)
  • \n
\n

New Features & Enhancements#

\n

Visual Improvements#

\n
    \n
  • Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons (#662, thanks to @ras0q for the suggestion)
  • \n
  • Improved mini calendar styling, interactions, and legend display
  • \n
  • Enhanced task dot visualization to reflect accurate matching dates
  • \n
\n

Settings Organization#

\n
    \n
  • Moved timeblocking settings to Features tab with improved usage instructions for better discoverability
  • \n
\n

Documentation#

\n
    \n
  • Updated documentation to fix auto-archiving settings reference (#673, thanks to @antonio for pointing out the inconsistency)
  • \n
\n

Contributors#

\n

Special thanks to contributors:

\n
    \n
  • @anareaty for reporting the Russian weekday scheduling conflict
  • \n
  • @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues
  • \n
  • @jcromwell for reporting the scheduled task grouping UTC regression
  • \n
  • @Yoav6 for identifying the excluded folders trailing comma issue
  • \n
  • @mdbraber for reporting calendar refresh issues with time tracking changes
  • \n
  • @girisumit for reporting the mini calendar header overflow issue
  • \n
  • @jsonshanks for providing CSS improvement suggestions for the mini calendar
  • \n
  • @ras0q for suggesting the file-text icon addition to agenda view
  • \n
  • @antonio for pointing out the auto-archiving documentation inconsistency
  • \n
  • Danny Talks Tech for reporting the all-day task rendering issue in his video review
  • \n
\n
\n

This release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish.

\n","text":"Bug Fixes# Task Scheduling & Natural Language Processing# Fixed Russian weekday scheduling conflict where single weekdays (e.g., \"воскресенье\") were incorrectly interpreted as recurring tasks instead of single-day scheduling (#665, thanks to @anareaty for the report) Fixed issue where natural language processing failed to save parsed time estimates in task creation modal (#682, thanks to @RumiaKitinari for the detailed report) Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under \"Past Scheduled\" instead of \"Today\" (#384, thanks to @jcromwell for the report) Settings & Configuration# Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings (#664, thanks to @Yoav6 for identifying this issue) Calendar & Time Management# Fixed calendar not refreshing when task duration or time tracking changes (#382, thanks to @mdbraber) Fixed calendar not refreshing after task archive or move operations Fixed timeblock editing using stored date instead of current date for past day modifications (#647, thanks to @RumiaKitinari) Fixed Pomodoro timer not preserving task context when auto-starting sessions (#641, thanks to @RumiaKitinari) Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to Danny Talks Tech for reporting this in his video review) User Interface# Fixed mini calendar header overflow issue in sidebar view (#459, with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report) New Features & Enhancements# Visual Improvements# Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons (#662, thanks to @ras0q for the suggestion) Improved mini calendar styling, interactions, and legend display Enhanced task dot visualization to reflect accurate matching dates Settings Organization# Moved timeblocking settings to Features tab with improved usage instructions for better discoverability Documentation# Updated documentation to fix auto-archiving settings reference (#673, thanks to @antonio for pointing out the inconsistency) Contributors# Special thanks to contributors: @anareaty for reporting the Russian weekday scheduling conflict @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues @jcromwell for reporting the scheduled task grouping UTC regression @Yoav6 for identifying the excluded folders trailing comma issue @mdbraber for reporting calendar refresh issues with time tracking changes @girisumit for reporting the mini calendar header overflow issue @jsonshanks for providing CSS improvement suggestions for the mini calendar @ras0q for suggesting the file-text icon addition to agenda view @antonio for pointing out the auto-archiving documentation inconsistency Danny Talks Tech for reporting the all-day task rendering issue in his video review This release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish."},{"route":"/obsidian/releases/3.24.0/","title":"TaskNotes 3.24.0","description":"Special thanks to all this release's contributors:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.0.md","namespace":"obsidian","relativePath":"releases/3.24.0.md","raw":"# TaskNotes 3.24.0\n\n## New Features\n\n### Agenda View Overdue Section\n\n- Added separate \"Overdue\" section in Agenda view instead of mixing overdue tasks with today's tasks ([#557](https://github.com/callumalpass/tasknotes/issues/557), thanks to @backyardbiomech for the detailed report)\n- Collapsible section with task completion statistics and proper internationalization support\n- Includes overdue recurring tasks based on their scheduled dates\n\n### Task Dependencies and Blocking Relationships\n\n- Implemented blocking/blocked task dependencies with persistent relationships ([#701](https://github.com/callumalpass/tasknotes/issues/701), thanks to @prayidae for the detailed feature request)\n- Tasks can be marked as blocking other tasks or blocked by other tasks\n- Dependency relationships persist in frontmatter as structural links\n- Dynamic blocked state computed based on blocking task completion status\n\n### Task Card Widget in Notes\n\n- Added configurable task card widget displaying at the top of task notes ([#576](https://github.com/callumalpass/tasknotes/issues/576), thanks to @jhedlund for the request)\n- Provides immediate access to task actions and context menus without requiring command palette\n- Uses CodeMirror widget system for integration\n- Appears above project subtasks widget when both enabled\n- Can be disabled via settings\n\n### Hierarchical Subgrouping\n\n- Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution)\n- Allows two-level task organization (e.g., Group by Status, Subgroup by Priority)\n- Cross-view support with consistent behavior\n- State persistence for expand/collapse preferences\n- Custom user fields supported as subgroup options\n\n### Internationalization Support\n\n- Added i18n framework with multi-language support\n- Support for German, Spanish, French, Russian, Chinese, and Japanese\n- Translation coverage for command palette entries and UI strings\n- Localized agenda and filter interface elements\n\n### Template Variables\n\n- Added `{{hashtags}}` template variable for space-separated hashtag rendering ([#612](https://github.com/callumalpass/tasknotes/issues/612), thanks to @strazto for the suggestion)\n- Added `{{currentNoteTitle}}` template variable for note-specific folder organization ([#637](https://github.com/callumalpass/tasknotes/issues/637), thanks to @Mara-Li for the request)\n- Added template variable support for archive folder paths ([#677](https://github.com/callumalpass/tasknotes/issues/677), thanks to @dsebastien for the request)\n- Fixed `{{project}}` variables to properly extract basenames from wikilinks ([#490](https://github.com/callumalpass/tasknotes/issues/490), thanks to @nsstrickland for the detailed bug report)\n\n### Project and Subtask Management\n\n- Enhanced task modals with project and subtask management capabilities\n- Added \"Add to project\" and \"Add subtasks\" sections in task creation/edit modals\n- Context menu options for assigning tasks to projects and adding subtasks\n- Collapsible lists with visual separators between form sections\n\n### View and Grouping Enhancements\n\n- Added \"Completed Date\" as grouping option for analyzing productivity ([#430](https://github.com/callumalpass/tasknotes/issues/430), thanks to @anareaty for the suggestion)\n- Added \"Status\" as sorting option in Kanban and Task List views ([#633](https://github.com/callumalpass/tasknotes/issues/633), thanks to @mdbraber for the report)\n- Implemented per-grouping column persistence for Kanban views\n- Smart default ordering respecting StatusManager and PriorityManager configurations\n\n## Bug Fixes\n\n### Calendar and Advanced Calendar\n\n- Fixed calendar not refreshing when task duration or time tracking changes\n- Fixed calendar not refreshing after task archive or move operations\n- Fixed agenda duplication for all-day ICS events ([#695](https://github.com/callumalpass/tasknotes/issues/695), thanks to @realJohnDoe for the report)\n- Added configurable `eventMinHeight` for Advanced Calendar to make short duration tasks readable ([#718](https://github.com/callumalpass/tasknotes/issues/718), thanks to @Ruboks-Cube for the detailed report)\n- Fixed multi-day task creation in month/year view to properly calculate time estimates ([#564](https://github.com/callumalpass/tasknotes/issues/564), thanks to @same774 for the report)\n\n### Kanban View\n\n- Fixed kanban view losing columns after upgrades ([#689](https://github.com/callumalpass/tasknotes/issues/689), thanks to @mikesale for the report)\n- Fixed clearing filters defaulting to \"none\" instead of \"status\" grouping ([#679](https://github.com/callumalpass/tasknotes/issues/679), thanks to @camara-tech-pro for the question)\n- Fixed column order changes when switching between views ([#710](https://github.com/callumalpass/tasknotes/issues/710), thanks to @phortx for the report)\n- Fixed kanban drag-and-drop for custom field grouping ([#494](https://github.com/callumalpass/tasknotes/issues/494), thanks to @anareaty for the report)\n- Enhanced save view modal functionality with improved styling and accessibility\n\n### Task Management\n\n- Fixed HTTP API task creation to return sanitized title matching stored content ([#635](https://github.com/callumalpass/tasknotes/issues/635), thanks to @nightroman for the detailed report)\n- Fixed `#task` tag being incorrectly added when using property-based task identification ([#570](https://github.com/callumalpass/tasknotes/issues/570), thanks to @RobbK17 for the report)\n- Fixed recurring task completion styling in Bases views ([#669](https://github.com/callumalpass/tasknotes/issues/669), thanks to @jordandrako for the report)\n\n### Hierarchical Tag Support\n\n- Added hierarchical tag support with exclusion patterns for Obsidian nested tags ([#584](https://github.com/callumalpass/tasknotes/issues/584), thanks to @renatomen for the detailed feature request)\n- Hierarchical matching allows searching for parent tags to match child tags (e.g., `t/ef` matches `t/ef/project`, `t/ef/task`)\n- Exclusion patterns support using `-` prefix to exclude specific tags and their children\n- Maintains backward compatibility with existing substring matching\n\n### Natural Language Processing and Tags\n\n- Fixed nested tags losing slashes in agenda view rendering ([#712](https://github.com/callumalpass/tasknotes/issues/712), thanks to @antonio for the report and fix)\n- Added support for hyphens in NLP tag parsing ([#568](https://github.com/callumalpass/tasknotes/issues/568), thanks to @jordandrako for the report)\n\n### Settings and Configuration\n\n- Fixed property value truncation in project autosuggest settings by adding input debouncing ([#705](https://github.com/callumalpass/tasknotes/issues/705), thanks to @aubreyz for the report)\n- Improved webhook transform error handling with detailed logging ([#719](https://github.com/callumalpass/tasknotes/issues/719), thanks to @stephen-netu for the detailed report)\n- Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation)\n\n### Code Quality and Development\n\n- Configured Prettier formatter for consistent code formatting ([#717](https://github.com/callumalpass/tasknotes/issues/717), thanks to @ras0q for the request)\n- Applied ESLint fixes reducing problems from 209 to 97\n- Added format and format:check scripts for development workflow\n- Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction)\n\n## Enhancements\n\n### Performance and Reliability\n\n- Added debouncing to project autosuggest property inputs\n- Improved error handling for webhook transform failures\n\n### User Interface\n\n- Added time display based on `timeEstimate` property in task statistics (thanks to Sergen Aras for the implementation)\n- Enhanced language selection display with native scripts\n\n### Settings Organization\n\n- Reorganized settings with improved categorization\n- Added collapsible functionality to various UI sections\n- Enhanced accessibility with proper button labeling\n\n## Documentation\n\n- Added documentation for task dependencies feature\n- Updated comprehensive subgrouping feature documentation\n- Enhanced template variable documentation\n- Updated various view documentation for new features\n\n## Contributors\n\nSpecial thanks to all this release's contributors:\n\n### Feature Contributors\n\n- **@renatomen** for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584)\n- **@antonio** for implementing nested tag slash preservation and providing the fix\n- **@elijahmanor** for fixing the browser extension repository URL\n- **@sergenaras** for implementing time display based on timeEstimate property in task statistics\n- **@hamlim** for implementing save button disable logic to prevent duplicate task creation\n\n### Issue Reporters and Feature Requesters\n\n- **@backyardbiomech** for the detailed overdue recurring tasks report (#557)\n- **@prayidae** for the detailed task dependencies feature request (#701)\n- **@jhedlund** for requesting task context menu in notes (#576)\n- **@anareaty** for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494)\n- **@mdbraber** for reporting missing status sorting option (#633)\n- **@strazto** for requesting hashtags template variable (#612)\n- **@Mara-Li** for requesting currentNoteTitle template variable (#637)\n- **@dsebastien** for requesting archive folder template support (#677)\n- **@nsstrickland** for the detailed project variable bug report (#490)\n- **@realJohnDoe** for reporting ICS all-day event duplication (#695)\n- **@Ruboks-Cube** for reporting short duration task rendering issues (#718)\n- **@same774** for reporting multi-day task creation issues (#564)\n- **@mikesale** for reporting kanban column loss (#689)\n- **@camara-tech-pro** for the kanban grouping question (#679)\n- **@phortx** for reporting column order changes (#710)\n- **@nightroman** for the detailed HTTP API title sanitization report (#635)\n- **@RobbK17** for reporting property identification tag issue (#570)\n- **@jordandrako** for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568)\n- **@aubreyz** for reporting project autosuggest truncation issue (#705)\n- **@ras0q** for requesting code formatting improvements (#717)\n- **@stephen-netu** for the detailed webhook transform script loading report (#719)\n","aliases":["/releases/3.24.0/","/releases/3.24.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"agenda-view-overdue-section","text":"Agenda View Overdue Section"},{"level":3,"id":"task-dependencies-and-blocking-relationships","text":"Task Dependencies and Blocking Relationships"},{"level":3,"id":"task-card-widget-in-notes","text":"Task Card Widget in Notes"},{"level":3,"id":"hierarchical-subgrouping","text":"Hierarchical Subgrouping"},{"level":3,"id":"internationalization-support","text":"Internationalization Support"},{"level":3,"id":"template-variables","text":"Template Variables"},{"level":3,"id":"project-and-subtask-management","text":"Project and Subtask Management"},{"level":3,"id":"view-and-grouping-enhancements","text":"View and Grouping Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-and-advanced-calendar","text":"Calendar and Advanced Calendar"},{"level":3,"id":"kanban-view","text":"Kanban View"},{"level":3,"id":"task-management","text":"Task Management"},{"level":3,"id":"hierarchical-tag-support","text":"Hierarchical Tag Support"},{"level":3,"id":"natural-language-processing-and-tags","text":"Natural Language Processing and Tags"},{"level":3,"id":"settings-and-configuration","text":"Settings and Configuration"},{"level":3,"id":"code-quality-and-development","text":"Code Quality and Development"},{"level":2,"id":"enhancements","text":"Enhancements"},{"level":3,"id":"performance-and-reliability","text":"Performance and Reliability"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"settings-organization","text":"Settings Organization"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"contributors","text":"Contributors"},{"level":3,"id":"feature-contributors","text":"Feature Contributors"},{"level":3,"id":"issue-reporters-and-feature-requesters","text":"Issue Reporters and Feature Requesters"}],"html":"

New Features#

\n

Agenda View Overdue Section#

\n
    \n
  • Added separate "Overdue" section in Agenda view instead of mixing overdue tasks with today's tasks (#557, thanks to @backyardbiomech for the detailed report)
  • \n
  • Collapsible section with task completion statistics and proper internationalization support
  • \n
  • Includes overdue recurring tasks based on their scheduled dates
  • \n
\n

Task Dependencies and Blocking Relationships#

\n
    \n
  • Implemented blocking/blocked task dependencies with persistent relationships (#701, thanks to @prayidae for the detailed feature request)
  • \n
  • Tasks can be marked as blocking other tasks or blocked by other tasks
  • \n
  • Dependency relationships persist in frontmatter as structural links
  • \n
  • Dynamic blocked state computed based on blocking task completion status
  • \n
\n

Task Card Widget in Notes#

\n
    \n
  • Added configurable task card widget displaying at the top of task notes (#576, thanks to @jhedlund for the request)
  • \n
  • Provides immediate access to task actions and context menus without requiring command palette
  • \n
  • Uses CodeMirror widget system for integration
  • \n
  • Appears above project subtasks widget when both enabled
  • \n
  • Can be disabled via settings
  • \n
\n

Hierarchical Subgrouping#

\n
    \n
  • Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution)
  • \n
  • Allows two-level task organization (e.g., Group by Status, Subgroup by Priority)
  • \n
  • Cross-view support with consistent behavior
  • \n
  • State persistence for expand/collapse preferences
  • \n
  • Custom user fields supported as subgroup options
  • \n
\n

Internationalization Support#

\n
    \n
  • Added i18n framework with multi-language support
  • \n
  • Support for German, Spanish, French, Russian, Chinese, and Japanese
  • \n
  • Translation coverage for command palette entries and UI strings
  • \n
  • Localized agenda and filter interface elements
  • \n
\n

Template Variables#

\n
    \n
  • Added {{hashtags}} template variable for space-separated hashtag rendering (#612, thanks to @strazto for the suggestion)
  • \n
  • Added {{currentNoteTitle}} template variable for note-specific folder organization (#637, thanks to @Mara-Li for the request)
  • \n
  • Added template variable support for archive folder paths (#677, thanks to @dsebastien for the request)
  • \n
  • Fixed {{project}} variables to properly extract basenames from wikilinks (#490, thanks to @nsstrickland for the detailed bug report)
  • \n
\n

Project and Subtask Management#

\n
    \n
  • Enhanced task modals with project and subtask management capabilities
  • \n
  • Added "Add to project" and "Add subtasks" sections in task creation/edit modals
  • \n
  • Context menu options for assigning tasks to projects and adding subtasks
  • \n
  • Collapsible lists with visual separators between form sections
  • \n
\n

View and Grouping Enhancements#

\n
    \n
  • Added "Completed Date" as grouping option for analyzing productivity (#430, thanks to @anareaty for the suggestion)
  • \n
  • Added "Status" as sorting option in Kanban and Task List views (#633, thanks to @mdbraber for the report)
  • \n
  • Implemented per-grouping column persistence for Kanban views
  • \n
  • Smart default ordering respecting StatusManager and PriorityManager configurations
  • \n
\n

Bug Fixes#

\n

Calendar and Advanced Calendar#

\n
    \n
  • Fixed calendar not refreshing when task duration or time tracking changes
  • \n
  • Fixed calendar not refreshing after task archive or move operations
  • \n
  • Fixed agenda duplication for all-day ICS events (#695, thanks to @realJohnDoe for the report)
  • \n
  • Added configurable eventMinHeight for Advanced Calendar to make short duration tasks readable (#718, thanks to @Ruboks-Cube for the detailed report)
  • \n
  • Fixed multi-day task creation in month/year view to properly calculate time estimates (#564, thanks to @same774 for the report)
  • \n
\n

Kanban View#

\n
    \n
  • Fixed kanban view losing columns after upgrades (#689, thanks to @mikesale for the report)
  • \n
  • Fixed clearing filters defaulting to "none" instead of "status" grouping (#679, thanks to @camara-tech-pro for the question)
  • \n
  • Fixed column order changes when switching between views (#710, thanks to @phortx for the report)
  • \n
  • Fixed kanban drag-and-drop for custom field grouping (#494, thanks to @anareaty for the report)
  • \n
  • Enhanced save view modal functionality with improved styling and accessibility
  • \n
\n

Task Management#

\n
    \n
  • Fixed HTTP API task creation to return sanitized title matching stored content (#635, thanks to @nightroman for the detailed report)
  • \n
  • Fixed #task tag being incorrectly added when using property-based task identification (#570, thanks to @RobbK17 for the report)
  • \n
  • Fixed recurring task completion styling in Bases views (#669, thanks to @jordandrako for the report)
  • \n
\n

Hierarchical Tag Support#

\n
    \n
  • Added hierarchical tag support with exclusion patterns for Obsidian nested tags (#584, thanks to @renatomen for the detailed feature request)
  • \n
  • Hierarchical matching allows searching for parent tags to match child tags (e.g., t/ef matches t/ef/project, t/ef/task)
  • \n
  • Exclusion patterns support using - prefix to exclude specific tags and their children
  • \n
  • Maintains backward compatibility with existing substring matching
  • \n
\n

Natural Language Processing and Tags#

\n
    \n
  • Fixed nested tags losing slashes in agenda view rendering (#712, thanks to @antonio for the report and fix)
  • \n
  • Added support for hyphens in NLP tag parsing (#568, thanks to @jordandrako for the report)
  • \n
\n

Settings and Configuration#

\n
    \n
  • Fixed property value truncation in project autosuggest settings by adding input debouncing (#705, thanks to @aubreyz for the report)
  • \n
  • Improved webhook transform error handling with detailed logging (#719, thanks to @stephen-netu for the detailed report)
  • \n
  • Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation)
  • \n
\n

Code Quality and Development#

\n
    \n
  • Configured Prettier formatter for consistent code formatting (#717, thanks to @ras0q for the request)
  • \n
  • Applied ESLint fixes reducing problems from 209 to 97
  • \n
  • Added format and format:check scripts for development workflow
  • \n
  • Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction)
  • \n
\n

Enhancements#

\n

Performance and Reliability#

\n
    \n
  • Added debouncing to project autosuggest property inputs
  • \n
  • Improved error handling for webhook transform failures
  • \n
\n

User Interface#

\n
    \n
  • Added time display based on timeEstimate property in task statistics (thanks to Sergen Aras for the implementation)
  • \n
  • Enhanced language selection display with native scripts
  • \n
\n

Settings Organization#

\n
    \n
  • Reorganized settings with improved categorization
  • \n
  • Added collapsible functionality to various UI sections
  • \n
  • Enhanced accessibility with proper button labeling
  • \n
\n

Documentation#

\n
    \n
  • Added documentation for task dependencies feature
  • \n
  • Updated comprehensive subgrouping feature documentation
  • \n
  • Enhanced template variable documentation
  • \n
  • Updated various view documentation for new features
  • \n
\n

Contributors#

\n

Special thanks to all this release's contributors:

\n

Feature Contributors#

\n
    \n
  • @renatomen for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584)
  • \n
  • @antonio for implementing nested tag slash preservation and providing the fix
  • \n
  • @elijahmanor for fixing the browser extension repository URL
  • \n
  • @sergenaras for implementing time display based on timeEstimate property in task statistics
  • \n
  • @hamlim for implementing save button disable logic to prevent duplicate task creation
  • \n
\n

Issue Reporters and Feature Requesters#

\n
    \n
  • @backyardbiomech for the detailed overdue recurring tasks report (#557)
  • \n
  • @prayidae for the detailed task dependencies feature request (#701)
  • \n
  • @jhedlund for requesting task context menu in notes (#576)
  • \n
  • @anareaty for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494)
  • \n
  • @mdbraber for reporting missing status sorting option (#633)
  • \n
  • @strazto for requesting hashtags template variable (#612)
  • \n
  • @Mara-Li for requesting currentNoteTitle template variable (#637)
  • \n
  • @dsebastien for requesting archive folder template support (#677)
  • \n
  • @nsstrickland for the detailed project variable bug report (#490)
  • \n
  • @realJohnDoe for reporting ICS all-day event duplication (#695)
  • \n
  • @Ruboks-Cube for reporting short duration task rendering issues (#718)
  • \n
  • @same774 for reporting multi-day task creation issues (#564)
  • \n
  • @mikesale for reporting kanban column loss (#689)
  • \n
  • @camara-tech-pro for the kanban grouping question (#679)
  • \n
  • @phortx for reporting column order changes (#710)
  • \n
  • @nightroman for the detailed HTTP API title sanitization report (#635)
  • \n
  • @RobbK17 for reporting property identification tag issue (#570)
  • \n
  • @jordandrako for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568)
  • \n
  • @aubreyz for reporting project autosuggest truncation issue (#705)
  • \n
  • @ras0q for requesting code formatting improvements (#717)
  • \n
  • @stephen-netu for the detailed webhook transform script loading report (#719)
  • \n
\n","text":"New Features# Agenda View Overdue Section# Added separate \"Overdue\" section in Agenda view instead of mixing overdue tasks with today's tasks (#557, thanks to @backyardbiomech for the detailed report) Collapsible section with task completion statistics and proper internationalization support Includes overdue recurring tasks based on their scheduled dates Task Dependencies and Blocking Relationships# Implemented blocking/blocked task dependencies with persistent relationships (#701, thanks to @prayidae for the detailed feature request) Tasks can be marked as blocking other tasks or blocked by other tasks Dependency relationships persist in frontmatter as structural links Dynamic blocked state computed based on blocking task completion status Task Card Widget in Notes# Added configurable task card widget displaying at the top of task notes (#576, thanks to @jhedlund for the request) Provides immediate access to task actions and context menus without requiring command palette Uses CodeMirror widget system for integration Appears above project subtasks widget when both enabled Can be disabled via settings Hierarchical Subgrouping# Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution) Allows two-level task organization (e.g., Group by Status, Subgroup by Priority) Cross-view support with consistent behavior State persistence for expand/collapse preferences Custom user fields supported as subgroup options Internationalization Support# Added i18n framework with multi-language support Support for German, Spanish, French, Russian, Chinese, and Japanese Translation coverage for command palette entries and UI strings Localized agenda and filter interface elements Template Variables# Added {{hashtags}} template variable for space-separated hashtag rendering (#612, thanks to @strazto for the suggestion) Added {{currentNoteTitle}} template variable for note-specific folder organization (#637, thanks to @Mara-Li for the request) Added template variable support for archive folder paths (#677, thanks to @dsebastien for the request) Fixed {{project}} variables to properly extract basenames from wikilinks (#490, thanks to @nsstrickland for the detailed bug report) Project and Subtask Management# Enhanced task modals with project and subtask management capabilities Added \"Add to project\" and \"Add subtasks\" sections in task creation/edit modals Context menu options for assigning tasks to projects and adding subtasks Collapsible lists with visual separators between form sections View and Grouping Enhancements# Added \"Completed Date\" as grouping option for analyzing productivity (#430, thanks to @anareaty for the suggestion) Added \"Status\" as sorting option in Kanban and Task List views (#633, thanks to @mdbraber for the report) Implemented per-grouping column persistence for Kanban views Smart default ordering respecting StatusManager and PriorityManager configurations Bug Fixes# Calendar and Advanced Calendar# Fixed calendar not refreshing when task duration or time tracking changes Fixed calendar not refreshing after task archive or move operations Fixed agenda duplication for all-day ICS events (#695, thanks to @realJohnDoe for the report) Added configurable eventMinHeight for Advanced Calendar to make short duration tasks readable (#718, thanks to @Ruboks-Cube for the detailed report) Fixed multi-day task creation in month/year view to properly calculate time estimates (#564, thanks to @same774 for the report) Kanban View# Fixed kanban view losing columns after upgrades (#689, thanks to @mikesale for the report) Fixed clearing filters defaulting to \"none\" instead of \"status\" grouping (#679, thanks to @camara-tech-pro for the question) Fixed column order changes when switching between views (#710, thanks to @phortx for the report) Fixed kanban drag-and-drop for custom field grouping (#494, thanks to @anareaty for the report) Enhanced save view modal functionality with improved styling and accessibility Task Management# Fixed HTTP API task creation to return sanitized title matching stored content (#635, thanks to @nightroman for the detailed report) Fixed #task tag being incorrectly added when using property-based task identification (#570, thanks to @RobbK17 for the report) Fixed recurring task completion styling in Bases views (#669, thanks to @jordandrako for the report) Hierarchical Tag Support# Added hierarchical tag support with exclusion patterns for Obsidian nested tags (#584, thanks to @renatomen for the detailed feature request) Hierarchical matching allows searching for parent tags to match child tags (e.g., t/ef matches t/ef/project, t/ef/task) Exclusion patterns support using - prefix to exclude specific tags and their children Maintains backward compatibility with existing substring matching Natural Language Processing and Tags# Fixed nested tags losing slashes in agenda view rendering (#712, thanks to @antonio for the report and fix) Added support for hyphens in NLP tag parsing (#568, thanks to @jordandrako for the report) Settings and Configuration# Fixed property value truncation in project autosuggest settings by adding input debouncing (#705, thanks to @aubreyz for the report) Improved webhook transform error handling with detailed logging (#719, thanks to @stephen-netu for the detailed report) Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation) Code Quality and Development# Configured Prettier formatter for consistent code formatting (#717, thanks to @ras0q for the request) Applied ESLint fixes reducing problems from 209 to 97 Added format and format:check scripts for development workflow Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction) Enhancements# Performance and Reliability# Added debouncing to project autosuggest property inputs Improved error handling for webhook transform failures User Interface# Added time display based on timeEstimate property in task statistics (thanks to Sergen Aras for the implementation) Enhanced language selection display with native scripts Settings Organization# Reorganized settings with improved categorization Added collapsible functionality to various UI sections Enhanced accessibility with proper button labeling Documentation# Added documentation for task dependencies feature Updated comprehensive subgrouping feature documentation Enhanced template variable documentation Updated various view documentation for new features Contributors# Special thanks to all this release's contributors: Feature Contributors# @renatomen for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584) @antonio for implementing nested tag slash preservation and providing the fix @elijahmanor for fixing the browser extension repository URL @sergenaras for implementing time display based on timeEstimate property in task statistics @hamlim for implementing save button disable logic to prevent duplicate task creation Issue Reporters and Feature Requesters# @backyardbiomech for the detailed overdue recurring tasks report (#557) @prayidae for the detailed task dependencies feature request (#701) @jhedlund for requesting task context menu in notes (#576) @anareaty for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494) @mdbraber for reporting missing status sorting option (#633) @strazto for requesting hashtags template variable (#612) @Mara-Li for requesting currentNoteTitle template variable (#637) @dsebastien for requesting archive folder template support (#677) @nsstrickland for the detailed project variable bug report (#490) @realJohnDoe for reporting ICS all-day event duplication (#695) @Ruboks-Cube for reporting short duration task rendering issues (#718) @same774 for reporting multi-day task creation issues (#564) @mikesale for reporting kanban column loss (#689) @camara-tech-pro for the kanban grouping question (#679) @phortx for reporting column order changes (#710) @nightroman for the detailed HTTP API title sanitization report (#635) @RobbK17 for reporting property identification tag issue (#570) @jordandrako for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568) @aubreyz for reporting project autosuggest truncation issue (#705) @ras0q for requesting code formatting improvements (#717) @stephen-netu for the detailed webhook transform script loading report (#719)"},{"route":"/obsidian/releases/3.24.1/","title":"TaskNotes 3.24.1","description":"This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.1.md","namespace":"obsidian","relativePath":"releases/3.24.1.md","raw":"# TaskNotes 3.24.1\n\n## Bug Fixes\n\n### Task Card Widget\n\n- Fixed task card widget appearing on all notes instead of only task notes\n- Widget now properly respects task identification settings (tag or property-based)\n\nThis patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.","aliases":["/releases/3.24.1/","/releases/3.24.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-card-widget","text":"Task Card Widget"}],"html":"

Bug Fixes#

\n

Task Card Widget#

\n
    \n
  • Fixed task card widget appearing on all notes instead of only task notes
  • \n
  • Widget now properly respects task identification settings (tag or property-based)
  • \n
\n

This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.

\n","text":"Bug Fixes# Task Card Widget# Fixed task card widget appearing on all notes instead of only task notes Widget now properly respects task identification settings (tag or property-based) This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes."},{"route":"/obsidian/releases/3.24.2/","title":"TaskNotes 3.24.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.2.md","namespace":"obsidian","relativePath":"releases/3.24.2.md","raw":"# TaskNotes 3.24.2 \n\n## Fixed\n\n- (#766) Fixed tag parsing incorrectly identifying notes with tags containing \"task\" (like \"pkm-task\") as task notes\n - Added exact hierarchical tag matching for task identification to prevent false positives\n - Preserved substring matching behavior for filter bar searches where it's desired\n - Only exact matches or hierarchical children (like \"task/work\") now identify notes as tasks\n - Thanks to @anareaty and @fastrick for reporting this issue\n- (#767) Fixed subgroups not rendering under the \"Overdue\" agenda group\n - Thanks to @renatomen for reporting this issue\n- (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values\n - Added time validation in settings UI with proper error messages and debouncing\n - Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00)\n - Prevents \"Cannot read properties of null (reading 'years')\" error from FullCalendar\n - Thanks to @kmaustral for reporting\n- (#769) Fixed NLP processor incorrectly assigning hardcoded \"waiting\" status when \"blocked\" appears in task titles\n - NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns\n - Prevents unexpected status assignments for users with custom status workflows\n - Fallback patterns still work when no custom status configurations are defined\n - Thanks to @renatomen for reporting this issue\n","aliases":["/releases/3.24.2/","/releases/3.24.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#766) Fixed tag parsing incorrectly identifying notes with tags containing "task" (like "pkm-task") as task notes
      \n
    • Added exact hierarchical tag matching for task identification to prevent false positives
    • \n
    • Preserved substring matching behavior for filter bar searches where it's desired
    • \n
    • Only exact matches or hierarchical children (like "task/work") now identify notes as tasks
    • \n
    • Thanks to @anareaty and @fastrick for reporting this issue
    • \n
    \n
  • \n
  • (#767) Fixed subgroups not rendering under the "Overdue" agenda group
      \n
    • Thanks to @renatomen for reporting this issue
    • \n
    \n
  • \n
  • (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values
      \n
    • Added time validation in settings UI with proper error messages and debouncing
    • \n
    • Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00)
    • \n
    • Prevents "Cannot read properties of null (reading 'years')" error from FullCalendar
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#769) Fixed NLP processor incorrectly assigning hardcoded "waiting" status when "blocked" appears in task titles
      \n
    • NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns
    • \n
    • Prevents unexpected status assignments for users with custom status workflows
    • \n
    • Fallback patterns still work when no custom status configurations are defined
    • \n
    • Thanks to @renatomen for reporting this issue
    • \n
    \n
  • \n
\n","text":"Fixed# (#766) Fixed tag parsing incorrectly identifying notes with tags containing \"task\" (like \"pkm-task\") as task notes Added exact hierarchical tag matching for task identification to prevent false positives Preserved substring matching behavior for filter bar searches where it's desired Only exact matches or hierarchical children (like \"task/work\") now identify notes as tasks Thanks to @anareaty and @fastrick for reporting this issue (#767) Fixed subgroups not rendering under the \"Overdue\" agenda group Thanks to @renatomen for reporting this issue (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values Added time validation in settings UI with proper error messages and debouncing Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00) Prevents \"Cannot read properties of null (reading 'years')\" error from FullCalendar Thanks to @kmaustral for reporting (#769) Fixed NLP processor incorrectly assigning hardcoded \"waiting\" status when \"blocked\" appears in task titles NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns Prevents unexpected status assignments for users with custom status workflows Fallback patterns still work when no custom status configurations are defined Thanks to @renatomen for reporting this issue"},{"route":"/obsidian/releases/3.24.3/","title":"TaskNotes 3.24.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.3.md","namespace":"obsidian","relativePath":"releases/3.24.3.md","raw":"# TaskNotes 3.24.3\n\n- (#776) Fixed screens failing to load with \"toLowerCase is not a function\" error\n - Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.)\n - Added type validation to filter out non-string values before processing tags\n - Valid string tags continue to work normally while invalid types are safely skipped\n - Thanks to @kmf and @Andre-Ioda for help debugging this issue\n","aliases":["/releases/3.24.3/","/releases/3.24.3/"],"toc":[],"html":"
    \n
  • (#776) Fixed screens failing to load with "toLowerCase is not a function" error
      \n
    • Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.)
    • \n
    • Added type validation to filter out non-string values before processing tags
    • \n
    • Valid string tags continue to work normally while invalid types are safely skipped
    • \n
    • Thanks to @kmf and @Andre-Ioda for help debugging this issue
    • \n
    \n
  • \n
\n","text":"(#776) Fixed screens failing to load with \"toLowerCase is not a function\" error Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.) Added type validation to filter out non-string values before processing tags Valid string tags continue to work normally while invalid types are safely skipped Thanks to @kmf and @Andre-Ioda for help debugging this issue"},{"route":"/obsidian/releases/3.24.4/","title":"TaskNotes 3.24.4","description":"(#768) Fixed calendar view crashes when tasks contain null values in grouping fields","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.4.md","namespace":"obsidian","relativePath":"releases/3.24.4.md","raw":"# TaskNotes 3.24.4\n\n## Fixed\n\n- (#768) Fixed calendar view crashes when tasks contain null values in grouping fields\n - Added null/undefined checks in sort comparisons to prevent localeCompare errors\n - Calendar now handles null values in tags, contexts, and custom fields gracefully\n - Thanks to @kmaustral for reporting\n\n- (#601) Fixed Unicode characters not displaying in tags and contexts\n - Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts\n - Affects Agenda View, Task List View, and all other views displaying tags\n - Thanks to @Kapinekas for reporting\n\n- (#778) Fixed cursor artifacts in CodeMirror widgets\n - Thanks to @jhedlund for the fix\n\n- Fixed task card widgets in note editor not updating for archive and time tracking changes\n - Task card widgets now properly detect when tasks are archived/unarchived\n - Task card widgets now properly detect when time tracking starts/stops\n - Blue \"tracking\" border now appears/disappears correctly in live preview\n - Archive styling now updates correctly in live preview\n\n## Changed\n\n- (#751) Status bar tracked task click behavior now opens task notes directly\n - Single tracked task: opens the task note immediately\n - Multiple tracked tasks: shows selector modal to choose which task note to open\n - Provides faster access to tracked tasks compared to previous task list view\n\n- (#727) \"Create New Inline Task\" command now respects the \"Include Current Note in Project\" setting\n - When enabled, the current note is automatically added as a project to inline tasks\n - Provides consistency with instant convert functionality\n - Thanks to @chrisfeagles for the suggestion\n\n- Improved link handling throughout the plugin using Obsidian's native APIs\n - Replaced manual wikilink generation with `FileManager.generateMarkdownLink()`\n - Now respects user's link format settings (wikilink vs markdown, relative paths)\n - Replaced manual link parsing with `parseLinktext()` for proper alias handling\n - Better compatibility with future Obsidian updates\n - Added centralized link utilities in `linkUtils.ts`\n\n- Refactored widget cursor styles into reusable utility class\n - Consolidated shared CSS into .cm-widget-cursor-fix utility\n - Improved maintainability across widget components\n\n","aliases":["/releases/3.24.4/","/releases/3.24.4/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#768) Fixed calendar view crashes when tasks contain null values in grouping fields

    \n
      \n
    • Added null/undefined checks in sort comparisons to prevent localeCompare errors
    • \n
    • Calendar now handles null values in tags, contexts, and custom fields gracefully
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#601) Fixed Unicode characters not displaying in tags and contexts

    \n
      \n
    • Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts
    • \n
    • Affects Agenda View, Task List View, and all other views displaying tags
    • \n
    • Thanks to @Kapinekas for reporting
    • \n
    \n
  • \n
  • (#778) Fixed cursor artifacts in CodeMirror widgets

    \n
      \n
    • Thanks to @jhedlund for the fix
    • \n
    \n
  • \n
  • Fixed task card widgets in note editor not updating for archive and time tracking changes

    \n
      \n
    • Task card widgets now properly detect when tasks are archived/unarchived
    • \n
    • Task card widgets now properly detect when time tracking starts/stops
    • \n
    • Blue "tracking" border now appears/disappears correctly in live preview
    • \n
    • Archive styling now updates correctly in live preview
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • (#751) Status bar tracked task click behavior now opens task notes directly

    \n
      \n
    • Single tracked task: opens the task note immediately
    • \n
    • Multiple tracked tasks: shows selector modal to choose which task note to open
    • \n
    • Provides faster access to tracked tasks compared to previous task list view
    • \n
    \n
  • \n
  • (#727) "Create New Inline Task" command now respects the "Include Current Note in Project" setting

    \n
      \n
    • When enabled, the current note is automatically added as a project to inline tasks
    • \n
    • Provides consistency with instant convert functionality
    • \n
    • Thanks to @chrisfeagles for the suggestion
    • \n
    \n
  • \n
  • Improved link handling throughout the plugin using Obsidian's native APIs

    \n
      \n
    • Replaced manual wikilink generation with FileManager.generateMarkdownLink()
    • \n
    • Now respects user's link format settings (wikilink vs markdown, relative paths)
    • \n
    • Replaced manual link parsing with parseLinktext() for proper alias handling
    • \n
    • Better compatibility with future Obsidian updates
    • \n
    • Added centralized link utilities in linkUtils.ts
    • \n
    \n
  • \n
  • Refactored widget cursor styles into reusable utility class

    \n
      \n
    • Consolidated shared CSS into .cm-widget-cursor-fix utility
    • \n
    • Improved maintainability across widget components
    • \n
    \n
  • \n
\n","text":"Fixed# (#768) Fixed calendar view crashes when tasks contain null values in grouping fields Added null/undefined checks in sort comparisons to prevent localeCompare errors Calendar now handles null values in tags, contexts, and custom fields gracefully Thanks to @kmaustral for reporting (#601) Fixed Unicode characters not displaying in tags and contexts Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts Affects Agenda View, Task List View, and all other views displaying tags Thanks to @Kapinekas for reporting (#778) Fixed cursor artifacts in CodeMirror widgets Thanks to @jhedlund for the fix Fixed task card widgets in note editor not updating for archive and time tracking changes Task card widgets now properly detect when tasks are archived/unarchived Task card widgets now properly detect when time tracking starts/stops Blue \"tracking\" border now appears/disappears correctly in live preview Archive styling now updates correctly in live preview Changed# (#751) Status bar tracked task click behavior now opens task notes directly Single tracked task: opens the task note immediately Multiple tracked tasks: shows selector modal to choose which task note to open Provides faster access to tracked tasks compared to previous task list view (#727) \"Create New Inline Task\" command now respects the \"Include Current Note in Project\" setting When enabled, the current note is automatically added as a project to inline tasks Provides consistency with instant convert functionality Thanks to @chrisfeagles for the suggestion Improved link handling throughout the plugin using Obsidian's native APIs Replaced manual wikilink generation with FileManager.generateMarkdownLink() Now respects user's link format settings (wikilink vs markdown, relative paths) Replaced manual link parsing with parseLinktext() for proper alias handling Better compatibility with future Obsidian updates Added centralized link utilities in linkUtils.ts Refactored widget cursor styles into reusable utility class Consolidated shared CSS into .cm-widget-cursor-fix utility Improved maintainability across widget components"},{"route":"/obsidian/releases/3.24.5/","title":"TaskNotes 3.24.5","description":"(#806) Fixed Bases views crashing on Obsidian 1.10.0 startup","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.5.md","namespace":"obsidian","relativePath":"releases/3.24.5.md","raw":"# TaskNotes 3.24.5\n\n## Fixed\n\n- (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup\n - TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup\n - Added defensive checks in `setEphemeralState` to handle early lifecycle calls\n - Added `focus()` method to view objects for proper restoration\n - Made root elements focusable to support Obsidian 1.10.0 view lifecycle\n\n- (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter\n - Added support for markdown link format `[text](path)` in projects and blockedBy fields\n - Handles URL-encoded paths like `[Car Maintenance](../../projects/Car%20Maintenance.md)`\n - Markdown links now render as clickable links showing display text instead of raw `[text](path)` format\n - Links are properly resolved for grouping, filtering, and project-task associations\n - Previously only wikilink format `[[path]]` was supported\n - Prevents automatic removal of project assignments when editing tasks\n - Thanks to @minchinweb for reporting\n\n- (#780) Fixed \"Cannot Create Timeblocks\" error when daily notes folder doesn't exist\n - Added proper error handling when `createDailyNote` fails due to missing folder\n - Improved error messages to guide users to check Daily Notes plugin configuration\n - Prevents uncaught errors from `obsidian-daily-notes-interface` package\n - Thanks to @uberunix for reporting\n\n","aliases":["/releases/3.24.5/","/releases/3.24.5/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup

    \n
      \n
    • TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup
    • \n
    • Added defensive checks in setEphemeralState to handle early lifecycle calls
    • \n
    • Added focus() method to view objects for proper restoration
    • \n
    • Made root elements focusable to support Obsidian 1.10.0 view lifecycle
    • \n
    \n
  • \n
  • (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter

    \n
      \n
    • Added support for markdown link format [text](path) in projects and blockedBy fields
    • \n
    • Handles URL-encoded paths like [Car Maintenance](../../projects/Car%20Maintenance.md)
    • \n
    • Markdown links now render as clickable links showing display text instead of raw [text](path) format
    • \n
    • Links are properly resolved for grouping, filtering, and project-task associations
    • \n
    • Previously only wikilink format [[path]] was supported
    • \n
    • Prevents automatic removal of project assignments when editing tasks
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#780) Fixed "Cannot Create Timeblocks" error when daily notes folder doesn't exist

    \n
      \n
    • Added proper error handling when createDailyNote fails due to missing folder
    • \n
    • Improved error messages to guide users to check Daily Notes plugin configuration
    • \n
    • Prevents uncaught errors from obsidian-daily-notes-interface package
    • \n
    • Thanks to @uberunix for reporting
    • \n
    \n
  • \n
\n","text":"Fixed# (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter Added support for markdown link format [text](path) in projects and blockedBy fields Handles URL-encoded paths like [Car Maintenance](../../projects/Car%20Maintenance.md) Markdown links now render as clickable links showing display text instead of raw [text](path) format Links are properly resolved for grouping, filtering, and project-task associations Previously only wikilink format [[path]] was supported Prevents automatic removal of project assignments when editing tasks Thanks to @minchinweb for reporting (#780) Fixed \"Cannot Create Timeblocks\" error when daily notes folder doesn't exist Added proper error handling when createDailyNote fails due to missing folder Improved error messages to guide users to check Daily Notes plugin configuration Prevents uncaught errors from obsidian-daily-notes-interface package Thanks to @uberunix for reporting"},{"route":"/obsidian/releases/3.24.6/","title":"TaskNotes 3.24.6","description":"(#440) Fixed inline task replacement not working for links with relative paths","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.6.md","namespace":"obsidian","relativePath":"releases/3.24.6.md","raw":"# TaskNotes 3.24.6\n\n## Added\n\n- Added release notes viewer\n - New view displays release notes in a dedicated tab when plugin updates\n - Automatically opens after updating to a new version\n - Access anytime via command palette \"TaskNotes: View release notes\" or Settings > General\n - Release notes are rendered using native Obsidian markdown rendering\n - Includes link to view all releases on GitHub\n - Fully internationalized with i18n support\n - Auto-generation system ensures correct version is loaded without manual updates\n\n## Fixed\n\n- (#440) Fixed inline task replacement not working for links with relative paths\n - Markdown links with relative paths like `[task](../../../GTD/tasks/task.md)` now display inline previews\n - Wikilinks with relative paths now work correctly\n - Removed overly aggressive path sanitization that was stripping `..` from all link paths\n - Works in both Live Preview and Reading Mode\n - Thanks to @minchinweb for reporting\n\n- (#814) Fixed markdown links in projects field not being recognized on Project notes\n - Tasks with markdown-style project links `[text](path)` now appear in project's Subtasks section\n - Updated project link detection to use `parseLinkToPath` utility which handles both wikilinks and markdown links\n - Handles URL-encoded paths like `[z Test Project](z%20Test%20Project.md)`\n - Thanks to @minchinweb for reporting\n\n- (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings\n - Project links in frontmatter are now always generated as wikilinks `[[link]]` by default for Obsidian compatibility\n - Obsidian does not support markdown links in frontmatter properties without third-party plugins\n - Added optional setting to enable markdown links in frontmatter for users with `obsidian-frontmatter-markdown-links` plugin\n - Setting only appears when user has markdown links enabled globally in Obsidian\n - Thanks to @nightroman for reporting\n","aliases":["/releases/3.24.6/","/releases/3.24.6/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added release notes viewer
      \n
    • New view displays release notes in a dedicated tab when plugin updates
    • \n
    • Automatically opens after updating to a new version
    • \n
    • Access anytime via command palette "TaskNotes: View release notes" or Settings > General
    • \n
    • Release notes are rendered using native Obsidian markdown rendering
    • \n
    • Includes link to view all releases on GitHub
    • \n
    • Fully internationalized with i18n support
    • \n
    • Auto-generation system ensures correct version is loaded without manual updates
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#440) Fixed inline task replacement not working for links with relative paths

    \n
      \n
    • Markdown links with relative paths like [task](../../../GTD/tasks/task.md) now display inline previews
    • \n
    • Wikilinks with relative paths now work correctly
    • \n
    • Removed overly aggressive path sanitization that was stripping .. from all link paths
    • \n
    • Works in both Live Preview and Reading Mode
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#814) Fixed markdown links in projects field not being recognized on Project notes

    \n
      \n
    • Tasks with markdown-style project links [text](path) now appear in project's Subtasks section
    • \n
    • Updated project link detection to use parseLinkToPath utility which handles both wikilinks and markdown links
    • \n
    • Handles URL-encoded paths like [z Test Project](z%20Test%20Project.md)
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings

    \n
      \n
    • Project links in frontmatter are now always generated as wikilinks [[link]] by default for Obsidian compatibility
    • \n
    • Obsidian does not support markdown links in frontmatter properties without third-party plugins
    • \n
    • Added optional setting to enable markdown links in frontmatter for users with obsidian-frontmatter-markdown-links plugin
    • \n
    • Setting only appears when user has markdown links enabled globally in Obsidian
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
\n","text":"Added# Added release notes viewer New view displays release notes in a dedicated tab when plugin updates Automatically opens after updating to a new version Access anytime via command palette \"TaskNotes: View release notes\" or Settings > General Release notes are rendered using native Obsidian markdown rendering Includes link to view all releases on GitHub Fully internationalized with i18n support Auto-generation system ensures correct version is loaded without manual updates Fixed# (#440) Fixed inline task replacement not working for links with relative paths Markdown links with relative paths like [task](../../../GTD/tasks/task.md) now display inline previews Wikilinks with relative paths now work correctly Removed overly aggressive path sanitization that was stripping .. from all link paths Works in both Live Preview and Reading Mode Thanks to @minchinweb for reporting (#814) Fixed markdown links in projects field not being recognized on Project notes Tasks with markdown-style project links [text](path) now appear in project's Subtasks section Updated project link detection to use parseLinkToPath utility which handles both wikilinks and markdown links Handles URL-encoded paths like [z Test Project](z%20Test%20Project.md) Thanks to @minchinweb for reporting (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings Project links in frontmatter are now always generated as wikilinks [[link]] by default for Obsidian compatibility Obsidian does not support markdown links in frontmatter properties without third-party plugins Added optional setting to enable markdown links in frontmatter for users with obsidian-frontmatter-markdown-links plugin Setting only appears when user has markdown links enabled globally in Obsidian Thanks to @nightroman for reporting"},{"route":"/obsidian/releases/3.25.0/","title":"TaskNotes 3.25.0","description":"Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.0.md","namespace":"obsidian","relativePath":"releases/3.25.0.md","raw":"# TaskNotes 3.25.0\n\n## Added\n\n- Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)\n - Supports month, week, day, year, and list views\n - Property-based events from note date properties (configurable start date, end date, and title properties)\n - Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events\n - Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height\n - Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based)\n - Date validation to handle invalid property values\n - Drag-and-drop to update property-based event dates in frontmatter\n - Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese)\n\n- Added grouped rendering support for Bases integration list and kanban views\n - List view displays collapsible groups with toggle controls\n - Kanban view renders grouped columns with drag-drop support\n - Automatically detects ungrouped views and renders as flat list\n\n- (#842) Added keyboard navigation support for task forms\n - Action bar icons now focusable with proper tab order and ARIA attributes\n - Enter and Space keys trigger actions on focused elements\n - Added submenu support for reminders button for better keyboard accessibility\n - Improved focus indicators for better visual feedback\n - Thanks to @maybetm for this excellent contribution!\n\n## Changed\n\n- Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions\n\n## Fixed\n\n- (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths\n - Changed debounce to trailing mode to ensure final value is saved instead of partial input\n - Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths\n - Thanks to @sascha224 for reporting\n\n- (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup\n - TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup\n - Added defensive checks in `setEphemeralState` to handle early lifecycle calls\n - Added `focus()` method to view objects for proper restoration\n - Made root elements focusable to support Obsidian 1.10.0 view lifecycle\n\n- (#825) Fixed single/double click settings not applying to calendar views\n - Shared click handling now works consistently across Advanced Calendar and Bases Calendar\n - Ctrl/Cmd+click opens tasks in new tab as expected\n - Single and double-click actions respect user settings\n\n- (#699) Fixed Obsidian freezing when moving calendar tab to new window\n - Skip calendar resize during window transfer to prevent freeze\n - Calendar may display incorrectly after move but can be fixed by switching views\n - Prevents complete UI lockup during tab transfer\n\n- (#816) Fixed template variables not processing in ICS subscription note folder paths\n - Template variables like `{{year}}`, `{{month}}`, `{{date}}` now work in ICS note folder settings\n - Extracted folder template processing into shared utility for consistency\n - Added support for ICS-specific variables: `{{icsEventTitle}}`, `{{icsEventLocation}}`, `{{icsEventDescription}}`\n - Users can now organize ICS notes in date-based hierarchies (e.g., `Daily/{{year}}/{{month}}/`)\n - Thanks to @j-peeters for reporting\n\n- (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views\n - Added 5-minute grace period after cache expiration to keep events visible during refresh\n - Trigger automatic background refresh when cache is stale or missing\n - Initialize ICS service instances early so views can register event listeners before data loads\n - Prevents disappearance during network errors or when calendar opens at Obsidian startup\n - Thanks to @j-peeters for reporting\n\n- (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion\n - Added `timeEstimate` field to `ParsedTaskData` interface\n - Time estimates from natural language parsing now properly transferred to task frontmatter\n - Parsed values now take priority over default settings\n - RRule strings passed directly without conversion (preferred format)\n - Thanks to @Justin-Burg for reporting\n\n- (#826) Fixed task card widget not appearing when Obsidian starts with task note open\n - Deferred dispatch calls to avoid \"EditorView.update not allowed during update\" error\n - Widget now renders correctly on startup without requiring workarounds\n - Thanks to @nightroman for reporting\n\n- (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues\n - Events with non-IANA timezone identifiers (e.g., `TZID=Zurich` without VTIMEZONE) now display at correct local times\n - Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone\n - Replaced unreliable `toJSDate()` conversion with `toUnixTime()` for accurate UTC timestamp handling\n - Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats\n - Thanks to @chrlaney for reporting and @wilf80 for detailed analysis\n\n- (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view\n - Recurring tasks now check both `due` and `scheduled` dates for overdue status\n - Previously only `scheduled` was checked for recurring tasks, causing tasks with overdue `due` dates to be hidden\n - Ensures consistent overdue detection logic between recurring and non-recurring tasks\n - Thanks to @skyrunner15 for reporting\n\n- (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones\n - Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones\n - UTC-anchored dates are now converted to local calendar dates before formatting\n - Fixes off-by-one day error that affected date selection and display\n - Thanks to @kenhsmith for reporting\n\n","aliases":["/releases/3.25.0/","/releases/3.25.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)

    \n
      \n
    • Supports month, week, day, year, and list views
    • \n
    • Property-based events from note date properties (configurable start date, end date, and title properties)
    • \n
    • Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events
    • \n
    • Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height
    • \n
    • Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based)
    • \n
    • Date validation to handle invalid property values
    • \n
    • Drag-and-drop to update property-based event dates in frontmatter
    • \n
    • Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese)
    • \n
    \n
  • \n
  • Added grouped rendering support for Bases integration list and kanban views

    \n
      \n
    • List view displays collapsible groups with toggle controls
    • \n
    • Kanban view renders grouped columns with drag-drop support
    • \n
    • Automatically detects ungrouped views and renders as flat list
    • \n
    \n
  • \n
  • (#842) Added keyboard navigation support for task forms

    \n
      \n
    • Action bar icons now focusable with proper tab order and ARIA attributes
    • \n
    • Enter and Space keys trigger actions on focused elements
    • \n
    • Added submenu support for reminders button for better keyboard accessibility
    • \n
    • Improved focus indicators for better visual feedback
    • \n
    • Thanks to @maybetm for this excellent contribution!
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions
  • \n
\n

Fixed#

\n
    \n
  • (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths

    \n
      \n
    • Changed debounce to trailing mode to ensure final value is saved instead of partial input
    • \n
    • Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths
    • \n
    • Thanks to @sascha224 for reporting
    • \n
    \n
  • \n
  • (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup

    \n
      \n
    • TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup
    • \n
    • Added defensive checks in setEphemeralState to handle early lifecycle calls
    • \n
    • Added focus() method to view objects for proper restoration
    • \n
    • Made root elements focusable to support Obsidian 1.10.0 view lifecycle
    • \n
    \n
  • \n
  • (#825) Fixed single/double click settings not applying to calendar views

    \n
      \n
    • Shared click handling now works consistently across Advanced Calendar and Bases Calendar
    • \n
    • Ctrl/Cmd+click opens tasks in new tab as expected
    • \n
    • Single and double-click actions respect user settings
    • \n
    \n
  • \n
  • (#699) Fixed Obsidian freezing when moving calendar tab to new window

    \n
      \n
    • Skip calendar resize during window transfer to prevent freeze
    • \n
    • Calendar may display incorrectly after move but can be fixed by switching views
    • \n
    • Prevents complete UI lockup during tab transfer
    • \n
    \n
  • \n
  • (#816) Fixed template variables not processing in ICS subscription note folder paths

    \n
      \n
    • Template variables like {{year}}, {{month}}, {{date}} now work in ICS note folder settings
    • \n
    • Extracted folder template processing into shared utility for consistency
    • \n
    • Added support for ICS-specific variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}}
    • \n
    • Users can now organize ICS notes in date-based hierarchies (e.g., Daily/{{year}}/{{month}}/)
    • \n
    • Thanks to @j-peeters for reporting
    • \n
    \n
  • \n
  • (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views

    \n
      \n
    • Added 5-minute grace period after cache expiration to keep events visible during refresh
    • \n
    • Trigger automatic background refresh when cache is stale or missing
    • \n
    • Initialize ICS service instances early so views can register event listeners before data loads
    • \n
    • Prevents disappearance during network errors or when calendar opens at Obsidian startup
    • \n
    • Thanks to @j-peeters for reporting
    • \n
    \n
  • \n
  • (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion

    \n
      \n
    • Added timeEstimate field to ParsedTaskData interface
    • \n
    • Time estimates from natural language parsing now properly transferred to task frontmatter
    • \n
    • Parsed values now take priority over default settings
    • \n
    • RRule strings passed directly without conversion (preferred format)
    • \n
    • Thanks to @Justin-Burg for reporting
    • \n
    \n
  • \n
  • (#826) Fixed task card widget not appearing when Obsidian starts with task note open

    \n
      \n
    • Deferred dispatch calls to avoid "EditorView.update not allowed during update" error
    • \n
    • Widget now renders correctly on startup without requiring workarounds
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
  • (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues

    \n
      \n
    • Events with non-IANA timezone identifiers (e.g., TZID=Zurich without VTIMEZONE) now display at correct local times
    • \n
    • Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone
    • \n
    • Replaced unreliable toJSDate() conversion with toUnixTime() for accurate UTC timestamp handling
    • \n
    • Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats
    • \n
    • Thanks to @chrlaney for reporting and @wilf80 for detailed analysis
    • \n
    \n
  • \n
  • (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view

    \n
      \n
    • Recurring tasks now check both due and scheduled dates for overdue status
    • \n
    • Previously only scheduled was checked for recurring tasks, causing tasks with overdue due dates to be hidden
    • \n
    • Ensures consistent overdue detection logic between recurring and non-recurring tasks
    • \n
    • Thanks to @skyrunner15 for reporting
    • \n
    \n
  • \n
  • (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones

    \n
      \n
    • Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones
    • \n
    • UTC-anchored dates are now converted to local calendar dates before formatting
    • \n
    • Fixes off-by-one day error that affected date selection and display
    • \n
    • Thanks to @kenhsmith for reporting
    • \n
    \n
  • \n
\n","text":"Added# Added Calendar view for Bases plugin integration (requires Bases 1.10.0+) Supports month, week, day, year, and list views Property-based events from note date properties (configurable start date, end date, and title properties) Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based) Date validation to handle invalid property values Drag-and-drop to update property-based event dates in frontmatter Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese) Added grouped rendering support for Bases integration list and kanban views List view displays collapsible groups with toggle controls Kanban view renders grouped columns with drag-drop support Automatically detects ungrouped views and renders as flat list (#842) Added keyboard navigation support for task forms Action bar icons now focusable with proper tab order and ARIA attributes Enter and Space keys trigger actions on focused elements Added submenu support for reminders button for better keyboard accessibility Improved focus indicators for better visual feedback Thanks to @maybetm for this excellent contribution! Changed# Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions Fixed# (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths Changed debounce to trailing mode to ensure final value is saved instead of partial input Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths Thanks to @sascha224 for reporting (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#825) Fixed single/double click settings not applying to calendar views Shared click handling now works consistently across Advanced Calendar and Bases Calendar Ctrl/Cmd+click opens tasks in new tab as expected Single and double-click actions respect user settings (#699) Fixed Obsidian freezing when moving calendar tab to new window Skip calendar resize during window transfer to prevent freeze Calendar may display incorrectly after move but can be fixed by switching views Prevents complete UI lockup during tab transfer (#816) Fixed template variables not processing in ICS subscription note folder paths Template variables like {{year}}, {{month}}, {{date}} now work in ICS note folder settings Extracted folder template processing into shared utility for consistency Added support for ICS-specific variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Users can now organize ICS notes in date-based hierarchies (e.g., Daily/{{year}}/{{month}}/) Thanks to @j-peeters for reporting (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views Added 5-minute grace period after cache expiration to keep events visible during refresh Trigger automatic background refresh when cache is stale or missing Initialize ICS service instances early so views can register event listeners before data loads Prevents disappearance during network errors or when calendar opens at Obsidian startup Thanks to @j-peeters for reporting (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion Added timeEstimate field to ParsedTaskData interface Time estimates from natural language parsing now properly transferred to task frontmatter Parsed values now take priority over default settings RRule strings passed directly without conversion (preferred format) Thanks to @Justin-Burg for reporting (#826) Fixed task card widget not appearing when Obsidian starts with task note open Deferred dispatch calls to avoid \"EditorView.update not allowed during update\" error Widget now renders correctly on startup without requiring workarounds Thanks to @nightroman for reporting (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues Events with non-IANA timezone identifiers (e.g., TZID=Zurich without VTIMEZONE) now display at correct local times Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone Replaced unreliable toJSDate() conversion with toUnixTime() for accurate UTC timestamp handling Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats Thanks to @chrlaney for reporting and @wilf80 for detailed analysis (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view Recurring tasks now check both due and scheduled dates for overdue status Previously only scheduled was checked for recurring tasks, causing tasks with overdue due dates to be hidden Ensures consistent overdue detection logic between recurring and non-recurring tasks Thanks to @skyrunner15 for reporting (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones UTC-anchored dates are now converted to local calendar dates before formatting Fixes off-by-one day error that affected date selection and display Thanks to @kenhsmith for reporting"},{"route":"/obsidian/releases/3.25.1/","title":"TaskNotes 3.25.1","description":"(#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.1.md","namespace":"obsidian","relativePath":"releases/3.25.1.md","raw":"# TaskNotes 3.25.1\n\n## Fixed\n\n- (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice\n - All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps\n - Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones)\n - All-day events no longer appear twice in Agenda view\n - Updated all date parsing throughout the codebase to handle date-only format correctly\n - Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events\n - Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695\n\n- (#859) Fixed multi-day task creation in Bases calendar view\n - Extracted shared task creation logic to `calendar-core.ts` for consistency between calendar views\n - Multi-day all-day selections now correctly set time estimate based on number of days dragged\n - Timed task selections (week view) now correctly calculate duration in minutes\n - Single-day clicks no longer override default time estimate settings\n - Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior\n - Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar)\n - Follows UTC Anchor principle for date-only strings\n - Thanks to @anareaty for reporting\n","aliases":["/releases/3.25.1/","/releases/3.25.1/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice

    \n
      \n
    • All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps
    • \n
    • Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones)
    • \n
    • All-day events no longer appear twice in Agenda view
    • \n
    • Updated all date parsing throughout the codebase to handle date-only format correctly
    • \n
    • Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events
    • \n
    • Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695
    • \n
    \n
  • \n
  • (#859) Fixed multi-day task creation in Bases calendar view

    \n
      \n
    • Extracted shared task creation logic to calendar-core.ts for consistency between calendar views
    • \n
    • Multi-day all-day selections now correctly set time estimate based on number of days dragged
    • \n
    • Timed task selections (week view) now correctly calculate duration in minutes
    • \n
    • Single-day clicks no longer override default time estimate settings
    • \n
    • Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior
    • \n
    • Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar)
    • \n
    • Follows UTC Anchor principle for date-only strings
    • \n
    • Thanks to @anareaty for reporting
    • \n
    \n
  • \n
\n","text":"Fixed# (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones) All-day events no longer appear twice in Agenda view Updated all date parsing throughout the codebase to handle date-only format correctly Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695 (#859) Fixed multi-day task creation in Bases calendar view Extracted shared task creation logic to calendar-core.ts for consistency between calendar views Multi-day all-day selections now correctly set time estimate based on number of days dragged Timed task selections (week view) now correctly calculate duration in minutes Single-day clicks no longer override default time estimate settings Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar) Follows UTC Anchor principle for date-only strings Thanks to @anareaty for reporting"},{"route":"/obsidian/releases/3.25.2/","title":"TaskNotes 3.25.2","description":"(#857) Fixed Mini Calendar opening previous day's daily note when clicked","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.2.md","namespace":"obsidian","relativePath":"releases/3.25.2.md","raw":"# TaskNotes 3.25.2\n\n## Fixed\n\n- (#857) Fixed Mini Calendar opening previous day's daily note when clicked\n - Affects users in negative UTC offset timezones (Americas, Pacific)\n - Thanks to @tsweezy for reporting\n\n- (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields\n - Added support for both Bases 1.10.0+ format (`{property: string, direction: string}`) and legacy string format\n - Note: GroupBy is not exposed in the Bases public API (`config.get('groupBy')` returns undefined)\n - Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths\n - Tasks with different wikilink formats pointing to the same project file will appear in separate columns\n - Example: `[[Project]]`, `[[path/to/Project]]`, and `[[Project|Alias]]` create separate columns\n - This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths\n - Thanks to @kmaustral for reporting\n\n## Added\n\n- Added date navigation configuration for Bases calendar views\n - Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load\n - Property-based navigation: Automatically navigate to dates from filtered note properties\n - Three navigation strategies: First result, Earliest date, or Latest date\n\n## Changed\n\n- Release notes now bundle all versions from current and previous minor series with collapsible sections\n - Added setting to disable automatic release notes display after updates\n","aliases":["/releases/3.25.2/","/releases/3.25.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#857) Fixed Mini Calendar opening previous day's daily note when clicked

    \n
      \n
    • Affects users in negative UTC offset timezones (Americas, Pacific)
    • \n
    • Thanks to @tsweezy for reporting
    • \n
    \n
  • \n
  • (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields

    \n
      \n
    • Added support for both Bases 1.10.0+ format ({property: string, direction: string}) and legacy string format
    • \n
    • Note: GroupBy is not exposed in the Bases public API (config.get('groupBy') returns undefined)
    • \n
    • Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths
        \n
      • Tasks with different wikilink formats pointing to the same project file will appear in separate columns
      • \n
      • Example: [[Project]], [[path/to/Project]], and [[Project|Alias]] create separate columns
      • \n
      • This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths
      • \n
      \n
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • Added date navigation configuration for Bases calendar views
      \n
    • Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load
    • \n
    • Property-based navigation: Automatically navigate to dates from filtered note properties
    • \n
    • Three navigation strategies: First result, Earliest date, or Latest date
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Release notes now bundle all versions from current and previous minor series with collapsible sections
      \n
    • Added setting to disable automatic release notes display after updates
    • \n
    \n
  • \n
\n","text":"Fixed# (#857) Fixed Mini Calendar opening previous day's daily note when clicked Affects users in negative UTC offset timezones (Americas, Pacific) Thanks to @tsweezy for reporting (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields Added support for both Bases 1.10.0+ format ({property: string, direction: string}) and legacy string format Note: GroupBy is not exposed in the Bases public API (config.get('groupBy') returns undefined) Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths Tasks with different wikilink formats pointing to the same project file will appear in separate columns Example: [[Project]], [[path/to/Project]], and [[Project|Alias]] create separate columns This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths Thanks to @kmaustral for reporting Added# Added date navigation configuration for Bases calendar views Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load Property-based navigation: Automatically navigate to dates from filtered note properties Three navigation strategies: First result, Earliest date, or Latest date Changed# Release notes now bundle all versions from current and previous minor series with collapsible sections Added setting to disable automatic release notes display after updates"},{"route":"/obsidian/releases/3.25.3/","title":"TaskNotes 3.25.3","description":"(#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.3.md","namespace":"obsidian","relativePath":"releases/3.25.3.md","raw":"# TaskNotes 3.25.3\n\n## Added\n\n- (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility\n - Fixes issue where themes like Retroma couldn't distinguish active tabs\n - Thanks to @Bregor for the contribution\n\n## Fixed\n\n- (#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled\n - Setting now always visible since it affects command palette task conversion\n - Resolves confusion for users who convert tasks via command palette\n - Thanks to @nnnell for the fix\n\n- (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions\n - Custom field wikilink suggestions (`[[`) now show all vault files instead of only filtered projects\n - Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal\n - Thanks to @renatomen for the thorough fix and tests\n","aliases":["/releases/3.25.3/","/releases/3.25.3/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility
      \n
    • Fixes issue where themes like Retroma couldn't distinguish active tabs
    • \n
    • Thanks to @Bregor for the contribution
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#899) Fixed "Folder for converted tasks" setting being hidden when convert button is disabled

    \n
      \n
    • Setting now always visible since it affects command palette task conversion
    • \n
    • Resolves confusion for users who convert tasks via command palette
    • \n
    • Thanks to @nnnell for the fix
    • \n
    \n
  • \n
  • (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions

    \n
      \n
    • Custom field wikilink suggestions ([[) now show all vault files instead of only filtered projects
    • \n
    • Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal
    • \n
    • Thanks to @renatomen for the thorough fix and tests
    • \n
    \n
  • \n
\n","text":"Added# (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility Fixes issue where themes like Retroma couldn't distinguish active tabs Thanks to @Bregor for the contribution Fixed# (#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled Setting now always visible since it affects command palette task conversion Resolves confusion for users who convert tasks via command palette Thanks to @nnnell for the fix (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions Custom field wikilink suggestions ([[) now show all vault files instead of only filtered projects Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal Thanks to @renatomen for the thorough fix and tests"},{"route":"/obsidian/releases/3.25.4/","title":"TaskNotes 3.25.4","description":"(#937), (#956) Added optional setting to hide identification tags in task cards","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.4.md","namespace":"obsidian","relativePath":"releases/3.25.4.md","raw":"# TaskNotes 3.25.4\n\n## Added\n\n- (#937), (#956) Added optional setting to hide identification tags in task cards\n - New \"Hide identification tags in task cards\" setting (only visible when using tag-based identification)\n - Hides exact matches (e.g., `#task`) and hierarchical children (e.g., `#task/project`, `#task/work/urgent`)\n - Reduces visual clutter while keeping tags in frontmatter for organizational purposes\n - Backward compatible - disabled by default\n - Thanks to @renatomen for implementing this feature and @edakimling for reporting\n\n- (#911) Added custom field suggestion filtering\n - New `autosuggestFilter` field to `UserMappedField` interface allows filtering suggestions by current filter context\n - Added collapsible filter section in settings with visual indicator\n - Comprehensive test coverage for custom field filtering feature\n - Thanks to @renatomen for this enhancement\n\n## Fixed\n\n- (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done\n - Edit Task modal now correctly adds completedDate when changing status to completed\n - Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter\n - Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions)\n - Thanks to @nightroman for reporting\n\n- (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured\n - All tasks were appearing in a single \"None\" column\n - Columns now appear in the order defined in TaskNotes settings (not alphabetical)\n - Detects invalid Bases grouping and falls back to status-based grouping\n - Tasks are properly distributed across status columns\n - Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting\n\n","aliases":["/releases/3.25.4/","/releases/3.25.4/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#937), (#956) Added optional setting to hide identification tags in task cards

    \n
      \n
    • New "Hide identification tags in task cards" setting (only visible when using tag-based identification)
    • \n
    • Hides exact matches (e.g., #task) and hierarchical children (e.g., #task/project, #task/work/urgent)
    • \n
    • Reduces visual clutter while keeping tags in frontmatter for organizational purposes
    • \n
    • Backward compatible - disabled by default
    • \n
    • Thanks to @renatomen for implementing this feature and @edakimling for reporting
    • \n
    \n
  • \n
  • (#911) Added custom field suggestion filtering

    \n
      \n
    • New autosuggestFilter field to UserMappedField interface allows filtering suggestions by current filter context
    • \n
    • Added collapsible filter section in settings with visual indicator
    • \n
    • Comprehensive test coverage for custom field filtering feature
    • \n
    • Thanks to @renatomen for this enhancement
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done

    \n
      \n
    • Edit Task modal now correctly adds completedDate when changing status to completed
    • \n
    • Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter
    • \n
    • Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions)
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
  • (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured

    \n
      \n
    • All tasks were appearing in a single "None" column
    • \n
    • Columns now appear in the order defined in TaskNotes settings (not alphabetical)
    • \n
    • Detects invalid Bases grouping and falls back to status-based grouping
    • \n
    • Tasks are properly distributed across status columns
    • \n
    • Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting
    • \n
    \n
  • \n
\n","text":"Added# (#937), (#956) Added optional setting to hide identification tags in task cards New \"Hide identification tags in task cards\" setting (only visible when using tag-based identification) Hides exact matches (e.g., #task) and hierarchical children (e.g., #task/project, #task/work/urgent) Reduces visual clutter while keeping tags in frontmatter for organizational purposes Backward compatible - disabled by default Thanks to @renatomen for implementing this feature and @edakimling for reporting (#911) Added custom field suggestion filtering New autosuggestFilter field to UserMappedField interface allows filtering suggestions by current filter context Added collapsible filter section in settings with visual indicator Comprehensive test coverage for custom field filtering feature Thanks to @renatomen for this enhancement Fixed# (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done Edit Task modal now correctly adds completedDate when changing status to completed Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions) Thanks to @nightroman for reporting (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured All tasks were appearing in a single \"None\" column Columns now appear in the order defined in TaskNotes settings (not alphabetical) Detects invalid Bases grouping and falls back to status-based grouping Tasks are properly distributed across status columns Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting"},{"route":"/obsidian/releases/3.25.6/","title":"Tasknotes 3.25.6","description":"(#1013) Fixed inability to subscribe to Apple iCloud calendars","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.6.md","namespace":"obsidian","relativePath":"releases/3.25.6.md","raw":"# Tasknotes 3.25.6\n\n## Fixed\n\n- (#1013) Fixed inability to subscribe to Apple iCloud calendars\n - Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly\n - Previously required manually changing the URL format before it would be accepted\n - Works with both standard and secure calendar URLs (webcal:// and webcals://)\n - Thanks to @nickbirch51 for reporting\n\n- (#1022) Fixed tasks randomly disappearing from views and not being recognized\n - Tasks would appear initially but disappear after a few seconds, especially during long sessions\n - Restarting Obsidian or using \"Refresh Cache\" would only temporarily fix the issue\n - Thanks to @seepage87 for reporting and @alejandrospoz for help debugging\n\n- (#968) Fixed timeEntries being duplicated when mapped to custom property name\n - When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property\n - FieldMapper now correctly uses only the configured property name for time tracking data\n - Thanks to @minchinweb for reporting this issue \n\n- (#953) Fixed non-task notes incorrectly appearing as subtasks in views\n - Notes with Parent or project properties but no task tag/property no longer show up as tasks\n - Views now update correctly when task tags are removed from files\n - Improved performance for large vaults by optimizing cache invalidation\n - Thanks to @renatomen for reporting and submitting PR #955\n","aliases":["/releases/3.25.6/","/releases/3.25.6/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1013) Fixed inability to subscribe to Apple iCloud calendars

    \n
      \n
    • Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly
    • \n
    • Previously required manually changing the URL format before it would be accepted
    • \n
    • Works with both standard and secure calendar URLs (webcal:// and webcals://)
    • \n
    • Thanks to @nickbirch51 for reporting
    • \n
    \n
  • \n
  • (#1022) Fixed tasks randomly disappearing from views and not being recognized

    \n
      \n
    • Tasks would appear initially but disappear after a few seconds, especially during long sessions
    • \n
    • Restarting Obsidian or using "Refresh Cache" would only temporarily fix the issue
    • \n
    • Thanks to @seepage87 for reporting and @alejandrospoz for help debugging
    • \n
    \n
  • \n
  • (#968) Fixed timeEntries being duplicated when mapped to custom property name

    \n
      \n
    • When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property
    • \n
    • FieldMapper now correctly uses only the configured property name for time tracking data
    • \n
    • Thanks to @minchinweb for reporting this issue
    • \n
    \n
  • \n
  • (#953) Fixed non-task notes incorrectly appearing as subtasks in views

    \n
      \n
    • Notes with Parent or project properties but no task tag/property no longer show up as tasks
    • \n
    • Views now update correctly when task tags are removed from files
    • \n
    • Improved performance for large vaults by optimizing cache invalidation
    • \n
    • Thanks to @renatomen for reporting and submitting PR #955
    • \n
    \n
  • \n
\n","text":"Fixed# (#1013) Fixed inability to subscribe to Apple iCloud calendars Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly Previously required manually changing the URL format before it would be accepted Works with both standard and secure calendar URLs (webcal:// and webcals://) Thanks to @nickbirch51 for reporting (#1022) Fixed tasks randomly disappearing from views and not being recognized Tasks would appear initially but disappear after a few seconds, especially during long sessions Restarting Obsidian or using \"Refresh Cache\" would only temporarily fix the issue Thanks to @seepage87 for reporting and @alejandrospoz for help debugging (#968) Fixed timeEntries being duplicated when mapped to custom property name When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property FieldMapper now correctly uses only the configured property name for time tracking data Thanks to @minchinweb for reporting this issue (#953) Fixed non-task notes incorrectly appearing as subtasks in views Notes with Parent or project properties but no task tag/property no longer show up as tasks Views now update correctly when task tags are removed from files Improved performance for large vaults by optimizing cache invalidation Thanks to @renatomen for reporting and submitting PR #955"},{"route":"/obsidian/releases/3.3.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.3.0.md","namespace":"obsidian","relativePath":"releases/3.3.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0\n","aliases":["/releases/3.3.0/","/releases/3.3.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0"},{"route":"/obsidian/releases/3.4.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.4.0.md","namespace":"obsidian","relativePath":"releases/3.4.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0\n","aliases":["/releases/3.4.0/","/releases/3.4.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0"},{"route":"/obsidian/releases/3.4.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.4.1.md","namespace":"obsidian","relativePath":"releases/3.4.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1\n","aliases":["/releases/3.4.1/","/releases/3.4.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1"},{"route":"/obsidian/releases/3.4.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.4.2.md","namespace":"obsidian","relativePath":"releases/3.4.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2\n","aliases":["/releases/3.4.2/","/releases/3.4.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2"},{"route":"/obsidian/releases/3.5.1/","title":"Untitled","description":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.5.1.md","namespace":"obsidian","relativePath":"releases/3.5.1.md","raw":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1\n","aliases":["/releases/3.5.1/","/releases/3.5.1/"],"toc":[],"html":"

This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.

\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1

\n","text":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1"},{"route":"/obsidian/releases/3.6.0/","title":"Untitled","description":"Fix task tag check. Add optional timeblocking.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.6.0.md","namespace":"obsidian","relativePath":"releases/3.6.0.md","raw":"Fix task tag check. \r\nAdd optional timeblocking. \n","aliases":["/releases/3.6.0/","/releases/3.6.0/"],"toc":[],"html":"

Fix task tag check. \nAdd optional timeblocking.

\n","text":"Fix task tag check. Add optional timeblocking."},{"route":"/obsidian/releases/3.7.0/","title":"TaskNotes v3.7.0 Release Notes","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.7.0.md","namespace":"obsidian","relativePath":"releases/3.7.0.md","raw":"# TaskNotes v3.7.0 Release Notes\r\n\r\n### Reading Mode Task Previews (thank you @amithkk)\r\n\r\n- Task link previews now work in Reading Mode in addition to Live Preview \r\n- Consistent interactive experience across all Obsidian view modes\r\n- Same functionality: click to edit, right-click for context menu, hover for file preview\r\n- New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling\r\n\r\n### Task Action Palette\r\n\r\n- New quick-action command palette for rapid task management\r\n- Access via command palette: \"TaskNotes: Open Task Action Palette\"\r\n- Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks\r\n- Handles recurring task instances vs. series intelligently\r\n- Fully keyboard navigable with categorized actions\r\n\r\n### Natural Language Task Input\r\n\r\n- Parse natural language when creating tasks: \"Buy groceries tomorrow 3pm high priority @home #errands\"\r\n- Powered by chrono-node for robust date/time parsing\r\n- Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates\r\n- Multi-line support: first line parsed, additional lines become task details\r\n- Toggle in Settings → Basic Defaults\r\n\r\n## UI/UX Improvements\r\n\r\n### Enhanced Task Creation Modal\r\n\r\n- Smart input mode with simplified interface when natural language is enabled\r\n- Progressive disclosure to detailed form when needed\r\n- Better conversion flow with pre-populated forms\r\n- Live filename preview as you type\r\n\r\n### Settings & Modal Improvements\r\n\r\n- Moved Natural Language Input to Basic Defaults section\r\n- Updated task link overlay description to mention both view modes\r\n- Reusable confirmation modal for consistent dialogs\r\n- Better error handling and accessibility improvements\r\n\r\n## Bug Fixes\r\n\r\n### Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)\r\n\r\n- Problem: Inline task conversion applied \"none\" instead of configured defaults\r\n- Solution: Changed useDefaultsOnInstantConvert default from false to true\r\n\r\n### Timer Function Standardization\r\n\r\n- Fixed browser compatibility by replacing Node.js timer types with browser-native timers\r\n- Resolved timing issues across different environments\r\n\r\n### Enhanced Task Link Overlays\r\n\r\n- Better path resolution with security enhancements\r\n- Graceful fallbacks for invalid or missing task files\r\n- Improved handling of rapid view changes\r\n\r\n## Technical Improvements\r\n\r\n### Enhanced Date Support\r\n\r\n- Full due date and scheduled date support in task creation and filename generation\r\n- New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format)\r\n- Support for ISO dates, relative dates, named dates, and natural language\r\n\r\n### Performance & Code Quality\r\n\r\n- Improved event handling with better refresh logic\r\n- Layout change listeners for immediate overlay updates\r\n- Enhanced error handling with user-friendly messages\r\n- Better TypeScript types and modular design\r\n\r\n## New Files & Dependencies\r\n\r\n### New Files\r\n\r\n- src/editor/ReadingModeTaskLinkProcessor.ts\r\n- src/modals/TaskActionPaletteModal.ts\r\n- src/services/NaturalLanguageParser.ts\r\n- src/modals/ConfirmationModal.ts\r\n- styles/task-action-palette-modal.css\r\n\r\n### New Dependency\r\n\r\n- chrono-node: Natural language date parsing library\r\n\r\n## What's Changed\r\n* Feat/task previews in reading mode by @amithkk in https://github.com/callumalpass/tasknotes/pull/57\r\n\r\n## New Contributors\r\n* @amithkk made their first contribution in https://github.com/callumalpass/tasknotes/pull/57\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0\n","aliases":["/releases/3.7.0/","/releases/3.7.0/"],"toc":[{"level":3,"id":"reading-mode-task-previews-thank-you-amithkk","text":"Reading Mode Task Previews (thank you @amithkk)"},{"level":3,"id":"task-action-palette","text":"Task Action Palette"},{"level":3,"id":"natural-language-task-input","text":"Natural Language Task Input"},{"level":2,"id":"uiux-improvements","text":"UI/UX Improvements"},{"level":3,"id":"enhanced-task-creation-modal","text":"Enhanced Task Creation Modal"},{"level":3,"id":"settings-modal-improvements","text":"Settings & Modal Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"fixed-inline-tasks-not-respecting-default-status-priority-issue-58","text":"Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)"},{"level":3,"id":"timer-function-standardization","text":"Timer Function Standardization"},{"level":3,"id":"enhanced-task-link-overlays","text":"Enhanced Task Link Overlays"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"},{"level":3,"id":"enhanced-date-support","text":"Enhanced Date Support"},{"level":3,"id":"performance-code-quality","text":"Performance & Code Quality"},{"level":2,"id":"new-files-dependencies","text":"New Files & Dependencies"},{"level":3,"id":"new-files","text":"New Files"},{"level":3,"id":"new-dependency","text":"New Dependency"},{"level":2,"id":"what39s-changed","text":"What's Changed"},{"level":2,"id":"new-contributors","text":"New Contributors"}],"html":"

Reading Mode Task Previews (thank you @amithkk)#

\n
    \n
  • Task link previews now work in Reading Mode in addition to Live Preview
  • \n
  • Consistent interactive experience across all Obsidian view modes
  • \n
  • Same functionality: click to edit, right-click for context menu, hover for file preview
  • \n
  • New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling
  • \n
\n

Task Action Palette#

\n
    \n
  • New quick-action command palette for rapid task management
  • \n
  • Access via command palette: "TaskNotes: Open Task Action Palette"
  • \n
  • Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks
  • \n
  • Handles recurring task instances vs. series intelligently
  • \n
  • Fully keyboard navigable with categorized actions
  • \n
\n

Natural Language Task Input#

\n
    \n
  • Parse natural language when creating tasks: "Buy groceries tomorrow 3pm high priority @home #errands"
  • \n
  • Powered by chrono-node for robust date/time parsing
  • \n
  • Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates
  • \n
  • Multi-line support: first line parsed, additional lines become task details
  • \n
  • Toggle in Settings → Basic Defaults
  • \n
\n

UI/UX Improvements#

\n

Enhanced Task Creation Modal#

\n
    \n
  • Smart input mode with simplified interface when natural language is enabled
  • \n
  • Progressive disclosure to detailed form when needed
  • \n
  • Better conversion flow with pre-populated forms
  • \n
  • Live filename preview as you type
  • \n
\n

Settings & Modal Improvements#

\n
    \n
  • Moved Natural Language Input to Basic Defaults section
  • \n
  • Updated task link overlay description to mention both view modes
  • \n
  • Reusable confirmation modal for consistent dialogs
  • \n
  • Better error handling and accessibility improvements
  • \n
\n

Bug Fixes#

\n

Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)#

\n
    \n
  • Problem: Inline task conversion applied "none" instead of configured defaults
  • \n
  • Solution: Changed useDefaultsOnInstantConvert default from false to true
  • \n
\n

Timer Function Standardization#

\n
    \n
  • Fixed browser compatibility by replacing Node.js timer types with browser-native timers
  • \n
  • Resolved timing issues across different environments
  • \n
\n\n
    \n
  • Better path resolution with security enhancements
  • \n
  • Graceful fallbacks for invalid or missing task files
  • \n
  • Improved handling of rapid view changes
  • \n
\n

Technical Improvements#

\n

Enhanced Date Support#

\n
    \n
  • Full due date and scheduled date support in task creation and filename generation
  • \n
  • New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format)
  • \n
  • Support for ISO dates, relative dates, named dates, and natural language
  • \n
\n

Performance & Code Quality#

\n
    \n
  • Improved event handling with better refresh logic
  • \n
  • Layout change listeners for immediate overlay updates
  • \n
  • Enhanced error handling with user-friendly messages
  • \n
  • Better TypeScript types and modular design
  • \n
\n

New Files & Dependencies#

\n

New Files#

\n
    \n
  • src/editor/ReadingModeTaskLinkProcessor.ts
  • \n
  • src/modals/TaskActionPaletteModal.ts
  • \n
  • src/services/NaturalLanguageParser.ts
  • \n
  • src/modals/ConfirmationModal.ts
  • \n
  • styles/task-action-palette-modal.css
  • \n
\n

New Dependency#

\n
    \n
  • chrono-node: Natural language date parsing library
  • \n
\n

What's Changed#

\n\n

New Contributors#

\n\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0

\n","text":"Reading Mode Task Previews (thank you @amithkk)# Task link previews now work in Reading Mode in addition to Live Preview Consistent interactive experience across all Obsidian view modes Same functionality: click to edit, right-click for context menu, hover for file preview New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling Task Action Palette# New quick-action command palette for rapid task management Access via command palette: \"TaskNotes: Open Task Action Palette\" Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks Handles recurring task instances vs. series intelligently Fully keyboard navigable with categorized actions Natural Language Task Input# Parse natural language when creating tasks: \"Buy groceries tomorrow 3pm high priority @home #errands\" Powered by chrono-node for robust date/time parsing Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates Multi-line support: first line parsed, additional lines become task details Toggle in Settings → Basic Defaults UI/UX Improvements# Enhanced Task Creation Modal# Smart input mode with simplified interface when natural language is enabled Progressive disclosure to detailed form when needed Better conversion flow with pre-populated forms Live filename preview as you type Settings & Modal Improvements# Moved Natural Language Input to Basic Defaults section Updated task link overlay description to mention both view modes Reusable confirmation modal for consistent dialogs Better error handling and accessibility improvements Bug Fixes# Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)# Problem: Inline task conversion applied \"none\" instead of configured defaults Solution: Changed useDefaultsOnInstantConvert default from false to true Timer Function Standardization# Fixed browser compatibility by replacing Node.js timer types with browser-native timers Resolved timing issues across different environments Enhanced Task Link Overlays# Better path resolution with security enhancements Graceful fallbacks for invalid or missing task files Improved handling of rapid view changes Technical Improvements# Enhanced Date Support# Full due date and scheduled date support in task creation and filename generation New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format) Support for ISO dates, relative dates, named dates, and natural language Performance & Code Quality# Improved event handling with better refresh logic Layout change listeners for immediate overlay updates Enhanced error handling with user-friendly messages Better TypeScript types and modular design New Files & Dependencies# New Files# src/editor/ReadingModeTaskLinkProcessor.ts src/modals/TaskActionPaletteModal.ts src/services/NaturalLanguageParser.ts src/modals/ConfirmationModal.ts styles/task-action-palette-modal.css New Dependency# chrono-node: Natural language date parsing library What's Changed# Feat/task previews in reading mode by @amithkk in https://github.com/callumalpass/tasknotes/pull/57 New Contributors# @amithkk made their first contribution in https://github.com/callumalpass/tasknotes/pull/57 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0"},{"route":"/obsidian/releases/3.7.1/","title":"Version 3.7.1","description":"Files with Major Changes:","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.7.1.md","namespace":"obsidian","relativePath":"releases/3.7.1.md","raw":"# Version 3.7.1\r\n\r\n## Major UI/UX Enhancements\r\n\r\n### Interactive Inline Task Previews\r\n\r\n- Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview\r\n- Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing\r\n- Enhanced Visual Design:\r\n - Redesigned with minimal styling\r\n - Improved spacing and vertical alignment between status dots, priority indicators, and task titles\r\n - Better hover effects with brightness and subtle animations\r\n - Status dots now use bordered design for better visibility\r\n\r\n### Modernized Task Card Design\r\n\r\n- Interactive Status Cycling: Click status dots on task cards to quickly change task status\r\n- Improved Mobile Support: Better touch targets and responsive behavior\r\n- Enhanced Animations: Smooth hover effects, scaling, and transition animations\r\n- Cleaner Layout: Streamlined design with better visual hierarchy\r\n\r\n### Enhanced Natural Language Processing\r\n\r\n#### Advanced Date Parsing\r\n\r\n- Explicit Trigger Recognition: Now recognizes specific phrases:\r\n - Due dates: \"due on\", \"deadline\", \"must be done by\", \"needs to be completed\"\r\n - Scheduled dates: \"scheduled for\", \"start on\", \"work on\", \"planned for\"\r\n- Configurable Defaults: New setting to choose whether ambiguous dates default to \"due\" or \"scheduled\"\r\n- Enhanced Recurrence Patterns:\r\n - \"every [weekday]\" patterns (every monday, every friday)\r\n - Plural day patterns (mondays, tuesdays, etc.)\r\n - \"Every other\" interval patterns (every other week, every 2 days)\r\n - Multiple days (\"every tuesday and thursday\")\r\n\r\n#### Improved Date/Time Handling\r\n\r\n- Better Time Component Support: Enhanced parsing of specific times with dates\r\n- Robust Validation: Improved handling of edge cases and malformed input\r\n- Smart Cleanup: Automatic removal of duplicate tags and contexts\r\n\r\n## Performance & Developer Experience\r\n\r\n### Instant Task Conversion Improvements\r\n\r\n- Real-time Updates: Task link overlays refresh immediately after task conversion\r\n- Smart Caching: Improved metadata cache management for newly created tasks\r\n- Better Error Handling: Enhanced validation with user-friendly error messages\r\n- Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines\r\n\r\n### Technical Improvements\r\n\r\n- Improved Event Handling: Fixed n.dispatch is not a function error with proper validation\r\n- BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization\r\n- Performance Optimizations: Reduced unnecessary re-renders and improved widget caching\r\n- Enhanced State Management: Better synchronization between UI updates and task data\r\n\r\n## Modal & Interface Enhancements\r\n\r\n### Enhanced Date/Time Modals\r\n\r\n- Better Keyboard Navigation: Enter to save, Escape to cancel\r\n- Separate Time Inputs: Dedicated date and time fields for precision\r\n- Quick Date Buttons: Common date selections for faster input\r\n- Improved Accessibility: Proper ARIA labels and screen reader support\r\n\r\n### Better User Experience\r\n\r\n- One-Click Status Changes: Direct status cycling from any task preview\r\n- Direct Date Editing: Click any date to immediately edit it\r\n- Enhanced Visual Feedback: Better hover states, transitions, and loading animations\r\n- Accessibility Improvements: Enhanced keyboard navigation and screen reader support\r\n\r\n### Bug Fixes & Stability\r\n\r\n- Fixed: Inline task widget dispatch errors that caused console warnings\r\n- Fixed: Vertical alignment issues with different-sized status and priority indicators\r\n- Fixed: Layout conflicts between flexbox and inline display properties\r\n- Fixed: Spacing issues in inline task previews causing cramped appearance\r\n- Fixed: Missing task link overlay refreshes after instant task conversion\r\n\r\n## Configuration & Settings\r\n\r\n### New User Settings\r\n\r\n- Natural Language Default: Configure whether ambiguous dates default to \"due\" or \"scheduled\"\r\n- Enhanced Task Creation: Improved default value application for instant task conversion\r\n\r\n## Technical Details\r\n\r\nFiles with Major Changes:\r\n- Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts)\r\n- Modernized task card design (TaskCard.ts)\r\n- Advanced natural language processing (NaturalLanguageParser.ts)\r\n- Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts)\r\n- Comprehensive CSS overhaul with BEM methodology\r\n","aliases":["/releases/3.7.1/","/releases/3.7.1/"],"toc":[{"level":2,"id":"major-uiux-enhancements","text":"Major UI/UX Enhancements"},{"level":3,"id":"interactive-inline-task-previews","text":"Interactive Inline Task Previews"},{"level":3,"id":"modernized-task-card-design","text":"Modernized Task Card Design"},{"level":3,"id":"enhanced-natural-language-processing","text":"Enhanced Natural Language Processing"},{"level":2,"id":"performance-developer-experience","text":"Performance & Developer Experience"},{"level":3,"id":"instant-task-conversion-improvements","text":"Instant Task Conversion Improvements"},{"level":3,"id":"technical-improvements","text":"Technical Improvements"},{"level":2,"id":"modal-interface-enhancements","text":"Modal & Interface Enhancements"},{"level":3,"id":"enhanced-datetime-modals","text":"Enhanced Date/Time Modals"},{"level":3,"id":"better-user-experience","text":"Better User Experience"},{"level":3,"id":"bug-fixes-stability","text":"Bug Fixes & Stability"},{"level":2,"id":"configuration-settings","text":"Configuration & Settings"},{"level":3,"id":"new-user-settings","text":"New User Settings"},{"level":2,"id":"technical-details","text":"Technical Details"}],"html":"

Major UI/UX Enhancements#

\n

Interactive Inline Task Previews#

\n
    \n
  • Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview
  • \n
  • Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing
  • \n
  • Enhanced Visual Design:
      \n
    • Redesigned with minimal styling
    • \n
    • Improved spacing and vertical alignment between status dots, priority indicators, and task titles
    • \n
    • Better hover effects with brightness and subtle animations
    • \n
    • Status dots now use bordered design for better visibility
    • \n
    \n
  • \n
\n

Modernized Task Card Design#

\n
    \n
  • Interactive Status Cycling: Click status dots on task cards to quickly change task status
  • \n
  • Improved Mobile Support: Better touch targets and responsive behavior
  • \n
  • Enhanced Animations: Smooth hover effects, scaling, and transition animations
  • \n
  • Cleaner Layout: Streamlined design with better visual hierarchy
  • \n
\n

Enhanced Natural Language Processing#

\n

Advanced Date Parsing#

\n
    \n
  • Explicit Trigger Recognition: Now recognizes specific phrases:
      \n
    • Due dates: "due on", "deadline", "must be done by", "needs to be completed"
    • \n
    • Scheduled dates: "scheduled for", "start on", "work on", "planned for"
    • \n
    \n
  • \n
  • Configurable Defaults: New setting to choose whether ambiguous dates default to "due" or "scheduled"
  • \n
  • Enhanced Recurrence Patterns:
      \n
    • "every [weekday]" patterns (every monday, every friday)
    • \n
    • Plural day patterns (mondays, tuesdays, etc.)
    • \n
    • "Every other" interval patterns (every other week, every 2 days)
    • \n
    • Multiple days ("every tuesday and thursday")
    • \n
    \n
  • \n
\n

Improved Date/Time Handling#

\n
    \n
  • Better Time Component Support: Enhanced parsing of specific times with dates
  • \n
  • Robust Validation: Improved handling of edge cases and malformed input
  • \n
  • Smart Cleanup: Automatic removal of duplicate tags and contexts
  • \n
\n

Performance & Developer Experience#

\n

Instant Task Conversion Improvements#

\n
    \n
  • Real-time Updates: Task link overlays refresh immediately after task conversion
  • \n
  • Smart Caching: Improved metadata cache management for newly created tasks
  • \n
  • Better Error Handling: Enhanced validation with user-friendly error messages
  • \n
  • Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines
  • \n
\n

Technical Improvements#

\n
    \n
  • Improved Event Handling: Fixed n.dispatch is not a function error with proper validation
  • \n
  • BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization
  • \n
  • Performance Optimizations: Reduced unnecessary re-renders and improved widget caching
  • \n
  • Enhanced State Management: Better synchronization between UI updates and task data
  • \n
\n

Modal & Interface Enhancements#

\n

Enhanced Date/Time Modals#

\n
    \n
  • Better Keyboard Navigation: Enter to save, Escape to cancel
  • \n
  • Separate Time Inputs: Dedicated date and time fields for precision
  • \n
  • Quick Date Buttons: Common date selections for faster input
  • \n
  • Improved Accessibility: Proper ARIA labels and screen reader support
  • \n
\n

Better User Experience#

\n
    \n
  • One-Click Status Changes: Direct status cycling from any task preview
  • \n
  • Direct Date Editing: Click any date to immediately edit it
  • \n
  • Enhanced Visual Feedback: Better hover states, transitions, and loading animations
  • \n
  • Accessibility Improvements: Enhanced keyboard navigation and screen reader support
  • \n
\n

Bug Fixes & Stability#

\n
    \n
  • Fixed: Inline task widget dispatch errors that caused console warnings
  • \n
  • Fixed: Vertical alignment issues with different-sized status and priority indicators
  • \n
  • Fixed: Layout conflicts between flexbox and inline display properties
  • \n
  • Fixed: Spacing issues in inline task previews causing cramped appearance
  • \n
  • Fixed: Missing task link overlay refreshes after instant task conversion
  • \n
\n

Configuration & Settings#

\n

New User Settings#

\n
    \n
  • Natural Language Default: Configure whether ambiguous dates default to "due" or "scheduled"
  • \n
  • Enhanced Task Creation: Improved default value application for instant task conversion
  • \n
\n

Technical Details#

\n

Files with Major Changes:

\n
    \n
  • Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts)
  • \n
  • Modernized task card design (TaskCard.ts)
  • \n
  • Advanced natural language processing (NaturalLanguageParser.ts)
  • \n
  • Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts)
  • \n
  • Comprehensive CSS overhaul with BEM methodology
  • \n
\n","text":"Major UI/UX Enhancements# Interactive Inline Task Previews# Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing Enhanced Visual Design: Redesigned with minimal styling Improved spacing and vertical alignment between status dots, priority indicators, and task titles Better hover effects with brightness and subtle animations Status dots now use bordered design for better visibility Modernized Task Card Design# Interactive Status Cycling: Click status dots on task cards to quickly change task status Improved Mobile Support: Better touch targets and responsive behavior Enhanced Animations: Smooth hover effects, scaling, and transition animations Cleaner Layout: Streamlined design with better visual hierarchy Enhanced Natural Language Processing# Advanced Date Parsing# Explicit Trigger Recognition: Now recognizes specific phrases: Due dates: \"due on\", \"deadline\", \"must be done by\", \"needs to be completed\" Scheduled dates: \"scheduled for\", \"start on\", \"work on\", \"planned for\" Configurable Defaults: New setting to choose whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Recurrence Patterns: \"every [weekday]\" patterns (every monday, every friday) Plural day patterns (mondays, tuesdays, etc.) \"Every other\" interval patterns (every other week, every 2 days) Multiple days (\"every tuesday and thursday\") Improved Date/Time Handling# Better Time Component Support: Enhanced parsing of specific times with dates Robust Validation: Improved handling of edge cases and malformed input Smart Cleanup: Automatic removal of duplicate tags and contexts Performance & Developer Experience# Instant Task Conversion Improvements# Real-time Updates: Task link overlays refresh immediately after task conversion Smart Caching: Improved metadata cache management for newly created tasks Better Error Handling: Enhanced validation with user-friendly error messages Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines Technical Improvements# Improved Event Handling: Fixed n.dispatch is not a function error with proper validation BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization Performance Optimizations: Reduced unnecessary re-renders and improved widget caching Enhanced State Management: Better synchronization between UI updates and task data Modal & Interface Enhancements# Enhanced Date/Time Modals# Better Keyboard Navigation: Enter to save, Escape to cancel Separate Time Inputs: Dedicated date and time fields for precision Quick Date Buttons: Common date selections for faster input Improved Accessibility: Proper ARIA labels and screen reader support Better User Experience# One-Click Status Changes: Direct status cycling from any task preview Direct Date Editing: Click any date to immediately edit it Enhanced Visual Feedback: Better hover states, transitions, and loading animations Accessibility Improvements: Enhanced keyboard navigation and screen reader support Bug Fixes & Stability# Fixed: Inline task widget dispatch errors that caused console warnings Fixed: Vertical alignment issues with different-sized status and priority indicators Fixed: Layout conflicts between flexbox and inline display properties Fixed: Spacing issues in inline task previews causing cramped appearance Fixed: Missing task link overlay refreshes after instant task conversion Configuration & Settings# New User Settings# Natural Language Default: Configure whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Task Creation: Improved default value application for instant task conversion Technical Details# Files with Major Changes: Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts) Modernized task card design (TaskCard.ts) Advanced natural language processing (NaturalLanguageParser.ts) Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts) Comprehensive CSS overhaul with BEM methodology"},{"route":"/obsidian/releases/3.8.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.1.md","namespace":"obsidian","relativePath":"releases/3.8.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1\n","aliases":["/releases/3.8.1/","/releases/3.8.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1"},{"route":"/obsidian/releases/3.8.5/","title":"TaskNotes 3.8.5 Release Notes","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.5.md","namespace":"obsidian","relativePath":"releases/3.8.5.md","raw":"# TaskNotes 3.8.5 Release Notes\r\n\r\n## UI/UX Improvements\r\n\r\n### Compact Filter Bar (Special thanks to @amithkk :tada: )\r\n\r\n- Complete redesign of FilterBar component with compact, modern interface\r\n- Native Obsidian dropdowns replace basic HTML select elements for better consistency\r\n- Collapsible controls - settings are hidden by default with expandable controls via settings button\r\n- Visual indicators showing active filter count on settings button\r\n- Integrated search bar with search icon and improved visual hierarchy\r\n- Right-aligned control buttons for better layout organization\r\n\r\n### Advanced Calendar View Integration\r\n\r\n- Unified view options - calendar view toggles now integrated into FilterBar dropdown\r\n- Streamlined interface - removed separate toggle controls in favor of FilterBar integration\r\n- Consistent UX across different view types with shared filter/view controls\r\n- Dynamic option management with real-time updates and state synchronization\r\n\r\n## Enhanced Natural Language Processing\r\n\r\n### Improved Text Processing\r\n\r\n- Better whitespace handling with new cleanupWhitespace() function for consistent text normalization\r\n- Enhanced priority detection with improved pattern matching and conflict resolution\r\n- Completion status support - added isCompleted field to parsed task data\r\n- More robust text extraction across tags, contexts, priorities, and dates\r\n\r\n### Date and Time Handling Improvements\r\n\r\n- Enhanced date parsing with better timezone handling for date-only strings\r\n- Improved date normalization with direct Date constructor to avoid timezone issues\r\n- Better error handling for invalid date strings and edge cases\r\n- More robust timestamp formatting with validation checks\r\n\r\n## Testing Infrastructure\r\n\r\n### Comprehensive Test Suite\r\n\r\n- Complete testing infrastructure with Jest configuration for both unit and integration tests\r\n- Enhanced mocking system with improved Obsidian API mocks and better type safety\r\n- Integration test helpers with utilities for end-to-end workflow testing\r\n- Improved test coverage across core components and services\r\n\r\n### Mock Improvements\r\n\r\n- Updated mock factories with better type consistency and realistic data generation\r\n- Enhanced DOM simulation for better UI component testing\r\n- Improved date-fns mocking with support for \"MMM d, yyyy h:mm a\" format\r\n- Better Obsidian API compatibility in test mocks\r\n\r\n## Developer Experience\r\n\r\n### Type Safety Enhancements\r\n\r\n- Refactored type definitions for improved consistency across the codebase\r\n- Better TypeScript integration with enhanced type checking and inference\r\n- Improved callback types for better development experience\r\n\r\n## Build and Deployment\r\n\r\n- Updated GitHub Actions with artifact uploader v4 for improved CI/CD\r\n- Enhanced development workflow with better testing and build processes\r\n\r\n## User Interface Polish\r\n\r\n### Task Creation Modal\r\n\r\n- Improved placeholder text with more natural language examples\r\n- Better user guidance for natural language task input format\r\n- Clearer instruction formatting for enhanced user experience\r\n\r\n### Visual Consistency\r\n\r\n- Native Obsidian styling throughout filter and control components\r\n- Consistent iconography using Obsidian's icon system\r\n- Improved responsive design with better mobile and small screen support\r\n\r\n## Bug Fixes and Stability\r\n\r\n#### Error Handling\r\n\r\n- Improved error handling in date parsing and normalization functions\r\n- Better validation for user input and edge cases\r\n- Enhanced robustness in text processing and natural language parsing\r\n\r\n### Code Quality\r\n\r\n- Refactored components for better maintainability and performance\r\n- Simplified scheduled date logic with cleaner default handling\r\n- Enhanced code organization with better separation of concerns\r\n\r\n\r\n## What's Changed\r\n\r\n* Add compact filter bar by @amithkk in https://github.com/callumalpass/tasknotes/pull/73\r\n\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5\n","aliases":["/releases/3.8.5/","/releases/3.8.5/"],"toc":[{"level":2,"id":"uiux-improvements","text":"UI/UX Improvements"},{"level":3,"id":"compact-filter-bar-special-thanks-to-amithkk-tada","text":"Compact Filter Bar (Special thanks to @amithkk :tada: )"},{"level":3,"id":"advanced-calendar-view-integration","text":"Advanced Calendar View Integration"},{"level":2,"id":"enhanced-natural-language-processing","text":"Enhanced Natural Language Processing"},{"level":3,"id":"improved-text-processing","text":"Improved Text Processing"},{"level":3,"id":"date-and-time-handling-improvements","text":"Date and Time Handling Improvements"},{"level":2,"id":"testing-infrastructure","text":"Testing Infrastructure"},{"level":3,"id":"comprehensive-test-suite","text":"Comprehensive Test Suite"},{"level":3,"id":"mock-improvements","text":"Mock Improvements"},{"level":2,"id":"developer-experience","text":"Developer Experience"},{"level":3,"id":"type-safety-enhancements","text":"Type Safety Enhancements"},{"level":2,"id":"build-and-deployment","text":"Build and Deployment"},{"level":2,"id":"user-interface-polish","text":"User Interface Polish"},{"level":3,"id":"task-creation-modal","text":"Task Creation Modal"},{"level":3,"id":"visual-consistency","text":"Visual Consistency"},{"level":2,"id":"bug-fixes-and-stability","text":"Bug Fixes and Stability"},{"level":3,"id":"code-quality","text":"Code Quality"},{"level":2,"id":"what39s-changed","text":"What's Changed"}],"html":"

UI/UX Improvements#

\n

Compact Filter Bar (Special thanks to @amithkk :tada: )#

\n
    \n
  • Complete redesign of FilterBar component with compact, modern interface
  • \n
  • Native Obsidian dropdowns replace basic HTML select elements for better consistency
  • \n
  • Collapsible controls - settings are hidden by default with expandable controls via settings button
  • \n
  • Visual indicators showing active filter count on settings button
  • \n
  • Integrated search bar with search icon and improved visual hierarchy
  • \n
  • Right-aligned control buttons for better layout organization
  • \n
\n

Advanced Calendar View Integration#

\n
    \n
  • Unified view options - calendar view toggles now integrated into FilterBar dropdown
  • \n
  • Streamlined interface - removed separate toggle controls in favor of FilterBar integration
  • \n
  • Consistent UX across different view types with shared filter/view controls
  • \n
  • Dynamic option management with real-time updates and state synchronization
  • \n
\n

Enhanced Natural Language Processing#

\n

Improved Text Processing#

\n
    \n
  • Better whitespace handling with new cleanupWhitespace() function for consistent text normalization
  • \n
  • Enhanced priority detection with improved pattern matching and conflict resolution
  • \n
  • Completion status support - added isCompleted field to parsed task data
  • \n
  • More robust text extraction across tags, contexts, priorities, and dates
  • \n
\n

Date and Time Handling Improvements#

\n
    \n
  • Enhanced date parsing with better timezone handling for date-only strings
  • \n
  • Improved date normalization with direct Date constructor to avoid timezone issues
  • \n
  • Better error handling for invalid date strings and edge cases
  • \n
  • More robust timestamp formatting with validation checks
  • \n
\n

Testing Infrastructure#

\n

Comprehensive Test Suite#

\n
    \n
  • Complete testing infrastructure with Jest configuration for both unit and integration tests
  • \n
  • Enhanced mocking system with improved Obsidian API mocks and better type safety
  • \n
  • Integration test helpers with utilities for end-to-end workflow testing
  • \n
  • Improved test coverage across core components and services
  • \n
\n

Mock Improvements#

\n
    \n
  • Updated mock factories with better type consistency and realistic data generation
  • \n
  • Enhanced DOM simulation for better UI component testing
  • \n
  • Improved date-fns mocking with support for "MMM d, yyyy h:mm a" format
  • \n
  • Better Obsidian API compatibility in test mocks
  • \n
\n

Developer Experience#

\n

Type Safety Enhancements#

\n
    \n
  • Refactored type definitions for improved consistency across the codebase
  • \n
  • Better TypeScript integration with enhanced type checking and inference
  • \n
  • Improved callback types for better development experience
  • \n
\n

Build and Deployment#

\n
    \n
  • Updated GitHub Actions with artifact uploader v4 for improved CI/CD
  • \n
  • Enhanced development workflow with better testing and build processes
  • \n
\n

User Interface Polish#

\n

Task Creation Modal#

\n
    \n
  • Improved placeholder text with more natural language examples
  • \n
  • Better user guidance for natural language task input format
  • \n
  • Clearer instruction formatting for enhanced user experience
  • \n
\n

Visual Consistency#

\n
    \n
  • Native Obsidian styling throughout filter and control components
  • \n
  • Consistent iconography using Obsidian's icon system
  • \n
  • Improved responsive design with better mobile and small screen support
  • \n
\n

Bug Fixes and Stability#

\n

Error Handling#

\n
    \n
  • Improved error handling in date parsing and normalization functions
  • \n
  • Better validation for user input and edge cases
  • \n
  • Enhanced robustness in text processing and natural language parsing
  • \n
\n

Code Quality#

\n
    \n
  • Refactored components for better maintainability and performance
  • \n
  • Simplified scheduled date logic with cleaner default handling
  • \n
  • Enhanced code organization with better separation of concerns
  • \n
\n

What's Changed#

\n\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5

\n","text":"UI/UX Improvements# Compact Filter Bar (Special thanks to @amithkk :tada: )# Complete redesign of FilterBar component with compact, modern interface Native Obsidian dropdowns replace basic HTML select elements for better consistency Collapsible controls - settings are hidden by default with expandable controls via settings button Visual indicators showing active filter count on settings button Integrated search bar with search icon and improved visual hierarchy Right-aligned control buttons for better layout organization Advanced Calendar View Integration# Unified view options - calendar view toggles now integrated into FilterBar dropdown Streamlined interface - removed separate toggle controls in favor of FilterBar integration Consistent UX across different view types with shared filter/view controls Dynamic option management with real-time updates and state synchronization Enhanced Natural Language Processing# Improved Text Processing# Better whitespace handling with new cleanupWhitespace() function for consistent text normalization Enhanced priority detection with improved pattern matching and conflict resolution Completion status support - added isCompleted field to parsed task data More robust text extraction across tags, contexts, priorities, and dates Date and Time Handling Improvements# Enhanced date parsing with better timezone handling for date-only strings Improved date normalization with direct Date constructor to avoid timezone issues Better error handling for invalid date strings and edge cases More robust timestamp formatting with validation checks Testing Infrastructure# Comprehensive Test Suite# Complete testing infrastructure with Jest configuration for both unit and integration tests Enhanced mocking system with improved Obsidian API mocks and better type safety Integration test helpers with utilities for end-to-end workflow testing Improved test coverage across core components and services Mock Improvements# Updated mock factories with better type consistency and realistic data generation Enhanced DOM simulation for better UI component testing Improved date-fns mocking with support for \"MMM d, yyyy h:mm a\" format Better Obsidian API compatibility in test mocks Developer Experience# Type Safety Enhancements# Refactored type definitions for improved consistency across the codebase Better TypeScript integration with enhanced type checking and inference Improved callback types for better development experience Build and Deployment# Updated GitHub Actions with artifact uploader v4 for improved CI/CD Enhanced development workflow with better testing and build processes User Interface Polish# Task Creation Modal# Improved placeholder text with more natural language examples Better user guidance for natural language task input format Clearer instruction formatting for enhanced user experience Visual Consistency# Native Obsidian styling throughout filter and control components Consistent iconography using Obsidian's icon system Improved responsive design with better mobile and small screen support Bug Fixes and Stability# Error Handling# Improved error handling in date parsing and normalization functions Better validation for user input and edge cases Enhanced robustness in text processing and natural language parsing Code Quality# Refactored components for better maintainability and performance Simplified scheduled date logic with cleaner default handling Enhanced code organization with better separation of concerns What's Changed# Add compact filter bar by @amithkk in https://github.com/callumalpass/tasknotes/pull/73 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5"},{"route":"/obsidian/releases/3.8.6/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.6.md","namespace":"obsidian","relativePath":"releases/3.8.6.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6\n","aliases":["/releases/3.8.6/","/releases/3.8.6/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6"},{"route":"/obsidian/releases/3.8.7/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.7.md","namespace":"obsidian","relativePath":"releases/3.8.7.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7\n","aliases":["/releases/3.8.7/","/releases/3.8.7/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7"},{"route":"/obsidian/releases/3.9.0/","title":"Release Notes v3.9.0","description":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.9.0.md","namespace":"obsidian","relativePath":"releases/3.9.0.md","raw":"# Release Notes v3.9.0\r\n\r\nThis release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience.\r\nKey updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance.\r\n\r\nA special thank you to amithkk (https://github.com/amithkk) for their contributions to this release!\r\n\r\n## New Features\r\n\r\n * RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible\r\n recurring task schedules. A migration assistant will help you update your existing tasks to the new format.\r\n * Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage\r\n individual completions of recurring tasks.\r\n * \"Show\" Dropdown in Filter Bar: A unified \"Show\" dropdown has been added to the filter bar, providing enhanced filtering options for your\r\n tasks.\r\n * Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow.\r\n * Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save\r\n tasks in the same folder as the current note.\r\n * \"Show Due Dates When Scheduled\" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view.\r\n * Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!)\r\n * Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features.\r\n * \"Highlight Today\" in Calendar View: The calendar view now highlights the current day for better visibility.\r\n * New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability.\r\n * CI/CD and Testing:\r\n * A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions.\r\n * GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases.\r\n\r\n## Enhancements\r\n\r\n * UI/UX Improvements:\r\n * The task edit and creation modals have been redesigned for a more minimalist and intuitive experience.\r\n * Task-related icons have been updated for better clarity.\r\n * Context menus have been added to task cards for quick actions.\r\n * The agenda view sorting options have been fixed.\r\n * The recurring calendar widget is now centered and on a separate line from its label.\r\n * Dropdown menus now handle clicks on text labels more reliably.\r\n * Performance and Reliability:\r\n * The task link overlay has been refactored to use a ViewPlugin for better performance.\r\n * The Advanced Calendar view now handles resizing and being moved to a new window more gracefully.\r\n * The natural language processing for task creation has been improved with a fallback mechanism.\r\n * Date parsing and handling have been made more robust, especially for UTC and different date formats.\r\n * Development Workflow:\r\n * ESLint configuration has been updated with new rules and plugins for better code consistency.\r\n * The build process for CSS has been improved.\r\n * The development guidelines have been updated to reflect the new architecture.\r\n\r\n## Bug Fixes\r\n\r\n\r\n * Fixed an issue where agenda view sorting options were not working correctly.\r\n * Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window.\r\n * Resolved a TypeError in the task modal's suggestion filtering.\r\n * Fixed an issue where the Pomodoro task selector did not show all un-archived tasks.\r\n * Corrected the filtering of daily notes in the getNotesForDate function.\r\n * Fixed a bug where the underlying markdown of a task link was not revealed on hover.\r\n * Removed misleading placeholder symbols from the settings.\r\n * Addressed various linting issues and improved code quality.\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0\n","aliases":["/releases/3.9.0/","/releases/3.9.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":2,"id":"enhancements","text":"Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"}],"html":"

This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience.\nKey updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance.

\n

A special thank you to amithkk (https://github.com/amithkk) for their contributions to this release!

\n

New Features#

\n
    \n
  • RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible\nrecurring task schedules. A migration assistant will help you update your existing tasks to the new format.
  • \n
  • Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage\nindividual completions of recurring tasks.
  • \n
  • "Show" Dropdown in Filter Bar: A unified "Show" dropdown has been added to the filter bar, providing enhanced filtering options for your\ntasks.
  • \n
  • Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow.
  • \n
  • Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save\ntasks in the same folder as the current note.
  • \n
  • "Show Due Dates When Scheduled" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view.
  • \n
  • Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!)
  • \n
  • Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features.
  • \n
  • "Highlight Today" in Calendar View: The calendar view now highlights the current day for better visibility.
  • \n
  • New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability.
  • \n
  • CI/CD and Testing:
      \n
    • A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions.
    • \n
    • GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases.
    • \n
    \n
  • \n
\n

Enhancements#

\n
    \n
  • UI/UX Improvements:
      \n
    • The task edit and creation modals have been redesigned for a more minimalist and intuitive experience.
    • \n
    • Task-related icons have been updated for better clarity.
    • \n
    • Context menus have been added to task cards for quick actions.
    • \n
    • The agenda view sorting options have been fixed.
    • \n
    • The recurring calendar widget is now centered and on a separate line from its label.
    • \n
    • Dropdown menus now handle clicks on text labels more reliably.
    • \n
    \n
  • \n
  • Performance and Reliability:
      \n
    • The task link overlay has been refactored to use a ViewPlugin for better performance.
    • \n
    • The Advanced Calendar view now handles resizing and being moved to a new window more gracefully.
    • \n
    • The natural language processing for task creation has been improved with a fallback mechanism.
    • \n
    • Date parsing and handling have been made more robust, especially for UTC and different date formats.
    • \n
    \n
  • \n
  • Development Workflow:
      \n
    • ESLint configuration has been updated with new rules and plugins for better code consistency.
    • \n
    • The build process for CSS has been improved.
    • \n
    • The development guidelines have been updated to reflect the new architecture.
    • \n
    \n
  • \n
\n

Bug Fixes#

\n
    \n
  • Fixed an issue where agenda view sorting options were not working correctly.
  • \n
  • Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window.
  • \n
  • Resolved a TypeError in the task modal's suggestion filtering.
  • \n
  • Fixed an issue where the Pomodoro task selector did not show all un-archived tasks.
  • \n
  • Corrected the filtering of daily notes in the getNotesForDate function.
  • \n
  • Fixed a bug where the underlying markdown of a task link was not revealed on hover.
  • \n
  • Removed misleading placeholder symbols from the settings.
  • \n
  • Addressed various linting issues and improved code quality.
  • \n
\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0

\n","text":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance. A special thank you to amithkk (https://github.com/amithkk) for their contributions to this release! New Features# RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible recurring task schedules. A migration assistant will help you update your existing tasks to the new format. Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage individual completions of recurring tasks. \"Show\" Dropdown in Filter Bar: A unified \"Show\" dropdown has been added to the filter bar, providing enhanced filtering options for your tasks. Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow. Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save tasks in the same folder as the current note. \"Show Due Dates When Scheduled\" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view. Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!) Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features. \"Highlight Today\" in Calendar View: The calendar view now highlights the current day for better visibility. New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability. CI/CD and Testing: A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions. GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases. Enhancements# UI/UX Improvements: The task edit and creation modals have been redesigned for a more minimalist and intuitive experience. Task-related icons have been updated for better clarity. Context menus have been added to task cards for quick actions. The agenda view sorting options have been fixed. The recurring calendar widget is now centered and on a separate line from its label. Dropdown menus now handle clicks on text labels more reliably. Performance and Reliability: The task link overlay has been refactored to use a ViewPlugin for better performance. The Advanced Calendar view now handles resizing and being moved to a new window more gracefully. The natural language processing for task creation has been improved with a fallback mechanism. Date parsing and handling have been made more robust, especially for UTC and different date formats. Development Workflow: ESLint configuration has been updated with new rules and plugins for better code consistency. The build process for CSS has been improved. The development guidelines have been updated to reflect the new architecture. Bug Fixes# Fixed an issue where agenda view sorting options were not working correctly. Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window. Resolved a TypeError in the task modal's suggestion filtering. Fixed an issue where the Pomodoro task selector did not show all un-archived tasks. Corrected the filtering of daily notes in the getNotesForDate function. Fixed a bug where the underlying markdown of a task link was not revealed on hover. Removed misleading placeholder symbols from the settings. Addressed various linting issues and improved code quality. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0"},{"route":"/obsidian/releases/3.9.1/","title":"Release Notes: 3.9.1","description":"New Features","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.9.1.md","namespace":"obsidian","relativePath":"releases/3.9.1.md","raw":"# Release Notes: 3.9.1\r\n\r\nNew Features\r\n\r\n * GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided.\r\n\r\nBug Fixes\r\n\r\n * Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended.\r\n * Task Creation: The \"Magic Wand\" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input.\r\n\r\n\r\n\r\n## What's Changed\r\n* Add github issue templates by @amithkk in https://github.com/callumalpass/tasknotes/pull/101\r\n\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1\n","aliases":["/releases/3.9.1/","/releases/3.9.1/"],"toc":[{"level":2,"id":"what39s-changed","text":"What's Changed"}],"html":"

New Features

\n
    \n
  • GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided.
  • \n
\n

Bug Fixes

\n
    \n
  • Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended.
  • \n
  • Task Creation: The "Magic Wand" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input.
  • \n
\n

What's Changed#

\n\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1

\n","text":"New Features GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided. Bug Fixes Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended. Task Creation: The \"Magic Wand\" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input. What's Changed# Add github issue templates by @amithkk in https://github.com/callumalpass/tasknotes/pull/101 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1"},{"route":"/obsidian/releases/4.0.0-beta.0/","title":"TaskNotes 4.0.0-beta.0","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.0.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.0.md","raw":"# TaskNotes 4.0.0-beta.0\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## What's New in v4\n\nTaskNotes v4 migrates all views to the Bases system.\n\n### Breaking Changes\n\n- **Minimum Obsidian version: 1.10.1**\n- **View commands now use Bases files** - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open `.base` files created automatically in your vault\n- **Saved filter views** - Custom saved views can be converted to `.base` files using a conversion button in settings\n\n## Added\n\n### OAuth Calendar Integration\n\n- Google Calendar and Microsoft Outlook integration via OAuth 2.0\n - View and sync calendar events in Bases calendar\n - Drag events in the TaskNotes bases calendar to change the event's time online\n - Events sync every 15 minutes or upon local change\n - Requires creating your own OAuth application (approximately 15 minutes)\n - See [Calendar Setup Guide](https://tasknotes.dev/calendar-setup)\n\n### Time Entry Editor Modal\n\n- Dedicated interface for managing time entries\n - Alt-drag on Bases calendar to create time entries\n - View total tracked time per task\n - Edit and delete time entries\n - Access via Task Action Palette (Alt/Opt + Enter)\n\n### Kanban Swimlane Layout\n\n- Horizontal swimlane grouping option for Bases Kanban\n - Group tasks by status, priority, or other fields\n - Hide empty columns\n - Configurable column widths\n - Improved drag-and-drop in swimlane mode\n\n### Saved View Converter\n\n- Conversion button in settings to convert saved filter views to `.base` files\n- Original settings preserved\n- Converted views created in `TaskNotes/Views/`\n\n## Changed\n\n### View System Architecture\n\n- All views now use Bases architecture\n - Calendar, Kanban, Tasks, Agenda, and Project Subtasks are `.base` files\n - Views stored in `TaskNotes/Views/`\n - Keyboard shortcuts and ribbon icons map to `.base` files\n - Configure file paths in Settings → Integrations → Bases Integration\n\n### Calendar\n\n- Control which calendar sources display\n - Toggle Google Calendar, Microsoft Calendar, and ICS events independently\n - Configurable list view with custom day count (2-10 days)\n - Improved timezone handling for recurring events\n\n### Settings\n\n- Reorganized settings tabs\n - OAuth calendar settings in Integrations tab\n - Updated help text\n\n## Fixed\n\n- (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\"\n - TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting\n - Thanks to @jack2game\n- Fixed dark mode calendar borders\n- Fixed Bases Kanban column ordering - Thanks to @mweichert\n- Fixed state management bug in FilterSettingsComponent\n- Fixed timezone handling for recurring events\n\n## Migration Guide\n\n### First Launch\n\n1. Default view files are created automatically in `TaskNotes/Views/`\n2. Ribbon and command palette commands now open `.base` files\n3. Review Settings → General to customize view file paths\n\n### Converting Saved Filter Views\n\n1. Go to Settings → General\n2. Click the conversion button to convert saved filter views to `.base` files\n3. Converted views appear in a file in `TaskNotes/Views/`\n\n### Calendar Integration (Optional)\n\n1. Go to Settings → Integrations → OAuth Calendar Integration\n2. Follow the [Calendar Setup Guide](https://tasknotes.dev/calendar-setup)\n3. Create OAuth applications with Google and/or Microsoft (approximately 15 minutes)\n4. Enter Client ID and Secret in calendar cards\n5. Click Connect\n\n## Known Limitations\n\n- Quick OAuth setup is disabled - only advanced setup (your own credentials) is available\n- Saved filter views require manual conversion using the button in settings\n- Migration is one-way - downgrading to v3 may require manual reconfiguration\n- OAuth setup requires creating applications with Google/Microsoft\n\n## Feedback\n\nReport issues on [GitHub](https://github.com/callumalpass/tasknotes/issues). Include:\n\n- Obsidian version\n- Steps to reproduce\n- Console errors (Ctrl/Cmd + Shift + I)\n- Whether issue occurs after migration or fresh install\n","aliases":["/releases/4.0.0-beta.0/","/releases/4.0.0-beta.0/"],"toc":[{"level":2,"id":"what39s-new-in-v4","text":"What's New in v4"},{"level":3,"id":"breaking-changes","text":"Breaking Changes"},{"level":2,"id":"added","text":"Added"},{"level":3,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"time-entry-editor-modal","text":"Time Entry Editor Modal"},{"level":3,"id":"kanban-swimlane-layout","text":"Kanban Swimlane Layout"},{"level":3,"id":"saved-view-converter","text":"Saved View Converter"},{"level":2,"id":"changed","text":"Changed"},{"level":3,"id":"view-system-architecture","text":"View System Architecture"},{"level":3,"id":"calendar","text":"Calendar"},{"level":3,"id":"settings","text":"Settings"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"migration-guide","text":"Migration Guide"},{"level":3,"id":"first-launch","text":"First Launch"},{"level":3,"id":"converting-saved-filter-views","text":"Converting Saved Filter Views"},{"level":3,"id":"calendar-integration-optional","text":"Calendar Integration (Optional)"},{"level":2,"id":"known-limitations","text":"Known Limitations"},{"level":2,"id":"feedback","text":"Feedback"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

What's New in v4#

\n

TaskNotes v4 migrates all views to the Bases system.

\n

Breaking Changes#

\n
    \n
  • Minimum Obsidian version: 1.10.1
  • \n
  • View commands now use Bases files - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open .base files created automatically in your vault
  • \n
  • Saved filter views - Custom saved views can be converted to .base files using a conversion button in settings
  • \n
\n

Added#

\n

OAuth Calendar Integration#

\n
    \n
  • Google Calendar and Microsoft Outlook integration via OAuth 2.0
      \n
    • View and sync calendar events in Bases calendar
    • \n
    • Drag events in the TaskNotes bases calendar to change the event's time online
    • \n
    • Events sync every 15 minutes or upon local change
    • \n
    • Requires creating your own OAuth application (approximately 15 minutes)
    • \n
    • See Calendar Setup Guide
    • \n
    \n
  • \n
\n

Time Entry Editor Modal#

\n
    \n
  • Dedicated interface for managing time entries
      \n
    • Alt-drag on Bases calendar to create time entries
    • \n
    • View total tracked time per task
    • \n
    • Edit and delete time entries
    • \n
    • Access via Task Action Palette (Alt/Opt + Enter)
    • \n
    \n
  • \n
\n

Kanban Swimlane Layout#

\n
    \n
  • Horizontal swimlane grouping option for Bases Kanban
      \n
    • Group tasks by status, priority, or other fields
    • \n
    • Hide empty columns
    • \n
    • Configurable column widths
    • \n
    • Improved drag-and-drop in swimlane mode
    • \n
    \n
  • \n
\n

Saved View Converter#

\n
    \n
  • Conversion button in settings to convert saved filter views to .base files
  • \n
  • Original settings preserved
  • \n
  • Converted views created in TaskNotes/Views/
  • \n
\n

Changed#

\n

View System Architecture#

\n
    \n
  • All views now use Bases architecture
      \n
    • Calendar, Kanban, Tasks, Agenda, and Project Subtasks are .base files
    • \n
    • Views stored in TaskNotes/Views/
    • \n
    • Keyboard shortcuts and ribbon icons map to .base files
    • \n
    • Configure file paths in Settings → Integrations → Bases Integration
    • \n
    \n
  • \n
\n

Calendar#

\n
    \n
  • Control which calendar sources display
      \n
    • Toggle Google Calendar, Microsoft Calendar, and ICS events independently
    • \n
    • Configurable list view with custom day count (2-10 days)
    • \n
    • Improved timezone handling for recurring events
    • \n
    \n
  • \n
\n

Settings#

\n
    \n
  • Reorganized settings tabs
      \n
    • OAuth calendar settings in Integrations tab
    • \n
    • Updated help text
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#843) Fixed task tag being added when "Identify tasks by" is set to "Property"
      \n
    • TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting
    • \n
    • Thanks to @jack2game
    • \n
    \n
  • \n
  • Fixed dark mode calendar borders
  • \n
  • Fixed Bases Kanban column ordering - Thanks to @mweichert
  • \n
  • Fixed state management bug in FilterSettingsComponent
  • \n
  • Fixed timezone handling for recurring events
  • \n
\n

Migration Guide#

\n

First Launch#

\n
    \n
  1. Default view files are created automatically in TaskNotes/Views/
  2. \n
  3. Ribbon and command palette commands now open .base files
  4. \n
  5. Review Settings → General to customize view file paths
  6. \n
\n

Converting Saved Filter Views#

\n
    \n
  1. Go to Settings → General
  2. \n
  3. Click the conversion button to convert saved filter views to .base files
  4. \n
  5. Converted views appear in a file in TaskNotes/Views/
  6. \n
\n

Calendar Integration (Optional)#

\n
    \n
  1. Go to Settings → Integrations → OAuth Calendar Integration
  2. \n
  3. Follow the Calendar Setup Guide
  4. \n
  5. Create OAuth applications with Google and/or Microsoft (approximately 15 minutes)
  6. \n
  7. Enter Client ID and Secret in calendar cards
  8. \n
  9. Click Connect
  10. \n
\n

Known Limitations#

\n
    \n
  • Quick OAuth setup is disabled - only advanced setup (your own credentials) is available
  • \n
  • Saved filter views require manual conversion using the button in settings
  • \n
  • Migration is one-way - downgrading to v3 may require manual reconfiguration
  • \n
  • OAuth setup requires creating applications with Google/Microsoft
  • \n
\n

Feedback#

\n

Report issues on GitHub. Include:

\n
    \n
  • Obsidian version
  • \n
  • Steps to reproduce
  • \n
  • Console errors (Ctrl/Cmd + Shift + I)
  • \n
  • Whether issue occurs after migration or fresh install
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. What's New in v4# TaskNotes v4 migrates all views to the Bases system. Breaking Changes# Minimum Obsidian version: 1.10.1 View commands now use Bases files - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open .base files created automatically in your vault Saved filter views - Custom saved views can be converted to .base files using a conversion button in settings Added# OAuth Calendar Integration# Google Calendar and Microsoft Outlook integration via OAuth 2.0 View and sync calendar events in Bases calendar Drag events in the TaskNotes bases calendar to change the event's time online Events sync every 15 minutes or upon local change Requires creating your own OAuth application (approximately 15 minutes) See Calendar Setup Guide Time Entry Editor Modal# Dedicated interface for managing time entries Alt-drag on Bases calendar to create time entries View total tracked time per task Edit and delete time entries Access via Task Action Palette (Alt/Opt + Enter) Kanban Swimlane Layout# Horizontal swimlane grouping option for Bases Kanban Group tasks by status, priority, or other fields Hide empty columns Configurable column widths Improved drag-and-drop in swimlane mode Saved View Converter# Conversion button in settings to convert saved filter views to .base files Original settings preserved Converted views created in TaskNotes/Views/ Changed# View System Architecture# All views now use Bases architecture Calendar, Kanban, Tasks, Agenda, and Project Subtasks are .base files Views stored in TaskNotes/Views/ Keyboard shortcuts and ribbon icons map to .base files Configure file paths in Settings → Integrations → Bases Integration Calendar# Control which calendar sources display Toggle Google Calendar, Microsoft Calendar, and ICS events independently Configurable list view with custom day count (2-10 days) Improved timezone handling for recurring events Settings# Reorganized settings tabs OAuth calendar settings in Integrations tab Updated help text Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting Thanks to @jack2game Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events Migration Guide# First Launch# Default view files are created automatically in TaskNotes/Views/ Ribbon and command palette commands now open .base files Review Settings → General to customize view file paths Converting Saved Filter Views# Go to Settings → General Click the conversion button to convert saved filter views to .base files Converted views appear in a file in TaskNotes/Views/ Calendar Integration (Optional)# Go to Settings → Integrations → OAuth Calendar Integration Follow the Calendar Setup Guide Create OAuth applications with Google and/or Microsoft (approximately 15 minutes) Enter Client ID and Secret in calendar cards Click Connect Known Limitations# Quick OAuth setup is disabled - only advanced setup (your own credentials) is available Saved filter views require manual conversion using the button in settings Migration is one-way - downgrading to v3 may require manual reconfiguration OAuth setup requires creating applications with Google/Microsoft Feedback# Report issues on GitHub. Include: Obsidian version Steps to reproduce Console errors (Ctrl/Cmd + Shift + I) Whether issue occurs after migration or fresh install"},{"route":"/obsidian/releases/4.0.0-beta.1/","title":"TaskNotes 4.0.0-beta.1","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.1.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.1.md","raw":"# TaskNotes 4.0.0-beta.1\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## Added\n\n- Added context menus for time entries and ICS events in calendar\n - Time entries: Right-click shows task context menu, left-click opens time entry editor modal\n - ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info\n- Added calendar icon to ICS event titles for better visual distinction\n- Added hover tooltips for timeblocks in calendar views\n- Added **MiniCalendar view** for Bases integration\n - Monthly calendar grid with dot indicators on days with notes\n - Configurable date property (file.ctime, note.dateCreated, etc.)\n - Fuzzy selector modal for selecting notes on clicked days\n - Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note\n- Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets\n - TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups\n - KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell)\n - Tested with up to **30,000 notes** with no performance degradation\n - Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help\n\n\n## Changed\n\n- Refactored Bases integration to use public API and trust pre-sorted data\n - Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture\n - Removed legacy view files and ~500 lines of redundant sorting/grouping logic\n - Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions\n - Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API\n - Reduced code duplication by 40% while maintaining full feature parity\n- Refactored calendar modules to use ES6 imports instead of lazy require() calls\n - Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts\n - Consolidated all imports at module top level\n - Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices\n- Time entry events now show task context menu on right-click (previously had no context menu)\n- Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability\n - Removed complex index synchronization in favor of direct MetadataCache queries\n - Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.)\n - Added minimal DependencyCache for task dependencies and project references only\n - Zero startup time (no index building required)\n - Always provides fresh, accurate task data from Obsidian's MetadataCache\n- Completed internationalization with 100% translation coverage across all supported languages\n - Added 90 missing translation keys to English base\n - Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese)\n - All locales now have complete coverage (1745/1745 keys)\n - Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components\n- Migrated to i18n-state-manager CLI tool for translation management\n - Replaced custom scripts with more robust i18n-state-manager package\n - Added i18n-state.config.json for project-specific patterns\n - New features: find-unused, check-duplicates, improved stale detection\n - Hash-based state tracking and ripgrep-based scanning for performance\n- Bases view templates now generate dynamically based on user settings\n - Task filters adapt to user's task identification method (tag or property)\n - Property ordering reflects defaultVisibleProperties setting\n - Uses correct YAML object notation for Bases filters\n - Maintains backward compatibility with legacy static templates\n- Updated Bases CalendarView to show TaskNotes in property-based events\n - Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.)\n - Previously all TaskNotes were filtered out from property-based events\n\n## Fixed\n\n- (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled\n - Eliminated race condition caused by index synchronization delays\n - TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes\n - No more timing-sensitive code that could conflict with other plugins' metadata processing\n - Tasks will always be visible regardless of other plugins' processing times\n - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging. \n- (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar\n - Removed unnecessary dynamic imports that were causing module resolution failures\n - Consolidated imports at top of calendar-core.ts module\n - Thanks to @jalooc for reporting this issue\n- Fixed task dependencies not displaying on task cards\n - TaskManager now properly calculates isBlocked and isBlocking flags from dependency data\n - Added missing property extractors and renderers in TaskCard for all dependency-related fields\n - Dependency information now shows correctly in Bases views, task note widgets, and other views\n - Shows \"Blocked (n)\" and \"Blocking (n)\" pills, plus detailed task links\n- Fixed Bases property mapping for user-configured field names\n - PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations\n - Example: User configures \"state\" → \"status\", Bases provides \"note.state\", now correctly maps to \"status\"\n - Ensures TaskCard properly recognizes and renders user-configured properties\n- Fixed Bases views not respecting user-configured visible properties\n - Now prioritizes Bases 1.10.0+ public API config.getOrder() method\n - Removed reliance on internal API paths that no longer work\n - Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy)\n- Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling\n- Fixed DateValue conversion in BasesDataAdapter\n - DateValue objects have {date: Date, time: boolean} structure\n - Now properly checks for value.date instanceof Date before legacy conversion methods\n - Fixes property-based events in CalendarView\n\n","aliases":["/releases/4.0.0-beta.1/","/releases/4.0.0-beta.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

Added#

\n
    \n
  • Added context menus for time entries and ICS events in calendar
      \n
    • Time entries: Right-click shows task context menu, left-click opens time entry editor modal
    • \n
    • ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info
    • \n
    \n
  • \n
  • Added calendar icon to ICS event titles for better visual distinction
  • \n
  • Added hover tooltips for timeblocks in calendar views
  • \n
  • Added MiniCalendar view for Bases integration
      \n
    • Monthly calendar grid with dot indicators on days with notes
    • \n
    • Configurable date property (file.ctime, note.dateCreated, etc.)
    • \n
    • Fuzzy selector modal for selecting notes on clicked days
    • \n
    • Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note
    • \n
    \n
  • \n
  • Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets
      \n
    • TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups
    • \n
    • KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell)
    • \n
    • Tested with up to 30,000 notes with no performance degradation
    • \n
    • Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Refactored Bases integration to use public API and trust pre-sorted data
      \n
    • Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture
    • \n
    • Removed legacy view files and ~500 lines of redundant sorting/grouping logic
    • \n
    • Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions
    • \n
    • Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API
    • \n
    • Reduced code duplication by 40% while maintaining full feature parity
    • \n
    \n
  • \n
  • Refactored calendar modules to use ES6 imports instead of lazy require() calls
      \n
    • Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts
    • \n
    • Consolidated all imports at module top level
    • \n
    • Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices
    • \n
    \n
  • \n
  • Time entry events now show task context menu on right-click (previously had no context menu)
  • \n
  • Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability
      \n
    • Removed complex index synchronization in favor of direct MetadataCache queries
    • \n
    • Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.)
    • \n
    • Added minimal DependencyCache for task dependencies and project references only
    • \n
    • Zero startup time (no index building required)
    • \n
    • Always provides fresh, accurate task data from Obsidian's MetadataCache
    • \n
    \n
  • \n
  • Completed internationalization with 100% translation coverage across all supported languages
      \n
    • Added 90 missing translation keys to English base
    • \n
    • Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese)
    • \n
    • All locales now have complete coverage (1745/1745 keys)
    • \n
    • Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components
    • \n
    \n
  • \n
  • Migrated to i18n-state-manager CLI tool for translation management
      \n
    • Replaced custom scripts with more robust i18n-state-manager package
    • \n
    • Added i18n-state.config.json for project-specific patterns
    • \n
    • New features: find-unused, check-duplicates, improved stale detection
    • \n
    • Hash-based state tracking and ripgrep-based scanning for performance
    • \n
    \n
  • \n
  • Bases view templates now generate dynamically based on user settings
      \n
    • Task filters adapt to user's task identification method (tag or property)
    • \n
    • Property ordering reflects defaultVisibleProperties setting
    • \n
    • Uses correct YAML object notation for Bases filters
    • \n
    • Maintains backward compatibility with legacy static templates
    • \n
    \n
  • \n
  • Updated Bases CalendarView to show TaskNotes in property-based events
      \n
    • Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.)
    • \n
    • Previously all TaskNotes were filtered out from property-based events
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled
      \n
    • Eliminated race condition caused by index synchronization delays
    • \n
    • TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes
    • \n
    • No more timing-sensitive code that could conflict with other plugins' metadata processing
    • \n
    • Tasks will always be visible regardless of other plugins' processing times
    • \n
    • Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging.
    • \n
    \n
  • \n
  • (#992) Fixed "Failed to resolve module specifier 'obsidian'" error when moving recurring task instances in calendar
      \n
    • Removed unnecessary dynamic imports that were causing module resolution failures
    • \n
    • Consolidated imports at top of calendar-core.ts module
    • \n
    • Thanks to @jalooc for reporting this issue
    • \n
    \n
  • \n
  • Fixed task dependencies not displaying on task cards
      \n
    • TaskManager now properly calculates isBlocked and isBlocking flags from dependency data
    • \n
    • Added missing property extractors and renderers in TaskCard for all dependency-related fields
    • \n
    • Dependency information now shows correctly in Bases views, task note widgets, and other views
    • \n
    • Shows "Blocked (n)" and "Blocking (n)" pills, plus detailed task links
    • \n
    \n
  • \n
  • Fixed Bases property mapping for user-configured field names
      \n
    • PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations
    • \n
    • Example: User configures "state" → "status", Bases provides "note.state", now correctly maps to "status"
    • \n
    • Ensures TaskCard properly recognizes and renders user-configured properties
    • \n
    \n
  • \n
  • Fixed Bases views not respecting user-configured visible properties
      \n
    • Now prioritizes Bases 1.10.0+ public API config.getOrder() method
    • \n
    • Removed reliance on internal API paths that no longer work
    • \n
    • Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy)
    • \n
    \n
  • \n
  • Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling
  • \n
  • Fixed DateValue conversion in BasesDataAdapter
      \n
    • DateValue objects have {date: Date, time: boolean} structure
    • \n
    • Now properly checks for value.date instanceof Date before legacy conversion methods
    • \n
    • Fixes property-based events in CalendarView
    • \n
    \n
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Added context menus for time entries and ICS events in calendar Time entries: Right-click shows task context menu, left-click opens time entry editor modal ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info Added calendar icon to ICS event titles for better visual distinction Added hover tooltips for timeblocks in calendar views Added MiniCalendar view for Bases integration Monthly calendar grid with dot indicators on days with notes Configurable date property (file.ctime, note.dateCreated, etc.) Fuzzy selector modal for selecting notes on clicked days Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell) Tested with up to 30,000 notes with no performance degradation Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help Changed# Refactored Bases integration to use public API and trust pre-sorted data Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture Removed legacy view files and ~500 lines of redundant sorting/grouping logic Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API Reduced code duplication by 40% while maintaining full feature parity Refactored calendar modules to use ES6 imports instead of lazy require() calls Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts Consolidated all imports at module top level Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices Time entry events now show task context menu on right-click (previously had no context menu) Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability Removed complex index synchronization in favor of direct MetadataCache queries Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.) Added minimal DependencyCache for task dependencies and project references only Zero startup time (no index building required) Always provides fresh, accurate task data from Obsidian's MetadataCache Completed internationalization with 100% translation coverage across all supported languages Added 90 missing translation keys to English base Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese) All locales now have complete coverage (1745/1745 keys) Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components Migrated to i18n-state-manager CLI tool for translation management Replaced custom scripts with more robust i18n-state-manager package Added i18n-state.config.json for project-specific patterns New features: find-unused, check-duplicates, improved stale detection Hash-based state tracking and ripgrep-based scanning for performance Bases view templates now generate dynamically based on user settings Task filters adapt to user's task identification method (tag or property) Property ordering reflects defaultVisibleProperties setting Uses correct YAML object notation for Bases filters Maintains backward compatibility with legacy static templates Updated Bases CalendarView to show TaskNotes in property-based events Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.) Previously all TaskNotes were filtered out from property-based events Fixed# (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled Eliminated race condition caused by index synchronization delays TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes No more timing-sensitive code that could conflict with other plugins' metadata processing Tasks will always be visible regardless of other plugins' processing times Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging. (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar Removed unnecessary dynamic imports that were causing module resolution failures Consolidated imports at top of calendar-core.ts module Thanks to @jalooc for reporting this issue Fixed task dependencies not displaying on task cards TaskManager now properly calculates isBlocked and isBlocking flags from dependency data Added missing property extractors and renderers in TaskCard for all dependency-related fields Dependency information now shows correctly in Bases views, task note widgets, and other views Shows \"Blocked (n)\" and \"Blocking (n)\" pills, plus detailed task links Fixed Bases property mapping for user-configured field names PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations Example: User configures \"state\" → \"status\", Bases provides \"note.state\", now correctly maps to \"status\" Ensures TaskCard properly recognizes and renders user-configured properties Fixed Bases views not respecting user-configured visible properties Now prioritizes Bases 1.10.0+ public API config.getOrder() method Removed reliance on internal API paths that no longer work Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy) Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter DateValue objects have {date: Date, time: boolean} structure Now properly checks for value.date instanceof Date before legacy conversion methods Fixes property-based events in CalendarView"},{"route":"/obsidian/releases/4.0.0-beta.2/","title":"TaskNotes 4.0.0-beta.2","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.2.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.2.md","raw":"# TaskNotes 4.0.0-beta.2\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## Added\n\n- (#1090) Portuguese (Brazil) translation\n - Full Portuguese (pt-BR) localization support\n - A big thanks to @andysteel for the contribution\n- **Configurable task modal fields** \n - New \"Modal Fields\" settings tab for complete control over task creation and edit modals\n - Configure which fields appear in creation vs edit modals independently\n - Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom)\n - Enable/disable individual fields (including core fields like contexts, tags, time estimate)\n - Organize fields into groups \n - Automatic migration of existing user-defined fields\n - Title and details fields support visibility toggling (ordering fixed for consistency)\n- **Rich markdown editor for NLP task creation**\n - Replaced plain textarea with full CodeMirror markdown editor\n - Live preview, syntax highlighting, and wikilink support\n - Ctrl/Cmd+Enter keyboard shortcut to save task\n - Esc/Tab keyboard shortcuts for modal control\n- **Customizable NLP triggers with autocomplete**\n - Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority)\n - Supports user-defined field triggers\n - CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab)\n - Quote support for multi-word values in user fields\n - Native tag suggester integration when using # trigger\n- **Inline task link overlay enhancements**\n - Configurable visible properties for inline task cards\n - PropertySelectorModal for selecting which properties to display\n - Improved layout: title prioritized, horizontal scrolling for metadata\n - Real-time updates when task data changes\n- **New utility services**\n - `TriggerConfigService` - manages NLP trigger configurations\n - `PropertySelectorModal` - reusable multi-select property picker\n - Property helpers for consistent property handling across views\n- Kanban column reordering via drag and drop\n - Drag column headers to reorder columns\n - Column order is saved per grouping property\n - Visual feedback during drag operations\n- Mini calendar enhancements (in progress)\n - Week numbers column\n - Heat map intensity visualization\n - Note preview tooltips on hover\n - Keyboard navigation\n- **Unified Relationships widget**\n - Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget\n - Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban)\n - Tabs automatically show/hide based on available relationship data\n - Bases views handle all data updates reactively - no manual refresh needed\n - Single configuration setting: show/hide and position (top/bottom)\n - Significantly reduced code complexity (430 fewer lines)\n\n## Fixed\n\n- (#1084) Fixed word wrapping in NLP preview items\n - Thanks to @maybetm for the fix\n- (#975) Fixed advanced calendar list headers not respecting theme colors\n - Thanks to @hugohil for the fix\n- (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space\n - Embedded bases now scroll internally instead of expanding to show all tasks\n - Consistent behavior between task list and kanban embedded views\n - Thanks to @same774 for reporting with screenshot\n- **Bases Calendar view options now working correctly**\n - Fixed \"Highlight today\" toggle not applying - now properly adds/removes CSS class when toggled\n - Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons\n - View type is now persisted when users click month/week/day buttons in the calendar UI\n- (#1050) Task modal no longer adds unwanted empty contexts and projects arrays\n - FieldMapper now checks if arrays are empty before writing to frontmatter\n - Thanks to @nightroman for reporting this issue\n- **Inline task link overlay fixes**\n - Fixed layout prioritization: title now prioritized over metadata\n - Added horizontal scrolling for metadata to prevent overflow\n - Fixed real-time update listeners for task data changes\n- Fixed group collapse/expand functionality in TaskListView\n - Re-registered click event listener for group headers using Component API\n - Groups can now be properly collapsed and expanded\n- Fixed config loading race condition in KanbanView and CalendarView\n - Config is now properly loaded in onload() lifecycle method\n - Views wait for config before rendering options\n- Fixed MiniCalendarView to use direct Bases API like other views\n - Consistent use of Component lifecycle methods\n - Proper cleanup in onunload()\n\n## Changed\n\n- **NLP system overhaul**\n - Replaced `StatusSuggestionService` wrapper with direct `NaturalLanguageParser` usage\n - Consolidated trigger configuration into unified `TriggerConfigService`\n - Enhanced `NaturalLanguageParser` with full trigger and user field support\n - Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger)\n- **Task card and editor improvements**\n - Simplified `TaskCard` interface - removed unused options (showCheckbox, showArchiveButton, groupByDate)\n - Refactored `TaskLinkWidget` to use unified `TaskCard` component for consistency\n - Added support for inline vs. block layout modes in task cards\n - Improved task card BEM CSS with better styling for inline mode\n- **Settings UI enhancements**\n - NLP triggers now configurable through Settings > Features tab\n - Added settings for inline task card visible properties\n - Improved appearance tab with property selector integration\n - Better organization of NLP-related settings\n- Refactored Bases views to use Component lifecycle properly\n - Views now extend Component and use onload()/onunload()\n - Automatic cleanup of event listeners via Component.registerDomEvent()\n - Improved state management and ephemeral state handling\n- Improved development experience\n - Converted ESLint errors to warnings for non-blocking development\n - Fixed various linting issues and unused imports\n\n## Removed\n\n- Removed `StatusSuggestionService` (functionality consolidated into `NaturalLanguageParser`)\n\n## Breaking Changes\n\n- **Relationships widget settings consolidated** (automatic migration)\n - Old settings removed: `showProjectSubtasks`, `projectSubtasksPosition`, `showTaskDependencies`, `taskDependenciesPosition`\n - New unified settings: `showRelationships`, `relationshipsPosition`\n - Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible\n - **Migration**: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default\n - **Bases file change**: The command mapping changed from `'project-subtasks': 'TaskNotes/Views/project-subtasks.base'` to `'relationships': 'TaskNotes/Views/relationships.base'`\n - Run \"Create Default Files\" in Settings > General to create the new `relationships.base` file\n\n","aliases":["/releases/4.0.0-beta.2/","/releases/4.0.0-beta.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"removed","text":"Removed"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

Added#

\n
    \n
  • (#1090) Portuguese (Brazil) translation
      \n
    • Full Portuguese (pt-BR) localization support
    • \n
    • A big thanks to @andysteel for the contribution
    • \n
    \n
  • \n
  • Configurable task modal fields
      \n
    • New "Modal Fields" settings tab for complete control over task creation and edit modals
    • \n
    • Configure which fields appear in creation vs edit modals independently
    • \n
    • Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom)
    • \n
    • Enable/disable individual fields (including core fields like contexts, tags, time estimate)
    • \n
    • Organize fields into groups
    • \n
    • Automatic migration of existing user-defined fields
    • \n
    • Title and details fields support visibility toggling (ordering fixed for consistency)
    • \n
    \n
  • \n
  • Rich markdown editor for NLP task creation
      \n
    • Replaced plain textarea with full CodeMirror markdown editor
    • \n
    • Live preview, syntax highlighting, and wikilink support
    • \n
    • Ctrl/Cmd+Enter keyboard shortcut to save task
    • \n
    • Esc/Tab keyboard shortcuts for modal control
    • \n
    \n
  • \n
  • Customizable NLP triggers with autocomplete
      \n
    • Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority)
    • \n
    • Supports user-defined field triggers
    • \n
    • CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab)
    • \n
    • Quote support for multi-word values in user fields
    • \n
    • Native tag suggester integration when using # trigger
    • \n
    \n
  • \n
  • Inline task link overlay enhancements
      \n
    • Configurable visible properties for inline task cards
    • \n
    • PropertySelectorModal for selecting which properties to display
    • \n
    • Improved layout: title prioritized, horizontal scrolling for metadata
    • \n
    • Real-time updates when task data changes
    • \n
    \n
  • \n
  • New utility services
      \n
    • TriggerConfigService - manages NLP trigger configurations
    • \n
    • PropertySelectorModal - reusable multi-select property picker
    • \n
    • Property helpers for consistent property handling across views
    • \n
    \n
  • \n
  • Kanban column reordering via drag and drop
      \n
    • Drag column headers to reorder columns
    • \n
    • Column order is saved per grouping property
    • \n
    • Visual feedback during drag operations
    • \n
    \n
  • \n
  • Mini calendar enhancements (in progress)
      \n
    • Week numbers column
    • \n
    • Heat map intensity visualization
    • \n
    • Note preview tooltips on hover
    • \n
    • Keyboard navigation
    • \n
    \n
  • \n
  • Unified Relationships widget
      \n
    • Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget
    • \n
    • Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban)
    • \n
    • Tabs automatically show/hide based on available relationship data
    • \n
    • Bases views handle all data updates reactively - no manual refresh needed
    • \n
    • Single configuration setting: show/hide and position (top/bottom)
    • \n
    • Significantly reduced code complexity (430 fewer lines)
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1084) Fixed word wrapping in NLP preview items
      \n
    • Thanks to @maybetm for the fix
    • \n
    \n
  • \n
  • (#975) Fixed advanced calendar list headers not respecting theme colors
      \n
    • Thanks to @hugohil for the fix
    • \n
    \n
  • \n
  • (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space
      \n
    • Embedded bases now scroll internally instead of expanding to show all tasks
    • \n
    • Consistent behavior between task list and kanban embedded views
    • \n
    • Thanks to @same774 for reporting with screenshot
    • \n
    \n
  • \n
  • Bases Calendar view options now working correctly
      \n
    • Fixed "Highlight today" toggle not applying - now properly adds/removes CSS class when toggled
    • \n
    • Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons
    • \n
    • View type is now persisted when users click month/week/day buttons in the calendar UI
    • \n
    \n
  • \n
  • (#1050) Task modal no longer adds unwanted empty contexts and projects arrays
      \n
    • FieldMapper now checks if arrays are empty before writing to frontmatter
    • \n
    • Thanks to @nightroman for reporting this issue
    • \n
    \n
  • \n
  • Inline task link overlay fixes
      \n
    • Fixed layout prioritization: title now prioritized over metadata
    • \n
    • Added horizontal scrolling for metadata to prevent overflow
    • \n
    • Fixed real-time update listeners for task data changes
    • \n
    \n
  • \n
  • Fixed group collapse/expand functionality in TaskListView
      \n
    • Re-registered click event listener for group headers using Component API
    • \n
    • Groups can now be properly collapsed and expanded
    • \n
    \n
  • \n
  • Fixed config loading race condition in KanbanView and CalendarView
      \n
    • Config is now properly loaded in onload() lifecycle method
    • \n
    • Views wait for config before rendering options
    • \n
    \n
  • \n
  • Fixed MiniCalendarView to use direct Bases API like other views
      \n
    • Consistent use of Component lifecycle methods
    • \n
    • Proper cleanup in onunload()
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • NLP system overhaul
      \n
    • Replaced StatusSuggestionService wrapper with direct NaturalLanguageParser usage
    • \n
    • Consolidated trigger configuration into unified TriggerConfigService
    • \n
    • Enhanced NaturalLanguageParser with full trigger and user field support
    • \n
    • Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger)
    • \n
    \n
  • \n
  • Task card and editor improvements
      \n
    • Simplified TaskCard interface - removed unused options (showCheckbox, showArchiveButton, groupByDate)
    • \n
    • Refactored TaskLinkWidget to use unified TaskCard component for consistency
    • \n
    • Added support for inline vs. block layout modes in task cards
    • \n
    • Improved task card BEM CSS with better styling for inline mode
    • \n
    \n
  • \n
  • Settings UI enhancements
      \n
    • NLP triggers now configurable through Settings > Features tab
    • \n
    • Added settings for inline task card visible properties
    • \n
    • Improved appearance tab with property selector integration
    • \n
    • Better organization of NLP-related settings
    • \n
    \n
  • \n
  • Refactored Bases views to use Component lifecycle properly
      \n
    • Views now extend Component and use onload()/onunload()
    • \n
    • Automatic cleanup of event listeners via Component.registerDomEvent()
    • \n
    • Improved state management and ephemeral state handling
    • \n
    \n
  • \n
  • Improved development experience
      \n
    • Converted ESLint errors to warnings for non-blocking development
    • \n
    • Fixed various linting issues and unused imports
    • \n
    \n
  • \n
\n

Removed#

\n
    \n
  • Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser)
  • \n
\n

Breaking Changes#

\n
    \n
  • Relationships widget settings consolidated (automatic migration)
      \n
    • Old settings removed: showProjectSubtasks, projectSubtasksPosition, showTaskDependencies, taskDependenciesPosition
    • \n
    • New unified settings: showRelationships, relationshipsPosition
    • \n
    • Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible
    • \n
    • Migration: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default
    • \n
    • Bases file change: The command mapping changed from 'project-subtasks': 'TaskNotes/Views/project-subtasks.base' to 'relationships': 'TaskNotes/Views/relationships.base'
    • \n
    • Run "Create Default Files" in Settings > General to create the new relationships.base file
    • \n
    \n
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# (#1090) Portuguese (Brazil) translation Full Portuguese (pt-BR) localization support A big thanks to @andysteel for the contribution Configurable task modal fields New \"Modal Fields\" settings tab for complete control over task creation and edit modals Configure which fields appear in creation vs edit modals independently Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom) Enable/disable individual fields (including core fields like contexts, tags, time estimate) Organize fields into groups Automatic migration of existing user-defined fields Title and details fields support visibility toggling (ordering fixed for consistency) Rich markdown editor for NLP task creation Replaced plain textarea with full CodeMirror markdown editor Live preview, syntax highlighting, and wikilink support Ctrl/Cmd+Enter keyboard shortcut to save task Esc/Tab keyboard shortcuts for modal control Customizable NLP triggers with autocomplete Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority) Supports user-defined field triggers CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab) Quote support for multi-word values in user fields Native tag suggester integration when using # trigger Inline task link overlay enhancements Configurable visible properties for inline task cards PropertySelectorModal for selecting which properties to display Improved layout: title prioritized, horizontal scrolling for metadata Real-time updates when task data changes New utility services TriggerConfigService - manages NLP trigger configurations PropertySelectorModal - reusable multi-select property picker Property helpers for consistent property handling across views Kanban column reordering via drag and drop Drag column headers to reorder columns Column order is saved per grouping property Visual feedback during drag operations Mini calendar enhancements (in progress) Week numbers column Heat map intensity visualization Note preview tooltips on hover Keyboard navigation Unified Relationships widget Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban) Tabs automatically show/hide based on available relationship data Bases views handle all data updates reactively - no manual refresh needed Single configuration setting: show/hide and position (top/bottom) Significantly reduced code complexity (430 fewer lines) Fixed# (#1084) Fixed word wrapping in NLP preview items Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space Embedded bases now scroll internally instead of expanding to show all tasks Consistent behavior between task list and kanban embedded views Thanks to @same774 for reporting with screenshot Bases Calendar view options now working correctly Fixed \"Highlight today\" toggle not applying - now properly adds/removes CSS class when toggled Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons View type is now persisted when users click month/week/day buttons in the calendar UI (#1050) Task modal no longer adds unwanted empty contexts and projects arrays FieldMapper now checks if arrays are empty before writing to frontmatter Thanks to @nightroman for reporting this issue Inline task link overlay fixes Fixed layout prioritization: title now prioritized over metadata Added horizontal scrolling for metadata to prevent overflow Fixed real-time update listeners for task data changes Fixed group collapse/expand functionality in TaskListView Re-registered click event listener for group headers using Component API Groups can now be properly collapsed and expanded Fixed config loading race condition in KanbanView and CalendarView Config is now properly loaded in onload() lifecycle method Views wait for config before rendering options Fixed MiniCalendarView to use direct Bases API like other views Consistent use of Component lifecycle methods Proper cleanup in onunload() Changed# NLP system overhaul Replaced StatusSuggestionService wrapper with direct NaturalLanguageParser usage Consolidated trigger configuration into unified TriggerConfigService Enhanced NaturalLanguageParser with full trigger and user field support Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger) Task card and editor improvements Simplified TaskCard interface - removed unused options (showCheckbox, showArchiveButton, groupByDate) Refactored TaskLinkWidget to use unified TaskCard component for consistency Added support for inline vs. block layout modes in task cards Improved task card BEM CSS with better styling for inline mode Settings UI enhancements NLP triggers now configurable through Settings > Features tab Added settings for inline task card visible properties Improved appearance tab with property selector integration Better organization of NLP-related settings Refactored Bases views to use Component lifecycle properly Views now extend Component and use onload()/onunload() Automatic cleanup of event listeners via Component.registerDomEvent() Improved state management and ephemeral state handling Improved development experience Converted ESLint errors to warnings for non-blocking development Fixed various linting issues and unused imports Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Breaking Changes# Relationships widget settings consolidated (automatic migration) Old settings removed: showProjectSubtasks, projectSubtasksPosition, showTaskDependencies, taskDependenciesPosition New unified settings: showRelationships, relationshipsPosition Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible Migration: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default Bases file change: The command mapping changed from 'project-subtasks': 'TaskNotes/Views/project-subtasks.base' to 'relationships': 'TaskNotes/Views/relationships.base' Run \"Create Default Files\" in Settings > General to create the new relationships.base file"},{"route":"/obsidian/releases/4.0.0-beta.3/","title":"TaskNotes 4.0.0-beta.3","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.3.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.3.md","raw":"# TaskNotes 4.0.0-beta.3\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## Added\n\n- Updated task card styling\n - Increased status dot size from 16px to 18px\n - Added subtle shadows and transitions to card hover states\n - Updated hover effects on status and priority dots with scaling and removed glow\n - Modified metadata pills with backdrop blur and adjusted spacing\n - Added box shadows to interactive elements (dates, projects, tags) on hover\n - Updated animations to use cubic-bezier easing\n - Added gradient accents to subtask and blocking task borders\n - Fixed subtasks appearing behind parent card hover backgrounds\n - Fixed subtask click and context menu events bubbling to parent cards\n - Fixed subtasks inheriting parent priority and status colors\n\n- (#361) Added completion-based recurrence support with `recurrence_anchor` field\n - Tasks can now recur based on completion date instead of scheduled date\n - Set `recurrence_anchor: completion` in task frontmatter to enable this behavior\n - When completing a recurring task, the next occurrence will be scheduled relative to the completion date\n - The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates\n - Defaults to `scheduled` (original behavior) if not specified\n - Useful for tasks like \"Exercise weekly\" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled\n - Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date)\n - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest\n\n- (#416) Added support for skipped recurrence instances with `skipped_instances` field\n - Recurring tasks can now have individual instances marked as \"skipped\" without completing them\n - Skipped instances are stored in the `skipped_instances` frontmatter array (e.g., `[\"2025-11-15\", \"2025-11-22\"]`)\n - Right-click on a recurring task instance in calendar views to skip/unskip it\n - Visual styling differentiates skipped instances:\n - Calendar views: Gray background with muted appearance\n - Task cards: Strike-through text with gray styling\n - Skipped instances don't affect the recurrence pattern - future instances continue as scheduled\n - Useful for holidays, vacations, or other planned exceptions to recurring tasks\n - Thanks to @mdbraber for the suggestion to use an array similar to `complete_instances`, and @jerzy-dudzic for reporting the issue\n\n\n## Fixed\n\n- (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed\n - Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years)\n - Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days)\n - Ensures the next occurrence is always found when completing recurring task instances\n - Thanks to @VenturaNotes for reporting\n\n- (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views\n - Extended the look-ahead period for yearly recurring tasks when generating calendar instances\n - Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges\n - Only displays instances that fall within the actual visible calendar range\n - Weekly recurring tasks were unaffected and continued to work correctly\n - Thanks to @bespokecomp for reporting\n\n- (#889) Fixed git merge conflicts in calendar subscription metadata\n - Calendar subscription `lastFetched` and `lastError` fields are now stored in memory instead of being saved to disk\n - Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions\n - The \"last synced\" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically\n - Thanks to @karlfrohlich for reporting\n\n- Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules\n - The custom recurrence modal now correctly parses and displays the start date and time fields\n - Fixed parser that was splitting on `=` instead of `:` for DTSTART values\n\n- (#1097) Fixed custom properties and formulas not displaying in Bases views\n - Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties\n - Formulas now work correctly using `formula.NAME` syntax\n - Custom note properties now work correctly using `note.PROPERTY` syntax\n - Thanks to @cathywu for reporting\n\n- (#1099) Fixed issues with default Bases file creation\n - Fixed double-prefix bug in relationships template that generated invalid filter expressions like `note.note.projects`\n - Fixed race condition where files created during plugin load wouldn't appear in file explorer\n - Default Bases files now generate with correct property paths and appear reliably in the file explorer\n - Thanks to @kmaustral for reporting\n\n- (#1110) Fixed open recurring tasks appearing crossed out in Tasks view\n - Removed stale `selectedDate` property that was never updated in v4\n - Tasks view now uses fresh UTC-anchored \"today\" for correct recurring task completion status\n - Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones\n - Also fixed KanbanView to use UTC-anchored dates for consistency\n - Thanks to @kmaustral for reporting\n\n- (#1118) Fixed user-defined fields not working in inline task conversion\n - User-defined fields like `>customfield value` now properly convert to frontmatter when using the \"TaskNote: Convert task to TaskNote\" command\n - Fixed fields appearing with internal IDs (e.g., `field_1761435101864`) instead of configured frontmatter key names\n - Array values are now properly joined with commas\n - Added `userFields` property to `ParsedTaskData` interface to support custom fields throughout the conversion flow\n - Thanks to @guncav for reporting\n\n- Fixed kanban column width CSS constraints not matching settings\n - Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range\n - Column width slider now works correctly across the full 200-500px range\n\n- Kanban view now shows empty columns for all user-defined statuses when grouping by status\n - Empty columns appear for custom statuses defined in settings, even when no tasks have that status\n - Allows users to drag tasks into empty status columns\n - Works in both flat kanban view and swimlane mode\n - Respects the existing \"Hide empty columns\" setting\n - Thanks to @williamcheuk03 for reporting this issue\n","aliases":["/releases/4.0.0-beta.3/","/releases/4.0.0-beta.3/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

Added#

\n
    \n
  • Updated task card styling

    \n
      \n
    • Increased status dot size from 16px to 18px
    • \n
    • Added subtle shadows and transitions to card hover states
    • \n
    • Updated hover effects on status and priority dots with scaling and removed glow
    • \n
    • Modified metadata pills with backdrop blur and adjusted spacing
    • \n
    • Added box shadows to interactive elements (dates, projects, tags) on hover
    • \n
    • Updated animations to use cubic-bezier easing
    • \n
    • Added gradient accents to subtask and blocking task borders
    • \n
    • Fixed subtasks appearing behind parent card hover backgrounds
    • \n
    • Fixed subtask click and context menu events bubbling to parent cards
    • \n
    • Fixed subtasks inheriting parent priority and status colors
    • \n
    \n
  • \n
  • (#361) Added completion-based recurrence support with recurrence_anchor field

    \n
      \n
    • Tasks can now recur based on completion date instead of scheduled date
    • \n
    • Set recurrence_anchor: completion in task frontmatter to enable this behavior
    • \n
    • When completing a recurring task, the next occurrence will be scheduled relative to the completion date
    • \n
    • The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates
    • \n
    • Defaults to scheduled (original behavior) if not specified
    • \n
    • Useful for tasks like "Exercise weekly" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled
    • \n
    • Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date)
    • \n
    • Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest
    • \n
    \n
  • \n
  • (#416) Added support for skipped recurrence instances with skipped_instances field

    \n
      \n
    • Recurring tasks can now have individual instances marked as "skipped" without completing them
    • \n
    • Skipped instances are stored in the skipped_instances frontmatter array (e.g., ["2025-11-15", "2025-11-22"])
    • \n
    • Right-click on a recurring task instance in calendar views to skip/unskip it
    • \n
    • Visual styling differentiates skipped instances:
        \n
      • Calendar views: Gray background with muted appearance
      • \n
      • Task cards: Strike-through text with gray styling
      • \n
      \n
    • \n
    • Skipped instances don't affect the recurrence pattern - future instances continue as scheduled
    • \n
    • Useful for holidays, vacations, or other planned exceptions to recurring tasks
    • \n
    • Thanks to @mdbraber for the suggestion to use an array similar to complete_instances, and @jerzy-dudzic for reporting the issue
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed

    \n
      \n
    • Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years)
    • \n
    • Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days)
    • \n
    • Ensures the next occurrence is always found when completing recurring task instances
    • \n
    • Thanks to @VenturaNotes for reporting
    • \n
    \n
  • \n
  • (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views

    \n
      \n
    • Extended the look-ahead period for yearly recurring tasks when generating calendar instances
    • \n
    • Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges
    • \n
    • Only displays instances that fall within the actual visible calendar range
    • \n
    • Weekly recurring tasks were unaffected and continued to work correctly
    • \n
    • Thanks to @bespokecomp for reporting
    • \n
    \n
  • \n
  • (#889) Fixed git merge conflicts in calendar subscription metadata

    \n
      \n
    • Calendar subscription lastFetched and lastError fields are now stored in memory instead of being saved to disk
    • \n
    • Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions
    • \n
    • The "last synced" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically
    • \n
    • Thanks to @karlfrohlich for reporting
    • \n
    \n
  • \n
  • Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules

    \n
      \n
    • The custom recurrence modal now correctly parses and displays the start date and time fields
    • \n
    • Fixed parser that was splitting on = instead of : for DTSTART values
    • \n
    \n
  • \n
  • (#1097) Fixed custom properties and formulas not displaying in Bases views

    \n
      \n
    • Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties
    • \n
    • Formulas now work correctly using formula.NAME syntax
    • \n
    • Custom note properties now work correctly using note.PROPERTY syntax
    • \n
    • Thanks to @cathywu for reporting
    • \n
    \n
  • \n
  • (#1099) Fixed issues with default Bases file creation

    \n
      \n
    • Fixed double-prefix bug in relationships template that generated invalid filter expressions like note.note.projects
    • \n
    • Fixed race condition where files created during plugin load wouldn't appear in file explorer
    • \n
    • Default Bases files now generate with correct property paths and appear reliably in the file explorer
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#1110) Fixed open recurring tasks appearing crossed out in Tasks view

    \n
      \n
    • Removed stale selectedDate property that was never updated in v4
    • \n
    • Tasks view now uses fresh UTC-anchored "today" for correct recurring task completion status
    • \n
    • Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones
    • \n
    • Also fixed KanbanView to use UTC-anchored dates for consistency
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#1118) Fixed user-defined fields not working in inline task conversion

    \n
      \n
    • User-defined fields like >customfield value now properly convert to frontmatter when using the "TaskNote: Convert task to TaskNote" command
    • \n
    • Fixed fields appearing with internal IDs (e.g., field_1761435101864) instead of configured frontmatter key names
    • \n
    • Array values are now properly joined with commas
    • \n
    • Added userFields property to ParsedTaskData interface to support custom fields throughout the conversion flow
    • \n
    • Thanks to @guncav for reporting
    • \n
    \n
  • \n
  • Fixed kanban column width CSS constraints not matching settings

    \n
      \n
    • Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range
    • \n
    • Column width slider now works correctly across the full 200-500px range
    • \n
    \n
  • \n
  • Kanban view now shows empty columns for all user-defined statuses when grouping by status

    \n
      \n
    • Empty columns appear for custom statuses defined in settings, even when no tasks have that status
    • \n
    • Allows users to drag tasks into empty status columns
    • \n
    • Works in both flat kanban view and swimlane mode
    • \n
    • Respects the existing "Hide empty columns" setting
    • \n
    • Thanks to @williamcheuk03 for reporting this issue
    • \n
    \n
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Updated task card styling Increased status dot size from 16px to 18px Added subtle shadows and transitions to card hover states Updated hover effects on status and priority dots with scaling and removed glow Modified metadata pills with backdrop blur and adjusted spacing Added box shadows to interactive elements (dates, projects, tags) on hover Updated animations to use cubic-bezier easing Added gradient accents to subtask and blocking task borders Fixed subtasks appearing behind parent card hover backgrounds Fixed subtask click and context menu events bubbling to parent cards Fixed subtasks inheriting parent priority and status colors (#361) Added completion-based recurrence support with recurrence_anchor field Tasks can now recur based on completion date instead of scheduled date Set recurrence_anchor: completion in task frontmatter to enable this behavior When completing a recurring task, the next occurrence will be scheduled relative to the completion date The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates Defaults to scheduled (original behavior) if not specified Useful for tasks like \"Exercise weekly\" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date) Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Added support for skipped recurrence instances with skipped_instances field Recurring tasks can now have individual instances marked as \"skipped\" without completing them Skipped instances are stored in the skipped_instances frontmatter array (e.g., [\"2025-11-15\", \"2025-11-22\"]) Right-click on a recurring task instance in calendar views to skip/unskip it Visual styling differentiates skipped instances: Calendar views: Gray background with muted appearance Task cards: Strike-through text with gray styling Skipped instances don't affect the recurrence pattern - future instances continue as scheduled Useful for holidays, vacations, or other planned exceptions to recurring tasks Thanks to @mdbraber for the suggestion to use an array similar to complete_instances, and @jerzy-dudzic for reporting the issue Fixed# (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years) Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days) Ensures the next occurrence is always found when completing recurring task instances Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views Extended the look-ahead period for yearly recurring tasks when generating calendar instances Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges Only displays instances that fall within the actual visible calendar range Weekly recurring tasks were unaffected and continued to work correctly Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata Calendar subscription lastFetched and lastError fields are now stored in memory instead of being saved to disk Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions The \"last synced\" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules The custom recurrence modal now correctly parses and displays the start date and time fields Fixed parser that was splitting on = instead of : for DTSTART values (#1097) Fixed custom properties and formulas not displaying in Bases views Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties Formulas now work correctly using formula.NAME syntax Custom note properties now work correctly using note.PROPERTY syntax Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation Fixed double-prefix bug in relationships template that generated invalid filter expressions like note.note.projects Fixed race condition where files created during plugin load wouldn't appear in file explorer Default Bases files now generate with correct property paths and appear reliably in the file explorer Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view Removed stale selectedDate property that was never updated in v4 Tasks view now uses fresh UTC-anchored \"today\" for correct recurring task completion status Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones Also fixed KanbanView to use UTC-anchored dates for consistency Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion User-defined fields like >customfield value now properly convert to frontmatter when using the \"TaskNote: Convert task to TaskNote\" command Fixed fields appearing with internal IDs (e.g., field_1761435101864) instead of configured frontmatter key names Array values are now properly joined with commas Added userFields property to ParsedTaskData interface to support custom fields throughout the conversion flow Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range Column width slider now works correctly across the full 200-500px range Kanban view now shows empty columns for all user-defined statuses when grouping by status Empty columns appear for custom statuses defined in settings, even when no tasks have that status Allows users to drag tasks into empty status columns Works in both flat kanban view and swimlane mode Respects the existing \"Hide empty columns\" setting Thanks to @williamcheuk03 for reporting this issue"},{"route":"/obsidian/releases/4.0.1/","title":"TaskNotes 4","description":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.1.md","namespace":"obsidian","relativePath":"releases/4.0.1.md","raw":"# TaskNotes 4\n\nTaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on `.base` files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault.\n\n## Highlights\n\n**New features and improvements:**\n\n- Performance improvements\n - Virtual scrolling in Task List and Kanban views handles **30,000+ tasks** without performance degradation\n- **OAuth calendar integration**\n - Google Calendar and Microsoft Outlook bi-directional sync\n - Drag calendar events in the TaskNotes calendar to update them online\n- **Configurable modals and NLP**\n - New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals\n - Rich markdown editor and customizable NLP triggers, including autocomplete for user fields\n- **Time management features**\n - Time Entry Editor Modal \n - Improved Timeblock creation and management\n - Completion-based recurrence with `recurrence_anchor` field\n - Skippable recurrence instances\n\n**Bases architecture changes:**\n\n- **Bases-first architecture**\n - Task views ship as `.base` files inside `TaskNotes/Views/`\n - Commands and ribbon buttons now open files you control\n - Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI\n - Agenda is a dedicated list-mode calendar `.base` file for fast daily/weekly reviews\n- **Inline workflows stay in sync**\n - Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place\n - Task cards inside notes honor the same Bases filtering/grouping rules as standalone views\n\n## Why Bases?\n\nMoving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which:\n\n- Reduces maintenance overhead and improves reliability\n- Lets advanced users version-control and audit their view definitions\n- Makes saved views portable between vaults\n- Keeps TaskNotes behavior consistent with other Obsidian-native workflows\n\n## Upgrade Notes\n\n- Obsidian **1.10.1 or later** is required (Bases public API with group-by support)\n- Enable the **Bases** core plugin before opening TaskNotes views\n- Run **Settings → TaskNotes → General → Create Default Files** if you need fresh `.base` files\n- Use **Export All Saved Views to Bases** to convert any legacy FilterBar saved views into `.base` files\n- The Relationships widget uses `TaskNotes/Views/relationships.base`; adjust that file to change what appears inside notes\n\n## Breaking Changes\n\n- The old FilterBar UI has been removed—all filtering and saved views live in `.base` files\n- Legacy widget settings (`showProjectSubtasks`, `showTaskDependencies`, etc.) were replaced with `showRelationships` and `relationshipsPosition`\n- Task view commands now fail if their mapped `.base` file is missing; configure paths under **Settings → TaskNotes → General → View Commands**\n- **Priority sorting now uses alphabetical order instead of custom weights**\n - In v3, TaskNotes used priority \"weights\" to determine sort order (higher weight = higher priority)\n - In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value\n - The weight field has been removed from the settings UI\n - **Workaround**: Name your priority values to sort alphabetically in your desired order\n - Example: `1-urgent`, `2-high`, `3-medium`, `4-normal`, `5-low`\n - Or: `a-urgent`, `b-high`, `c-medium`, `d-normal`, `e-low`\n- Agenda view has been replaced by the list view in Calendar\n - Grouping is not supported in this view, so the \"Overdue\" group is no longer provided\n - A separate \"Overdue\" view is available in the \"Task List\" base file\n\n## Known Issues\n\n- Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data\n- Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views\n\n## Details\n\n### Added\n\n- Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis\n- Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing\n- Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create)\n- Kanban Swimlane Layout with horizontal grouping and configurable column widths\n- Saved View Converter button in settings to convert v3 saved filter views to `.base` files\n- Context menus for time entries and ICS events in calendar views\n- Calendar icon to ICS event titles for better visual distinction\n- Hover tooltips for timeblocks in calendar views\n- MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis\n- (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution\n- Configurable task modal fields with drag-and-drop reordering in new \"Modal Fields\" settings tab\n- Rich markdown editor for NLP task creation with syntax highlighting and wikilink support\n- Customizable NLP triggers with autocomplete and keyboard navigation\n- Inline task link overlay enhancements with configurable visible properties\n- Kanban column reordering via drag and drop with saved order per grouping property\n- Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation\n- Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs\n- Updated task card styling with improved hover effects, shadows, and gradient accents\n- (#361) Completion-based recurrence support with `recurrence_anchor` field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest\n- (#416) Support for skipped recurrence instances with `skipped_instances` field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue\n- Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups\n- Documentation for default Bases templates showing all default `.base` file templates with examples\n\n### Changed\n\n- All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with `.base` files\n- Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling\n- Reorganized settings tabs with OAuth calendar settings in Integrations tab\n- Refactored Bases integration to use public API and trust pre-sorted data\n- Refactored calendar modules to use ES6 imports instead of lazy require() calls\n- Time entry events now show task context menu on right-click\n- Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data\n- Completed internationalization with 100% translation coverage across all 6 supported languages\n- Migrated to i18n-state-manager CLI tool for improved translation management\n- Bases view templates now generate dynamically based on user settings with adaptive task filters\n- Updated Bases CalendarView to show TaskNotes in property-based events\n- NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage\n- Simplified TaskCard interface and refactored TaskLinkWidget for consistency\n- Settings UI enhancements with NLP triggers configurable through Features tab\n- Refactored Bases views to use Component lifecycle properly with automatic cleanup\n- Improved development experience by converting ESLint errors to warnings\n- Renamed \"Advanced Calendar\" to \"Calendar\" throughout the UI\n- Improved timeblock visual styling in calendar views with reduced border width and softer shadows\n- Updated \"Export All Views\" button to \"Export V3 Views\" to clarify it migrates v3 saved views\n- Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys\n- Changed default Tasks List template view order with \"All Tasks\" first and added \"Unscheduled\" view\n\n### Fixed\n\n- (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" - Thanks to @jack2game for reporting\n- Fixed dark mode calendar borders\n- Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting\n- Fixed state management bug in FilterSettingsComponent\n- Fixed timezone handling for recurring events\n- (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging\n- (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting\n- Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags\n- Fixed Bases property mapping for user-configured field names\n- Fixed Bases views not respecting user-configured visible properties\n- Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling\n- Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView\n- (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix\n- (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix\n- (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot\n- Fixed \"Highlight today\" toggle and calendar view type persistence in Bases Calendar view options\n- (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting\n- Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata\n- Fixed group collapse/expand functionality in TaskListView\n- Fixed config loading race condition in KanbanView and CalendarView\n- Fixed MiniCalendarView to use direct Bases API like other views\n- (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting\n- (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting\n- (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting\n- Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules\n- (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting\n- (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting\n- (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting\n- (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting\n- Fixed kanban column width CSS constraints not matching settings slider range\n- Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting\n- (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting\n- (#1133) Fixed empty priority columns not showing in Kanban view when \"Hide empty columns\" is disabled - Thanks to @luckb0x for reporting\n- Fixed OAuth calendar cards showing \"Unknown account\" by removing non-functional Account field - Thanks to @Oblique for reporting\n- Fixed incorrect Bases syntax in default template files with correct parameter naming\n- Fixed incorrect Bases syntax in \"Export V3 Views\" feature with correct YAML structure\n- (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting\n- (#1043) Fixed inability to set \"at time of event\" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting\n- (#1055) Fixed break sessions being logged as `type: work` when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging\n- (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting\n- (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting\n- Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration\n- (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting\n- (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting\n- (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting\n- Fixed time entries not showing in calendar view for tasks without scheduled or due dates\n- (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting\n- (#1086) Fixed calendar \"+more\" popover showing white text on white background in dark mode - Thanks to @same774 for reporting\n- (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting\n- (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information\n- (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting\n\n### Removed\n\n- Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser)\n- Removed legacy FilterBar UI - all filtering now lives in `.base` files\n- Removed legacy views\n\n","aliases":["/releases/4.0.1/","/releases/4.0.1/"],"toc":[{"level":2,"id":"highlights","text":"Highlights"},{"level":2,"id":"why-bases","text":"Why Bases?"},{"level":2,"id":"upgrade-notes","text":"Upgrade Notes"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"},{"level":2,"id":"known-issues","text":"Known Issues"},{"level":2,"id":"details","text":"Details"},{"level":3,"id":"added","text":"Added"},{"level":3,"id":"changed","text":"Changed"},{"level":3,"id":"fixed","text":"Fixed"},{"level":3,"id":"removed","text":"Removed"}],"html":"

TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on .base files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault.

\n

Highlights#

\n

New features and improvements:

\n
    \n
  • Performance improvements
      \n
    • Virtual scrolling in Task List and Kanban views handles 30,000+ tasks without performance degradation
    • \n
    \n
  • \n
  • OAuth calendar integration
      \n
    • Google Calendar and Microsoft Outlook bi-directional sync
    • \n
    • Drag calendar events in the TaskNotes calendar to update them online
    • \n
    \n
  • \n
  • Configurable modals and NLP
      \n
    • New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals
    • \n
    • Rich markdown editor and customizable NLP triggers, including autocomplete for user fields
    • \n
    \n
  • \n
  • Time management features
      \n
    • Time Entry Editor Modal
    • \n
    • Improved Timeblock creation and management
    • \n
    • Completion-based recurrence with recurrence_anchor field
    • \n
    • Skippable recurrence instances
    • \n
    \n
  • \n
\n

Bases architecture changes:

\n
    \n
  • Bases-first architecture
      \n
    • Task views ship as .base files inside TaskNotes/Views/
    • \n
    • Commands and ribbon buttons now open files you control
    • \n
    • Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI
    • \n
    • Agenda is a dedicated list-mode calendar .base file for fast daily/weekly reviews
    • \n
    \n
  • \n
  • Inline workflows stay in sync
      \n
    • Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place
    • \n
    • Task cards inside notes honor the same Bases filtering/grouping rules as standalone views
    • \n
    \n
  • \n
\n

Why Bases?#

\n

Moving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which:

\n
    \n
  • Reduces maintenance overhead and improves reliability
  • \n
  • Lets advanced users version-control and audit their view definitions
  • \n
  • Makes saved views portable between vaults
  • \n
  • Keeps TaskNotes behavior consistent with other Obsidian-native workflows
  • \n
\n

Upgrade Notes#

\n
    \n
  • Obsidian 1.10.1 or later is required (Bases public API with group-by support)
  • \n
  • Enable the Bases core plugin before opening TaskNotes views
  • \n
  • Run Settings → TaskNotes → General → Create Default Files if you need fresh .base files
  • \n
  • Use Export All Saved Views to Bases to convert any legacy FilterBar saved views into .base files
  • \n
  • The Relationships widget uses TaskNotes/Views/relationships.base; adjust that file to change what appears inside notes
  • \n
\n

Breaking Changes#

\n
    \n
  • The old FilterBar UI has been removed—all filtering and saved views live in .base files
  • \n
  • Legacy widget settings (showProjectSubtasks, showTaskDependencies, etc.) were replaced with showRelationships and relationshipsPosition
  • \n
  • Task view commands now fail if their mapped .base file is missing; configure paths under Settings → TaskNotes → General → View Commands
  • \n
  • Priority sorting now uses alphabetical order instead of custom weights
      \n
    • In v3, TaskNotes used priority "weights" to determine sort order (higher weight = higher priority)
    • \n
    • In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value
    • \n
    • The weight field has been removed from the settings UI
    • \n
    • Workaround: Name your priority values to sort alphabetically in your desired order
        \n
      • Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low
      • \n
      • Or: a-urgent, b-high, c-medium, d-normal, e-low
      • \n
      \n
    • \n
    \n
  • \n
  • Agenda view has been replaced by the list view in Calendar
      \n
    • Grouping is not supported in this view, so the "Overdue" group is no longer provided
    • \n
    • A separate "Overdue" view is available in the "Task List" base file
    • \n
    \n
  • \n
\n

Known Issues#

\n
    \n
  • Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data
  • \n
  • Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views
  • \n
\n

Details#

\n

Added#

\n
    \n
  • Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis
  • \n
  • Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing
  • \n
  • Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create)
  • \n
  • Kanban Swimlane Layout with horizontal grouping and configurable column widths
  • \n
  • Saved View Converter button in settings to convert v3 saved filter views to .base files
  • \n
  • Context menus for time entries and ICS events in calendar views
  • \n
  • Calendar icon to ICS event titles for better visual distinction
  • \n
  • Hover tooltips for timeblocks in calendar views
  • \n
  • MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis
  • \n
  • (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution
  • \n
  • Configurable task modal fields with drag-and-drop reordering in new "Modal Fields" settings tab
  • \n
  • Rich markdown editor for NLP task creation with syntax highlighting and wikilink support
  • \n
  • Customizable NLP triggers with autocomplete and keyboard navigation
  • \n
  • Inline task link overlay enhancements with configurable visible properties
  • \n
  • Kanban column reordering via drag and drop with saved order per grouping property
  • \n
  • Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation
  • \n
  • Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs
  • \n
  • Updated task card styling with improved hover effects, shadows, and gradient accents
  • \n
  • (#361) Completion-based recurrence support with recurrence_anchor field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest
  • \n
  • (#416) Support for skipped recurrence instances with skipped_instances field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue
  • \n
  • Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups
  • \n
  • Documentation for default Bases templates showing all default .base file templates with examples
  • \n
\n

Changed#

\n
    \n
  • All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with .base files
  • \n
  • Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling
  • \n
  • Reorganized settings tabs with OAuth calendar settings in Integrations tab
  • \n
  • Refactored Bases integration to use public API and trust pre-sorted data
  • \n
  • Refactored calendar modules to use ES6 imports instead of lazy require() calls
  • \n
  • Time entry events now show task context menu on right-click
  • \n
  • Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data
  • \n
  • Completed internationalization with 100% translation coverage across all 6 supported languages
  • \n
  • Migrated to i18n-state-manager CLI tool for improved translation management
  • \n
  • Bases view templates now generate dynamically based on user settings with adaptive task filters
  • \n
  • Updated Bases CalendarView to show TaskNotes in property-based events
  • \n
  • NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage
  • \n
  • Simplified TaskCard interface and refactored TaskLinkWidget for consistency
  • \n
  • Settings UI enhancements with NLP triggers configurable through Features tab
  • \n
  • Refactored Bases views to use Component lifecycle properly with automatic cleanup
  • \n
  • Improved development experience by converting ESLint errors to warnings
  • \n
  • Renamed "Advanced Calendar" to "Calendar" throughout the UI
  • \n
  • Improved timeblock visual styling in calendar views with reduced border width and softer shadows
  • \n
  • Updated "Export All Views" button to "Export V3 Views" to clarify it migrates v3 saved views
  • \n
  • Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys
  • \n
  • Changed default Tasks List template view order with "All Tasks" first and added "Unscheduled" view
  • \n
\n

Fixed#

\n
    \n
  • (#843) Fixed task tag being added when "Identify tasks by" is set to "Property" - Thanks to @jack2game for reporting
  • \n
  • Fixed dark mode calendar borders
  • \n
  • Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting
  • \n
  • Fixed state management bug in FilterSettingsComponent
  • \n
  • Fixed timezone handling for recurring events
  • \n
  • (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging
  • \n
  • (#992) Fixed "Failed to resolve module specifier 'obsidian'" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting
  • \n
  • Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags
  • \n
  • Fixed Bases property mapping for user-configured field names
  • \n
  • Fixed Bases views not respecting user-configured visible properties
  • \n
  • Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling
  • \n
  • Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView
  • \n
  • (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix
  • \n
  • (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix
  • \n
  • (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot
  • \n
  • Fixed "Highlight today" toggle and calendar view type persistence in Bases Calendar view options
  • \n
  • (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting
  • \n
  • Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata
  • \n
  • Fixed group collapse/expand functionality in TaskListView
  • \n
  • Fixed config loading race condition in KanbanView and CalendarView
  • \n
  • Fixed MiniCalendarView to use direct Bases API like other views
  • \n
  • (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting
  • \n
  • (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting
  • \n
  • (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting
  • \n
  • Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules
  • \n
  • (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting
  • \n
  • (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting
  • \n
  • (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting
  • \n
  • (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting
  • \n
  • Fixed kanban column width CSS constraints not matching settings slider range
  • \n
  • Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting
  • \n
  • (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting
  • \n
  • (#1133) Fixed empty priority columns not showing in Kanban view when "Hide empty columns" is disabled - Thanks to @luckb0x for reporting
  • \n
  • Fixed OAuth calendar cards showing "Unknown account" by removing non-functional Account field - Thanks to @Oblique for reporting
  • \n
  • Fixed incorrect Bases syntax in default template files with correct parameter naming
  • \n
  • Fixed incorrect Bases syntax in "Export V3 Views" feature with correct YAML structure
  • \n
  • (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting
  • \n
  • (#1043) Fixed inability to set "at time of event" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting
  • \n
  • (#1055) Fixed break sessions being logged as type: work when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging
  • \n
  • (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting
  • \n
  • (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting
  • \n
  • Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration
  • \n
  • (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting
  • \n
  • (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting
  • \n
  • (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting
  • \n
  • Fixed time entries not showing in calendar view for tasks without scheduled or due dates
  • \n
  • (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting
  • \n
  • (#1086) Fixed calendar "+more" popover showing white text on white background in dark mode - Thanks to @same774 for reporting
  • \n
  • (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting
  • \n
  • (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information
  • \n
  • (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting
  • \n
\n

Removed#

\n
    \n
  • Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser)
  • \n
  • Removed legacy FilterBar UI - all filtering now lives in .base files
  • \n
  • Removed legacy views
  • \n
\n","text":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on .base files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault. Highlights# New features and improvements: Performance improvements Virtual scrolling in Task List and Kanban views handles 30,000+ tasks without performance degradation OAuth calendar integration Google Calendar and Microsoft Outlook bi-directional sync Drag calendar events in the TaskNotes calendar to update them online Configurable modals and NLP New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals Rich markdown editor and customizable NLP triggers, including autocomplete for user fields Time management features Time Entry Editor Modal Improved Timeblock creation and management Completion-based recurrence with recurrence_anchor field Skippable recurrence instances Bases architecture changes: Bases-first architecture Task views ship as .base files inside TaskNotes/Views/ Commands and ribbon buttons now open files you control Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI Agenda is a dedicated list-mode calendar .base file for fast daily/weekly reviews Inline workflows stay in sync Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place Task cards inside notes honor the same Bases filtering/grouping rules as standalone views Why Bases?# Moving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which: Reduces maintenance overhead and improves reliability Lets advanced users version-control and audit their view definitions Makes saved views portable between vaults Keeps TaskNotes behavior consistent with other Obsidian-native workflows Upgrade Notes# Obsidian 1.10.1 or later is required (Bases public API with group-by support) Enable the Bases core plugin before opening TaskNotes views Run Settings → TaskNotes → General → Create Default Files if you need fresh .base files Use Export All Saved Views to Bases to convert any legacy FilterBar saved views into .base files The Relationships widget uses TaskNotes/Views/relationships.base; adjust that file to change what appears inside notes Breaking Changes# The old FilterBar UI has been removed—all filtering and saved views live in .base files Legacy widget settings (showProjectSubtasks, showTaskDependencies, etc.) were replaced with showRelationships and relationshipsPosition Task view commands now fail if their mapped .base file is missing; configure paths under Settings → TaskNotes → General → View Commands Priority sorting now uses alphabetical order instead of custom weights In v3, TaskNotes used priority \"weights\" to determine sort order (higher weight = higher priority) In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value The weight field has been removed from the settings UI Workaround: Name your priority values to sort alphabetically in your desired order Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Agenda view has been replaced by the list view in Calendar Grouping is not supported in this view, so the \"Overdue\" group is no longer provided A separate \"Overdue\" view is available in the \"Task List\" base file Known Issues# Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views Details# Added# Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create) Kanban Swimlane Layout with horizontal grouping and configurable column widths Saved View Converter button in settings to convert v3 saved filter views to .base files Context menus for time entries and ICS events in calendar views Calendar icon to ICS event titles for better visual distinction Hover tooltips for timeblocks in calendar views MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution Configurable task modal fields with drag-and-drop reordering in new \"Modal Fields\" settings tab Rich markdown editor for NLP task creation with syntax highlighting and wikilink support Customizable NLP triggers with autocomplete and keyboard navigation Inline task link overlay enhancements with configurable visible properties Kanban column reordering via drag and drop with saved order per grouping property Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs Updated task card styling with improved hover effects, shadows, and gradient accents (#361) Completion-based recurrence support with recurrence_anchor field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Support for skipped recurrence instances with skipped_instances field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups Documentation for default Bases templates showing all default .base file templates with examples Changed# All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with .base files Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling Reorganized settings tabs with OAuth calendar settings in Integrations tab Refactored Bases integration to use public API and trust pre-sorted data Refactored calendar modules to use ES6 imports instead of lazy require() calls Time entry events now show task context menu on right-click Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data Completed internationalization with 100% translation coverage across all 6 supported languages Migrated to i18n-state-manager CLI tool for improved translation management Bases view templates now generate dynamically based on user settings with adaptive task filters Updated Bases CalendarView to show TaskNotes in property-based events NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage Simplified TaskCard interface and refactored TaskLinkWidget for consistency Settings UI enhancements with NLP triggers configurable through Features tab Refactored Bases views to use Component lifecycle properly with automatic cleanup Improved development experience by converting ESLint errors to warnings Renamed \"Advanced Calendar\" to \"Calendar\" throughout the UI Improved timeblock visual styling in calendar views with reduced border width and softer shadows Updated \"Export All Views\" button to \"Export V3 Views\" to clarify it migrates v3 saved views Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys Changed default Tasks List template view order with \"All Tasks\" first and added \"Unscheduled\" view Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" - Thanks to @jack2game for reporting Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags Fixed Bases property mapping for user-configured field names Fixed Bases views not respecting user-configured visible properties Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot Fixed \"Highlight today\" toggle and calendar view type persistence in Bases Calendar view options (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata Fixed group collapse/expand functionality in TaskListView Fixed config loading race condition in KanbanView and CalendarView Fixed MiniCalendarView to use direct Bases API like other views (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings slider range Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting (#1133) Fixed empty priority columns not showing in Kanban view when \"Hide empty columns\" is disabled - Thanks to @luckb0x for reporting Fixed OAuth calendar cards showing \"Unknown account\" by removing non-functional Account field - Thanks to @Oblique for reporting Fixed incorrect Bases syntax in default template files with correct parameter naming Fixed incorrect Bases syntax in \"Export V3 Views\" feature with correct YAML structure (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting (#1043) Fixed inability to set \"at time of event\" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting (#1055) Fixed break sessions being logged as type: work when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting Fixed time entries not showing in calendar view for tasks without scheduled or due dates (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting (#1086) Fixed calendar \"+more\" popover showing white text on white background in dark mode - Thanks to @same774 for reporting (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Removed legacy FilterBar UI - all filtering now lives in .base files Removed legacy views"},{"route":"/obsidian/releases/4.0.2/","title":"TaskNotes 4.0.2","description":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have repor...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.2.md","namespace":"obsidian","relativePath":"releases/4.0.2.md","raw":"# TaskNotes 4.0.2\n\nThis release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks.\n\n## Added\n\n- Added \"Not Blocked\" view to default task list template\n - Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies)\n - Uses Bases `list.filter()` to check completion status of each blocking task\n - This new view can be accessed by regenerating the Task List view, or by copying the filters from the [default base templates documentation](https://tasknotes.dev/views/default-base-templates)\n\n## Fixed\n\n- (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration\n - Default Kanban template now automatically includes `groupBy` property set to status\n - Resolves \"Kanban requires a 'Group by' property to be configured\" error on first use\n - Users no longer need to manually configure grouping through the Sort menu\n - Thanks to @randomness42 and @seepage87 for reporting\n- Fixed user-defined custom fields appearing as `user:field_xxx` in generated base templates\n - Custom fields now use their actual property names (e.g., `effort` instead of `user:field_1761435303709`)\n - Ensures Bases can properly query user-defined properties\n - Also fixed `totalTrackedTime` to correctly map to the configured `timeEntries` property name\n- (#1145) Improved Kanban error message when no 'Group by' property is configured\n - Now includes instructions: \"Click the 'Sort' button and select a property under 'Group by'\"\n - Thanks to @randomness42 for the suggestion\n- (#1139, #1141) Fixed relationships widget not appearing in project notes\n - Project references are now resolved to full file paths when indexing\n - Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths\n - Restores v3.x behavior where subtasks appear in parent project notes\n - Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing\n- Fixed dependency blocking status to be status-aware\n - \"Blocked (x)\" pill now only appears when tasks have **incomplete** blocking dependencies\n - Tasks with all completed blocking dependencies no longer show as blocked\n- Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks\n - When a task is modified, only forward dependencies are cleared (stored in its frontmatter)\n - Reverse dependencies are preserved (stored in other tasks' frontmatter)\n\n## Changed\n\n- Removed custom TaskNotes icon from task modals\n - Task creation and edit modals now use Obsidian's standard title styling \n - Thanks to @kepano for the suggestion\n- Moved default base templates documentation to `docs/views/`\n - Location: `docs/views/default-base-templates.md`\n - Added cross-references to official Obsidian Bases documentation\n - Updated code comments to reference new documentation path\n- Fixed incorrect quote escaping in default base templates documentation\n - YAML examples now use proper single quotes for strings containing double quotes\n","aliases":["/releases/4.0.2/","/releases/4.0.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks.

\n

Added#

\n
    \n
  • Added "Not Blocked" view to default task list template
      \n
    • Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies)
    • \n
    • Uses Bases list.filter() to check completion status of each blocking task
    • \n
    • This new view can be accessed by regenerating the Task List view, or by copying the filters from the default base templates documentation
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration
      \n
    • Default Kanban template now automatically includes groupBy property set to status
    • \n
    • Resolves "Kanban requires a 'Group by' property to be configured" error on first use
    • \n
    • Users no longer need to manually configure grouping through the Sort menu
    • \n
    • Thanks to @randomness42 and @seepage87 for reporting
    • \n
    \n
  • \n
  • Fixed user-defined custom fields appearing as user:field_xxx in generated base templates
      \n
    • Custom fields now use their actual property names (e.g., effort instead of user:field_1761435303709)
    • \n
    • Ensures Bases can properly query user-defined properties
    • \n
    • Also fixed totalTrackedTime to correctly map to the configured timeEntries property name
    • \n
    \n
  • \n
  • (#1145) Improved Kanban error message when no 'Group by' property is configured
      \n
    • Now includes instructions: "Click the 'Sort' button and select a property under 'Group by'"
    • \n
    • Thanks to @randomness42 for the suggestion
    • \n
    \n
  • \n
  • (#1139, #1141) Fixed relationships widget not appearing in project notes
      \n
    • Project references are now resolved to full file paths when indexing
    • \n
    • Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths
    • \n
    • Restores v3.x behavior where subtasks appear in parent project notes
    • \n
    • Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing
    • \n
    \n
  • \n
  • Fixed dependency blocking status to be status-aware
      \n
    • "Blocked (x)" pill now only appears when tasks have incomplete blocking dependencies
    • \n
    • Tasks with all completed blocking dependencies no longer show as blocked
    • \n
    \n
  • \n
  • Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks
      \n
    • When a task is modified, only forward dependencies are cleared (stored in its frontmatter)
    • \n
    • Reverse dependencies are preserved (stored in other tasks' frontmatter)
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Removed custom TaskNotes icon from task modals
      \n
    • Task creation and edit modals now use Obsidian's standard title styling
    • \n
    • Thanks to @kepano for the suggestion
    • \n
    \n
  • \n
  • Moved default base templates documentation to docs/views/
      \n
    • Location: docs/views/default-base-templates.md
    • \n
    • Added cross-references to official Obsidian Bases documentation
    • \n
    • Updated code comments to reference new documentation path
    • \n
    \n
  • \n
  • Fixed incorrect quote escaping in default base templates documentation
      \n
    • YAML examples now use proper single quotes for strings containing double quotes
    • \n
    \n
  • \n
\n","text":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks. Added# Added \"Not Blocked\" view to default task list template Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies) Uses Bases list.filter() to check completion status of each blocking task This new view can be accessed by regenerating the Task List view, or by copying the filters from the default base templates documentation Fixed# (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration Default Kanban template now automatically includes groupBy property set to status Resolves \"Kanban requires a 'Group by' property to be configured\" error on first use Users no longer need to manually configure grouping through the Sort menu Thanks to @randomness42 and @seepage87 for reporting Fixed user-defined custom fields appearing as user:field_xxx in generated base templates Custom fields now use their actual property names (e.g., effort instead of user:field_1761435303709) Ensures Bases can properly query user-defined properties Also fixed totalTrackedTime to correctly map to the configured timeEntries property name (#1145) Improved Kanban error message when no 'Group by' property is configured Now includes instructions: \"Click the 'Sort' button and select a property under 'Group by'\" Thanks to @randomness42 for the suggestion (#1139, #1141) Fixed relationships widget not appearing in project notes Project references are now resolved to full file paths when indexing Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths Restores v3.x behavior where subtasks appear in parent project notes Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing Fixed dependency blocking status to be status-aware \"Blocked (x)\" pill now only appears when tasks have incomplete blocking dependencies Tasks with all completed blocking dependencies no longer show as blocked Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks When a task is modified, only forward dependencies are cleared (stored in its frontmatter) Reverse dependencies are preserved (stored in other tasks' frontmatter) Changed# Removed custom TaskNotes icon from task modals Task creation and edit modals now use Obsidian's standard title styling Thanks to @kepano for the suggestion Moved default base templates documentation to docs/views/ Location: docs/views/default-base-templates.md Added cross-references to official Obsidian Bases documentation Updated code comments to reference new documentation path Fixed incorrect quote escaping in default base templates documentation YAML examples now use proper single quotes for strings containing double quotes"},{"route":"/obsidian/releases/4.0.3/","title":"TaskNotes 4.0.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.3.md","namespace":"obsidian","relativePath":"releases/4.0.3.md","raw":"# TaskNotes 4.0.3\n\n## Fixed\n\n- (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists\n - Changed inline task cards to use span elements instead of divs for proper inline flow\n - Added max-width constraint to prevent wrapping when tasks are wider than editor\n - Task embeds now display correctly inline with bullet points during live preview\n - Thanks to @3zra47 for reporting\n- (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar\n - Thanks to @DearHaruHaru for reporting\n- (#1161, #1162) Fixed \"unexpected scalar\" YAML parsing error in generated tasks-default.base template\n - Changed nested quotes in \"Not Blocked\" filter from double to single quotes\n - Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix\n\n## Changed\n\n- Updated task modal UI to use native Obsidian patterns for better theme compatibility\n - Thanks to @kepano for feedback\n\n","aliases":["/releases/4.0.3/","/releases/4.0.3/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists
      \n
    • Changed inline task cards to use span elements instead of divs for proper inline flow
    • \n
    • Added max-width constraint to prevent wrapping when tasks are wider than editor
    • \n
    • Task embeds now display correctly inline with bullet points during live preview
    • \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar
      \n
    • Thanks to @DearHaruHaru for reporting
    • \n
    \n
  • \n
  • (#1161, #1162) Fixed "unexpected scalar" YAML parsing error in generated tasks-default.base template
      \n
    • Changed nested quotes in "Not Blocked" filter from double to single quotes
    • \n
    • Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Updated task modal UI to use native Obsidian patterns for better theme compatibility
      \n
    • Thanks to @kepano for feedback
    • \n
    \n
  • \n
\n","text":"Fixed# (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists Changed inline task cards to use span elements instead of divs for proper inline flow Added max-width constraint to prevent wrapping when tasks are wider than editor Task embeds now display correctly inline with bullet points during live preview Thanks to @3zra47 for reporting (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar Thanks to @DearHaruHaru for reporting (#1161, #1162) Fixed \"unexpected scalar\" YAML parsing error in generated tasks-default.base template Changed nested quotes in \"Not Blocked\" filter from double to single quotes Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix Changed# Updated task modal UI to use native Obsidian patterns for better theme compatibility Thanks to @kepano for feedback"},{"route":"/obsidian/releases/4.0.4/","title":"TaskNotes 4.0.4","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.4.md","namespace":"obsidian","relativePath":"releases/4.0.4.md","raw":"# TaskNotes 4.0.4\n\n## Added\n\n- (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals\n - Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals\n - Thanks to @luckb0x, @hamlim and @nightroman for the feature requests\n\n## Fixed\n\n- (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks\n - Prevents cards from extending beyond column boundaries before virtualization activates\n - Thanks to @lomarcanys for reporting\n- (#1177) Bases views now anchor recurring completion and calendar navigation to the right date\n - Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of \"today\" (fixes complete_instances)\n - Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps\n - Thanks to @nslee123 for flagging the issue\n- Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day\n - Corrected all-day end date calculation to prevent off-by-one spans\n - Added regression test for the UTC anchor behavior\n - Thanks to KaCii for [flagging the issue](https://discord.com/channels/686053708261228577/1433165116702199880/1439757826380660767)\n\n## Changed\n\n- Refactored plugin styling to better align with Obsidian's native UI conventions\n - Replaced all `cursor: pointer` with `cursor: var(--cursor)` (100+ instances) to follow Obsidian's cursor convention\n - Removed forced `border: none; box-shadow: none` rules that were fighting against Obsidian's native button styling\n - Scoped custom `.tn-btn` button system to settings modal only (`.mod-settings`), allowing Obsidian's native button styles to work elsewhere\n - Thanks to @kepano for guidance\n","aliases":["/releases/4.0.4/","/releases/4.0.4/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Added#

\n
    \n
  • (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals
      \n
    • Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals
    • \n
    • Thanks to @luckb0x, @hamlim and @nightroman for the feature requests
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks
      \n
    • Prevents cards from extending beyond column boundaries before virtualization activates
    • \n
    • Thanks to @lomarcanys for reporting
    • \n
    \n
  • \n
  • (#1177) Bases views now anchor recurring completion and calendar navigation to the right date
      \n
    • Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of "today" (fixes complete_instances)
    • \n
    • Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps
    • \n
    • Thanks to @nslee123 for flagging the issue
    • \n
    \n
  • \n
  • Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day
      \n
    • Corrected all-day end date calculation to prevent off-by-one spans
    • \n
    • Added regression test for the UTC anchor behavior
    • \n
    • Thanks to KaCii for flagging the issue
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Refactored plugin styling to better align with Obsidian's native UI conventions
      \n
    • Replaced all cursor: pointer with cursor: var(--cursor) (100+ instances) to follow Obsidian's cursor convention
    • \n
    • Removed forced border: none; box-shadow: none rules that were fighting against Obsidian's native button styling
    • \n
    • Scoped custom .tn-btn button system to settings modal only (.mod-settings), allowing Obsidian's native button styles to work elsewhere
    • \n
    • Thanks to @kepano for guidance
    • \n
    \n
  • \n
\n","text":"Added# (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals Thanks to @luckb0x, @hamlim and @nightroman for the feature requests Fixed# (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks Prevents cards from extending beyond column boundaries before virtualization activates Thanks to @lomarcanys for reporting (#1177) Bases views now anchor recurring completion and calendar navigation to the right date Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of \"today\" (fixes complete_instances) Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps Thanks to @nslee123 for flagging the issue Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day Corrected all-day end date calculation to prevent off-by-one spans Added regression test for the UTC anchor behavior Thanks to KaCii for flagging the issue Changed# Refactored plugin styling to better align with Obsidian's native UI conventions Replaced all cursor: pointer with cursor: var(--cursor) (100+ instances) to follow Obsidian's cursor convention Removed forced border: none; box-shadow: none rules that were fighting against Obsidian's native button styling Scoped custom .tn-btn button system to settings modal only (.mod-settings), allowing Obsidian's native button styles to work elsewhere Thanks to @kepano for guidance"},{"route":"/obsidian/releases/4.0.5/","title":"TaskNotes 4.0.5","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.5.md","namespace":"obsidian","relativePath":"releases/4.0.5.md","raw":"# TaskNotes 4.0.5\n\n## Changed\n\n- (#790) Task edit modal now shows unresolved project links with appropriate styling\n\t- Similar to how dependencies are displayed, unresolved projects now appear with visual indication\n\t- Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved\n\t- Thanks to @aubreyz for reporting\n\n## Fixed\n\n- (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks\n\t- Project index was incorrectly adding all linked files instead of only files referenced in the projects field\n\t- Now properly parses the projects field and only indexes those specific files as projects\n\t- Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution\n\t- Thanks to @craziedde for reporting\n- (#1200) Fixed kanban drag & drop not updating task properties correctly\n\t- Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks)\n\t- Previously, kanban updates bypassed `updateProperty` and directly modified frontmatter\n\t- Thanks very much to @tvoklov for the PR\n- (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries\n\t- Configure CodeMirror tooltips to render in document.body instead of constrained editor container\n\t- Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height\n\t- Thanks to @Andrei-Ioda for reporting\n- (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor\n\t- Remove padding-left override on `.cm-line` to allow CodeMirror decorations (checkboxes, indentation) to render properly\n\t- Content padding is now handled by `.cm-content` while `.cm-line` uses natural spacing\n\t- Thanks to @nightroman for reporting\n- Fixed relationships widget not appearing on project notes without frontmatter\n\t- Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter\n- Fixed task card and relationships widgets not appearing when opening notes in source mode\n\t- Removed live preview mode restriction to allow widgets to render in both source and live preview modes\n- (#901) Fixed calendar view toolbar buttons overflowing on narrow screens\n - Added `flex-wrap: wrap` to calendar header toolbar to allow buttons to wrap to multiple lines\n - Thanks to @RumiaKitinari for reporting\n- (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings\n\t- Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences\n\t- Calendar view initialization now correctly uses `plugin.settings.calendarViewSettings` as the fallback\n\t- Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting \n- Fixed calendar to ensure that it respects user's locale\n - Tries to use calendar locale, then tries UI language, then system language, then falls back to English\n- (#1043) Fixed default reminders with \"at time of event\" (0 offset) not being applied to tasks\n\t- UI was displaying \"1\" instead of \"0\" for zero-offset reminders in settings\n\t- Thanks to @dblinnikov for reporting\n- (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords\n\t- Manually typing status trigger + label now correctly parses (e.g., `*Done` when label is `Done`)\n\t- Status values containing temporal keywords no longer misparsed as dates (e.g., `Expedite = Now`)\n\t- Thanks very much to @renatomen for the PR\n- (#1212) Fixed \"Show release notes on update\" toggle not saving correctly\n - Thanks to @Jon-dog for reporting\n- (#1197) Add Portuguese language to list of translations in general tab settings\n - Allows users to select the Portuguese translation option\n - Thanks to @andysteel for the PR\n- Fixed file properties displaying incorrectly in Bases views\n\t- File properties like `file.name`, `file.basename`, `file.size`, etc. were showing as \"Title\" or returning null\n\t- Now correctly extracts and displays all file properties from Obsidian's file metadata\n\t- Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)\n","aliases":["/releases/4.0.5/","/releases/4.0.5/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • (#790) Task edit modal now shows unresolved project links with appropriate styling
      \n
    • Similar to how dependencies are displayed, unresolved projects now appear with visual indication
    • \n
    • Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved
    • \n
    • Thanks to @aubreyz for reporting
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks
      \n
    • Project index was incorrectly adding all linked files instead of only files referenced in the projects field
    • \n
    • Now properly parses the projects field and only indexes those specific files as projects
    • \n
    • Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution
    • \n
    • Thanks to @craziedde for reporting
    • \n
    \n
  • \n
  • (#1200) Fixed kanban drag & drop not updating task properties correctly
      \n
    • Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks)
    • \n
    • Previously, kanban updates bypassed updateProperty and directly modified frontmatter
    • \n
    • Thanks very much to @tvoklov for the PR
    • \n
    \n
  • \n
  • (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries
      \n
    • Configure CodeMirror tooltips to render in document.body instead of constrained editor container
    • \n
    • Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height
    • \n
    • Thanks to @Andrei-Ioda for reporting
    • \n
    \n
  • \n
  • (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor
      \n
    • Remove padding-left override on .cm-line to allow CodeMirror decorations (checkboxes, indentation) to render properly
    • \n
    • Content padding is now handled by .cm-content while .cm-line uses natural spacing
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
  • Fixed relationships widget not appearing on project notes without frontmatter
      \n
    • Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter
    • \n
    \n
  • \n
  • Fixed task card and relationships widgets not appearing when opening notes in source mode
      \n
    • Removed live preview mode restriction to allow widgets to render in both source and live preview modes
    • \n
    \n
  • \n
  • (#901) Fixed calendar view toolbar buttons overflowing on narrow screens
      \n
    • Added flex-wrap: wrap to calendar header toolbar to allow buttons to wrap to multiple lines
    • \n
    • Thanks to @RumiaKitinari for reporting
    • \n
    \n
  • \n
  • (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings
      \n
    • Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences
    • \n
    • Calendar view initialization now correctly uses plugin.settings.calendarViewSettings as the fallback
    • \n
    • Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting
    • \n
    \n
  • \n
  • Fixed calendar to ensure that it respects user's locale
      \n
    • Tries to use calendar locale, then tries UI language, then system language, then falls back to English
    • \n
    \n
  • \n
  • (#1043) Fixed default reminders with "at time of event" (0 offset) not being applied to tasks
      \n
    • UI was displaying "1" instead of "0" for zero-offset reminders in settings
    • \n
    • Thanks to @dblinnikov for reporting
    • \n
    \n
  • \n
  • (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords
      \n
    • Manually typing status trigger + label now correctly parses (e.g., *Done when label is Done)
    • \n
    • Status values containing temporal keywords no longer misparsed as dates (e.g., Expedite = Now)
    • \n
    • Thanks very much to @renatomen for the PR
    • \n
    \n
  • \n
  • (#1212) Fixed "Show release notes on update" toggle not saving correctly
      \n
    • Thanks to @Jon-dog for reporting
    • \n
    \n
  • \n
  • (#1197) Add Portuguese language to list of translations in general tab settings
      \n
    • Allows users to select the Portuguese translation option
    • \n
    • Thanks to @andysteel for the PR
    • \n
    \n
  • \n
  • Fixed file properties displaying incorrectly in Bases views
      \n
    • File properties like file.name, file.basename, file.size, etc. were showing as "Title" or returning null
    • \n
    • Now correctly extracts and displays all file properties from Obsidian's file metadata
    • \n
    • Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)
    • \n
    \n
  • \n
\n","text":"Changed# (#790) Task edit modal now shows unresolved project links with appropriate styling Similar to how dependencies are displayed, unresolved projects now appear with visual indication Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved Thanks to @aubreyz for reporting Fixed# (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks Project index was incorrectly adding all linked files instead of only files referenced in the projects field Now properly parses the projects field and only indexes those specific files as projects Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution Thanks to @craziedde for reporting (#1200) Fixed kanban drag & drop not updating task properties correctly Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks) Previously, kanban updates bypassed updateProperty and directly modified frontmatter Thanks very much to @tvoklov for the PR (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries Configure CodeMirror tooltips to render in document.body instead of constrained editor container Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height Thanks to @Andrei-Ioda for reporting (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor Remove padding-left override on .cm-line to allow CodeMirror decorations (checkboxes, indentation) to render properly Content padding is now handled by .cm-content while .cm-line uses natural spacing Thanks to @nightroman for reporting Fixed relationships widget not appearing on project notes without frontmatter Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter Fixed task card and relationships widgets not appearing when opening notes in source mode Removed live preview mode restriction to allow widgets to render in both source and live preview modes (#901) Fixed calendar view toolbar buttons overflowing on narrow screens Added flex-wrap: wrap to calendar header toolbar to allow buttons to wrap to multiple lines Thanks to @RumiaKitinari for reporting (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences Calendar view initialization now correctly uses plugin.settings.calendarViewSettings as the fallback Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting Fixed calendar to ensure that it respects user's locale Tries to use calendar locale, then tries UI language, then system language, then falls back to English (#1043) Fixed default reminders with \"at time of event\" (0 offset) not being applied to tasks UI was displaying \"1\" instead of \"0\" for zero-offset reminders in settings Thanks to @dblinnikov for reporting (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords Manually typing status trigger + label now correctly parses (e.g., *Done when label is Done) Status values containing temporal keywords no longer misparsed as dates (e.g., Expedite = Now) Thanks very much to @renatomen for the PR (#1212) Fixed \"Show release notes on update\" toggle not saving correctly Thanks to @Jon-dog for reporting (#1197) Add Portuguese language to list of translations in general tab settings Allows users to select the Portuguese translation option Thanks to @andysteel for the PR Fixed file properties displaying incorrectly in Bases views File properties like file.name, file.basename, file.size, etc. were showing as \"Title\" or returning null Now correctly extracts and displays all file properties from Obsidian's file metadata Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)"},{"route":"/obsidian/releases/4.1.0/","title":"TaskNotes 4.1.0","description":"(#1245), (#793) Added custom icon support for task statuses","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.0.md","namespace":"obsidian","relativePath":"releases/4.1.0.md","raw":"# TaskNotes 4.1.0\n\n## Added\n\n- (#1245), (#793) Added custom icon support for task statuses\n - Configure a Lucide icon name (e.g., `check`, `circle`, `clock`) per status in Settings → Task Properties → Task Statuses\n - Icons display instead of the colored dot, inheriting the status color\n - Browse available icons at [lucide.dev](https://lucide.dev)\n - Improves accessibility by allowing shape-based status differentiation\n - Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators\n\n- (#1259) Added [Property Types Reference](../settings/property-types-reference.md) documentation\n - Documents expected data types (text, list, date, number) for all frontmatter properties\n - Includes format specifications, examples, and a complete YAML reference\n - Thanks to @Oblique82 for the suggestion\n\n- (#1248) Added formula property support for sub-grouping in Bases Task List view\n - Formula properties (e.g., `formula.myFormula`) now appear in the Sub-group by dropdown\n - Supports all Bases Value types including strings, numbers, booleans, dates, and lists\n - Thanks to @prayidae for the feature request\n\n- (#1070) Added formula property support for swimlanes in Bases Kanban view\n - Formula properties now appear in the Swim Lane dropdown\n - Fixed swimlanes displaying empty when grouping by formula properties\n - Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values)\n - Thanks to @cathywu for reporting\n\n- (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views\n - Shift+click to select multiple tasks\n - Right-click selected tasks to open batch context menu\n - Batch operations: change status, priority, due date, scheduled date, archive, delete\n - Drag multiple selected cards in Kanban to move them together\n - Click the selection count indicator to clear selection\n - Thanks to @jalooc and @solidabstract for the feature requests\n\n- (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar)\n - Enable via \"Enable search box\" toggle in view settings\n - Searches across title, status, priority, tags, contexts, projects, and visible custom properties\n - Press Escape or click × to clear search\n - Thanks to @renatomen for the PR\n\n- (#363) Added \"Create or open task\" command with NLP-based quick task creation\n - Open via command palette or assign a hotkey\n - Search existing tasks or type natural language to create new tasks (e.g., \"Buy groceries tomorrow #shopping\")\n - Press Enter to select an existing task, Shift+Enter to create a new task\n - Real-time preview shows parsed title, due date, priority, tags, and other metadata\n - Can be used when adding sub-tasks to create sub-tasks on-the-fly\n - Thanks to @luciolebrillante for the feature request\n\n- (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal\n - Detects modifications to any field (title, dates, priority, tags, etc.)\n - Shows confirmation dialog with Save/Discard/Keep Editing options\n - Prevents accidental data loss from clicking outside the modal or pressing Escape\n - Thanks to @renatomen for the PR and @0-BSCode for the feature request\n\n- (#904) Added visual highlighting for overdue and past dates on task cards\n - Overdue due dates now display in red text\n - Past scheduled dates now display in blue text\n - Thanks to @ras0q for the suggestion\n\n- (#1164) Added `priorityWeight` formula to all default Bases templates for priority-based sorting\n - Formula maps each priority value to a numeric weight based on your custom priority configuration\n - Sort by `formula.priorityWeight` in ascending order to get highest priority tasks first\n - Example: `if(priority==\"high\",0,if(priority==\"normal\",1,if(priority==\"low\",2,999)))`\n - Thanks to @jhedlund for the suggestion\n\n- (#1257), (#1064) Added configurable event stacking options for Bases Calendar view\n - **Allow events to overlap**: Toggle whether timed events visually overlap or display side-by-side in week/day views\n - **Max stacked events**: Limit horizontal event stacking in week/day views (0 = unlimited)\n - **Max events per day**: Limit events shown per day cell in month view (0 = auto based on cell height)\n - **Max event rows per day**: Limit event rows per day cell in month view (0 = unlimited)\n - Configure per-view in the Bases Calendar view settings under Layout\n - Thanks to @3zra47 and @hasanyilmaz for the feature requests\n\n## Changed\n\n- Improved inline task conversion to merge TasksPlugin and NLP parsing results\n - Previously, if a task had hashtags (e.g., `- [ ] Buy milk tomorrow #groceries`), NLP parsing was skipped entirely\n - Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata\n - TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values\n - Tags, contexts, and projects from both sources are combined and deduplicated\n\n- Polished task card styling for a more native Obsidian look\n - Simplified hover and focus states to use native Obsidian colors\n - Removed blur filter and shadows from metadata pills\n - Fixed subtask chevron vertical alignment with status dot\n - Reduced swimlane label column width in Kanban view\n\n- (#1151) Increased mini calendar heatmap color intensity for better visibility\n - Days with notes now show more noticeable colors, especially with low note counts\n - Intensity levels increased from 10/25/45/65% to 25/40/55/70%\n - Thanks to @arreme for the suggestion\n\n## Fixed\n\n- (#1271) Fixed custom user fields not appearing in task modals after creation\n - New custom fields are now automatically added to both creation and edit modals\n - Deleting a custom field also removes it from modal configuration\n - Updating a field's display name syncs to the modal configuration\n - Thanks to @craziedde for reporting\n\n- (#1256) Fixed links in custom properties not rendering as clickable in task cards\n - Wikilinks (`[[Note]]`) now render correctly in Bases views\n - Markdown links (`[text](url)`) now render correctly in all views\n - Links in list-type properties are also properly rendered\n - Thanks to @3zra47 for reporting\n\n- (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists\n - Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line\n - Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed\n - Thanks to @3zra47 for reporting\n\n- (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist\n - Thanks to @Anthonyhunter100 for reporting\n\n- (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column\n - Tasks with multiple values now appear in each individual column (e.g., a task with `contexts: [work, call]` appears in both \"work\" and \"call\" columns)\n - Added \"Show items in multiple columns\" option (enabled by default) to control this behavior\n - Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list\n - Fixed swimlane mode to also respect list property explosion\n - Thanks to @dictionarymouse for reporting\n\n- (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs\n - Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab\n - Added middle-click support for opening in new tab\n - Thanks to @diegomarzaa for reporting\n\n- (#1265) Fixed task edit modal corrupting markdown-style project links on save\n - Links like `[Project Name](path.md)` were being wrapped in extra brackets: `[[[Project Name](path.md)]]`\n - Plain text project names are now preserved as-is instead of being converted to wikilinks\n - Markdown-style project links now resolve properly and display as linked (not orange/unresolved)\n - Thanks to @minchinweb for reporting\n\n- (#1266) Fixed Kanban view scroll position resetting to top of column after any change\n - Clicking status dots, priority, or other task properties no longer jumps the column back to top\n - Scroll position is now preserved for both regular columns and swimlane cells\n - Thanks to @essouflenfer for reporting\n\n- (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects\n - Tags like `#investigación` were being truncated at accented characters (e.g., `#investigaci`)\n - Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., `@家`, `#杂事`, `@ознакомиться`)\n - Parser now uses Unicode-aware regex patterns to support all languages and scripts\n - Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting\n\n- (#1249) Fixed project preview in task creation modal showing quadruple brackets (`[[[[Project]]]]`)\n - Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display\n - Thanks to @2vzqwz8tvg-png for reporting\n\n- (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive\n - Priority cards are now draggable to reorder (like statuses)\n - Priorities are displayed in weight order (lowest to highest priority)\n - New priorities are added at the end (highest priority) instead of with a fixed weight\n - Thanks to @2vzqwz8tvg-png for reporting\n\n- (#1272) Fixed recurrence anchor not being saved when set to \"completion\" during task creation\n - Selecting \"completion\" as the recurrence anchor now correctly persists to the task frontmatter\n - Thanks to @blaxcky for reporting\n\n- (#1128) Fixed NLP parser not allowing slashes in context names\n - Contexts like `@shopping/groceries` were being split into `@shopping` and `/groceries`\n - Hierarchical context names now work the same as tags and projects\n - Thanks to @wealthychef1 for reporting\n\n- (#1170) Fixed `dateCreated` and `dateModified` not using custom property names when creating notes from calendar events\n - Notes created from ICS events now respect the field mapping configured in settings\n - Thanks to @maddie-m for reporting\n\n- (#1171) Fixed calendar event toggles not responding to changes after initial load\n - Toggling \"Show scheduled tasks\", \"Show due tasks\", and other event filters now correctly updates the calendar\n - Previously, changing these toggles had no effect until the view was reloaded\n - Thanks to @hangryscribe3 for reporting\n\n- (#1198) Fixed project links being created relative to the wrong file when editing from Bases views\n - Relative paths in project links are now correctly resolved relative to the task note file\n - Previously, editing a task from a Bases view would create project links relative to the `.base` file\n - Thanks to @minchinweb for reporting\n\n","aliases":["/releases/4.1.0/","/releases/4.1.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1245), (#793) Added custom icon support for task statuses

    \n
      \n
    • Configure a Lucide icon name (e.g., check, circle, clock) per status in Settings → Task Properties → Task Statuses
    • \n
    • Icons display instead of the colored dot, inheriting the status color
    • \n
    • Browse available icons at lucide.dev
    • \n
    • Improves accessibility by allowing shape-based status differentiation
    • \n
    • Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators
    • \n
    \n
  • \n
  • (#1259) Added Property Types Reference documentation

    \n
      \n
    • Documents expected data types (text, list, date, number) for all frontmatter properties
    • \n
    • Includes format specifications, examples, and a complete YAML reference
    • \n
    • Thanks to @Oblique82 for the suggestion
    • \n
    \n
  • \n
  • (#1248) Added formula property support for sub-grouping in Bases Task List view

    \n
      \n
    • Formula properties (e.g., formula.myFormula) now appear in the Sub-group by dropdown
    • \n
    • Supports all Bases Value types including strings, numbers, booleans, dates, and lists
    • \n
    • Thanks to @prayidae for the feature request
    • \n
    \n
  • \n
  • (#1070) Added formula property support for swimlanes in Bases Kanban view

    \n
      \n
    • Formula properties now appear in the Swim Lane dropdown
    • \n
    • Fixed swimlanes displaying empty when grouping by formula properties
    • \n
    • Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values)
    • \n
    • Thanks to @cathywu for reporting
    • \n
    \n
  • \n
  • (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views

    \n
      \n
    • Shift+click to select multiple tasks
    • \n
    • Right-click selected tasks to open batch context menu
    • \n
    • Batch operations: change status, priority, due date, scheduled date, archive, delete
    • \n
    • Drag multiple selected cards in Kanban to move them together
    • \n
    • Click the selection count indicator to clear selection
    • \n
    • Thanks to @jalooc and @solidabstract for the feature requests
    • \n
    \n
  • \n
  • (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar)

    \n
      \n
    • Enable via "Enable search box" toggle in view settings
    • \n
    • Searches across title, status, priority, tags, contexts, projects, and visible custom properties
    • \n
    • Press Escape or click × to clear search
    • \n
    • Thanks to @renatomen for the PR
    • \n
    \n
  • \n
  • (#363) Added "Create or open task" command with NLP-based quick task creation

    \n
      \n
    • Open via command palette or assign a hotkey
    • \n
    • Search existing tasks or type natural language to create new tasks (e.g., "Buy groceries tomorrow #shopping")
    • \n
    • Press Enter to select an existing task, Shift+Enter to create a new task
    • \n
    • Real-time preview shows parsed title, due date, priority, tags, and other metadata
    • \n
    • Can be used when adding sub-tasks to create sub-tasks on-the-fly
    • \n
    • Thanks to @luciolebrillante for the feature request
    • \n
    \n
  • \n
  • (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal

    \n
      \n
    • Detects modifications to any field (title, dates, priority, tags, etc.)
    • \n
    • Shows confirmation dialog with Save/Discard/Keep Editing options
    • \n
    • Prevents accidental data loss from clicking outside the modal or pressing Escape
    • \n
    • Thanks to @renatomen for the PR and @0-BSCode for the feature request
    • \n
    \n
  • \n
  • (#904) Added visual highlighting for overdue and past dates on task cards

    \n
      \n
    • Overdue due dates now display in red text
    • \n
    • Past scheduled dates now display in blue text
    • \n
    • Thanks to @ras0q for the suggestion
    • \n
    \n
  • \n
  • (#1164) Added priorityWeight formula to all default Bases templates for priority-based sorting

    \n
      \n
    • Formula maps each priority value to a numeric weight based on your custom priority configuration
    • \n
    • Sort by formula.priorityWeight in ascending order to get highest priority tasks first
    • \n
    • Example: if(priority=="high",0,if(priority=="normal",1,if(priority=="low",2,999)))
    • \n
    • Thanks to @jhedlund for the suggestion
    • \n
    \n
  • \n
  • (#1257), (#1064) Added configurable event stacking options for Bases Calendar view

    \n
      \n
    • Allow events to overlap: Toggle whether timed events visually overlap or display side-by-side in week/day views
    • \n
    • Max stacked events: Limit horizontal event stacking in week/day views (0 = unlimited)
    • \n
    • Max events per day: Limit events shown per day cell in month view (0 = auto based on cell height)
    • \n
    • Max event rows per day: Limit event rows per day cell in month view (0 = unlimited)
    • \n
    • Configure per-view in the Bases Calendar view settings under Layout
    • \n
    • Thanks to @3zra47 and @hasanyilmaz for the feature requests
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Improved inline task conversion to merge TasksPlugin and NLP parsing results

    \n
      \n
    • Previously, if a task had hashtags (e.g., - [ ] Buy milk tomorrow #groceries), NLP parsing was skipped entirely
    • \n
    • Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata
    • \n
    • TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values
    • \n
    • Tags, contexts, and projects from both sources are combined and deduplicated
    • \n
    \n
  • \n
  • Polished task card styling for a more native Obsidian look

    \n
      \n
    • Simplified hover and focus states to use native Obsidian colors
    • \n
    • Removed blur filter and shadows from metadata pills
    • \n
    • Fixed subtask chevron vertical alignment with status dot
    • \n
    • Reduced swimlane label column width in Kanban view
    • \n
    \n
  • \n
  • (#1151) Increased mini calendar heatmap color intensity for better visibility

    \n
      \n
    • Days with notes now show more noticeable colors, especially with low note counts
    • \n
    • Intensity levels increased from 10/25/45/65% to 25/40/55/70%
    • \n
    • Thanks to @arreme for the suggestion
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1271) Fixed custom user fields not appearing in task modals after creation

    \n
      \n
    • New custom fields are now automatically added to both creation and edit modals
    • \n
    • Deleting a custom field also removes it from modal configuration
    • \n
    • Updating a field's display name syncs to the modal configuration
    • \n
    • Thanks to @craziedde for reporting
    • \n
    \n
  • \n
  • (#1256) Fixed links in custom properties not rendering as clickable in task cards

    \n
      \n
    • Wikilinks ([[Note]]) now render correctly in Bases views
    • \n
    • Markdown links ([text](url)) now render correctly in all views
    • \n
    • Links in list-type properties are also properly rendered
    • \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists

    \n
      \n
    • Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line
    • \n
    • Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed
    • \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist

    \n
      \n
    • Thanks to @Anthonyhunter100 for reporting
    • \n
    \n
  • \n
  • (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column

    \n
      \n
    • Tasks with multiple values now appear in each individual column (e.g., a task with contexts: [work, call] appears in both "work" and "call" columns)
    • \n
    • Added "Show items in multiple columns" option (enabled by default) to control this behavior
    • \n
    • Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list
    • \n
    • Fixed swimlane mode to also respect list property explosion
    • \n
    • Thanks to @dictionarymouse for reporting
    • \n
    \n
  • \n
  • (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs

    \n
      \n
    • Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab
    • \n
    • Added middle-click support for opening in new tab
    • \n
    • Thanks to @diegomarzaa for reporting
    • \n
    \n
  • \n
  • (#1265) Fixed task edit modal corrupting markdown-style project links on save

    \n
      \n
    • Links like [Project Name](path.md) were being wrapped in extra brackets: [[[Project Name](path.md)]]
    • \n
    • Plain text project names are now preserved as-is instead of being converted to wikilinks
    • \n
    • Markdown-style project links now resolve properly and display as linked (not orange/unresolved)
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#1266) Fixed Kanban view scroll position resetting to top of column after any change

    \n
      \n
    • Clicking status dots, priority, or other task properties no longer jumps the column back to top
    • \n
    • Scroll position is now preserved for both regular columns and swimlane cells
    • \n
    • Thanks to @essouflenfer for reporting
    • \n
    \n
  • \n
  • (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects

    \n
      \n
    • Tags like #investigación were being truncated at accented characters (e.g., #investigaci)
    • \n
    • Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., @家, #杂事, @ознакомиться)
    • \n
    • Parser now uses Unicode-aware regex patterns to support all languages and scripts
    • \n
    • Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting
    • \n
    \n
  • \n
  • (#1249) Fixed project preview in task creation modal showing quadruple brackets ([[[[Project]]]])

    \n
      \n
    • Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display
    • \n
    • Thanks to @2vzqwz8tvg-png for reporting
    • \n
    \n
  • \n
  • (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive

    \n
      \n
    • Priority cards are now draggable to reorder (like statuses)
    • \n
    • Priorities are displayed in weight order (lowest to highest priority)
    • \n
    • New priorities are added at the end (highest priority) instead of with a fixed weight
    • \n
    • Thanks to @2vzqwz8tvg-png for reporting
    • \n
    \n
  • \n
  • (#1272) Fixed recurrence anchor not being saved when set to "completion" during task creation

    \n
      \n
    • Selecting "completion" as the recurrence anchor now correctly persists to the task frontmatter
    • \n
    • Thanks to @blaxcky for reporting
    • \n
    \n
  • \n
  • (#1128) Fixed NLP parser not allowing slashes in context names

    \n
      \n
    • Contexts like @shopping/groceries were being split into @shopping and /groceries
    • \n
    • Hierarchical context names now work the same as tags and projects
    • \n
    • Thanks to @wealthychef1 for reporting
    • \n
    \n
  • \n
  • (#1170) Fixed dateCreated and dateModified not using custom property names when creating notes from calendar events

    \n
      \n
    • Notes created from ICS events now respect the field mapping configured in settings
    • \n
    • Thanks to @maddie-m for reporting
    • \n
    \n
  • \n
  • (#1171) Fixed calendar event toggles not responding to changes after initial load

    \n
      \n
    • Toggling "Show scheduled tasks", "Show due tasks", and other event filters now correctly updates the calendar
    • \n
    • Previously, changing these toggles had no effect until the view was reloaded
    • \n
    • Thanks to @hangryscribe3 for reporting
    • \n
    \n
  • \n
  • (#1198) Fixed project links being created relative to the wrong file when editing from Bases views

    \n
      \n
    • Relative paths in project links are now correctly resolved relative to the task note file
    • \n
    • Previously, editing a task from a Bases view would create project links relative to the .base file
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
\n","text":"Added# (#1245), (#793) Added custom icon support for task statuses Configure a Lucide icon name (e.g., check, circle, clock) per status in Settings → Task Properties → Task Statuses Icons display instead of the colored dot, inheriting the status color Browse available icons at lucide.dev Improves accessibility by allowing shape-based status differentiation Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators (#1259) Added Property Types Reference documentation Documents expected data types (text, list, date, number) for all frontmatter properties Includes format specifications, examples, and a complete YAML reference Thanks to @Oblique82 for the suggestion (#1248) Added formula property support for sub-grouping in Bases Task List view Formula properties (e.g., formula.myFormula) now appear in the Sub-group by dropdown Supports all Bases Value types including strings, numbers, booleans, dates, and lists Thanks to @prayidae for the feature request (#1070) Added formula property support for swimlanes in Bases Kanban view Formula properties now appear in the Swim Lane dropdown Fixed swimlanes displaying empty when grouping by formula properties Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values) Thanks to @cathywu for reporting (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views Shift+click to select multiple tasks Right-click selected tasks to open batch context menu Batch operations: change status, priority, due date, scheduled date, archive, delete Drag multiple selected cards in Kanban to move them together Click the selection count indicator to clear selection Thanks to @jalooc and @solidabstract for the feature requests (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar) Enable via \"Enable search box\" toggle in view settings Searches across title, status, priority, tags, contexts, projects, and visible custom properties Press Escape or click × to clear search Thanks to @renatomen for the PR (#363) Added \"Create or open task\" command with NLP-based quick task creation Open via command palette or assign a hotkey Search existing tasks or type natural language to create new tasks (e.g., \"Buy groceries tomorrow #shopping\") Press Enter to select an existing task, Shift+Enter to create a new task Real-time preview shows parsed title, due date, priority, tags, and other metadata Can be used when adding sub-tasks to create sub-tasks on-the-fly Thanks to @luciolebrillante for the feature request (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal Detects modifications to any field (title, dates, priority, tags, etc.) Shows confirmation dialog with Save/Discard/Keep Editing options Prevents accidental data loss from clicking outside the modal or pressing Escape Thanks to @renatomen for the PR and @0-BSCode for the feature request (#904) Added visual highlighting for overdue and past dates on task cards Overdue due dates now display in red text Past scheduled dates now display in blue text Thanks to @ras0q for the suggestion (#1164) Added priorityWeight formula to all default Bases templates for priority-based sorting Formula maps each priority value to a numeric weight based on your custom priority configuration Sort by formula.priorityWeight in ascending order to get highest priority tasks first Example: if(priority==\"high\",0,if(priority==\"normal\",1,if(priority==\"low\",2,999))) Thanks to @jhedlund for the suggestion (#1257), (#1064) Added configurable event stacking options for Bases Calendar view Allow events to overlap: Toggle whether timed events visually overlap or display side-by-side in week/day views Max stacked events: Limit horizontal event stacking in week/day views (0 = unlimited) Max events per day: Limit events shown per day cell in month view (0 = auto based on cell height) Max event rows per day: Limit event rows per day cell in month view (0 = unlimited) Configure per-view in the Bases Calendar view settings under Layout Thanks to @3zra47 and @hasanyilmaz for the feature requests Changed# Improved inline task conversion to merge TasksPlugin and NLP parsing results Previously, if a task had hashtags (e.g., - [ ] Buy milk tomorrow #groceries), NLP parsing was skipped entirely Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values Tags, contexts, and projects from both sources are combined and deduplicated Polished task card styling for a more native Obsidian look Simplified hover and focus states to use native Obsidian colors Removed blur filter and shadows from metadata pills Fixed subtask chevron vertical alignment with status dot Reduced swimlane label column width in Kanban view (#1151) Increased mini calendar heatmap color intensity for better visibility Days with notes now show more noticeable colors, especially with low note counts Intensity levels increased from 10/25/45/65% to 25/40/55/70% Thanks to @arreme for the suggestion Fixed# (#1271) Fixed custom user fields not appearing in task modals after creation New custom fields are now automatically added to both creation and edit modals Deleting a custom field also removes it from modal configuration Updating a field's display name syncs to the modal configuration Thanks to @craziedde for reporting (#1256) Fixed links in custom properties not rendering as clickable in task cards Wikilinks ([[Note]]) now render correctly in Bases views Markdown links ([text](url)) now render correctly in all views Links in list-type properties are also properly rendered Thanks to @3zra47 for reporting (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed Thanks to @3zra47 for reporting (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist Thanks to @Anthonyhunter100 for reporting (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column Tasks with multiple values now appear in each individual column (e.g., a task with contexts: [work, call] appears in both \"work\" and \"call\" columns) Added \"Show items in multiple columns\" option (enabled by default) to control this behavior Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list Fixed swimlane mode to also respect list property explosion Thanks to @dictionarymouse for reporting (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab Added middle-click support for opening in new tab Thanks to @diegomarzaa for reporting (#1265) Fixed task edit modal corrupting markdown-style project links on save Links like [Project Name](path.md) were being wrapped in extra brackets: [[[Project Name](path.md)]] Plain text project names are now preserved as-is instead of being converted to wikilinks Markdown-style project links now resolve properly and display as linked (not orange/unresolved) Thanks to @minchinweb for reporting (#1266) Fixed Kanban view scroll position resetting to top of column after any change Clicking status dots, priority, or other task properties no longer jumps the column back to top Scroll position is now preserved for both regular columns and swimlane cells Thanks to @essouflenfer for reporting (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects Tags like #investigación were being truncated at accented characters (e.g., #investigaci) Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., @家, #杂事, @ознакомиться) Parser now uses Unicode-aware regex patterns to support all languages and scripts Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting (#1249) Fixed project preview in task creation modal showing quadruple brackets ([[[[Project]]]]) Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display Thanks to @2vzqwz8tvg-png for reporting (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive Priority cards are now draggable to reorder (like statuses) Priorities are displayed in weight order (lowest to highest priority) New priorities are added at the end (highest priority) instead of with a fixed weight Thanks to @2vzqwz8tvg-png for reporting (#1272) Fixed recurrence anchor not being saved when set to \"completion\" during task creation Selecting \"completion\" as the recurrence anchor now correctly persists to the task frontmatter Thanks to @blaxcky for reporting (#1128) Fixed NLP parser not allowing slashes in context names Contexts like @shopping/groceries were being split into @shopping and /groceries Hierarchical context names now work the same as tags and projects Thanks to @wealthychef1 for reporting (#1170) Fixed dateCreated and dateModified not using custom property names when creating notes from calendar events Notes created from ICS events now respect the field mapping configured in settings Thanks to @maddie-m for reporting (#1171) Fixed calendar event toggles not responding to changes after initial load Toggling \"Show scheduled tasks\", \"Show due tasks\", and other event filters now correctly updates the calendar Previously, changing these toggles had no effect until the view was reloaded Thanks to @hangryscribe3 for reporting (#1198) Fixed project links being created relative to the wrong file when editing from Bases views Relative paths in project links are now correctly resolved relative to the task note file Previously, editing a task from a Bases view would create project links relative to the .base file Thanks to @minchinweb for reporting"},{"route":"/obsidian/releases/4.1.1/","title":"TaskNotes 4.1.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.1.md","namespace":"obsidian","relativePath":"releases/4.1.1.md","raw":"# TaskNotes 4.1.1\n\n## Added\n\n- (#1277) Icon autosuggestion for custom status settings\n - Type to search through all available Lucide icons\n - Thanks to @Arachnidai for the suggestion\n- New formula properties in default Base templates\n - **Date calculations**: `daysUntilDue`, `daysUntilScheduled`, `daysSinceCreated`, `daysSinceModified`\n - **Boolean helpers**: `isOverdue`, `isDueToday`, `isDueThisWeek`, `isScheduledToday`, `isRecurring`, `hasTimeEstimate`\n - **Time tracking**: `timeRemaining`, `efficiencyRatio`, `timeTrackedThisWeek`, `timeTrackedToday`, `timeTrackedFormatted`\n - **Grouping**: `dueMonth`, `dueWeek`, `scheduledMonth`, `scheduledWeek`, `dueDateCategory`, `timeEstimateCategory`, `ageCategory`, `createdMonth`, `modifiedMonth`, `priorityCategory`, `projectCount`, `contextCount`, `trackingStatus`\n - **Combined due/scheduled**: `nextDate`, `daysUntilNext`, `hasDate`, `isToday`, `isThisWeek`, `nextDateCategory`, `nextDateMonth`, `nextDateWeek` - work with whichever date comes first\n - **Sorting**: `priorityWeight`, `urgencyScore` (combines priority with date proximity)\n - **Display**: `dueDateDisplay` (relative dates like \"Today\", \"Tomorrow\", \"3d ago\")\n - Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first\n - See [Default Base Templates documentation](https://tasknotes.dev/views/default-base-templates) for full details\n - **Note**: To get these new formulas, either copy them from the documentation, or delete your `.base` files in `TaskNotes/Views/` and restart Obsidian to regenerate them\n\n## Changed\n\n- (#1282) Added spacing between task title and metadata in inline task widgets for improved readability\n - Thanks to @3zra47 for the suggestion\n- Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals)\n- Added embedded video guide for Google Calendar OAuth setup in documentation\n - Thanks to [@antoneheyward](https://www.youtube.com/@antoneheyward) for the tutorial\n\n## Fixed\n\n- (#1279) Fixed Kanban column width setting not being respected on mobile devices\n - Thanks to @guncav for reporting\n- (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening\n - The bug caused `complete_instances` to record the next day instead of the user's current calendar day\n - Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps\n\n","aliases":["/releases/4.1.1/","/releases/4.1.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1277) Icon autosuggestion for custom status settings
      \n
    • Type to search through all available Lucide icons
    • \n
    • Thanks to @Arachnidai for the suggestion
    • \n
    \n
  • \n
  • New formula properties in default Base templates
      \n
    • Date calculations: daysUntilDue, daysUntilScheduled, daysSinceCreated, daysSinceModified
    • \n
    • Boolean helpers: isOverdue, isDueToday, isDueThisWeek, isScheduledToday, isRecurring, hasTimeEstimate
    • \n
    • Time tracking: timeRemaining, efficiencyRatio, timeTrackedThisWeek, timeTrackedToday, timeTrackedFormatted
    • \n
    • Grouping: dueMonth, dueWeek, scheduledMonth, scheduledWeek, dueDateCategory, timeEstimateCategory, ageCategory, createdMonth, modifiedMonth, priorityCategory, projectCount, contextCount, trackingStatus
    • \n
    • Combined due/scheduled: nextDate, daysUntilNext, hasDate, isToday, isThisWeek, nextDateCategory, nextDateMonth, nextDateWeek - work with whichever date comes first
    • \n
    • Sorting: priorityWeight, urgencyScore (combines priority with date proximity)
    • \n
    • Display: dueDateDisplay (relative dates like "Today", "Tomorrow", "3d ago")
    • \n
    • Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first
    • \n
    • See Default Base Templates documentation for full details
    • \n
    • Note: To get these new formulas, either copy them from the documentation, or delete your .base files in TaskNotes/Views/ and restart Obsidian to regenerate them
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • (#1282) Added spacing between task title and metadata in inline task widgets for improved readability
      \n
    • Thanks to @3zra47 for the suggestion
    • \n
    \n
  • \n
  • Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals)
  • \n
  • Added embedded video guide for Google Calendar OAuth setup in documentation\n
  • \n
\n

Fixed#

\n
    \n
  • (#1279) Fixed Kanban column width setting not being respected on mobile devices
      \n
    • Thanks to @guncav for reporting
    • \n
    \n
  • \n
  • (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening
      \n
    • The bug caused complete_instances to record the next day instead of the user's current calendar day
    • \n
    • Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps
    • \n
    \n
  • \n
\n","text":"Added# (#1277) Icon autosuggestion for custom status settings Type to search through all available Lucide icons Thanks to @Arachnidai for the suggestion New formula properties in default Base templates Date calculations: daysUntilDue, daysUntilScheduled, daysSinceCreated, daysSinceModified Boolean helpers: isOverdue, isDueToday, isDueThisWeek, isScheduledToday, isRecurring, hasTimeEstimate Time tracking: timeRemaining, efficiencyRatio, timeTrackedThisWeek, timeTrackedToday, timeTrackedFormatted Grouping: dueMonth, dueWeek, scheduledMonth, scheduledWeek, dueDateCategory, timeEstimateCategory, ageCategory, createdMonth, modifiedMonth, priorityCategory, projectCount, contextCount, trackingStatus Combined due/scheduled: nextDate, daysUntilNext, hasDate, isToday, isThisWeek, nextDateCategory, nextDateMonth, nextDateWeek - work with whichever date comes first Sorting: priorityWeight, urgencyScore (combines priority with date proximity) Display: dueDateDisplay (relative dates like \"Today\", \"Tomorrow\", \"3d ago\") Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first See Default Base Templates documentation for full details Note: To get these new formulas, either copy them from the documentation, or delete your .base files in TaskNotes/Views/ and restart Obsidian to regenerate them Changed# (#1282) Added spacing between task title and metadata in inline task widgets for improved readability Thanks to @3zra47 for the suggestion Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals) Added embedded video guide for Google Calendar OAuth setup in documentation Thanks to @antoneheyward for the tutorial Fixed# (#1279) Fixed Kanban column width setting not being respected on mobile devices Thanks to @guncav for reporting (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening The bug caused complete_instances to record the next day instead of the user's current calendar day Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps"},{"route":"/obsidian/releases/4.1.2/","title":"TaskNotes 4.1.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.2.md","namespace":"obsidian","relativePath":"releases/4.1.2.md","raw":"# TaskNotes 4.1.2\n\n## Fixed\n\n- Significant performance improvements for Bases views (TaskList, Kanban, Calendar)\n - Reduced `extractDataItems` time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks)\n - Computed file properties (`file.backlinks`, `file.links`, etc.) are now fetched lazily during render instead of upfront\n - Only visible items (with virtualization) trigger expensive property computations\n - Added debouncing to `onDataUpdated` to prevent UI freezes during typing\n - Timeblock generation now uses Obsidian's metadataCache instead of file reads\n - Added date range filtering for calendar events to skip events outside visible range\n - (#1285) Calendar view uses 5-second debounce to prevent flickering while typing\n\t - Thanks to @steven-murray for reporting\n- Calendar view switching (month/week/day/list) is now much faster\n - View type is now saved on unload instead of on every change\n- Fixed task edit modal archive button being too narrow on mobile devices\n- (#1319) Added missing properties to Field Mapping settings\n - `recurrence_anchor` - now in Settings > Task Properties > Task Details\n - `skipped_instances` - now in Settings > Task Properties > Metadata Properties\n - Thanks to @kazerniel for reporting\n- (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits\n - Text that cannot fit in the filename is now preserved in the task note's body\n - Thanks to @prayidae for reporting\n- (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible\n - Thanks to @Richard-UMPV for reporting\n- (#1317) Fixed project autosuggest filters not working correctly when only \"Required Property Key\" is configured\n - NLP `+` trigger now properly filters by property existence when no property value is specified\n - Modal \"Add to project\" button now shows consistent results with inline autosuggest\n - Thanks to @JacksonMcDonaldDev for reporting\n- (#1287), (#1307) The \"New\" button in Bases views now opens the TaskNotes creation modal\n - Tasks created from Bases views now respect default properties (status, priority, etc.)\n - Tasks are now created in the configured default folder instead of the views folder\n - Thanks to @anareaty and @sylvainfct-dot for reporting\n- (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI\n - Added instructions for configuring via Azure manifest editor\n - Thanks to @PlecotusAustriacus for reporting\n\n## Added\n\n- (#803) New command \"Convert current note to task\" to add task properties to an existing note\n - Thanks to @GardarikanetS and @diegomarzaa for suggesting\n- (#1080) Custom user fields now support default values\n - Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list\n - Defaults are applied when creating tasks via modal, instant conversion, \"Create or open task\" command, or HTTP API\n - Thanks to @bradyrx for suggesting\n\n## Changed\n\n- Added documentation link to settings panel (links to tasknotes.dev)\n- Reorganized settings panel for improved discoverability\n - Removed \"Defaults\" tab - default values are now configured alongside each property in the Task Properties tab\n - Moved task filename format settings to the Title property section\n - Moved project autosuggest settings to the Projects property section\n - Body template setting moved to the Features tab\n - Added descriptions to each property explaining its purpose\n - Moved \"Folder for converted tasks\" setting to General tab under Task Storage for better discoverability\n - Updated setting description to clarify that leaving empty uses the default tasks folder\n\n","aliases":["/releases/4.1.2/","/releases/4.1.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • Significant performance improvements for Bases views (TaskList, Kanban, Calendar)
      \n
    • Reduced extractDataItems time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks)
    • \n
    • Computed file properties (file.backlinks, file.links, etc.) are now fetched lazily during render instead of upfront
    • \n
    • Only visible items (with virtualization) trigger expensive property computations
    • \n
    • Added debouncing to onDataUpdated to prevent UI freezes during typing
    • \n
    • Timeblock generation now uses Obsidian's metadataCache instead of file reads
    • \n
    • Added date range filtering for calendar events to skip events outside visible range
    • \n
    • (#1285) Calendar view uses 5-second debounce to prevent flickering while typing
        \n
      • Thanks to @steven-murray for reporting
      • \n
      \n
    • \n
    \n
  • \n
  • Calendar view switching (month/week/day/list) is now much faster
      \n
    • View type is now saved on unload instead of on every change
    • \n
    \n
  • \n
  • Fixed task edit modal archive button being too narrow on mobile devices
  • \n
  • (#1319) Added missing properties to Field Mapping settings
      \n
    • recurrence_anchor - now in Settings > Task Properties > Task Details
    • \n
    • skipped_instances - now in Settings > Task Properties > Metadata Properties
    • \n
    • Thanks to @kazerniel for reporting
    • \n
    \n
  • \n
  • (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits
      \n
    • Text that cannot fit in the filename is now preserved in the task note's body
    • \n
    • Thanks to @prayidae for reporting
    • \n
    \n
  • \n
  • (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible
      \n
    • Thanks to @Richard-UMPV for reporting
    • \n
    \n
  • \n
  • (#1317) Fixed project autosuggest filters not working correctly when only "Required Property Key" is configured
      \n
    • NLP + trigger now properly filters by property existence when no property value is specified
    • \n
    • Modal "Add to project" button now shows consistent results with inline autosuggest
    • \n
    • Thanks to @JacksonMcDonaldDev for reporting
    • \n
    \n
  • \n
  • (#1287), (#1307) The "New" button in Bases views now opens the TaskNotes creation modal
      \n
    • Tasks created from Bases views now respect default properties (status, priority, etc.)
    • \n
    • Tasks are now created in the configured default folder instead of the views folder
    • \n
    • Thanks to @anareaty and @sylvainfct-dot for reporting
    • \n
    \n
  • \n
  • (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI
      \n
    • Added instructions for configuring via Azure manifest editor
    • \n
    • Thanks to @PlecotusAustriacus for reporting
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#803) New command "Convert current note to task" to add task properties to an existing note
      \n
    • Thanks to @GardarikanetS and @diegomarzaa for suggesting
    • \n
    \n
  • \n
  • (#1080) Custom user fields now support default values
      \n
    • Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list
    • \n
    • Defaults are applied when creating tasks via modal, instant conversion, "Create or open task" command, or HTTP API
    • \n
    • Thanks to @bradyrx for suggesting
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Added documentation link to settings panel (links to tasknotes.dev)
  • \n
  • Reorganized settings panel for improved discoverability
      \n
    • Removed "Defaults" tab - default values are now configured alongside each property in the Task Properties tab
    • \n
    • Moved task filename format settings to the Title property section
    • \n
    • Moved project autosuggest settings to the Projects property section
    • \n
    • Body template setting moved to the Features tab
    • \n
    • Added descriptions to each property explaining its purpose
    • \n
    • Moved "Folder for converted tasks" setting to General tab under Task Storage for better discoverability
    • \n
    • Updated setting description to clarify that leaving empty uses the default tasks folder
    • \n
    \n
  • \n
\n","text":"Fixed# Significant performance improvements for Bases views (TaskList, Kanban, Calendar) Reduced extractDataItems time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks) Computed file properties (file.backlinks, file.links, etc.) are now fetched lazily during render instead of upfront Only visible items (with virtualization) trigger expensive property computations Added debouncing to onDataUpdated to prevent UI freezes during typing Timeblock generation now uses Obsidian's metadataCache instead of file reads Added date range filtering for calendar events to skip events outside visible range (#1285) Calendar view uses 5-second debounce to prevent flickering while typing Thanks to @steven-murray for reporting Calendar view switching (month/week/day/list) is now much faster View type is now saved on unload instead of on every change Fixed task edit modal archive button being too narrow on mobile devices (#1319) Added missing properties to Field Mapping settings recurrence_anchor - now in Settings > Task Properties > Task Details skipped_instances - now in Settings > Task Properties > Metadata Properties Thanks to @kazerniel for reporting (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits Text that cannot fit in the filename is now preserved in the task note's body Thanks to @prayidae for reporting (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible Thanks to @Richard-UMPV for reporting (#1317) Fixed project autosuggest filters not working correctly when only \"Required Property Key\" is configured NLP + trigger now properly filters by property existence when no property value is specified Modal \"Add to project\" button now shows consistent results with inline autosuggest Thanks to @JacksonMcDonaldDev for reporting (#1287), (#1307) The \"New\" button in Bases views now opens the TaskNotes creation modal Tasks created from Bases views now respect default properties (status, priority, etc.) Tasks are now created in the configured default folder instead of the views folder Thanks to @anareaty and @sylvainfct-dot for reporting (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI Added instructions for configuring via Azure manifest editor Thanks to @PlecotusAustriacus for reporting Added# (#803) New command \"Convert current note to task\" to add task properties to an existing note Thanks to @GardarikanetS and @diegomarzaa for suggesting (#1080) Custom user fields now support default values Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list Defaults are applied when creating tasks via modal, instant conversion, \"Create or open task\" command, or HTTP API Thanks to @bradyrx for suggesting Changed# Added documentation link to settings panel (links to tasknotes.dev) Reorganized settings panel for improved discoverability Removed \"Defaults\" tab - default values are now configured alongside each property in the Task Properties tab Moved task filename format settings to the Title property section Moved project autosuggest settings to the Projects property section Body template setting moved to the Features tab Added descriptions to each property explaining its purpose Moved \"Folder for converted tasks\" setting to General tab under Task Storage for better discoverability Updated setting description to clarify that leaving empty uses the default tasks folder"},{"route":"/obsidian/releases/4.1.3/","title":"TaskNotes 4.1.3","description":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.3.md","namespace":"obsidian","relativePath":"releases/4.1.3.md","raw":"# TaskNotes 4.1.3\n\nThis patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals. \n\n## Added\n\n- Split layout for task modals on wide screens (900px+)\n - Details editor appears in a dedicated right column when the modal is expanded\n - New setting \"Split layout on wide screens\" in Modal Fields settings tab to toggle this behavior\n - Improves usability by showing form fields and details side-by-side\n\n## Fixed\n\n- (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions\n - Initial calendar load is now immediate again\n - User interactions (drag/drop, creating timeblocks, etc.) respond instantly\n - Removed redundant date filtering (FullCalendar handles this more efficiently)\n - Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting\n","aliases":["/releases/4.1.3/","/releases/4.1.3/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable "split" view to the task creation/edit modals.

\n

Added#

\n
    \n
  • Split layout for task modals on wide screens (900px+)
      \n
    • Details editor appears in a dedicated right column when the modal is expanded
    • \n
    • New setting "Split layout on wide screens" in Modal Fields settings tab to toggle this behavior
    • \n
    • Improves usability by showing form fields and details side-by-side
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions
      \n
    • Initial calendar load is now immediate again
    • \n
    • User interactions (drag/drop, creating timeblocks, etc.) respond instantly
    • \n
    • Removed redundant date filtering (FullCalendar handles this more efficiently)
    • \n
    • Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting
    • \n
    \n
  • \n
\n","text":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals. Added# Split layout for task modals on wide screens (900px+) Details editor appears in a dedicated right column when the modal is expanded New setting \"Split layout on wide screens\" in Modal Fields settings tab to toggle this behavior Improves usability by showing form fields and details side-by-side Fixed# (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions Initial calendar load is now immediate again User interactions (drag/drop, creating timeblocks, etc.) respond instantly Removed redundant date filtering (FullCalendar handles this more efficiently) Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting"},{"route":"/obsidian/releases/4.10.0/","title":"TaskNotes 4.10.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.10.0.md","namespace":"obsidian","relativePath":"releases/4.10.0.md","raw":"# TaskNotes 4.10.0\n\n## Added\n\n- **New companion plugin:** TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See [TaskNotes Workflows](https://tasknotes.dev/companion-plugins/tasknotes-workflows/).\n - (#1530) `Auto-start time tracking` starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up.\n - (#222, #184) `Stop time tracking on complete` stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up.\n - (#265) `Stamp started timestamp` records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion.\n - (#1703) `Clear scheduled when started` clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request.\n - (#1293) `Rollover overdue scheduled tasks` moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request.\n - (#1896) `Escalate upcoming due tasks` raises priority as due dates approach. Thanks to @Neptune-Illusion for the request.\n - (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion.\n - (#1166) `Blocked task review` provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up.\n- Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See [JavaScript API](https://tasknotes.dev/javascript-api/).\n- Added documentation for the companion-plugin model. See [Companion Plugins](https://tasknotes.dev/companion-plugins/).\n- (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#materialized-occurrence-notes) and [Property Types Reference](https://tasknotes.dev/settings/property-types-reference/#materialized-occurrence-properties). Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests.\n- (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request.\n- (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs.\n\n## Changed\n\n- Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling.\n- Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's `occurrence_date` identity. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#calendar-drag-and-drop).\n- Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode.\n\n## Fixed\n\n- (#1976) Fixed embedded Calendar and Agenda Bases so \"Navigate to date from property\" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this.\n- (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this.\n- Fixed the release notes view using cramped interface typography instead of regular reading typography.\n- (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion.\n- (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events.\n- (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this.\n- (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this.\n- (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views.\n- (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue.\n","aliases":["/releases/4.10.0/","/releases/4.10.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • New companion plugin: TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See TaskNotes Workflows.
      \n
    • (#1530) Auto-start time tracking starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up.
    • \n
    • (#222, #184) Stop time tracking on complete stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up.
    • \n
    • (#265) Stamp started timestamp records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion.
    • \n
    • (#1703) Clear scheduled when started clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request.
    • \n
    • (#1293) Rollover overdue scheduled tasks moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request.
    • \n
    • (#1896) Escalate upcoming due tasks raises priority as due dates approach. Thanks to @Neptune-Illusion for the request.
    • \n
    • (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion.
    • \n
    • (#1166) Blocked task review provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up.
    • \n
    \n
  • \n
  • Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See JavaScript API.
  • \n
  • Added documentation for the companion-plugin model. See Companion Plugins.
  • \n
  • (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See Recurring Tasks and Property Types Reference. Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests.
  • \n
  • (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request.
  • \n
  • (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs.
  • \n
\n

Changed#

\n
    \n
  • Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling.
  • \n
  • Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's occurrence_date identity. See Recurring Tasks.
  • \n
  • Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode.
  • \n
\n

Fixed#

\n
    \n
  • (#1976) Fixed embedded Calendar and Agenda Bases so "Navigate to date from property" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this.
  • \n
  • (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this.
  • \n
  • Fixed the release notes view using cramped interface typography instead of regular reading typography.
  • \n
  • (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion.
  • \n
  • (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events.
  • \n
  • (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this.
  • \n
  • (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this.
  • \n
  • (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views.
  • \n
  • (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue.
  • \n
\n","text":"Added# New companion plugin: TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See TaskNotes Workflows. (#1530) Auto-start time tracking starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up. (#222, #184) Stop time tracking on complete stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up. (#265) Stamp started timestamp records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion. (#1703) Clear scheduled when started clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request. (#1293) Rollover overdue scheduled tasks moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request. (#1896) Escalate upcoming due tasks raises priority as due dates approach. Thanks to @Neptune-Illusion for the request. (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion. (#1166) Blocked task review provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up. Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See JavaScript API. Added documentation for the companion-plugin model. See Companion Plugins. (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See Recurring Tasks and Property Types Reference. Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests. (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request. (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs. Changed# Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling. Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's occurrence_date identity. See Recurring Tasks. Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode. Fixed# (#1976) Fixed embedded Calendar and Agenda Bases so \"Navigate to date from property\" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this. (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this. Fixed the release notes view using cramped interface typography instead of regular reading typography. (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion. (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events. (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this. (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this. (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views. (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue."},{"route":"/obsidian/releases/4.10.1/","title":"TaskNotes 4.10.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.10.1.md","namespace":"obsidian","relativePath":"releases/4.10.1.md","raw":"# TaskNotes 4.10.1\n\n## Added\n\n- Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser.\n- (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default `.base` files from the current TaskNotes templates. Thanks to @businessBoris for the request.\n- (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap.\n\n## Fixed\n\n- (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots.\n- (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this.\n- (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot.\n- (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting.\n- (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot.\n- (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor.\n- (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting.\n- (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this.\n","aliases":["/releases/4.10.1/","/releases/4.10.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser.
  • \n
  • (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default .base files from the current TaskNotes templates. Thanks to @businessBoris for the request.
  • \n
  • (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap.
  • \n
\n

Fixed#

\n
    \n
  • (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots.
  • \n
  • (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this.
  • \n
  • (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot.
  • \n
  • (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting.
  • \n
  • (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot.
  • \n
  • (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor.
  • \n
  • (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting.
  • \n
  • (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this.
  • \n
\n","text":"Added# Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser. (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default .base files from the current TaskNotes templates. Thanks to @businessBoris for the request. (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap. Fixed# (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots. (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this. (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting. (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor. (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting. (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this."},{"route":"/obsidian/releases/4.10.2/","title":"TaskNotes 4.10.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.10.2.md","namespace":"obsidian","relativePath":"releases/4.10.2.md","raw":"# TaskNotes 4.10.2\n\n## Fixed\n\n- (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this.\n- (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this.\n","aliases":["/releases/4.10.2/","/releases/4.10.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this.
  • \n
  • (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this.
  • \n
\n","text":"Fixed# (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this. (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this."},{"route":"/obsidian/releases/4.11.0/","title":"TaskNotes 4.11.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.11.0.md","namespace":"obsidian","relativePath":"releases/4.11.0.md","raw":"# TaskNotes 4.11.0\n\n## Added\n\n- (#730, #1897, #1942, #1998) Added [Canvas Bases](https://github.com/callumalpass/canvas-bases), an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See [Canvas Bases](https://tasknotes.dev/companion-plugins/canvas-bases/) for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion.\n- Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views.\n- Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu.\n- (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split.\n- (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level `occurrence_template` support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request.\n- (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See [Pomodoro View](https://tasknotes.dev/views/pomodoro-view/) for the timer behavior. Thanks to @abbiefalls90 for suggesting this.\n- (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See [Integrations Settings](https://tasknotes.dev/settings/integrations/#calendar-subscriptions-ics) for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion.\n\n## Changed\n\n- (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback.\n- (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this.\n- Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission.\n- Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes.\n- Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans.\n- Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened.\n\n## Fixed\n\n- (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this.\n- (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this.\n- (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this.\n- (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this.\n- (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this.\n- (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this.\n- Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped `blockedBy` property from the note.\n","aliases":["/releases/4.11.0/","/releases/4.11.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#730, #1897, #1942, #1998) Added Canvas Bases, an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See Canvas Bases for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion.
  • \n
  • Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views.
  • \n
  • Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu.
  • \n
  • (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split.
  • \n
  • (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level occurrence_template support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request.
  • \n
  • (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See Pomodoro View for the timer behavior. Thanks to @abbiefalls90 for suggesting this.
  • \n
  • (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See Integrations Settings for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion.
  • \n
\n

Changed#

\n
    \n
  • (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback.
  • \n
  • (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this.
  • \n
  • Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission.
  • \n
  • Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes.
  • \n
  • Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans.
  • \n
  • Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened.
  • \n
\n

Fixed#

\n
    \n
  • (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this.
  • \n
  • (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this.
  • \n
  • (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this.
  • \n
  • (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this.
  • \n
  • (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this.
  • \n
  • Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped blockedBy property from the note.
  • \n
\n","text":"Added# (#730, #1897, #1942, #1998) Added Canvas Bases, an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See Canvas Bases for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion. Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views. Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu. (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split. (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level occurrence_template support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request. (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See Pomodoro View for the timer behavior. Thanks to @abbiefalls90 for suggesting this. (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See Integrations Settings for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion. Changed# (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback. (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this. Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission. Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes. Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans. Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened. Fixed# (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this. (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this. (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this. (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this. (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this. (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this. Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped blockedBy property from the note."},{"route":"/obsidian/releases/4.11.1/","title":"TaskNotes 4.11.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.11.1.md","namespace":"obsidian","relativePath":"releases/4.11.1.md","raw":"# TaskNotes 4.11.1\n\n## Added\n\n- (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an **Occurrences** tab. See [Relationships Widget](https://tasknotes.dev/features/inline-tasks/#relationships-widget). Thanks to @3zra47 for requesting this.\n- (#2022) Added a **Skip instance** / **Unskip instance** action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#completion-tracking). Thanks to @AmonAmarthFTW for requesting this.\n- (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this.\n- (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this.\n- (#2060) Added date-type custom fields to the task right-click menu under **Custom dates**. Thanks to @chmac for requesting this.\n- (#2067) Added an **Edit task** action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this.\n- (#2068) Added `reminders` input support to the MCP `tasknotes_create_task` and `tasknotes_update_task` tools. Thanks to @Spirit597 for requesting this.\n- (#2069) Added an **Add project** action to the Quick Actions palette. Thanks to @chmac for requesting this.\n\n## Fixed\n\n- (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report.\n- (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this.\n- (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this.\n- (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this.\n- (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this.\n- (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this.\n- (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this.\n- (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this.\n- (#2079) Fixed the reminder modal's **Absolute** tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue.\n\n## Changed\n\n- Improved local review checks so unsafe direct `Object.prototype` method access is caught before submission.\n","aliases":["/releases/4.11.1/","/releases/4.11.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Added#

\n
    \n
  • (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an Occurrences tab. See Relationships Widget. Thanks to @3zra47 for requesting this.
  • \n
  • (#2022) Added a Skip instance / Unskip instance action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See Recurring Tasks. Thanks to @AmonAmarthFTW for requesting this.
  • \n
  • (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this.
  • \n
  • (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this.
  • \n
  • (#2060) Added date-type custom fields to the task right-click menu under Custom dates. Thanks to @chmac for requesting this.
  • \n
  • (#2067) Added an Edit task action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this.
  • \n
  • (#2068) Added reminders input support to the MCP tasknotes_create_task and tasknotes_update_task tools. Thanks to @Spirit597 for requesting this.
  • \n
  • (#2069) Added an Add project action to the Quick Actions palette. Thanks to @chmac for requesting this.
  • \n
\n

Fixed#

\n
    \n
  • (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report.
  • \n
  • (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this.
  • \n
  • (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this.
  • \n
  • (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this.
  • \n
  • (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this.
  • \n
  • (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this.
  • \n
  • (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this.
  • \n
  • (#2079) Fixed the reminder modal's Absolute tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue.
  • \n
\n

Changed#

\n
    \n
  • Improved local review checks so unsafe direct Object.prototype method access is caught before submission.
  • \n
\n","text":"Added# (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an Occurrences tab. See Relationships Widget. Thanks to @3zra47 for requesting this. (#2022) Added a Skip instance / Unskip instance action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See Recurring Tasks. Thanks to @AmonAmarthFTW for requesting this. (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this. (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this. (#2060) Added date-type custom fields to the task right-click menu under Custom dates. Thanks to @chmac for requesting this. (#2067) Added an Edit task action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this. (#2068) Added reminders input support to the MCP tasknotes_create_task and tasknotes_update_task tools. Thanks to @Spirit597 for requesting this. (#2069) Added an Add project action to the Quick Actions palette. Thanks to @chmac for requesting this. Fixed# (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report. (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this. (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this. (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this. (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this. (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this. (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this. (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this. (#2079) Fixed the reminder modal's Absolute tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue. Changed# Improved local review checks so unsafe direct Object.prototype method access is caught before submission."},{"route":"/obsidian/releases/4.2.0/","title":"TaskNotes 4.2.0","description":"Added Korean (한국어) language support","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.2.0.md","namespace":"obsidian","relativePath":"releases/4.2.0.md","raw":"# TaskNotes 4.2.0\n\n## Added\n\n- Added Korean (한국어) language support\n - Full translation of all 1911 localization keys\n - Korean language option now available in Settings → General → Language\n\n- Adopted Obsidian 1.11.0 API features with backwards compatibility\n - Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+)\n - Settings sections now use native `SettingGroup` for improved visual grouping (Obsidian 1.11.0+)\n - Falls back gracefully to traditional section headers on older Obsidian versions\n\n- (#59) Added `shortYear` template variable for custom filename and folder templates\n - Use `{shortYear}` in filename templates (e.g., \"25\" for 2025)\n - Use `{{shortYear}}` in folder templates\n - Thanks to @Pixeltica for the feature request\n\n- (#1393) Option to prevent auto-creation of default Base view files on startup\n - New \"Auto-create default files\" toggle in Settings → Integrations → Bases Integration\n - When disabled, deleted sample Base files will not be recreated on plugin load\n - The manual \"Create Default Files\" button remains available for on-demand recreation\n - Thanks to @wealthychef1 for the feature request\n\n- (#1408) Shift+click on status icon to cycle backwards through statuses\n - Normal click cycles forward through status order\n - Shift+click cycles in reverse order\n - Thanks to @JerryLu086 for the feature request\n\n- (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled\n - Previously required pressing 'i' before typing when Obsidian vim mode was active\n - The modal now automatically enters insert mode on focus, allowing immediate typing\n - Thanks to @Leo310 for the feature request\n\n- Added button tooltips to calendar view toolbar\n - Hovering over navigation and view buttons now shows descriptive hints\n - Buttons include: Today, Previous, Next, Month, Week, Day, Year, List\n\n- Added tooltips to task modal action icons\n - Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover\n - Improves discoverability for new users\n\n- (#503) Settings now sync automatically across devices via Obsidian Sync\n - Changes to custom statuses, priorities, and other settings apply immediately without restart\n - Thanks to @jhedlund for the feature request and @l-mb for the implementation\n\n- (#1403) Kanban view option to consolidate status icons in column headers\n - New \"Show status icon in column header only\" toggle in Kanban view settings (disabled by default)\n - When enabled and grouped by status, shows the icon in the column header and hides it on cards\n - Reduces visual redundancy when the column already indicates the status\n - Thanks to @l-mb for the feature request and implementation\n\n- (#1401) Calendar view option to span tasks between scheduled and due dates\n - New \"Span tasks between scheduled and due dates\" toggle in Calendar view Layout settings\n - When enabled, tasks with both scheduled and due dates display as multi-day bars\n - Provides Gantt chart-style visualization for project planning\n - Thanks to @0atman for the feature request\n\n- (#1334) `{{currentNotePath}}` now works for \"Create new inline task\" command\n - The inline task folder setting with `{{currentNotePath}}` previously only worked for checkbox conversion\n - Now also applies when using the \"Create new inline task\" command from the command palette\n - Thanks to @kmaustral for the feature request\n\n- (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel\n - New \"Mobile sidebar\" setting in Settings → Features → Pomodoro Timer\n - Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar\n - Allows quick swipe access to the timer without switching notes on mobile devices\n - Thanks to @Evthestrike for the feature request\n\n- (#1220) Option to use ICS event end time as task due date\n - New \"Use ICS event end time as task due date\" toggle in Settings → Integrations → Calendar Subscriptions\n - When enabled, tasks created from calendar events will have their due date set to the event's end time\n - For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec)\n - For timed events, includes the exact end time\n - Defaults to disabled to preserve existing behavior\n - Thanks to @MiserMagus for the feature request\n\n- (#1108) Option to use task duration instead of due date for ICS calendar export\n - New \"Use task duration for event length\" toggle in Settings → Integrations → Automatic ICS Export\n - When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND\n - This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines\n - When disabled (default), preserves existing behavior using due date as DTEND\n - Thanks to @bepolymathe for the feature request\n\n## Fixed\n\n- (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified\n - Input like \"Task scheduled for tomorrow due next week\" now correctly sets both scheduled and due dates\n - Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers\n - Thanks to @wealthychef1 for reporting\n\n- (#1384) Fixed title being sanitized even when \"Store Task Title in Filename\" is disabled\n - Characters like `?`, `<`, `>`, `:`, etc. are now preserved in task titles when they won't be used in filenames\n - When `storeTitleInFilename` is false, only minimal sanitization (whitespace normalization, control character removal) is applied\n - Thanks to @allison-casey for reporting\n\n- (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view\n - Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon\n - Changed default Agenda template to disable property-based events (`showPropertyBasedEvents: false`)\n - Users can re-enable property-based events in view settings if needed for non-task date properties\n - Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting\n\n- (#1386) Fixed `timeEstimateCategory` formula showing \"Long (>2h)\" instead of \"No estimate\" for new tasks\n - The condition didn't properly handle null values when `timeEstimate` property is unset\n - Also fixed the same issue in `trackingStatus` formula\n - Thanks to @nicou for reporting and @osxisl for the PR\n\n- (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes\n - Also fixed CalendarView corrupting other view files when saving state on unload\n - Thanks to @music-soul1-1 for reporting\n\n- (#1398) Fixed overdue strikethrough showing on completed tasks\n - Completed tasks with past due dates no longer display overdue styling \n - Respects the \"Hide completed from overdue\" setting which defaults to true\n\n- (#1363) Fixed calendar view showing nothing when a task has an invalid date format\n - Tasks with malformed dates (e.g., \"262025-12-16\" instead of \"2025-12-16\") no longer crash the entire calendar\n - Invalid tasks are now skipped with a console warning, allowing other events to display normally\n - Thanks to @Erelen for reporting\n\n- Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent\n - Today's column now uses a tint of the theme accent color for consistent styling\n\n- (#1399) Fixed drag-and-drop not working in Kanban view on mobile\n - Cards and columns can now be dragged using long-press gesture on touch devices\n - Includes haptic feedback and auto-scroll when dragging near edges\n - Thanks to @l-mb for reporting and the fix\n\n- (#1381) Fixed Pomodoro \"Change Task\" menu not showing newly created tasks\n - Tasks created while the Pomodoro view was open would not appear in the task selector\n - Improved metadata cache synchronization to properly wait for new files to be indexed\n - Thanks to @Ghosthael for reporting\n\n- (#1344) Fixed \"Unsaved Changes\" popup appearing randomly when closing task edit modal\n - The popup would appear even when no changes were made to the task\n - Caused by inconsistent trailing whitespace normalization when comparing details content\n - Thanks to @hasanyilmaz for reporting\n\n- (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula\n - After editing task metadata, cards would jump to \"None\" column until Obsidian reload\n - Column assignment now uses Bases' computed grouping instead of cached formula outputs\n - Thanks to @bailob for the fix\n\n- (#1352) Fixed date context menu not preserving time when using increment options\n - Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., `2025-12-10T16:00`) now preserves the time\n - Previously the time would be stripped, changing `2025-12-10T16:00` to `2025-12-11` instead of `2025-12-11T16:00`\n - Thanks to @cathywu for the feature request\n\n- Fixed v3 saved views exporting incorrectly to Bases format\n - Title filters now correctly use `file.name` instead of `note.title`\n - Archived filters now generate valid boolean expressions instead of malformed comparisons\n - \"Is Blocked\" filters now generate correct expressions with proper operator precedence\n\n- (#1036) Due dates can now be dragged in the calendar view\n - Previously only scheduled dates were draggable; due dates were locked in place\n - Dragging a due event now updates the task's due date property\n - Thanks to @same774 for reporting\n\n- Improved calendar view responsiveness for user interactions\n - Task creation, editing, timeblock changes, and view option toggles now update immediately\n - Previously these actions waited 5 seconds due to the debounce intended for external file changes\n - The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing\n\n- Improved visual affordance for Pomodoro timer duration adjustment buttons\n - The +/- buttons below the timer now have visible backgrounds and borders\n - Hover states show accent color border for clearer interactivity feedback\n - Previously buttons were nearly invisible with transparent backgrounds\n\n- (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows\n - Drag-and-drop in Kanban view now works correctly when the view is in a new window\n - Context menus (status, priority, task) now work correctly in pop-out windows\n - Stats view drill-down modal now appears in the correct window\n - Search boxes, task cards, and grouped task lists render correctly\n - Root cause: Code was using global `document` and standard `instanceof` checks which fail across windows\n - Solution: Use `ownerDocument` for DOM operations and Obsidian's cross-window `instanceOf()` method\n - **Known limitation**: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global `document` for mouse event listeners. Use context menus or edit modals as a workaround.\n - Updated FullCalendar to v6.1.20\n - Thanks to @Snakiest, @same774, and @3zra47 for reporting\n\n- (#1337) Fixed \"Convert current note to task\" hotkey not applying default values from settings\n - When user configured default status/priority as \"None\", the modal would show \"Open\" and \"Normal\" instead\n - Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults\n - Now preserves constructor-provided task data when converting non-task files\n - Thanks to @guihasparyk for reporting\n\n- (#1304) Fixed \"Cannot find function map on type Link\" error in Blocking view\n - Error occurred when embedding the Relationships base and opening the Blocking view\n - Root cause: When `blockedBy` contained a single dependency, Bases returned it as a Link object without a `.map()` method\n - Fixed by wrapping `blockedBy` with `list()` before calling `.map()`, consistent with the Blocked By view\n - Thanks to @prayidae for reporting\n\n- (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev\n - The page existed but was not accessible from the site navigation\n - Thanks to @Arachnidai for reporting\n\n- (#1223) Fixed \"Go to today's note\" command opening wrong date in positive UTC offset timezones\n - In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note\n - Root cause: Incorrectly extracting UTC date components instead of local timezone date\n - Thanks to @BrucePlumb for reporting\n","aliases":["/releases/4.2.0/","/releases/4.2.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added Korean (한국어) language support

    \n
      \n
    • Full translation of all 1911 localization keys
    • \n
    • Korean language option now available in Settings → General → Language
    • \n
    \n
  • \n
  • Adopted Obsidian 1.11.0 API features with backwards compatibility

    \n
      \n
    • Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+)
    • \n
    • Settings sections now use native SettingGroup for improved visual grouping (Obsidian 1.11.0+)
    • \n
    • Falls back gracefully to traditional section headers on older Obsidian versions
    • \n
    \n
  • \n
  • (#59) Added shortYear template variable for custom filename and folder templates

    \n
      \n
    • Use {shortYear} in filename templates (e.g., "25" for 2025)
    • \n
    • Use {{shortYear}} in folder templates
    • \n
    • Thanks to @Pixeltica for the feature request
    • \n
    \n
  • \n
  • (#1393) Option to prevent auto-creation of default Base view files on startup

    \n
      \n
    • New "Auto-create default files" toggle in Settings → Integrations → Bases Integration
    • \n
    • When disabled, deleted sample Base files will not be recreated on plugin load
    • \n
    • The manual "Create Default Files" button remains available for on-demand recreation
    • \n
    • Thanks to @wealthychef1 for the feature request
    • \n
    \n
  • \n
  • (#1408) Shift+click on status icon to cycle backwards through statuses

    \n
      \n
    • Normal click cycles forward through status order
    • \n
    • Shift+click cycles in reverse order
    • \n
    • Thanks to @JerryLu086 for the feature request
    • \n
    \n
  • \n
  • (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled

    \n
      \n
    • Previously required pressing 'i' before typing when Obsidian vim mode was active
    • \n
    • The modal now automatically enters insert mode on focus, allowing immediate typing
    • \n
    • Thanks to @Leo310 for the feature request
    • \n
    \n
  • \n
  • Added button tooltips to calendar view toolbar

    \n
      \n
    • Hovering over navigation and view buttons now shows descriptive hints
    • \n
    • Buttons include: Today, Previous, Next, Month, Week, Day, Year, List
    • \n
    \n
  • \n
  • Added tooltips to task modal action icons

    \n
      \n
    • Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover
    • \n
    • Improves discoverability for new users
    • \n
    \n
  • \n
  • (#503) Settings now sync automatically across devices via Obsidian Sync

    \n
      \n
    • Changes to custom statuses, priorities, and other settings apply immediately without restart
    • \n
    • Thanks to @jhedlund for the feature request and @l-mb for the implementation
    • \n
    \n
  • \n
  • (#1403) Kanban view option to consolidate status icons in column headers

    \n
      \n
    • New "Show status icon in column header only" toggle in Kanban view settings (disabled by default)
    • \n
    • When enabled and grouped by status, shows the icon in the column header and hides it on cards
    • \n
    • Reduces visual redundancy when the column already indicates the status
    • \n
    • Thanks to @l-mb for the feature request and implementation
    • \n
    \n
  • \n
  • (#1401) Calendar view option to span tasks between scheduled and due dates

    \n
      \n
    • New "Span tasks between scheduled and due dates" toggle in Calendar view Layout settings
    • \n
    • When enabled, tasks with both scheduled and due dates display as multi-day bars
    • \n
    • Provides Gantt chart-style visualization for project planning
    • \n
    • Thanks to @0atman for the feature request
    • \n
    \n
  • \n
  • (#1334) {{currentNotePath}} now works for "Create new inline task" command

    \n
      \n
    • The inline task folder setting with {{currentNotePath}} previously only worked for checkbox conversion
    • \n
    • Now also applies when using the "Create new inline task" command from the command palette
    • \n
    • Thanks to @kmaustral for the feature request
    • \n
    \n
  • \n
  • (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel

    \n
      \n
    • New "Mobile sidebar" setting in Settings → Features → Pomodoro Timer
    • \n
    • Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar
    • \n
    • Allows quick swipe access to the timer without switching notes on mobile devices
    • \n
    • Thanks to @Evthestrike for the feature request
    • \n
    \n
  • \n
  • (#1220) Option to use ICS event end time as task due date

    \n
      \n
    • New "Use ICS event end time as task due date" toggle in Settings → Integrations → Calendar Subscriptions
    • \n
    • When enabled, tasks created from calendar events will have their due date set to the event's end time
    • \n
    • For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec)
    • \n
    • For timed events, includes the exact end time
    • \n
    • Defaults to disabled to preserve existing behavior
    • \n
    • Thanks to @MiserMagus for the feature request
    • \n
    \n
  • \n
  • (#1108) Option to use task duration instead of due date for ICS calendar export

    \n
      \n
    • New "Use task duration for event length" toggle in Settings → Integrations → Automatic ICS Export
    • \n
    • When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND
    • \n
    • This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines
    • \n
    • When disabled (default), preserves existing behavior using due date as DTEND
    • \n
    • Thanks to @bepolymathe for the feature request
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified

    \n
      \n
    • Input like "Task scheduled for tomorrow due next week" now correctly sets both scheduled and due dates
    • \n
    • Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers
    • \n
    • Thanks to @wealthychef1 for reporting
    • \n
    \n
  • \n
  • (#1384) Fixed title being sanitized even when "Store Task Title in Filename" is disabled

    \n
      \n
    • Characters like ?, <, >, :, etc. are now preserved in task titles when they won't be used in filenames
    • \n
    • When storeTitleInFilename is false, only minimal sanitization (whitespace normalization, control character removal) is applied
    • \n
    • Thanks to @allison-casey for reporting
    • \n
    \n
  • \n
  • (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view

    \n
      \n
    • Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon
    • \n
    • Changed default Agenda template to disable property-based events (showPropertyBasedEvents: false)
    • \n
    • Users can re-enable property-based events in view settings if needed for non-task date properties
    • \n
    • Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting
    • \n
    \n
  • \n
  • (#1386) Fixed timeEstimateCategory formula showing "Long (>2h)" instead of "No estimate" for new tasks

    \n
      \n
    • The condition didn't properly handle null values when timeEstimate property is unset
    • \n
    • Also fixed the same issue in trackingStatus formula
    • \n
    • Thanks to @nicou for reporting and @osxisl for the PR
    • \n
    \n
  • \n
  • (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes

    \n
      \n
    • Also fixed CalendarView corrupting other view files when saving state on unload
    • \n
    • Thanks to @music-soul1-1 for reporting
    • \n
    \n
  • \n
  • (#1398) Fixed overdue strikethrough showing on completed tasks

    \n
      \n
    • Completed tasks with past due dates no longer display overdue styling
    • \n
    • Respects the "Hide completed from overdue" setting which defaults to true
    • \n
    \n
  • \n
  • (#1363) Fixed calendar view showing nothing when a task has an invalid date format

    \n
      \n
    • Tasks with malformed dates (e.g., "262025-12-16" instead of "2025-12-16") no longer crash the entire calendar
    • \n
    • Invalid tasks are now skipped with a console warning, allowing other events to display normally
    • \n
    • Thanks to @Erelen for reporting
    • \n
    \n
  • \n
  • Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent

    \n
      \n
    • Today's column now uses a tint of the theme accent color for consistent styling
    • \n
    \n
  • \n
  • (#1399) Fixed drag-and-drop not working in Kanban view on mobile

    \n
      \n
    • Cards and columns can now be dragged using long-press gesture on touch devices
    • \n
    • Includes haptic feedback and auto-scroll when dragging near edges
    • \n
    • Thanks to @l-mb for reporting and the fix
    • \n
    \n
  • \n
  • (#1381) Fixed Pomodoro "Change Task" menu not showing newly created tasks

    \n
      \n
    • Tasks created while the Pomodoro view was open would not appear in the task selector
    • \n
    • Improved metadata cache synchronization to properly wait for new files to be indexed
    • \n
    • Thanks to @Ghosthael for reporting
    • \n
    \n
  • \n
  • (#1344) Fixed "Unsaved Changes" popup appearing randomly when closing task edit modal

    \n
      \n
    • The popup would appear even when no changes were made to the task
    • \n
    • Caused by inconsistent trailing whitespace normalization when comparing details content
    • \n
    • Thanks to @hasanyilmaz for reporting
    • \n
    \n
  • \n
  • (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula

    \n
      \n
    • After editing task metadata, cards would jump to "None" column until Obsidian reload
    • \n
    • Column assignment now uses Bases' computed grouping instead of cached formula outputs
    • \n
    • Thanks to @bailob for the fix
    • \n
    \n
  • \n
  • (#1352) Fixed date context menu not preserving time when using increment options

    \n
      \n
    • Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., 2025-12-10T16:00) now preserves the time
    • \n
    • Previously the time would be stripped, changing 2025-12-10T16:00 to 2025-12-11 instead of 2025-12-11T16:00
    • \n
    • Thanks to @cathywu for the feature request
    • \n
    \n
  • \n
  • Fixed v3 saved views exporting incorrectly to Bases format

    \n
      \n
    • Title filters now correctly use file.name instead of note.title
    • \n
    • Archived filters now generate valid boolean expressions instead of malformed comparisons
    • \n
    • "Is Blocked" filters now generate correct expressions with proper operator precedence
    • \n
    \n
  • \n
  • (#1036) Due dates can now be dragged in the calendar view

    \n
      \n
    • Previously only scheduled dates were draggable; due dates were locked in place
    • \n
    • Dragging a due event now updates the task's due date property
    • \n
    • Thanks to @same774 for reporting
    • \n
    \n
  • \n
  • Improved calendar view responsiveness for user interactions

    \n
      \n
    • Task creation, editing, timeblock changes, and view option toggles now update immediately
    • \n
    • Previously these actions waited 5 seconds due to the debounce intended for external file changes
    • \n
    • The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing
    • \n
    \n
  • \n
  • Improved visual affordance for Pomodoro timer duration adjustment buttons

    \n
      \n
    • The +/- buttons below the timer now have visible backgrounds and borders
    • \n
    • Hover states show accent color border for clearer interactivity feedback
    • \n
    • Previously buttons were nearly invisible with transparent backgrounds
    • \n
    \n
  • \n
  • (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows

    \n
      \n
    • Drag-and-drop in Kanban view now works correctly when the view is in a new window
    • \n
    • Context menus (status, priority, task) now work correctly in pop-out windows
    • \n
    • Stats view drill-down modal now appears in the correct window
    • \n
    • Search boxes, task cards, and grouped task lists render correctly
    • \n
    • Root cause: Code was using global document and standard instanceof checks which fail across windows
    • \n
    • Solution: Use ownerDocument for DOM operations and Obsidian's cross-window instanceOf() method
    • \n
    • Known limitation: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global document for mouse event listeners. Use context menus or edit modals as a workaround.
    • \n
    • Updated FullCalendar to v6.1.20
    • \n
    • Thanks to @Snakiest, @same774, and @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1337) Fixed "Convert current note to task" hotkey not applying default values from settings

    \n
      \n
    • When user configured default status/priority as "None", the modal would show "Open" and "Normal" instead
    • \n
    • Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults
    • \n
    • Now preserves constructor-provided task data when converting non-task files
    • \n
    • Thanks to @guihasparyk for reporting
    • \n
    \n
  • \n
  • (#1304) Fixed "Cannot find function map on type Link" error in Blocking view

    \n
      \n
    • Error occurred when embedding the Relationships base and opening the Blocking view
    • \n
    • Root cause: When blockedBy contained a single dependency, Bases returned it as a Link object without a .map() method
    • \n
    • Fixed by wrapping blockedBy with list() before calling .map(), consistent with the Blocked By view
    • \n
    • Thanks to @prayidae for reporting
    • \n
    \n
  • \n
  • (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev

    \n
      \n
    • The page existed but was not accessible from the site navigation
    • \n
    • Thanks to @Arachnidai for reporting
    • \n
    \n
  • \n
  • (#1223) Fixed "Go to today's note" command opening wrong date in positive UTC offset timezones

    \n
      \n
    • In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note
    • \n
    • Root cause: Incorrectly extracting UTC date components instead of local timezone date
    • \n
    • Thanks to @BrucePlumb for reporting
    • \n
    \n
  • \n
\n","text":"Added# Added Korean (한국어) language support Full translation of all 1911 localization keys Korean language option now available in Settings → General → Language Adopted Obsidian 1.11.0 API features with backwards compatibility Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+) Settings sections now use native SettingGroup for improved visual grouping (Obsidian 1.11.0+) Falls back gracefully to traditional section headers on older Obsidian versions (#59) Added shortYear template variable for custom filename and folder templates Use {shortYear} in filename templates (e.g., \"25\" for 2025) Use {{shortYear}} in folder templates Thanks to @Pixeltica for the feature request (#1393) Option to prevent auto-creation of default Base view files on startup New \"Auto-create default files\" toggle in Settings → Integrations → Bases Integration When disabled, deleted sample Base files will not be recreated on plugin load The manual \"Create Default Files\" button remains available for on-demand recreation Thanks to @wealthychef1 for the feature request (#1408) Shift+click on status icon to cycle backwards through statuses Normal click cycles forward through status order Shift+click cycles in reverse order Thanks to @JerryLu086 for the feature request (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled Previously required pressing 'i' before typing when Obsidian vim mode was active The modal now automatically enters insert mode on focus, allowing immediate typing Thanks to @Leo310 for the feature request Added button tooltips to calendar view toolbar Hovering over navigation and view buttons now shows descriptive hints Buttons include: Today, Previous, Next, Month, Week, Day, Year, List Added tooltips to task modal action icons Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover Improves discoverability for new users (#503) Settings now sync automatically across devices via Obsidian Sync Changes to custom statuses, priorities, and other settings apply immediately without restart Thanks to @jhedlund for the feature request and @l-mb for the implementation (#1403) Kanban view option to consolidate status icons in column headers New \"Show status icon in column header only\" toggle in Kanban view settings (disabled by default) When enabled and grouped by status, shows the icon in the column header and hides it on cards Reduces visual redundancy when the column already indicates the status Thanks to @l-mb for the feature request and implementation (#1401) Calendar view option to span tasks between scheduled and due dates New \"Span tasks between scheduled and due dates\" toggle in Calendar view Layout settings When enabled, tasks with both scheduled and due dates display as multi-day bars Provides Gantt chart-style visualization for project planning Thanks to @0atman for the feature request (#1334) {{currentNotePath}} now works for \"Create new inline task\" command The inline task folder setting with {{currentNotePath}} previously only worked for checkbox conversion Now also applies when using the \"Create new inline task\" command from the command palette Thanks to @kmaustral for the feature request (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel New \"Mobile sidebar\" setting in Settings → Features → Pomodoro Timer Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar Allows quick swipe access to the timer without switching notes on mobile devices Thanks to @Evthestrike for the feature request (#1220) Option to use ICS event end time as task due date New \"Use ICS event end time as task due date\" toggle in Settings → Integrations → Calendar Subscriptions When enabled, tasks created from calendar events will have their due date set to the event's end time For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec) For timed events, includes the exact end time Defaults to disabled to preserve existing behavior Thanks to @MiserMagus for the feature request (#1108) Option to use task duration instead of due date for ICS calendar export New \"Use task duration for event length\" toggle in Settings → Integrations → Automatic ICS Export When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines When disabled (default), preserves existing behavior using due date as DTEND Thanks to @bepolymathe for the feature request Fixed# (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified Input like \"Task scheduled for tomorrow due next week\" now correctly sets both scheduled and due dates Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers Thanks to @wealthychef1 for reporting (#1384) Fixed title being sanitized even when \"Store Task Title in Filename\" is disabled Characters like ?, <, >, :, etc. are now preserved in task titles when they won't be used in filenames When storeTitleInFilename is false, only minimal sanitization (whitespace normalization, control character removal) is applied Thanks to @allison-casey for reporting (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon Changed default Agenda template to disable property-based events (showPropertyBasedEvents: false) Users can re-enable property-based events in view settings if needed for non-task date properties Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting (#1386) Fixed timeEstimateCategory formula showing \"Long (>2h)\" instead of \"No estimate\" for new tasks The condition didn't properly handle null values when timeEstimate property is unset Also fixed the same issue in trackingStatus formula Thanks to @nicou for reporting and @osxisl for the PR (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes Also fixed CalendarView corrupting other view files when saving state on unload Thanks to @music-soul1-1 for reporting (#1398) Fixed overdue strikethrough showing on completed tasks Completed tasks with past due dates no longer display overdue styling Respects the \"Hide completed from overdue\" setting which defaults to true (#1363) Fixed calendar view showing nothing when a task has an invalid date format Tasks with malformed dates (e.g., \"262025-12-16\" instead of \"2025-12-16\") no longer crash the entire calendar Invalid tasks are now skipped with a console warning, allowing other events to display normally Thanks to @Erelen for reporting Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent Today's column now uses a tint of the theme accent color for consistent styling (#1399) Fixed drag-and-drop not working in Kanban view on mobile Cards and columns can now be dragged using long-press gesture on touch devices Includes haptic feedback and auto-scroll when dragging near edges Thanks to @l-mb for reporting and the fix (#1381) Fixed Pomodoro \"Change Task\" menu not showing newly created tasks Tasks created while the Pomodoro view was open would not appear in the task selector Improved metadata cache synchronization to properly wait for new files to be indexed Thanks to @Ghosthael for reporting (#1344) Fixed \"Unsaved Changes\" popup appearing randomly when closing task edit modal The popup would appear even when no changes were made to the task Caused by inconsistent trailing whitespace normalization when comparing details content Thanks to @hasanyilmaz for reporting (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula After editing task metadata, cards would jump to \"None\" column until Obsidian reload Column assignment now uses Bases' computed grouping instead of cached formula outputs Thanks to @bailob for the fix (#1352) Fixed date context menu not preserving time when using increment options Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., 2025-12-10T16:00) now preserves the time Previously the time would be stripped, changing 2025-12-10T16:00 to 2025-12-11 instead of 2025-12-11T16:00 Thanks to @cathywu for the feature request Fixed v3 saved views exporting incorrectly to Bases format Title filters now correctly use file.name instead of note.title Archived filters now generate valid boolean expressions instead of malformed comparisons \"Is Blocked\" filters now generate correct expressions with proper operator precedence (#1036) Due dates can now be dragged in the calendar view Previously only scheduled dates were draggable; due dates were locked in place Dragging a due event now updates the task's due date property Thanks to @same774 for reporting Improved calendar view responsiveness for user interactions Task creation, editing, timeblock changes, and view option toggles now update immediately Previously these actions waited 5 seconds due to the debounce intended for external file changes The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing Improved visual affordance for Pomodoro timer duration adjustment buttons The +/- buttons below the timer now have visible backgrounds and borders Hover states show accent color border for clearer interactivity feedback Previously buttons were nearly invisible with transparent backgrounds (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows Drag-and-drop in Kanban view now works correctly when the view is in a new window Context menus (status, priority, task) now work correctly in pop-out windows Stats view drill-down modal now appears in the correct window Search boxes, task cards, and grouped task lists render correctly Root cause: Code was using global document and standard instanceof checks which fail across windows Solution: Use ownerDocument for DOM operations and Obsidian's cross-window instanceOf() method Known limitation: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global document for mouse event listeners. Use context menus or edit modals as a workaround. Updated FullCalendar to v6.1.20 Thanks to @Snakiest, @same774, and @3zra47 for reporting (#1337) Fixed \"Convert current note to task\" hotkey not applying default values from settings When user configured default status/priority as \"None\", the modal would show \"Open\" and \"Normal\" instead Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults Now preserves constructor-provided task data when converting non-task files Thanks to @guihasparyk for reporting (#1304) Fixed \"Cannot find function map on type Link\" error in Blocking view Error occurred when embedding the Relationships base and opening the Blocking view Root cause: When blockedBy contained a single dependency, Bases returned it as a Link object without a .map() method Fixed by wrapping blockedBy with list() before calling .map(), consistent with the Blocked By view Thanks to @prayidae for reporting (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev The page existed but was not accessible from the site navigation Thanks to @Arachnidai for reporting (#1223) Fixed \"Go to today's note\" command opening wrong date in positive UTC offset timezones In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note Root cause: Incorrectly extracting UTC date components instead of local timezone date Thanks to @BrucePlumb for reporting"},{"route":"/obsidian/releases/4.2.1/","title":"TaskNotes 4.2.1","description":"(#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.2.1.md","namespace":"obsidian","relativePath":"releases/4.2.1.md","raw":"# TaskNotes 4.2.1\n\n## Added\n\n- New Calendars API endpoint for access to calendar data\n - Access calendar provider information and connection status\n - Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions\n - Filter events by date range\n - [`tasknotes-cli`](https://github.com/callumalpass/tasknotes-cli) has been updated to make use of this endpoint\n\n## Fixed\n\n- (#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder\n - \"Create New Task\" now correctly uses the configured default task folder\n - \"Create New Inline Task\" continues to use the inline task folder setting\n - Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming\n\n- (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified\n - Entering something like \"task due Jan 9 at Jan 9\" now correctly sets both the due date and scheduled date\n - Thanks to @wealthychef1 and @dblinnikov for reporting\n\n- (#1410) Fixed vim insert mode not activating in task creation modal\n - The modal now correctly enters insert mode when vim keybindings are enabled\n - Thanks to @Leo310 for the feature request\n\n- (#1422) Fixed tags with dashes not being parsed correctly\n - Tags like `#my-tag` were being truncated to `#my`\n - Thanks to @JerryLu086 for reporting\n\n- (#1419) Fixed custom statuses and priorities not saving in settings\n - Values entered in text fields were sometimes lost when closing the settings modal\n - Thanks to @s33a for reporting\n","aliases":["/releases/4.2.1/","/releases/4.2.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • New Calendars API endpoint for access to calendar data
      \n
    • Access calendar provider information and connection status
    • \n
    • Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions
    • \n
    • Filter events by date range
    • \n
    • tasknotes-cli has been updated to make use of this endpoint
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1424) Fixed "Create New Task" command creating tasks in active folder instead of default folder

    \n
      \n
    • "Create New Task" now correctly uses the configured default task folder
    • \n
    • "Create New Inline Task" continues to use the inline task folder setting
    • \n
    • Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming
    • \n
    \n
  • \n
  • (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified

    \n
      \n
    • Entering something like "task due Jan 9 at Jan 9" now correctly sets both the due date and scheduled date
    • \n
    • Thanks to @wealthychef1 and @dblinnikov for reporting
    • \n
    \n
  • \n
  • (#1410) Fixed vim insert mode not activating in task creation modal

    \n
      \n
    • The modal now correctly enters insert mode when vim keybindings are enabled
    • \n
    • Thanks to @Leo310 for the feature request
    • \n
    \n
  • \n
  • (#1422) Fixed tags with dashes not being parsed correctly

    \n
      \n
    • Tags like #my-tag were being truncated to #my
    • \n
    • Thanks to @JerryLu086 for reporting
    • \n
    \n
  • \n
  • (#1419) Fixed custom statuses and priorities not saving in settings

    \n
      \n
    • Values entered in text fields were sometimes lost when closing the settings modal
    • \n
    • Thanks to @s33a for reporting
    • \n
    \n
  • \n
\n","text":"Added# New Calendars API endpoint for access to calendar data Access calendar provider information and connection status Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions Filter events by date range tasknotes-cli has been updated to make use of this endpoint Fixed# (#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder \"Create New Task\" now correctly uses the configured default task folder \"Create New Inline Task\" continues to use the inline task folder setting Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified Entering something like \"task due Jan 9 at Jan 9\" now correctly sets both the due date and scheduled date Thanks to @wealthychef1 and @dblinnikov for reporting (#1410) Fixed vim insert mode not activating in task creation modal The modal now correctly enters insert mode when vim keybindings are enabled Thanks to @Leo310 for the feature request (#1422) Fixed tags with dashes not being parsed correctly Tags like #my-tag were being truncated to #my Thanks to @JerryLu086 for reporting (#1419) Fixed custom statuses and priorities not saving in settings Values entered in text fields were sometimes lost when closing the settings modal Thanks to @s33a for reporting"},{"route":"/obsidian/releases/4.3.0/","title":"TaskNotes 4.3.0","description":"(#1361) Option to disable inline task overlay for aliased wikilinks","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.0.md","namespace":"obsidian","relativePath":"releases/4.3.0.md","raw":"# TaskNotes 4.3.0\n\n## Changed\n\n- (#1437) Unified template variable syntax and available variables across filename and body templates\n - Both systems now use double-brace `{{variable}}` syntax consistently\n - Single-brace `{variable}` syntax remains supported for backwards compatibility but is deprecated\n - Settings UI shows a warning when deprecated single-brace syntax is detected\n - Filename templates gain body template variables: `{{contexts}}`, `{{tags}}`, `{{hashtags}}`, `{{timeEstimate}}`, `{{details}}`, `{{parentNote}}`\n - Body templates gain filename template variables: `{{zettel}}`, `{{nano}}`, and all extended date/time variables\n - Thanks to @23maverick23 for reporting\n\n## Added\n\n- (#1361) Option to disable inline task overlay for aliased wikilinks\n - New setting in Features → Inline Tasks: \"Disable overlay for aliased links\"\n - When enabled, links with aliases like `[[Task|Check Status]]` render as plain links\n - Links without aliases continue to show the interactive task widget\n - Useful when embedding tasks in prose where the widget would be disruptive\n - Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117\n\n- (#1199, #1205) Google Calendar export for tasks\n - Sync tasks to Google Calendar based on scheduled or due dates\n - Automatic sync on task create, update, complete, and delete\n - Configurable event title templates with placeholders (`{{title}}`, `{{status}}`, `{{priority}}`, etc.)\n - Event descriptions include task metadata and optional Obsidian deep link\n - Support for all-day or timed events with customizable duration\n - Event color customization using Google Calendar's color palette\n - Default reminder setting for popup notifications\n - Bulk sync and unlink actions in settings\n - Task-event linking stored in frontmatter (`googleCalendarEventId`)\n - Recurring tasks sync as Google Calendar recurring events\n - Completed or skipped recurring instances are automatically excluded\n - Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input\n\n## Fixed\n\n- (#1413) Fixed angle-bracket links and project title display\n - Angle-bracket links like `[Spec]()` now resolve correctly\n - Project links display frontmatter `title` instead of raw filename/path when available\n - Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants\n - Many thanks to @normenmueller for the contribution\n\n- (#1414) Kanban column headers now display configured priority labels instead of raw values\n - Many thanks to @normenmueller for the contribution\n\n- (#1416) Fixed property-based task identification mutating tags unexpectedly\n - Tags are only written when explicitly changed by the user\n - Task tag is only added in tag-based identification mode\n - Fixes #1391\n - Thanks to @loukandr for reporting and @normenmueller for the fix\n\n- (#1187) Fixed \"Unknown view types\" error when opening Bases views after upgrading from pre-V4\n - Users who had disabled Bases support in earlier versions could not open Bases views after upgrading\n - Settings migration now automatically re-enables Bases support since the toggle was removed in V4\n - Thanks to @MiracleXYZ for reporting\n\n- (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs\n - The top-level task filter was excluding non-task files from the Projects view\n - Projects can be any file type (not just tasks), so the filter is now applied per-view\n - Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not\n - Users with existing relationships.base files should delete and regenerate them to get the fix\n - Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution\n\n- Fixed calendar view type not persisting or applying when changed\n - View type changes via header buttons (week/day/month) are now saved to the .base file\n - View type changes via Bases settings panel now apply immediately without reload\n\n- (#1441) Fixed task dragging broken with \"Span tasks between scheduled and due dates\" enabled\n - Span events can now be dragged to move tasks in time\n - Dragging shifts both scheduled and due dates proportionally, preserving the span duration\n - Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position\n - Thanks to @Peeeet for reporting\n","aliases":["/releases/4.3.0/","/releases/4.3.0/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • (#1437) Unified template variable syntax and available variables across filename and body templates
      \n
    • Both systems now use double-brace {{variable}} syntax consistently
    • \n
    • Single-brace {variable} syntax remains supported for backwards compatibility but is deprecated
    • \n
    • Settings UI shows a warning when deprecated single-brace syntax is detected
    • \n
    • Filename templates gain body template variables: {{contexts}}, {{tags}}, {{hashtags}}, {{timeEstimate}}, {{details}}, {{parentNote}}
    • \n
    • Body templates gain filename template variables: {{zettel}}, {{nano}}, and all extended date/time variables
    • \n
    • Thanks to @23maverick23 for reporting
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#1361) Option to disable inline task overlay for aliased wikilinks

    \n
      \n
    • New setting in Features → Inline Tasks: "Disable overlay for aliased links"
    • \n
    • When enabled, links with aliases like [[Task|Check Status]] render as plain links
    • \n
    • Links without aliases continue to show the interactive task widget
    • \n
    • Useful when embedding tasks in prose where the widget would be disruptive
    • \n
    • Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117
    • \n
    \n
  • \n
  • (#1199, #1205) Google Calendar export for tasks

    \n
      \n
    • Sync tasks to Google Calendar based on scheduled or due dates
    • \n
    • Automatic sync on task create, update, complete, and delete
    • \n
    • Configurable event title templates with placeholders ({{title}}, {{status}}, {{priority}}, etc.)
    • \n
    • Event descriptions include task metadata and optional Obsidian deep link
    • \n
    • Support for all-day or timed events with customizable duration
    • \n
    • Event color customization using Google Calendar's color palette
    • \n
    • Default reminder setting for popup notifications
    • \n
    • Bulk sync and unlink actions in settings
    • \n
    • Task-event linking stored in frontmatter (googleCalendarEventId)
    • \n
    • Recurring tasks sync as Google Calendar recurring events
    • \n
    • Completed or skipped recurring instances are automatically excluded
    • \n
    • Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1413) Fixed angle-bracket links and project title display

    \n
      \n
    • Angle-bracket links like [Spec](<Projects/Client X/Spec.md>) now resolve correctly
    • \n
    • Project links display frontmatter title instead of raw filename/path when available
    • \n
    • Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants
    • \n
    • Many thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1414) Kanban column headers now display configured priority labels instead of raw values

    \n
      \n
    • Many thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1416) Fixed property-based task identification mutating tags unexpectedly

    \n
      \n
    • Tags are only written when explicitly changed by the user
    • \n
    • Task tag is only added in tag-based identification mode
    • \n
    • Fixes #1391
    • \n
    • Thanks to @loukandr for reporting and @normenmueller for the fix
    • \n
    \n
  • \n
  • (#1187) Fixed "Unknown view types" error when opening Bases views after upgrading from pre-V4

    \n
      \n
    • Users who had disabled Bases support in earlier versions could not open Bases views after upgrading
    • \n
    • Settings migration now automatically re-enables Bases support since the toggle was removed in V4
    • \n
    • Thanks to @MiracleXYZ for reporting
    • \n
    \n
  • \n
  • (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs

    \n
      \n
    • The top-level task filter was excluding non-task files from the Projects view
    • \n
    • Projects can be any file type (not just tasks), so the filter is now applied per-view
    • \n
    • Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not
    • \n
    • Users with existing relationships.base files should delete and regenerate them to get the fix
    • \n
    • Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution
    • \n
    \n
  • \n
  • Fixed calendar view type not persisting or applying when changed

    \n
      \n
    • View type changes via header buttons (week/day/month) are now saved to the .base file
    • \n
    • View type changes via Bases settings panel now apply immediately without reload
    • \n
    \n
  • \n
  • (#1441) Fixed task dragging broken with "Span tasks between scheduled and due dates" enabled

    \n
      \n
    • Span events can now be dragged to move tasks in time
    • \n
    • Dragging shifts both scheduled and due dates proportionally, preserving the span duration
    • \n
    • Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position
    • \n
    • Thanks to @Peeeet for reporting
    • \n
    \n
  • \n
\n","text":"Changed# (#1437) Unified template variable syntax and available variables across filename and body templates Both systems now use double-brace {{variable}} syntax consistently Single-brace {variable} syntax remains supported for backwards compatibility but is deprecated Settings UI shows a warning when deprecated single-brace syntax is detected Filename templates gain body template variables: {{contexts}}, {{tags}}, {{hashtags}}, {{timeEstimate}}, {{details}}, {{parentNote}} Body templates gain filename template variables: {{zettel}}, {{nano}}, and all extended date/time variables Thanks to @23maverick23 for reporting Added# (#1361) Option to disable inline task overlay for aliased wikilinks New setting in Features → Inline Tasks: \"Disable overlay for aliased links\" When enabled, links with aliases like [[Task|Check Status]] render as plain links Links without aliases continue to show the interactive task widget Useful when embedding tasks in prose where the widget would be disruptive Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117 (#1199, #1205) Google Calendar export for tasks Sync tasks to Google Calendar based on scheduled or due dates Automatic sync on task create, update, complete, and delete Configurable event title templates with placeholders ({{title}}, {{status}}, {{priority}}, etc.) Event descriptions include task metadata and optional Obsidian deep link Support for all-day or timed events with customizable duration Event color customization using Google Calendar's color palette Default reminder setting for popup notifications Bulk sync and unlink actions in settings Task-event linking stored in frontmatter (googleCalendarEventId) Recurring tasks sync as Google Calendar recurring events Completed or skipped recurring instances are automatically excluded Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input Fixed# (#1413) Fixed angle-bracket links and project title display Angle-bracket links like [Spec]() now resolve correctly Project links display frontmatter title instead of raw filename/path when available Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants Many thanks to @normenmueller for the contribution (#1414) Kanban column headers now display configured priority labels instead of raw values Many thanks to @normenmueller for the contribution (#1416) Fixed property-based task identification mutating tags unexpectedly Tags are only written when explicitly changed by the user Task tag is only added in tag-based identification mode Fixes #1391 Thanks to @loukandr for reporting and @normenmueller for the fix (#1187) Fixed \"Unknown view types\" error when opening Bases views after upgrading from pre-V4 Users who had disabled Bases support in earlier versions could not open Bases views after upgrading Settings migration now automatically re-enables Bases support since the toggle was removed in V4 Thanks to @MiracleXYZ for reporting (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs The top-level task filter was excluding non-task files from the Projects view Projects can be any file type (not just tasks), so the filter is now applied per-view Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not Users with existing relationships.base files should delete and regenerate them to get the fix Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution Fixed calendar view type not persisting or applying when changed View type changes via header buttons (week/day/month) are now saved to the .base file View type changes via Bases settings panel now apply immediately without reload (#1441) Fixed task dragging broken with \"Span tasks between scheduled and due dates\" enabled Span events can now be dragged to move tasks in time Dragging shifts both scheduled and due dates proportionally, preserving the span duration Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position Thanks to @Peeeet for reporting"},{"route":"/obsidian/releases/4.3.1/","title":"TaskNotes 4.3.1","description":"(#1546) Added sticky kanban column headers that remain visible while scrolling","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.1.md","namespace":"obsidian","relativePath":"releases/4.3.1.md","raw":"# TaskNotes 4.3.1\n\n## Added\n\n- (#1546) Added sticky kanban column headers that remain visible while scrolling\n - Thanks to @normenmueller for the contribution\n\n- (#1458) Added CSS color classes to context tags for custom styling\n - Each context tag now receives a unique CSS class based on its name (e.g., `context-tag--color-0` through `context-tag--color-19`)\n - Enables styling individual contexts via CSS snippets\n - Thanks to @phortx for the contribution\n\n- Added [mdbase-spec](https://mdbase.dev) type definition generation\n - New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (`mdbase.yaml` and `_types/task.md`) at the vault root\n - Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change\n - Enables interoperability with other tools that support the mdbase-spec format\n\n## Fixed\n\n- (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter\n - Dependencies now retain their `[[wikilink]]` format when saved, preventing them from breaking on file rename\n - Thanks to @renekalff for reporting\n\n- (#1443) Fixed default status/priority not updating when the referenced custom value is deleted\n - Deleting a custom status or priority that was set as the default now resets the default to the first available value\n - Thanks to @l-mb for the contribution\n\n- (#1448) Fixed project removals not persisting from the task edit modal\n - Removing all projects from a task now correctly clears the projects field\n - Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection\n - Thanks to @normenmueller for the contribution\n\n- (#1514), (#1517) Fixed task reminders not syncing to Google Calendar\n - Task-specific reminders (both relative and absolute) now sync to Google Calendar\n - Previously only the global default reminder setting was used, ignoring per-task reminders\n - Thanks to @christenbc for the contribution\n\n- (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked\n - Status dot, checkbox, and card styling now update instantly when cycling status\n - Thanks to @christenbc for the contribution\n\n- (#1537) Fixed Google Calendar errors during bulk sync\n - Added rate limiting to space out API calls, preventing errors when syncing many tasks at once\n - Thanks to @Lorite for the contribution\n\n- (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar\n - Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day\n - Clearing recurrence from a task now also removes it from the synced Google Calendar event\n - Thanks to @christenbc for the contribution\n\n- (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., `#project/sub-project`) being truncated in link text\n - Tags containing slashes, hyphens, and Unicode characters now render correctly\n - Thanks to @normenmueller for the contribution and @ysafonov for reporting\n\n- (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart\n - The dropdown now re-populates once calendars are fetched during startup\n - Thanks to @N-HEDGER for reporting\n\n- (#1567) Fixed inline task card widgets disappearing momentarily\n - When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link\n - Thanks to @scztt for reporting\n\n- (#1568) Fixed deleted tasks not being removed from Google Calendar\n - When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically\n - Thanks to @kmaustral for reporting\n\n- Fixed Integrations tab spacing and layout issues\n - Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections\n","aliases":["/releases/4.3.1/","/releases/4.3.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1546) Added sticky kanban column headers that remain visible while scrolling

    \n
      \n
    • Thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1458) Added CSS color classes to context tags for custom styling

    \n
      \n
    • Each context tag now receives a unique CSS class based on its name (e.g., context-tag--color-0 through context-tag--color-19)
    • \n
    • Enables styling individual contexts via CSS snippets
    • \n
    • Thanks to @phortx for the contribution
    • \n
    \n
  • \n
  • Added mdbase-spec type definition generation

    \n
      \n
    • New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (mdbase.yaml and _types/task.md) at the vault root
    • \n
    • Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change
    • \n
    • Enables interoperability with other tools that support the mdbase-spec format
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter

    \n
      \n
    • Dependencies now retain their [[wikilink]] format when saved, preventing them from breaking on file rename
    • \n
    • Thanks to @renekalff for reporting
    • \n
    \n
  • \n
  • (#1443) Fixed default status/priority not updating when the referenced custom value is deleted

    \n
      \n
    • Deleting a custom status or priority that was set as the default now resets the default to the first available value
    • \n
    • Thanks to @l-mb for the contribution
    • \n
    \n
  • \n
  • (#1448) Fixed project removals not persisting from the task edit modal

    \n
      \n
    • Removing all projects from a task now correctly clears the projects field
    • \n
    • Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection
    • \n
    • Thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1514), (#1517) Fixed task reminders not syncing to Google Calendar

    \n
      \n
    • Task-specific reminders (both relative and absolute) now sync to Google Calendar
    • \n
    • Previously only the global default reminder setting was used, ignoring per-task reminders
    • \n
    • Thanks to @christenbc for the contribution
    • \n
    \n
  • \n
  • (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked

    \n
      \n
    • Status dot, checkbox, and card styling now update instantly when cycling status
    • \n
    • Thanks to @christenbc for the contribution
    • \n
    \n
  • \n
  • (#1537) Fixed Google Calendar errors during bulk sync

    \n
      \n
    • Added rate limiting to space out API calls, preventing errors when syncing many tasks at once
    • \n
    • Thanks to @Lorite for the contribution
    • \n
    \n
  • \n
  • (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar

    \n
      \n
    • Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day
    • \n
    • Clearing recurrence from a task now also removes it from the synced Google Calendar event
    • \n
    • Thanks to @christenbc for the contribution
    • \n
    \n
  • \n
  • (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., #project/sub-project) being truncated in link text

    \n
      \n
    • Tags containing slashes, hyphens, and Unicode characters now render correctly
    • \n
    • Thanks to @normenmueller for the contribution and @ysafonov for reporting
    • \n
    \n
  • \n
  • (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart

    \n
      \n
    • The dropdown now re-populates once calendars are fetched during startup
    • \n
    • Thanks to @N-HEDGER for reporting
    • \n
    \n
  • \n
  • (#1567) Fixed inline task card widgets disappearing momentarily

    \n
      \n
    • When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link
    • \n
    • Thanks to @scztt for reporting
    • \n
    \n
  • \n
  • (#1568) Fixed deleted tasks not being removed from Google Calendar

    \n
      \n
    • When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • Fixed Integrations tab spacing and layout issues

    \n
      \n
    • Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections
    • \n
    \n
  • \n
\n","text":"Added# (#1546) Added sticky kanban column headers that remain visible while scrolling Thanks to @normenmueller for the contribution (#1458) Added CSS color classes to context tags for custom styling Each context tag now receives a unique CSS class based on its name (e.g., context-tag--color-0 through context-tag--color-19) Enables styling individual contexts via CSS snippets Thanks to @phortx for the contribution Added mdbase-spec type definition generation New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (mdbase.yaml and _types/task.md) at the vault root Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change Enables interoperability with other tools that support the mdbase-spec format Fixed# (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter Dependencies now retain their [[wikilink]] format when saved, preventing them from breaking on file rename Thanks to @renekalff for reporting (#1443) Fixed default status/priority not updating when the referenced custom value is deleted Deleting a custom status or priority that was set as the default now resets the default to the first available value Thanks to @l-mb for the contribution (#1448) Fixed project removals not persisting from the task edit modal Removing all projects from a task now correctly clears the projects field Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection Thanks to @normenmueller for the contribution (#1514), (#1517) Fixed task reminders not syncing to Google Calendar Task-specific reminders (both relative and absolute) now sync to Google Calendar Previously only the global default reminder setting was used, ignoring per-task reminders Thanks to @christenbc for the contribution (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked Status dot, checkbox, and card styling now update instantly when cycling status Thanks to @christenbc for the contribution (#1537) Fixed Google Calendar errors during bulk sync Added rate limiting to space out API calls, preventing errors when syncing many tasks at once Thanks to @Lorite for the contribution (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day Clearing recurrence from a task now also removes it from the synced Google Calendar event Thanks to @christenbc for the contribution (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., #project/sub-project) being truncated in link text Tags containing slashes, hyphens, and Unicode characters now render correctly Thanks to @normenmueller for the contribution and @ysafonov for reporting (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart The dropdown now re-populates once calendars are fetched during startup Thanks to @N-HEDGER for reporting (#1567) Fixed inline task card widgets disappearing momentarily When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link Thanks to @scztt for reporting (#1568) Fixed deleted tasks not being removed from Google Calendar When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically Thanks to @kmaustral for reporting Fixed Integrations tab spacing and layout issues Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections"},{"route":"/obsidian/releases/4.3.2/","title":"TaskNotes 4.3.2","description":"(#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.2.md","namespace":"obsidian","relativePath":"releases/4.3.2.md","raw":"# TaskNotes 4.3.2\n\n## Added\n\n- (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus\n - Previously required typing at least one character before suggestions appeared\n - Already-selected values are excluded from the suggestion list\n - Thanks to @Glint-Eye for the suggestion\n\n- (#1506) Added setting to configure the default color for new timeblocks\n - New color picker in Settings > Features > Timeblocking\n - Previously hardcoded to indigo; now user-configurable\n - Thanks to @phillipadsmith for the suggestion\n\n## Fixed\n\n- Fixed [mdbase-spec](https://mdbase.dev) type definition generation not triggering when settings change\n\n- (#1456) Fixed inline tasks jumping visually when marked as completed\n - Thanks to @3zra47 for reporting\n\n- (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances\n - Thanks to @slipstyle for reporting\n\n- (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time\n - All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder\n - Thanks to @Jomo94 for reporting\n\n- (#1470) Fixed cursor showing as default instead of pointer on interactive elements\n - Thanks to @TheFrostedDev for reporting\n\n- (#1491) Fixed boolean property values being quoted as strings in Bases filter generation\n - When using a boolean property (e.g. `tasknote: true`) for task identification, the filter now correctly handles the value\n - Thanks to @denisgorod for reporting\n\n- (#1494) Fixed Kanban swimlane resetting to \"None\" on initial load and after navigation\n - Thanks to @tnguyen2018 for reporting\n\n- (#1555) Fixed \"Folder already exists\" error when creating tasks or converting inline tasks\n - Thanks to @jkune5 for reporting\n\n- (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height\n - Thanks to @willfanguy for reporting\n\n- (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view\n - Thanks to @karenchoe428 for reporting\n\n- (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large\n - Thanks to @kazerniel for reporting\n\n- (#1492) Fixed hardcoded \"open\" status leaking into filenames, recurring task displays, and parsing fallbacks\n - Users with custom default statuses (e.g. \"inbox\") no longer see \"open\" where their configured default should appear\n - Recurring tasks now show their actual configured status instead of always displaying \"open\" when not completed\n - Thanks to @macdrifter for reporting\n\n- (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view\n - Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior\n - Added today indicator highlighting to list view day headers\n - Thanks to @Robubble for the suggestion\n","aliases":["/releases/4.3.2/","/releases/4.3.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus

    \n
      \n
    • Previously required typing at least one character before suggestions appeared
    • \n
    • Already-selected values are excluded from the suggestion list
    • \n
    • Thanks to @Glint-Eye for the suggestion
    • \n
    \n
  • \n
  • (#1506) Added setting to configure the default color for new timeblocks

    \n
      \n
    • New color picker in Settings > Features > Timeblocking
    • \n
    • Previously hardcoded to indigo; now user-configurable
    • \n
    • Thanks to @phillipadsmith for the suggestion
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed mdbase-spec type definition generation not triggering when settings change

    \n
  • \n
  • (#1456) Fixed inline tasks jumping visually when marked as completed

    \n
      \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances

    \n
      \n
    • Thanks to @slipstyle for reporting
    • \n
    \n
  • \n
  • (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time

    \n
      \n
    • All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder
    • \n
    • Thanks to @Jomo94 for reporting
    • \n
    \n
  • \n
  • (#1470) Fixed cursor showing as default instead of pointer on interactive elements

    \n
      \n
    • Thanks to @TheFrostedDev for reporting
    • \n
    \n
  • \n
  • (#1491) Fixed boolean property values being quoted as strings in Bases filter generation

    \n
      \n
    • When using a boolean property (e.g. tasknote: true) for task identification, the filter now correctly handles the value
    • \n
    • Thanks to @denisgorod for reporting
    • \n
    \n
  • \n
  • (#1494) Fixed Kanban swimlane resetting to "None" on initial load and after navigation

    \n
      \n
    • Thanks to @tnguyen2018 for reporting
    • \n
    \n
  • \n
  • (#1555) Fixed "Folder already exists" error when creating tasks or converting inline tasks

    \n
      \n
    • Thanks to @jkune5 for reporting
    • \n
    \n
  • \n
  • (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height

    \n
      \n
    • Thanks to @willfanguy for reporting
    • \n
    \n
  • \n
  • (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view

    \n
      \n
    • Thanks to @karenchoe428 for reporting
    • \n
    \n
  • \n
  • (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large

    \n
      \n
    • Thanks to @kazerniel for reporting
    • \n
    \n
  • \n
  • (#1492) Fixed hardcoded "open" status leaking into filenames, recurring task displays, and parsing fallbacks

    \n
      \n
    • Users with custom default statuses (e.g. "inbox") no longer see "open" where their configured default should appear
    • \n
    • Recurring tasks now show their actual configured status instead of always displaying "open" when not completed
    • \n
    • Thanks to @macdrifter for reporting
    • \n
    \n
  • \n
  • (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view

    \n
      \n
    • Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior
    • \n
    • Added today indicator highlighting to list view day headers
    • \n
    • Thanks to @Robubble for the suggestion
    • \n
    \n
  • \n
\n","text":"Added# (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus Previously required typing at least one character before suggestions appeared Already-selected values are excluded from the suggestion list Thanks to @Glint-Eye for the suggestion (#1506) Added setting to configure the default color for new timeblocks New color picker in Settings > Features > Timeblocking Previously hardcoded to indigo; now user-configurable Thanks to @phillipadsmith for the suggestion Fixed# Fixed mdbase-spec type definition generation not triggering when settings change (#1456) Fixed inline tasks jumping visually when marked as completed Thanks to @3zra47 for reporting (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances Thanks to @slipstyle for reporting (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder Thanks to @Jomo94 for reporting (#1470) Fixed cursor showing as default instead of pointer on interactive elements Thanks to @TheFrostedDev for reporting (#1491) Fixed boolean property values being quoted as strings in Bases filter generation When using a boolean property (e.g. tasknote: true) for task identification, the filter now correctly handles the value Thanks to @denisgorod for reporting (#1494) Fixed Kanban swimlane resetting to \"None\" on initial load and after navigation Thanks to @tnguyen2018 for reporting (#1555) Fixed \"Folder already exists\" error when creating tasks or converting inline tasks Thanks to @jkune5 for reporting (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height Thanks to @willfanguy for reporting (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view Thanks to @karenchoe428 for reporting (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large Thanks to @kazerniel for reporting (#1492) Fixed hardcoded \"open\" status leaking into filenames, recurring task displays, and parsing fallbacks Users with custom default statuses (e.g. \"inbox\") no longer see \"open\" where their configured default should appear Recurring tasks now show their actual configured status instead of always displaying \"open\" when not completed Thanks to @macdrifter for reporting (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior Added today indicator highlighting to list view day headers Thanks to @Robubble for the suggestion"},{"route":"/obsidian/releases/4.3.3/","title":"TaskNotes 4.3.3","description":"Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.3.md","namespace":"obsidian","relativePath":"releases/4.3.3.md","raw":"# TaskNotes 4.3.3\n\n## Changed\n\n- Published [`mdbase-tasknotes`](https://github.com/callumalpass/mdbase-tasknotes) (`mtn`), a standalone CLI for managing tasks in markdown files via mdbase\n - Works on the same vault and `_types/task.md` schema that TaskNotes generates, without requiring the plugin or HTTP API\n - Preferable over [tasknotes-cli](https://github.com/callumalpass/tasknotes-cli) as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments\n - Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL\n\n- Extracted shared natural language parsing logic into the standalone npm package [`tasknotes-nlp-core`](https://github.com/callumalpass/tasknotes-nlp-core)\n - The NLP parser and related language configuration are now shared through this package\n - This keeps behavior consistent between the plugin and CLI tools\n\n## Added\n\n- (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed\n - When enabled, all checked checkboxes (`- [x]`) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled\n - Useful for recurring tasks with subtask checklists that need to be repeated each instance\n - Configurable via Settings > Features > Recurring Tasks > \"Reset checkboxes on recurrence\"\n - Thanks to @phortx for the feature request\n\n- (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view\n - When clicking or dragging to select a time slot, a new \"Create calendar event\" option appears in the context menu\n - Opens a modal to enter event title, description, location, and select which calendar to create on\n - Supports both Google Calendar and Microsoft Calendar providers\n - Thanks to @Robubble for the feature request\n\n- (#1597) Added MCP server for AI agent integration\n - Exposes TaskNotes tools at `/mcp` endpoint, gated behind `enableMCP` setting\n - Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics\n - Thanks to @dstotijn for the contribution\n\n## Fixed\n\n- Fixed generated [mdbase](https://mdbase.dev) type definitions for task dependencies using the wrong field type\n - In `_types/task.md`, `blockedBy[].uid` now uses `type: link` (was `type: string`)\n - Better matches how dependency links are serialized in task frontmatter (`[[...]]`)\n\n- Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data\n - In `_types/task.md`, `reminders[].type` now uses enum values `absolute|relative`\n - `reminders[].relatedTo` now uses enum values `due|scheduled`\n - `reminders[].absoluteTime` now uses `type: datetime` (was `type: string`)\n\n- (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data\n - Thanks to @dstotijn for the fix\n\n- (#1581) Fixed Pomodoro starting break instead of work session after app restart\n - After completing a work session and restarting, pressing Start would incorrectly start a break\n - Now properly resets `nextSessionType` when clearing stale sessions or stopping the timer\n - Thanks to @Sirnii for the detailed bug report and root cause analysis\n\n- (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height\n - Added vertical scroll to modal content area while keeping buttons pinned at bottom\n - Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion\n\n- (#1600) Fixed kanban view grouping not working when more than 20 views exist\n - The `getGroupByPropertyId()` method had a hardcoded loop limit of 20 iterations\n - Views at index 20 or higher would not be found, causing groupBy to return null\n - Thanks to @IHaveNoShame for reporting\n\n- (#1595) Fixed task modal floating buttons blocking content on mobile\n - Added mobile-specific (`body.is-mobile`) CSS to ensure proper flex layout\n - Button container now stays pinned at bottom without overlapping scrollable content\n - Thanks to @Jomo94 for reporting\n\n- (#1590) Fixed HTTP API not allowing `blockedBy` dependencies when creating tasks\n - Added `blockedBy` field support to `TaskService.createTask()`\n - Updated API documentation with `blockedBy`, `recurrence`, and `reminders` fields\n - Thanks to @hGriff0n for reporting\n\n- (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones\n - Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11)\n - Fixed date boundary comparisons in both `generateRecurringInstances()` and `generateRecurringTaskInstances()` to compare dates only, not timestamps\n - Thanks to @benefitbug for reporting\n\n- (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message\n - When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: \"Failed to refresh google token: Request failed, status 400\"\n - Now detects irrecoverable token errors (`invalid_grant`, `invalid_client`) and automatically disconnects the OAuth connection\n - Shows actionable error message: \"Google Calendar connection expired. Please reconnect in Settings > Integrations.\"\n - Prevents repeated failed refresh attempts and error message spam\n - Thanks to @osxisl for reporting and @Naesue for helping in discussion\n\n- (#1584) Fixed DOMTokenList error when task status values contain spaces\n - Clicking the status ring on a task card threw an error when status contained spaces (e.g., \"In Progress\")\n - Status and priority values are now sanitized before being used as CSS class names\n - Thanks to @omber for reporting\n","aliases":["/releases/4.3.3/","/releases/4.3.3/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase

    \n
      \n
    • Works on the same vault and _types/task.md schema that TaskNotes generates, without requiring the plugin or HTTP API
    • \n
    • Preferable over tasknotes-cli as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments
    • \n
    • Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL
    • \n
    \n
  • \n
  • Extracted shared natural language parsing logic into the standalone npm package tasknotes-nlp-core

    \n
      \n
    • The NLP parser and related language configuration are now shared through this package
    • \n
    • This keeps behavior consistent between the plugin and CLI tools
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed

    \n
      \n
    • When enabled, all checked checkboxes (- [x]) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled
    • \n
    • Useful for recurring tasks with subtask checklists that need to be repeated each instance
    • \n
    • Configurable via Settings > Features > Recurring Tasks > "Reset checkboxes on recurrence"
    • \n
    • Thanks to @phortx for the feature request
    • \n
    \n
  • \n
  • (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view

    \n
      \n
    • When clicking or dragging to select a time slot, a new "Create calendar event" option appears in the context menu
    • \n
    • Opens a modal to enter event title, description, location, and select which calendar to create on
    • \n
    • Supports both Google Calendar and Microsoft Calendar providers
    • \n
    • Thanks to @Robubble for the feature request
    • \n
    \n
  • \n
  • (#1597) Added MCP server for AI agent integration

    \n
      \n
    • Exposes TaskNotes tools at /mcp endpoint, gated behind enableMCP setting
    • \n
    • Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics
    • \n
    • Thanks to @dstotijn for the contribution
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed generated mdbase type definitions for task dependencies using the wrong field type

    \n
      \n
    • In _types/task.md, blockedBy[].uid now uses type: link (was type: string)
    • \n
    • Better matches how dependency links are serialized in task frontmatter ([[...]])
    • \n
    \n
  • \n
  • Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data

    \n
      \n
    • In _types/task.md, reminders[].type now uses enum values absolute|relative
    • \n
    • reminders[].relatedTo now uses enum values due|scheduled
    • \n
    • reminders[].absoluteTime now uses type: datetime (was type: string)
    • \n
    \n
  • \n
  • (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data

    \n
      \n
    • Thanks to @dstotijn for the fix
    • \n
    \n
  • \n
  • (#1581) Fixed Pomodoro starting break instead of work session after app restart

    \n
      \n
    • After completing a work session and restarting, pressing Start would incorrectly start a break
    • \n
    • Now properly resets nextSessionType when clearing stale sessions or stopping the timer
    • \n
    • Thanks to @Sirnii for the detailed bug report and root cause analysis
    • \n
    \n
  • \n
  • (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height

    \n
      \n
    • Added vertical scroll to modal content area while keeping buttons pinned at bottom
    • \n
    • Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion
    • \n
    \n
  • \n
  • (#1600) Fixed kanban view grouping not working when more than 20 views exist

    \n
      \n
    • The getGroupByPropertyId() method had a hardcoded loop limit of 20 iterations
    • \n
    • Views at index 20 or higher would not be found, causing groupBy to return null
    • \n
    • Thanks to @IHaveNoShame for reporting
    • \n
    \n
  • \n
  • (#1595) Fixed task modal floating buttons blocking content on mobile

    \n
      \n
    • Added mobile-specific (body.is-mobile) CSS to ensure proper flex layout
    • \n
    • Button container now stays pinned at bottom without overlapping scrollable content
    • \n
    • Thanks to @Jomo94 for reporting
    • \n
    \n
  • \n
  • (#1590) Fixed HTTP API not allowing blockedBy dependencies when creating tasks

    \n
      \n
    • Added blockedBy field support to TaskService.createTask()
    • \n
    • Updated API documentation with blockedBy, recurrence, and reminders fields
    • \n
    • Thanks to @hGriff0n for reporting
    • \n
    \n
  • \n
  • (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones

    \n
      \n
    • Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11)
    • \n
    • Fixed date boundary comparisons in both generateRecurringInstances() and generateRecurringTaskInstances() to compare dates only, not timestamps
    • \n
    • Thanks to @benefitbug for reporting
    • \n
    \n
  • \n
  • (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message

    \n
      \n
    • When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: "Failed to refresh google token: Request failed, status 400"
    • \n
    • Now detects irrecoverable token errors (invalid_grant, invalid_client) and automatically disconnects the OAuth connection
    • \n
    • Shows actionable error message: "Google Calendar connection expired. Please reconnect in Settings > Integrations."
    • \n
    • Prevents repeated failed refresh attempts and error message spam
    • \n
    • Thanks to @osxisl for reporting and @Naesue for helping in discussion
    • \n
    \n
  • \n
  • (#1584) Fixed DOMTokenList error when task status values contain spaces

    \n
      \n
    • Clicking the status ring on a task card threw an error when status contained spaces (e.g., "In Progress")
    • \n
    • Status and priority values are now sanitized before being used as CSS class names
    • \n
    • Thanks to @omber for reporting
    • \n
    \n
  • \n
\n","text":"Changed# Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase Works on the same vault and _types/task.md schema that TaskNotes generates, without requiring the plugin or HTTP API Preferable over tasknotes-cli as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL Extracted shared natural language parsing logic into the standalone npm package tasknotes-nlp-core The NLP parser and related language configuration are now shared through this package This keeps behavior consistent between the plugin and CLI tools Added# (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed When enabled, all checked checkboxes (- [x]) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled Useful for recurring tasks with subtask checklists that need to be repeated each instance Configurable via Settings > Features > Recurring Tasks > \"Reset checkboxes on recurrence\" Thanks to @phortx for the feature request (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view When clicking or dragging to select a time slot, a new \"Create calendar event\" option appears in the context menu Opens a modal to enter event title, description, location, and select which calendar to create on Supports both Google Calendar and Microsoft Calendar providers Thanks to @Robubble for the feature request (#1597) Added MCP server for AI agent integration Exposes TaskNotes tools at /mcp endpoint, gated behind enableMCP setting Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics Thanks to @dstotijn for the contribution Fixed# Fixed generated mdbase type definitions for task dependencies using the wrong field type In _types/task.md, blockedBy[].uid now uses type: link (was type: string) Better matches how dependency links are serialized in task frontmatter ([[...]]) Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data In _types/task.md, reminders[].type now uses enum values absolute|relative reminders[].relatedTo now uses enum values due|scheduled reminders[].absoluteTime now uses type: datetime (was type: string) (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data Thanks to @dstotijn for the fix (#1581) Fixed Pomodoro starting break instead of work session after app restart After completing a work session and restarting, pressing Start would incorrectly start a break Now properly resets nextSessionType when clearing stale sessions or stopping the timer Thanks to @Sirnii for the detailed bug report and root cause analysis (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height Added vertical scroll to modal content area while keeping buttons pinned at bottom Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion (#1600) Fixed kanban view grouping not working when more than 20 views exist The getGroupByPropertyId() method had a hardcoded loop limit of 20 iterations Views at index 20 or higher would not be found, causing groupBy to return null Thanks to @IHaveNoShame for reporting (#1595) Fixed task modal floating buttons blocking content on mobile Added mobile-specific (body.is-mobile) CSS to ensure proper flex layout Button container now stays pinned at bottom without overlapping scrollable content Thanks to @Jomo94 for reporting (#1590) Fixed HTTP API not allowing blockedBy dependencies when creating tasks Added blockedBy field support to TaskService.createTask() Updated API documentation with blockedBy, recurrence, and reminders fields Thanks to @hGriff0n for reporting (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11) Fixed date boundary comparisons in both generateRecurringInstances() and generateRecurringTaskInstances() to compare dates only, not timestamps Thanks to @benefitbug for reporting (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: \"Failed to refresh google token: Request failed, status 400\" Now detects irrecoverable token errors (invalid_grant, invalid_client) and automatically disconnects the OAuth connection Shows actionable error message: \"Google Calendar connection expired. Please reconnect in Settings > Integrations.\" Prevents repeated failed refresh attempts and error message spam Thanks to @osxisl for reporting and @Naesue for helping in discussion (#1584) Fixed DOMTokenList error when task status values contain spaces Clicking the status ring on a task card threw an error when status contained spaces (e.g., \"In Progress\") Status and priority values are now sanitized before being used as CSS class names Thanks to @omber for reporting"},{"route":"/obsidian/releases/4.4.0/","title":"TaskNotes 4.4.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.4.0.md","namespace":"obsidian","relativePath":"releases/4.4.0.md","raw":"# TaskNotes 4.4.0\n\n## Added\n\n- [Mdbase](https://mdbase.dev) type generation now includes `tn_role` annotations so external tools can identify each field's role even when frontmatter names are customized\n- (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed\n - Thanks to @jimbo108108 for reporting\n- Mdbase type status fields now include `tn_completed_values` so external tools can reliably identify which status values count as completed\n- (#1576) Added an optional `Checklist Progress` task-card property that renders a compact progress bar and `completed/total` count from top-level markdown checkboxes\n - Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps\n - In Bases views, map `tasks` (`file.tasks`) to `Checklist Progress`\n - Existing `.base` files need `file.tasks` added to the view `order` YAML manually\n - Newly generated `.base` templates now include `file.tasks` in view `order` by default\n - Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion\n\n## Changed\n\n- Mdbase type generation no longer overwrites `mdbase.yaml` if the file already exists, preserving user customisations\n- Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP\n- Webhook runtime state now syncs automatically when plugin settings change\n- Shared HTTP response/body parsing utilities are now consolidated in a dedicated `httpUtils` module\n- Release notes now include a reminder on every release page that default generated `.base` template changes never overwrite existing user `.base` files, and that users can regenerate templates from Settings to pick up updates\n\n## Fixed\n\n- (#1608) Fixed task title frontmatter being removed when `storeTitleInFilename` is enabled\n - `title` is now retained in frontmatter while filename derivation from title remains unchanged\n - Thanks to @victoraraujo105 for the PR\n- (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View\n - Updated range calculations to use local calendar-day boundaries consistently\n- (#1602) Fixed inconsistent `timeEntries` timestamp formats across create/edit/drag/resize flows\n - Time entry timestamps are now written in canonical UTC ISO format (`toISOString()` with `Z`) across all write paths\n- (#1602) Fixed denormalized `timeEntries.duration` drift after edits\n - Time tracking calculations now derive duration from `startTime`/`endTime`\n - Time entry save paths now strip legacy `duration` values instead of persisting them\n - Thanks to @dy66 for opening #1602\n","aliases":["/releases/4.4.0/","/releases/4.4.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Mdbase type generation now includes tn_role annotations so external tools can identify each field's role even when frontmatter names are customized
  • \n
  • (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed
      \n
    • Thanks to @jimbo108108 for reporting
    • \n
    \n
  • \n
  • Mdbase type status fields now include tn_completed_values so external tools can reliably identify which status values count as completed
  • \n
  • (#1576) Added an optional Checklist Progress task-card property that renders a compact progress bar and completed/total count from top-level markdown checkboxes
      \n
    • Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps
    • \n
    • In Bases views, map tasks (file.tasks) to Checklist Progress
    • \n
    • Existing .base files need file.tasks added to the view order YAML manually
    • \n
    • Newly generated .base templates now include file.tasks in view order by default
    • \n
    • Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Mdbase type generation no longer overwrites mdbase.yaml if the file already exists, preserving user customisations
  • \n
  • Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP
  • \n
  • Webhook runtime state now syncs automatically when plugin settings change
  • \n
  • Shared HTTP response/body parsing utilities are now consolidated in a dedicated httpUtils module
  • \n
  • Release notes now include a reminder on every release page that default generated .base template changes never overwrite existing user .base files, and that users can regenerate templates from Settings to pick up updates
  • \n
\n

Fixed#

\n
    \n
  • (#1608) Fixed task title frontmatter being removed when storeTitleInFilename is enabled
      \n
    • title is now retained in frontmatter while filename derivation from title remains unchanged
    • \n
    • Thanks to @victoraraujo105 for the PR
    • \n
    \n
  • \n
  • (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View
      \n
    • Updated range calculations to use local calendar-day boundaries consistently
    • \n
    \n
  • \n
  • (#1602) Fixed inconsistent timeEntries timestamp formats across create/edit/drag/resize flows
      \n
    • Time entry timestamps are now written in canonical UTC ISO format (toISOString() with Z) across all write paths
    • \n
    \n
  • \n
  • (#1602) Fixed denormalized timeEntries.duration drift after edits
      \n
    • Time tracking calculations now derive duration from startTime/endTime
    • \n
    • Time entry save paths now strip legacy duration values instead of persisting them
    • \n
    • Thanks to @dy66 for opening #1602
    • \n
    \n
  • \n
\n","text":"Added# Mdbase type generation now includes tn_role annotations so external tools can identify each field's role even when frontmatter names are customized (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed Thanks to @jimbo108108 for reporting Mdbase type status fields now include tn_completed_values so external tools can reliably identify which status values count as completed (#1576) Added an optional Checklist Progress task-card property that renders a compact progress bar and completed/total count from top-level markdown checkboxes Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps In Bases views, map tasks (file.tasks) to Checklist Progress Existing .base files need file.tasks added to the view order YAML manually Newly generated .base templates now include file.tasks in view order by default Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion Changed# Mdbase type generation no longer overwrites mdbase.yaml if the file already exists, preserving user customisations Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP Webhook runtime state now syncs automatically when plugin settings change Shared HTTP response/body parsing utilities are now consolidated in a dedicated httpUtils module Release notes now include a reminder on every release page that default generated .base template changes never overwrite existing user .base files, and that users can regenerate templates from Settings to pick up updates Fixed# (#1608) Fixed task title frontmatter being removed when storeTitleInFilename is enabled title is now retained in frontmatter while filename derivation from title remains unchanged Thanks to @victoraraujo105 for the PR (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View Updated range calculations to use local calendar-day boundaries consistently (#1602) Fixed inconsistent timeEntries timestamp formats across create/edit/drag/resize flows Time entry timestamps are now written in canonical UTC ISO format (toISOString() with Z) across all write paths (#1602) Fixed denormalized timeEntries.duration drift after edits Time tracking calculations now derive duration from startTime/endTime Time entry save paths now strip legacy duration values instead of persisting them Thanks to @dy66 for opening #1602"},{"route":"/obsidian/releases/4.5.0/","title":"TaskNotes 4.5.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.0.md","namespace":"obsidian","relativePath":"releases/4.5.0.md","raw":"# TaskNotes 4.5.0\n\n## Fixed\n\n- (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled\n - Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports\n- (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup\n - Applied the same protection to task cards so overlapping refreshes are coalesced there too\n - Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior\n- (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events\n - Thanks to @bepolymathe for the request and interoperability details\n- (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task\n - Added a per-view \"Expanded relationships\" option so you can switch between inherited filters and showing all related tasks\n - Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion\n- Improved custom view and search-pane activation when reopening deferred tabs\n- (#1720) Fixed Bases Task List cards showing icon tokens such as `clock` instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs\n - Thanks to @Sirnii for reporting\n- (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs\n - Thanks to @Sarryaz for reporting\n- (#1651) Fixed date `is` query filtering so date-only searches also match timed `scheduled` and `due` values during prefiltering\n - Thanks to @36mimu36 for reporting\n- (#1644) Fixed generated default task views so recurring tasks without a `complete_instances` property still appear as incomplete where appropriate\n - Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior\n- (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today\n - In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere\n - Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix\n- Fixed documentation deployment CI failures caused by `docs-builder/src/js/main.js` being excluded by a broad `.gitignore` rule\n- Reduced background calendar-sync overhead when persisting sync tokens\n- Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads\n- Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened\n- (#1630) Fixed TaskNote inline task cards ignoring centered \"Readable line length\" layout in the Minimal theme\n - Thanks to @martin-forge for reporting\n- Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings\n- Fixed docs site links so internal Markdown links resolve to app routes instead of broken `.md` paths\n- Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar\n\n## Added\n\n- (#1704) Added an option to widen the current day column in multi-day calendar time-grid views\n - You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both\n - Thanks to @dictionarymouse for the feature request\n- Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control\n - Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands\n- (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available\n - Thanks to @hokfujow for the feature request\n- (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views\n - Supports grouped Task List moves, manual ordering via the `tasknotes_manual_order` property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls\n - To use it, sort the view by the Manual Order field (`tasknotes_manual_order` by default), or regenerate the built-in `.base` templates from **Settings → TaskNotes → General → Create Default Files**\n - Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR\n- Added a standalone [TaskNotes Specification](https://github.com/callumalpass/tasknotes-spec) repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests\n- Added [tasknotes-tui](https://github.com/callumalpass/tasknotes-tui), a terminal UI for working with TaskNotes vaults\n - Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette\n\n## Changed\n\n- Refactored several internal modules to reduce coupling and make maintenance safer\n- Updated generated `_types/task.md` output so `dateCreated` and `dateModified` include generated timestamp values, and `recurrence_anchor` defaults to `scheduled`\n- Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy\n- Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations\n","aliases":["/releases/4.5.0/","/releases/4.5.0/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled
      \n
    • Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports
    • \n
    \n
  • \n
  • (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup
      \n
    • Applied the same protection to task cards so overlapping refreshes are coalesced there too
    • \n
    • Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior
    • \n
    \n
  • \n
  • (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events
      \n
    • Thanks to @bepolymathe for the request and interoperability details
    • \n
    \n
  • \n
  • (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task
      \n
    • Added a per-view "Expanded relationships" option so you can switch between inherited filters and showing all related tasks
    • \n
    • Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion
    • \n
    \n
  • \n
  • Improved custom view and search-pane activation when reopening deferred tabs
  • \n
  • (#1720) Fixed Bases Task List cards showing icon tokens such as clock instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs
      \n
    • Thanks to @Sirnii for reporting
    • \n
    \n
  • \n
  • (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs
      \n
    • Thanks to @Sarryaz for reporting
    • \n
    \n
  • \n
  • (#1651) Fixed date is query filtering so date-only searches also match timed scheduled and due values during prefiltering
      \n
    • Thanks to @36mimu36 for reporting
    • \n
    \n
  • \n
  • (#1644) Fixed generated default task views so recurring tasks without a complete_instances property still appear as incomplete where appropriate
      \n
    • Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior
    • \n
    \n
  • \n
  • (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today
      \n
    • In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere
    • \n
    • Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix
    • \n
    \n
  • \n
  • Fixed documentation deployment CI failures caused by docs-builder/src/js/main.js being excluded by a broad .gitignore rule
  • \n
  • Reduced background calendar-sync overhead when persisting sync tokens
  • \n
  • Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads
  • \n
  • Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened
  • \n
  • (#1630) Fixed TaskNote inline task cards ignoring centered "Readable line length" layout in the Minimal theme
      \n
    • Thanks to @martin-forge for reporting
    • \n
    \n
  • \n
  • Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings
  • \n
  • Fixed docs site links so internal Markdown links resolve to app routes instead of broken .md paths
  • \n
  • Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar
  • \n
\n

Added#

\n
    \n
  • (#1704) Added an option to widen the current day column in multi-day calendar time-grid views
      \n
    • You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both
    • \n
    • Thanks to @dictionarymouse for the feature request
    • \n
    \n
  • \n
  • Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control
      \n
    • Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands
    • \n
    \n
  • \n
  • (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available
      \n
    • Thanks to @hokfujow for the feature request
    • \n
    \n
  • \n
  • (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views
      \n
    • Supports grouped Task List moves, manual ordering via the tasknotes_manual_order property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls
    • \n
    • To use it, sort the view by the Manual Order field (tasknotes_manual_order by default), or regenerate the built-in .base templates from Settings → TaskNotes → General → Create Default Files
    • \n
    • Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR
    • \n
    \n
  • \n
  • Added a standalone TaskNotes Specification repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests
  • \n
  • Added tasknotes-tui, a terminal UI for working with TaskNotes vaults
      \n
    • Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Refactored several internal modules to reduce coupling and make maintenance safer
  • \n
  • Updated generated _types/task.md output so dateCreated and dateModified include generated timestamp values, and recurrence_anchor defaults to scheduled
  • \n
  • Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy
  • \n
  • Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations
  • \n
\n","text":"Fixed# (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup Applied the same protection to task cards so overlapping refreshes are coalesced there too Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events Thanks to @bepolymathe for the request and interoperability details (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task Added a per-view \"Expanded relationships\" option so you can switch between inherited filters and showing all related tasks Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion Improved custom view and search-pane activation when reopening deferred tabs (#1720) Fixed Bases Task List cards showing icon tokens such as clock instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs Thanks to @Sirnii for reporting (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs Thanks to @Sarryaz for reporting (#1651) Fixed date is query filtering so date-only searches also match timed scheduled and due values during prefiltering Thanks to @36mimu36 for reporting (#1644) Fixed generated default task views so recurring tasks without a complete_instances property still appear as incomplete where appropriate Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix Fixed documentation deployment CI failures caused by docs-builder/src/js/main.js being excluded by a broad .gitignore rule Reduced background calendar-sync overhead when persisting sync tokens Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened (#1630) Fixed TaskNote inline task cards ignoring centered \"Readable line length\" layout in the Minimal theme Thanks to @martin-forge for reporting Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings Fixed docs site links so internal Markdown links resolve to app routes instead of broken .md paths Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar Added# (#1704) Added an option to widen the current day column in multi-day calendar time-grid views You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both Thanks to @dictionarymouse for the feature request Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available Thanks to @hokfujow for the feature request (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views Supports grouped Task List moves, manual ordering via the tasknotes_manual_order property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls To use it, sort the view by the Manual Order field (tasknotes_manual_order by default), or regenerate the built-in .base templates from Settings → TaskNotes → General → Create Default Files Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR Added a standalone TaskNotes Specification repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests Added tasknotes-tui, a terminal UI for working with TaskNotes vaults Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette Changed# Refactored several internal modules to reduce coupling and make maintenance safer Updated generated _types/task.md output so dateCreated and dateModified include generated timestamp values, and recurrence_anchor defaults to scheduled Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations"},{"route":"/obsidian/releases/4.5.1/","title":"TaskNotes 4.5.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.1.md","namespace":"obsidian","relativePath":"releases/4.5.1.md","raw":"# TaskNotes 4.5.1\n\n## Fixed\n\n- (#1672) Fixed custom date ranges in the MCP time summary tool so `from` and `to` dates work as expected\n - Thanks to @pib for the fix\n- (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward\n - Thanks to @ysafonov for the report and screenshot\n","aliases":["/releases/4.5.1/","/releases/4.5.1/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1672) Fixed custom date ranges in the MCP time summary tool so from and to dates work as expected
      \n
    • Thanks to @pib for the fix
    • \n
    \n
  • \n
  • (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward
      \n
    • Thanks to @ysafonov for the report and screenshot
    • \n
    \n
  • \n
\n","text":"Fixed# (#1672) Fixed custom date ranges in the MCP time summary tool so from and to dates work as expected Thanks to @pib for the fix (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward Thanks to @ysafonov for the report and screenshot"},{"route":"/obsidian/releases/4.5.2/","title":"TaskNotes 4.5.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.2.md","namespace":"obsidian","relativePath":"releases/4.5.2.md","raw":"# TaskNotes 4.5.2\n\n## Added\n\n- (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal.\n - Thanks to @fastrick for the request and @renatomen for the PR.\n- (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values.\n - Thanks to @Treygec for the request and PR.\n- (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior.\n - Thanks to @P-Sc for the PR.\n\n## Changed\n\n- Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations.\n- Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully.\n\n## Fixed\n\n- (#1778) Fixed MCP initialize requests using newer protocol versions such as `2025-11-25` failing instead of negotiating down to TaskNotes' supported MCP version.\n - Thanks to @SakulaPor for reporting.\n- (#1781) Fixed duplicate metadata properties on Bases task cards when bare and `note.`-prefixed property IDs map to the same TaskNotes field.\n - Thanks to @loukandr for reporting and tracing the issue.\n- (#1787) Removed the \"(click to change)\" helper text from recurrence tooltips on task cards.\n - Thanks to @kazerniel for reporting.\n- (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects.\n - Thanks to @prepare4robots for reporting.\n- (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections.\n - Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus.\n - Thanks to @3zra47 for reporting.\n- (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled.\n - Thanks to @spiv for reporting.\n- (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone.\n - Thanks to @3zra47 for reporting and following up.\n- (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes.\n - Thanks to @3zra47 for reporting and following up.\n- (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation.\n - Thanks to @renatomen for the PR.\n- (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling.\n - Thanks to @sigma7863 for the PR.\n- (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties.\n - Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue.\n- (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations.\n - Thanks to @berzernberg for reporting Russian translation gaps.\n- (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder.\n - Thanks to @martin-forge for reporting and the PR.\n- (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date.\n - Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues.\n- (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency.\n - Thanks to @martin-forge for reporting.\n- Published [`mdbase-tasknotes`](https://github.com/callumalpass/mdbase-tasknotes) 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas.\n - Includes clearer create-path diagnostics, natural-language `mtn list --due` filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct `mtn --version` reporting.\n - Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR.\n- (#1667) Fixed NLP scheduled-date parsing so standalone `scheduled` and `start` triggers can set scheduled dates alongside due dates.\n - Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR.\n- Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases.\n- (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight.\n - Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone.\n - Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date.\n - Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758.\n- (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick.\n - Pomodoro stats now refresh on initial render and session completion instead of once per second.\n - Pomodoro daily-note stats now read the relevant date/range instead of routing through all history.\n - Native Pomodoro notifications now respect the notification setting and granted permission before showing.\n - Thanks to @Szu-Szu for reporting and @its-thex for confirming.\n- (#1744) Fixed Bases Task List views so changing the per-view `Expanded relationships` option takes effect on re-render.\n - Restores the expected `show-all` behavior for setups that hide subtasks at the top level with `note.projects.isEmpty()`.\n - Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow.\n- Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards.\n","aliases":["/releases/4.5.2/","/releases/4.5.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal.
      \n
    • Thanks to @fastrick for the request and @renatomen for the PR.
    • \n
    \n
  • \n
  • (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values.
      \n
    • Thanks to @Treygec for the request and PR.
    • \n
    \n
  • \n
  • (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior.
      \n
    • Thanks to @P-Sc for the PR.
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations.
  • \n
  • Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully.
  • \n
\n

Fixed#

\n
    \n
  • (#1778) Fixed MCP initialize requests using newer protocol versions such as 2025-11-25 failing instead of negotiating down to TaskNotes' supported MCP version.
      \n
    • Thanks to @SakulaPor for reporting.
    • \n
    \n
  • \n
  • (#1781) Fixed duplicate metadata properties on Bases task cards when bare and note.-prefixed property IDs map to the same TaskNotes field.
      \n
    • Thanks to @loukandr for reporting and tracing the issue.
    • \n
    \n
  • \n
  • (#1787) Removed the "(click to change)" helper text from recurrence tooltips on task cards.
      \n
    • Thanks to @kazerniel for reporting.
    • \n
    \n
  • \n
  • (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects.
      \n
    • Thanks to @prepare4robots for reporting.
    • \n
    \n
  • \n
  • (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections.
      \n
    • Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus.
    • \n
    • Thanks to @3zra47 for reporting.
    • \n
    \n
  • \n
  • (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled.
      \n
    • Thanks to @spiv for reporting.
    • \n
    \n
  • \n
  • (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone.
      \n
    • Thanks to @3zra47 for reporting and following up.
    • \n
    \n
  • \n
  • (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes.
      \n
    • Thanks to @3zra47 for reporting and following up.
    • \n
    \n
  • \n
  • (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation.
      \n
    • Thanks to @renatomen for the PR.
    • \n
    \n
  • \n
  • (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling.
      \n
    • Thanks to @sigma7863 for the PR.
    • \n
    \n
  • \n
  • (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties.
      \n
    • Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue.
    • \n
    \n
  • \n
  • (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations.
      \n
    • Thanks to @berzernberg for reporting Russian translation gaps.
    • \n
    \n
  • \n
  • (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder.
      \n
    • Thanks to @martin-forge for reporting and the PR.
    • \n
    \n
  • \n
  • (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date.
      \n
    • Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues.
    • \n
    \n
  • \n
  • (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency.
      \n
    • Thanks to @martin-forge for reporting.
    • \n
    \n
  • \n
  • Published mdbase-tasknotes 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas.
      \n
    • Includes clearer create-path diagnostics, natural-language mtn list --due filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct mtn --version reporting.
    • \n
    • Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR.
    • \n
    \n
  • \n
  • (#1667) Fixed NLP scheduled-date parsing so standalone scheduled and start triggers can set scheduled dates alongside due dates.
      \n
    • Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR.
    • \n
    \n
  • \n
  • Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases.
  • \n
  • (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight.
      \n
    • Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone.
    • \n
    • Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date.
    • \n
    • Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758.
    • \n
    \n
  • \n
  • (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick.
      \n
    • Pomodoro stats now refresh on initial render and session completion instead of once per second.
    • \n
    • Pomodoro daily-note stats now read the relevant date/range instead of routing through all history.
    • \n
    • Native Pomodoro notifications now respect the notification setting and granted permission before showing.
    • \n
    • Thanks to @Szu-Szu for reporting and @its-thex for confirming.
    • \n
    \n
  • \n
  • (#1744) Fixed Bases Task List views so changing the per-view Expanded relationships option takes effect on re-render.
      \n
    • Restores the expected show-all behavior for setups that hide subtasks at the top level with note.projects.isEmpty().
    • \n
    • Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow.
    • \n
    \n
  • \n
  • Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards.
  • \n
\n","text":"Added# (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal. Thanks to @fastrick for the request and @renatomen for the PR. (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values. Thanks to @Treygec for the request and PR. (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior. Thanks to @P-Sc for the PR. Changed# Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations. Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully. Fixed# (#1778) Fixed MCP initialize requests using newer protocol versions such as 2025-11-25 failing instead of negotiating down to TaskNotes' supported MCP version. Thanks to @SakulaPor for reporting. (#1781) Fixed duplicate metadata properties on Bases task cards when bare and note.-prefixed property IDs map to the same TaskNotes field. Thanks to @loukandr for reporting and tracing the issue. (#1787) Removed the \"(click to change)\" helper text from recurrence tooltips on task cards. Thanks to @kazerniel for reporting. (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects. Thanks to @prepare4robots for reporting. (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections. Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus. Thanks to @3zra47 for reporting. (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled. Thanks to @spiv for reporting. (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone. Thanks to @3zra47 for reporting and following up. (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes. Thanks to @3zra47 for reporting and following up. (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation. Thanks to @renatomen for the PR. (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling. Thanks to @sigma7863 for the PR. (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties. Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue. (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations. Thanks to @berzernberg for reporting Russian translation gaps. (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder. Thanks to @martin-forge for reporting and the PR. (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date. Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues. (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency. Thanks to @martin-forge for reporting. Published mdbase-tasknotes 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas. Includes clearer create-path diagnostics, natural-language mtn list --due filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct mtn --version reporting. Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR. (#1667) Fixed NLP scheduled-date parsing so standalone scheduled and start triggers can set scheduled dates alongside due dates. Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR. Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases. (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight. Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone. Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date. Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758. (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick. Pomodoro stats now refresh on initial render and session completion instead of once per second. Pomodoro daily-note stats now read the relevant date/range instead of routing through all history. Native Pomodoro notifications now respect the notification setting and granted permission before showing. Thanks to @Szu-Szu for reporting and @its-thex for confirming. (#1744) Fixed Bases Task List views so changing the per-view Expanded relationships option takes effect on re-render. Restores the expected show-all behavior for setups that hide subtasks at the top level with note.projects.isEmpty(). Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow. Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards."},{"route":"/obsidian/releases/4.5.3/","title":"TaskNotes 4.5.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.3.md","namespace":"obsidian","relativePath":"releases/4.5.3.md","raw":"# TaskNotes 4.5.3\n\n## Fixed\n\n- (#1834, #1847) Fixed empty Bases formula and custom properties showing `null` or `undefined` on TaskNotes task cards.\n - A big thanks to @Glint-Eye and @3zra47 for reporting.\n- (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates.\n - A big thanks to @kmaustral for reporting.\n","aliases":["/releases/4.5.3/","/releases/4.5.3/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1834, #1847) Fixed empty Bases formula and custom properties showing null or undefined on TaskNotes task cards.
      \n
    • A big thanks to @Glint-Eye and @3zra47 for reporting.
    • \n
    \n
  • \n
  • (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates.
      \n
    • A big thanks to @kmaustral for reporting.
    • \n
    \n
  • \n
\n","text":"Fixed# (#1834, #1847) Fixed empty Bases formula and custom properties showing null or undefined on TaskNotes task cards. A big thanks to @Glint-Eye and @3zra47 for reporting. (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates. A big thanks to @kmaustral for reporting."},{"route":"/obsidian/releases/4.6.0/","title":"TaskNotes 4.6.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.6.0.md","namespace":"obsidian","relativePath":"releases/4.6.0.md","raw":"# TaskNotes 4.6.0\n\n## Changed\n\n- TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin.\n- Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes.\n\n## Fixed\n\n- Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file.\n","aliases":["/releases/4.6.0/","/releases/4.6.0/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin.
  • \n
  • Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes.
  • \n
\n

Fixed#

\n
    \n
  • Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file.
  • \n
\n","text":"Changed# TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin. Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes. Fixed# Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file."},{"route":"/obsidian/releases/4.7.0/","title":"TaskNotes 4.7.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.7.0.md","namespace":"obsidian","relativePath":"releases/4.7.0.md","raw":"# TaskNotes 4.7.0\n\n## Changed\n\n- Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit `any` usage.\n- Clarified privacy documentation for optional integrations that make periodic background network refreshes.\n- Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views.\n- (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date\n - Thanks to @loukandr for the contribution\n\n## Fixed\n\n- Fixed project autocomplete searches so non-empty `+` queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows.\n- (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as `2025-08-12 18:00`\n - Thanks to @bepolymathe for requesting this and @m4to-3pe for following up\n- Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing.\n- (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as `{{project}}` before moving the file\n - Thanks to @OXI-717 for reporting\n- (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title\n - Thanks to @Sineapple for reporting\n- (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks\n - Thanks to @macbikegeek for reporting\n- (#1880) Fixed the status bar time-tracking label for task titles that contain a dash\n - Thanks to @ubidev for reporting\n- (#1854) Fixed modal task completion so completed tasks receive a completed date consistently\n - Thanks to @misolex for reporting\n- (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons\n - Thanks to @kmaustral for reporting and @loukandr for the fix\n\n## Removed\n\n- Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported.\n","aliases":["/releases/4.7.0/","/releases/4.7.0/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"removed","text":"Removed"}],"html":"

Changed#

\n
    \n
  • Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit any usage.
  • \n
  • Clarified privacy documentation for optional integrations that make periodic background network refreshes.
  • \n
  • Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views.
  • \n
  • (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date
      \n
    • Thanks to @loukandr for the contribution
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed project autocomplete searches so non-empty + queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows.
  • \n
  • (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as 2025-08-12 18:00
      \n
    • Thanks to @bepolymathe for requesting this and @m4to-3pe for following up
    • \n
    \n
  • \n
  • Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing.
  • \n
  • (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as {{project}} before moving the file
      \n
    • Thanks to @OXI-717 for reporting
    • \n
    \n
  • \n
  • (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title
      \n
    • Thanks to @Sineapple for reporting
    • \n
    \n
  • \n
  • (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks
      \n
    • Thanks to @macbikegeek for reporting
    • \n
    \n
  • \n
  • (#1880) Fixed the status bar time-tracking label for task titles that contain a dash
      \n
    • Thanks to @ubidev for reporting
    • \n
    \n
  • \n
  • (#1854) Fixed modal task completion so completed tasks receive a completed date consistently
      \n
    • Thanks to @misolex for reporting
    • \n
    \n
  • \n
  • (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons
      \n
    • Thanks to @kmaustral for reporting and @loukandr for the fix
    • \n
    \n
  • \n
\n

Removed#

\n
    \n
  • Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported.
  • \n
\n","text":"Changed# Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit any usage. Clarified privacy documentation for optional integrations that make periodic background network refreshes. Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views. (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date Thanks to @loukandr for the contribution Fixed# Fixed project autocomplete searches so non-empty + queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows. (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as 2025-08-12 18:00 Thanks to @bepolymathe for requesting this and @m4to-3pe for following up Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing. (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as {{project}} before moving the file Thanks to @OXI-717 for reporting (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title Thanks to @Sineapple for reporting (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks Thanks to @macbikegeek for reporting (#1880) Fixed the status bar time-tracking label for task titles that contain a dash Thanks to @ubidev for reporting (#1854) Fixed modal task completion so completed tasks receive a completed date consistently Thanks to @misolex for reporting (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons Thanks to @kmaustral for reporting and @loukandr for the fix Removed# Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported."},{"route":"/obsidian/releases/4.7.1/","title":"TaskNotes 4.7.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.7.1.md","namespace":"obsidian","relativePath":"releases/4.7.1.md","raw":"# TaskNotes 4.7.1\n\n## Changed\n\n- Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of `main.js`, `manifest.json`, and `styles.css`.\n","aliases":["/releases/4.7.1/","/releases/4.7.1/"],"toc":[{"level":2,"id":"changed","text":"Changed"}],"html":"

Changed#

\n
    \n
  • Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of main.js, manifest.json, and styles.css.
  • \n
\n","text":"Changed# Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of main.js, manifest.json, and styles.css."},{"route":"/obsidian/releases/4.7.2/","title":"TaskNotes 4.7.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.7.2.md","namespace":"obsidian","relativePath":"releases/4.7.2.md","raw":"# TaskNotes 4.7.2\n\n## Changed\n\n- Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission.\n- Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance.\n- Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup.\n- Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals.\n- Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions.\n- Prevented a console error when plugin listeners are cleaned up after reloads.\n- Added a local lint check to prevent interval-based polling in files that also perform network requests.\n","aliases":["/releases/4.7.2/","/releases/4.7.2/"],"toc":[{"level":2,"id":"changed","text":"Changed"}],"html":"

Changed#

\n
    \n
  • Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission.
  • \n
  • Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance.
  • \n
  • Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup.
  • \n
  • Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals.
  • \n
  • Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions.
  • \n
  • Prevented a console error when plugin listeners are cleaned up after reloads.
  • \n
  • Added a local lint check to prevent interval-based polling in files that also perform network requests.
  • \n
\n","text":"Changed# Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission. Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance. Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup. Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals. Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions. Prevented a console error when plugin listeners are cleaned up after reloads. Added a local lint check to prevent interval-based polling in files that also perform network requests."},{"route":"/obsidian/releases/4.8.0/","title":"TaskNotes 4.8.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.8.0.md","namespace":"obsidian","relativePath":"releases/4.8.0.md","raw":"# TaskNotes 4.8.0\n\n## Added\n\n- (#353) Added a `Has Subtasks` filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this.\n- (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this.\n- (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up.\n- (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this.\n- (#1052) Added a public JavaScript API for in-vault scripts at `app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text)`, so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this.\n- (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this.\n- (#1254) Added `../` and `./` normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as `{{currentNotePath}}/../Tasks`. Thanks to @rdick for suggesting this.\n- (#1267) Added Daily Notes-style date tokens such as `YYYY`, `MM`, `DD`, `MMMM`, and `dddd` to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this.\n- (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this.\n- (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this.\n- (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this.\n- (#1376) Added backslash escapes for NLP trigger tokens, so text like `\\@context`, `\\*done`, or `\\tomorrow` can stay in the task title. Thanks to @JerryLu086 for suggesting this.\n- (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this.\n- (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up.\n- (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this.\n- (#144) Added an \"Open note in new tab\" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback.\n- (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback.\n- (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up.\n- (#1541) Added `{{currentNotePath}}` and `{{currentNoteTitle}}` support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback.\n- (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback.\n- (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case.\n- (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case.\n- (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this.\n- (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this.\n- (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as \"tomorrow at 3pm\" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this.\n- (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.\n- (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this.\n- (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this.\n- (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this.\n- (#1625) Added `Shift` + `Cmd`/`Ctrl` + `Enter` in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this.\n- (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this.\n- (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short `projectId`. Thanks to @bendavis987 for the contribution.\n- (#923) Added `{{projectFilePath}}` and `{{projectFilePaths}}` folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this.\n- (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this.\n- (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback.\n- (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this.\n- (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this.\n- (#1776) Allowed calendar timeline end times after midnight, such as `26:00` for a 2 AM next-day end. Thanks to @chrabia for suggesting this.\n- (#1784, #1833) Added a per-view `pinnedColumns` option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this.\n- (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this.\n- (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up.\n- (#1808) Added advanced Kanban swimlane ordering through `swimLaneOrder`, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback.\n- (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this.\n- (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this.\n- (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this.\n- (#561) Added a \"Last day\" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up.\n- (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this.\n- (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this.\n- (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this.\n- (#1176) Added advanced Kanban WIP limits through `wipLimits`, so column headers can show `(current/limit)` counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this.\n- (#914) Added a generated `Due in` countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this.\n- (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this.\n- (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this.\n- (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback.\n- (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this.\n- (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions.\n- (#791) Added a UUID v4 task filename format and `{{uuid}}` custom filename template variable. Thanks to @bangbangbanggit for suggesting this.\n- (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback.\n- (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this.\n- (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this.\n- (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback.\n- (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this.\n- Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes.\n\n## Changed\n\n- Expanded the bug report template to ask for Obsidian \"Show debug info\" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots.\n- Release notes now show the default `.base` file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes.\n- Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project.\n- (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion.\n- (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up.\n- Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards.\n- Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected.\n- Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage.\n- (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this.\n- (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this.\n- Made task-card priority dots and configured priority icons slightly larger for better visibility.\n- (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this.\n- (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this.\n- (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this.\n- (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this.\n- (#1392) Made TaskNotes date fields accept compact `YYYYMMDD` typing and pasted dates. Thanks to @kazerniel for suggesting this.\n- (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this.\n- (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this.\n- (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this.\n- Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers.\n- (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first picker where clicking a date saves immediately, with time entry still available in the picker. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.\n- (#1642) Made completion-based custom recurrence use flexible weekly, monthly, and yearly intervals without forcing a fixed weekday, month day, or month. Thanks to @Volker-brdb for suggesting this.\n- (#1724) Moved recurring task complete/skip instance actions into the date area of the task context menu. Thanks to @prepare4robots for suggesting this.\n- (#1762) Used the configured Google Calendar task export target as the default calendar when creating manual external calendar events. Thanks to @chrabia for suggesting this.\n- (#1774) Made expandable project chevrons visible and easier to tap on mobile. Thanks to @sh0nuff for suggesting this.\n- (#190) Made task-card and inline task-link action controls easier to tap on mobile, including always-visible task options on touch layouts. Thanks to @Poly-0000 for suggesting this.\n- (#518, #1710, #1785) Added an opt-in setting for Create subtask to inherit the parent task's projects, contexts, priority, and non-identifying tags while always keeping the parent-task project link. Thanks to @bepolymathe, @Jalpara, and @poulpoulsen for reporting this, and to @tomsymonds, @AndyEveritt, @wedgen, @lindsaylearns, and @hokfujow for the follow-up feedback.\n- (#1790) Extended the identifying-tag hiding setting to task modal tag suggestions, and kept hidden identifying tag children in place when editing other tags. Thanks to @loukandr for suggesting this.\n- (#1804) Made the inline-created task folder setting visible even when instant conversion is disabled, and clarified that leaving it empty uses the default tasks folder. Thanks to @CaFeZn for suggesting this.\n- (#1822) Matched the Task Edit Modal subtask list order to the existing relationship sort, so active and higher-priority subtasks appear ahead of completed ones. Thanks to @Glint-Eye for suggesting this.\n- (#1233, #1339) Added an Appearance setting to expand project subtasks by default in task cards, while still letting individual cards be collapsed. Thanks to @n1njaznutz and @hasanyilmaz for suggesting this and @kazerniel and @benmartinek for the follow-up.\n- (#763) Made the Relationships widget appear on project notes that match Project Autosuggest tag or property filters, even before any tasks link to the project. Thanks to @ChadHattabaugh for suggesting this.\n- (#732) Remembered the Task & Project Statistics filters between openings, including the selected date range, custom dates, and minimum time filter. Thanks to @RumiaKitinari for suggesting this.\n- (#1335) Added optional default times for new task scheduled and due dates, so default-dated tasks can appear as timed calendar events instead of all-day events. Thanks to @echo-saurav for suggesting this.\n- (#1327) Made TaskNotes Bases search match any word in a multi-word search instead of requiring the whole phrase. Thanks to @craziedde for suggesting this.\n- (#1318) Made aliased inline task links use the alias text inside the task widget, so `[[Task title|short label]]` can display as `short label`. Thanks to @3zra47 for suggesting this and @kazerniel for the follow-up.\n- (#1325) Added `./` and `../` support to Include folders filters for project and file autosuggest, resolved from the active note's folder. Thanks to @EpolPers for suggesting this.\n- (#1313) Added generated `llms.txt` and `llms-full.txt` files to the documentation site, so the primary docs can be shared with LLM tools more easily. Thanks to @JacksonMcDonaldDev for suggesting this.\n- (#1308) Added a Calendar view option to stop date links from creating missing daily notes, while still opening existing daily notes. Thanks to @Arachnidai for suggesting this.\n- (#1300) Allowed priority, status, calendar subscription, and timeblock color settings to use Obsidian theme color names such as `red`, `blue`, and `cyan`. Thanks to @thestrike72 for suggesting this.\n- (#1299) Added a command that creates or opens a task and immediately starts time tracking for it. Thanks to @slipstyle for suggesting this.\n- (#1284) Added an exact-match option for hiding task identification tags, so `#task` can be hidden while nested tags such as `#task/project` remain visible. Thanks to @3zra47 for suggesting this.\n- (#1009) Added a confirmed Delete button to the Edit Task modal, so unwanted task notes can be removed without first opening the note file. Thanks to @jalooc for suggesting this.\n- Improved the internal structure of Calendar, Kanban, Bases, task cards, and task modals to make future changes easier to test and maintain.\n\n## Fixed\n\n- (#697, #1374) Recognized manually authored task notes that use a single scalar tag such as `tags: task`, so they appear in TaskNotes views and menus like notes using YAML list tags. Thanks to @aubreyz and @phortx for reporting this, and to @jleewastaken for the follow-up.\n- Removed the upward hover shift from calendar events while keeping the hover shadow feedback.\n- Made same-column manual-order drops in TaskNotes Kanban settle immediately when the local order patch is safe, including virtual columns through a stable reorder path that avoids layout jumps.\n- Made single-card cross-column drops in TaskNotes Kanban settle through a local state patch when the move is safe, reducing the wait for the full Bases refresh.\n- Fixed Calendar timeblocks created from a selected time range so they appear as soon as Obsidian indexes the daily note update, instead of waiting for a later refresh.\n- Replaced the external calendar event emoji marker with the calendar icon and kept it in the same top-right event corner.\n- Restored Task List group toggles and recurring calendar month controls to compact icon buttons instead of inherited boxed theme buttons.\n- Refined the settings tab navigation styling so tabs read as quieter inline navigation instead of default buttons.\n- (#263) Made the instant inline task conversion button respond to touch/pointer activation, so mobile multi-line selections can be converted into TaskNotes. Thanks to @cathywu for reporting this.\n- (#216) Preserved `@context` markers when converting Tasks-plugin-style checkbox tasks into TaskNotes, while keeping those contexts out of the created task title. Thanks to @ksdavidc for suggesting this, and to @hangryscribe3, @nayatiuh, and @natleahh for the follow-up feedback.\n- (#508) Showed project note names instead of full project paths in grouped Kanban and Task List headings, while keeping the headings linked to the project note. Thanks to @elvarb for reporting this and @dmodify for confirming it in Task List.\n- (#408) Used the task title as the native system notification title for task reminders instead of always showing `TaskNotes Reminder`. Thanks to @DudeThatsErin for reporting this and @phillipadsmith for the follow-up.\n- (#385) Let Mini Calendar month controls shrink and wrap cleanly in narrow sidebars. Thanks to @iholston for reporting this.\n- Fixed Calendar List view task cards so they use the available row width without duplicate list cells, row-hover backgrounds, or linked-hover styling.\n- (#552) Made instant task convert buttons appear for checkbox tasks inside callouts, and kept converted links inside the callout list. Thanks to @Oblique82 for reporting this and @ksdavidc for the follow-up.\n- (#559) Treated notes linked to one loaded recurring calendar event instance as related to the other instances in that series. Thanks to @cathywu for reporting this and @mdbraber for the implementation notes.\n- (#685) Made Calendar list views respect the All-day slot option by hiding all-day events from the list when that option is turned off. Thanks to @RumiaKitinari for reporting this.\n- (#643) Stopped custom filename templates such as `task-{year}{month}{day}{hour}{minute}` from incorrectly showing the \"filename shortened\" notice when creating tasks. Thanks to @minchinweb for reporting this.\n- (#722) Made Skip Break reset a queued Pomodoro break back to the next focus timer without starting a session. Thanks to @Goossiii for reporting this and @YIRU69 for the follow-up.\n- (#782) Made recurrence weekday choices follow the configured first day of week, and made the quick \"Weekdays only\" recurrence use locale weekend data instead of assuming Monday through Friday everywhere. Thanks to @BKSalman for reporting this.\n- (#872) Made note-level task cards appear immediately, and stay visible while editing, when a task note is embedded as a Canvas file node. Thanks to @bangbangbanggit for reporting this and @benmartinek for the follow-up.\n- (#856) Fixed filters for number custom fields so numeric task values match equivalent filter values entered as text. Thanks to @thoughtcipher for reporting this.\n- (#1039) Restored clearer TaskNotes Bases grouping for nested project paths, and made the Calendar refresh control an icon button again. Thanks to @dblinnikov for reporting this.\n- (#1034) Let embedded TaskNotes Calendar views size to their content by default, so month, week, and day embeds no longer reserve full-pane proportions inside notes. Thanks to @same774 for reporting this.\n- (#1023) Kept task modal custom fields scrollable above the iPhone keyboard while creating or editing tasks. Thanks to @3zra47 for reporting this.\n- (#1019) Kept active Pomodoro and time-tracking task references working after the tracked task file is renamed. Thanks to @AndreMonthy for reporting this.\n- (#1037) Let embedded TaskNotes Calendar year views size to their content and kept the year title from wrapping vertically. Thanks to @same774 for reporting this.\n- (#1047) Wrapped long file paths in the Edit Task modal metadata section, so narrow mobile screens no longer get a sideways scrollbar from the File row. Thanks to @3zra47 for reporting this.\n- (#1051) Preserved extra values on a property-based task identification field when saving a task, so list properties such as `class: [task, habit]` no longer get collapsed to only the identifying value. Thanks to @WhoIsSeanGalt for reporting this.\n- (#1060) Reused and revealed an already-open Calendar/Base view when running view commands, so a view kept in the sidebar no longer reopens in a new main tab. Thanks to @kmaustral for reporting this.\n- (#1075) Hid the native WebKit date-input label that could appear as `Label` when editing scheduled dates on macOS. Thanks to @3zra47 for reporting this.\n- (#1076) Allowed timeblocks to end at midnight using `00:00`, and accepted `24:00` as an explicit end-of-day value in timeblock validation. Thanks to @skoove for reporting this and @gregor202 for the follow-up.\n- (#1086) Fixed the Calendar `+ more` control in dark mode so expanded all-day task groups stay readable. Thanks to @same774 for reporting this.\n- (#1100) Applied Advanced Calendar View search and title filters to the tasks used for calendar rendering, so filtering controls affect which tasks appear on the calendar. Thanks to @quiet-coder-io for reporting this.\n- (#1147) Added a delete action for recent Pomodoro statistics sessions, so erroneous Pomodoro history can be removed without editing plugin storage or daily-note frontmatter manually. Thanks to @RumiaKitinari for reporting this and @BrucePlumb for the follow-up.\n- (#1150) Kept recurring tasks' due dates visible in Calendar Bases views, and showed their scheduled date when recurrence instances are hidden. Thanks to @thomatino for reporting this and @BrucePlumb for the follow-up.\n- (#1159) Softened Calendar time-entry styling so recorded time blocks no longer visually outweigh task events. Thanks to @hatespinach for reporting this.\n- (#1191) Aligned the task-card and relationships widgets inside notes with Obsidian's editor margins, including readable-line-width layouts. Thanks to @minchinweb for reporting this.\n- (#1183) Kept the Calendar create menu open after drag-selecting a time range, so the selected duration can be used when creating a task. Thanks to @randomness42 for reporting this.\n- (#1179) Stopped Calendar Bases views from repainting after unrelated note updates when the visible calendar data has not changed. Thanks to @same774 for reporting this.\n- (#1156) Kept property-based task identification through the `tags` property from rewriting task tags as a plain text value, and generated default Bases now use tag membership for that setting. Thanks to @seepage87 for the detailed migration report and @chrsdk for the follow-up.\n- (#1232) Fixed generated Task List Base date filters so recurring tasks scheduled for today appear in the Today view, and today's completed recurring instances stay hidden. Thanks to @mvichosfm for reporting this and @ArthurGideon and @VarunNikam22 for the follow-up.\n- (#1231) Fixed the generated Task List Base Overdue view so tasks with scheduled dates in the past appear alongside tasks with due dates in the past. Thanks to @Lorite for reporting this and @dictionarymouse for the follow-up.\n- (#1228) Matched the task details editor's Markdown heading colors to the active Obsidian theme, including themes that customize heading colors. Thanks to @BrucePlumb for requesting this.\n- (#1227) Refreshed the relationships widget when project references are indexed or updated so project notes can show related tasks automatically again. Thanks to @luckb0x for reporting this.\n- (#1219) Fixed Kanban drags that start on an expanded subtask card so they move that subtask instead of dragging the parent card. Thanks to @craziedde for reporting this.\n- (#990) Treated one-item status lists written by Obsidian Properties as the same status value in TaskNotes Kanban, so they no longer create duplicate columns. Thanks to @mlevison for reporting this.\n- (#983) Let Agenda Calendar views wrap their header controls and task titles inside narrow sidebars, so Today and refresh controls and task icons remain visible without sideways scrolling. Thanks to @3zra47 for reporting this.\n- (#982) Made TaskNotes task-card typography scale from Obsidian's text font size setting, so Bases and Agenda task text follows larger mobile font settings. Thanks to @3zra47 for suggesting this and @chrsdk and @scottaltham-payroc for the follow-up.\n- (#966) Made reminder delete buttons larger and always visible on mobile, so reminders can be removed from the Manage All Reminders modal on iPad. Thanks to @PSG2017 for reporting this.\n- (#964) Made Pomodoro and time-tracking task selection use the current recurring instance status, so a recurring task can still be selected after an earlier instance was completed. Thanks to @lomarcanys for reporting this.\n- (#944) Preserved number and boolean custom field values when moving tasks between grouped Kanban or Task List columns, and when creating a task from a grouped Kanban column. Thanks to @thoughtcipher for reporting this.\n- (#935) Fixed Task List priority sorting so descending order puts higher-weighted priorities first, and due dates are used before scheduled dates when priority values tie. Thanks to @Glint-Eye for reporting this and @kacoroski for the follow-up.\n- (#922) Made the `Blocked` task-card pill expand the blocker tasks, and rendered `blockedBy` dependencies as clickable links when that property is shown on cards. Thanks to @prayidae for reporting this and following up.\n- (#919) Fixed exported ICS task events so they use valid calendar event statuses and can be imported by stricter calendar apps. Thanks to @benoitjadinon for reporting this.\n- (#1213) Fixed embedded Task List Bases in Obsidian pop-out windows so typing below the embed no longer leaves a large blank gap. Thanks to @same774 for reporting this.\n- (#1243) Removed quoted multi-word custom field NLP expressions from created task titles after saving the custom field value. Thanks to @Arachnidai for reporting this.\n- (#1252) Hardened the calendar-first task date picker for iPad taps so date buttons use direct touch manipulation. Thanks to @alxandrharris for reporting this.\n- (#1261) Removed the extra Task List Base scrollbar when an embedded task list note is placed in a sidebar, while keeping normal embedded task lists scrollable in the main note area. Thanks to @cathywu for reporting this.\n- (#1347) Lowered TaskNotes task-card tag CSS specificity so hierarchical tag colors from Obsidian themes and tag-color plugins can apply correctly. Thanks to @3Fish for reporting this.\n- (#1374) Recognized status and priority labels entered through Obsidian Properties or Bases as their configured TaskNotes values. Thanks to @phortx for reporting this.\n- (#1373) Parsed numeric natural-language dates with the configured calendar locale, so `en-GB` treats `11/06/2026` as 11 June instead of November 6, and `YYYY/MM/DD` works consistently. Thanks to @AleMunin for reporting this and @imsuck for the follow-up.\n- (#1370) Prevented recurring task series from being queued for auto-archive when their parent status uses auto-archive, so ongoing recurring tasks are not moved away after completing an occurrence. Thanks to @Jomo94 for reporting this and @martin-forge for the follow-up discussion.\n- (#1367) Made recurring task completion counts use the total expected instances for finite `COUNT` or `UNTIL` recurrences, and stopped showing a made-up percentage for unbounded recurrences. Thanks to @saurinni for reporting this.\n- (#1365) Preserved email and other URI links from converted inline task titles by moving the original links into the new task body, and rendered `message:`/`mailto:` markdown links as external links in TaskNotes surfaces. Thanks to @phillipadsmith for reporting this and @hasanyilmaz for the follow-up.\n- (#1350) Refreshed inline task widgets in Reading mode after task property edits, so changed dates and other visible properties no longer stay stale until the note is reopened. Thanks to @tmsbn for reporting this.\n- (#1329) Pulled the relationships widget up to the end of the note content without removing its normal spacing, and kept that placement updated while editing and on load so it no longer covers the editor. Thanks to @Volker-brdb for reporting this.\n- (#1326) Treated empty task frontmatter values as missing, so empty titles fall back to the filename and blank date, priority, and recurrence fields are ignored. Thanks to @craziedde for suggesting this.\n- (#1316) Stopped stale Workspace state from overriding the configured Calendar view mode, so switching Workspaces no longer forces an old Day/Week/List choice over the view default. Thanks to @kmaustral for reporting this and following up.\n- (#1302) Read task frontmatter directly from the task file when Obsidian has not indexed its metadata yet, so visible tasks can still be opened, updated, and selected instead of reporting \"Task not found\". Thanks to @WorldTeacher for reporting this and @Steven-AA for confirming it.\n- Kept just-written task data available while Obsidian's metadata cache catches up, so immediate reads after task edits no longer briefly return stale values.\n- (#1297) Made the Create or open task footer tappable, so mobile users can create the typed task without needing the Shift+Enter shortcut. Thanks to @slipstyle for reporting this.\n- (#1288) Allowed formula properties to appear in Calendar property-based event start and end date selectors. Thanks to @hasanyilmaz for reporting this.\n- Made TaskNotes Kanban drags show a lightweight held-card preview, so the dragged card remains easy to track while the source column opens the drop slot.\n- (#1423) Refreshed TaskNotes Bases views when subtasks are deleted, so expanded project cards drop removed subtasks and stop showing project controls when the last subtask is gone. Thanks to @normenmueller for reporting this.\n- (#1419) Kept custom user field name, key, and default-value edits in Task Properties settings when closing settings without first blurring the field. Thanks to @s33a for reporting this and @kacoroski for the follow-up.\n- Reduced redundant settings writes by coalescing overlapping saves, so settings changes made in quick succession finish with the latest values without repeating every intermediate save cycle.\n- (#1331, #1411) Made Agenda Calendar Bases respect the Base sort order within each day instead of falling back to alphabetical title order. Thanks to @bane73 and @ky1ejs for reporting this.\n- (#1383) Made task modal markdown editors expose the active editor API expected by plugins such as Templater. Thanks to @tomsymonds for reporting this.\n- Fixed the first-run Create/Edit Task modal so the default fields appear immediately after installing TaskNotes, without needing to open Modal Fields settings or restart Obsidian.\n- (#1895) Restored the natural-language preview in the Create Task modal. Thanks to @ssonhub for reporting this.\n- (#1898) Cleared stale Calendar time-axis column widths when switching views, so Day, Week, and 3-day views keep the time labels anchored on the left. Thanks to @ddevaal for reporting this.\n- (#1439) Fixed generated Bases dependency filters so `blockedBy` entries stored as links, strings, or dependency objects are handled consistently in Not Blocked and Relationships views. Thanks to @prayidae for reporting this and following up.\n- (#1435) Prevented malformed task dependency, status, or priority values from breaking the task context menu. Thanks to @23maverick23 for reporting this.\n- (#1434) Kept older filename-titled tasks readable after turning off \"Store title in filename\" by falling back to the filename when a task has no usable title property. Thanks to @hujuDev for reporting this.\n- (#1433) Made the Due date and Scheduled date weekday picker follow the configured first day of week. Thanks to @sandchipper for reporting this.\n- (#1430) Showed custom user-field property keys in Modal Fields settings instead of internal field IDs. Thanks to @JerryLu086 for reporting this.\n- (#1427) Fixed project autosuggest Required Tags filters so frontmatter tags parsed by Obsidian are handled the same way as direct tag-property filters. Thanks to @ProHaller for reporting this.\n- (#1495) Added an Update default files action for generated Bases views, so task-tag or task-identification setting changes can refresh existing `.base` filters without deleting files manually. Thanks to @Liya430 for reporting this.\n- (#1512) Prevented the split Create/Edit Task modal details pane from collapsing to a one-character-wide column under the Minimal theme. Thanks to @willfanguy for reporting this and sharing detailed CSS notes.\n- (#1524) Fixed task-card font sizes shrinking when a Bases view is opened in an Obsidian pop-out window. Thanks to @Glint-Eye for reporting this.\n- (#1535) Fixed the generated Relationships Base Subtasks filter so single project links do not trigger a Bases `contains` error. Thanks to @DanaKyle for reporting this.\n- (#1102) Refreshed task cards when a task status is edited directly in Obsidian frontmatter, so the card no longer stays on the old status until it is clicked. Thanks to @Wayment9504 for reporting this.\n- (#1105) Added an explicit Close action to the mobile task options menu, so iPhone users do not need to tap near the top system bar to dismiss it. Thanks to @J-R-Troutman for reporting this.\n- (#1550) Prevented mobile Calendar event drags from opening the task context menu before the drag can begin. Thanks to @stil-sudo for suggesting this.\n- (#1563) Removed duplicate entries from Calendar event related notes when the same linked file is also a TaskNote. Thanks to @VarunNikam22 for reporting this.\n- (#1566) Rendered grouped multi-project values as individual links when a Bases group title contains multiple project links. Thanks to @ptsouchlos for suggesting this.\n- (#1569) Allowed local ICS calendar paths inside the vault to be pasted as absolute filesystem paths, and showed a clearer error when the file is outside the vault. Thanks to @Photon89 for reporting this and following up.\n- (#1584) Sanitized task-card status and priority class names, so custom values with spaces no longer create invalid CSS classes. Thanks to @omber for reporting this.\n- (#1587) Stored dependencies added from the task context menu as wikilinks, matching the Edit Task modal. Thanks to @mgrecar for reporting this.\n- (#1590) Clarified HTTP API task creation docs and OpenAPI schema for writable `blockedBy` dependencies, and marked `blocking` as a read-only derived relationship. Thanks to @hGriff0n for reporting this.\n- (#1591) Added a startup guard that avoids saving default settings over an existing settings file if Obsidian temporarily returns no plugin data during an update. Thanks to @GGlider for reporting this.\n- (#1593) Made the New button in TaskNotes Bases views open the TaskNotes create task modal again, so new tasks respect the configured default tasks folder. Thanks to @katlandreth for reporting this.\n- (#1594) Made task cards inside recurring task notes complete the task's current scheduled occurrence instead of today's date when no calendar or view date is supplied. Thanks to @ngraham20 for reporting this.\n- (#1601) Prevented overlapping Live Preview relationship-widget injections from leaving duplicate subtask/relationship sections in a note. Thanks to @wealthychef1 for reporting this and @benmartinek for confirming it.\n- (#1610) Made expanded subtasks in TaskNotes Bases views follow the current view's sorted task order instead of a fixed fallback order. Thanks to @MrZzard for reporting this and @slipstyle for confirming it.\n- (#1609) Restored scrolling in wide split-layout task edit modals when the form content is taller than the modal. Thanks to @3zra47 for reporting this.\n- (#1614) Wrote unchecked boolean custom user-field defaults to new task frontmatter, including tasks created through instant conversion. Thanks to @kobalteule for reporting this.\n- (#1611) Made generated default Bases urgency scores fall back safely when the next-date distance is missing. Thanks to @benoitjadinon for reporting this and suggesting the formula fix.\n- (#1623) Honored \"Store title in filename\" across task creation and edits, so the mapped title property is omitted from frontmatter and stale title fields are removed on save. Thanks to @VenturaNotes for reporting this, and to @Ender367, @slipstyle, and @loukandr for confirming and tracing affected paths.\n- (#1621) Made Kanban swimlane labels stop freezing on mobile and kept their label column compact, leaving more room for task cards while horizontally scrolling. Thanks to @karenchoe428 for reporting this.\n- (#1615) Detected Obsidian custom multi-text properties exposed through `widget: \"multitext\"` as list properties, so Kanban can split those values into multiple columns. Thanks to @konton71 for reporting this.\n- (#1626) Expanded recurring ICS subscription events through the one-year subscription window for high-frequency recurring calendars. Thanks to @pib for reporting this.\n- (#1628) Refreshed Calendar Bases views promptly when switching between filtered Agenda views, so the previous view's task set does not stay visible until the delayed refresh. Thanks to @Lanalangz for reporting this.\n- (#1629) Saved `blockedBy` dependencies selected in the Create Task modal. Thanks to @obsilover for reporting this.\n- (#1634) Aligned custom status icons in inline tasks with the default inline status circle. Thanks to @ttlaylor for reporting this and @basbarten for confirming it.\n- (#1636) Restored the active styling for the Calendar list-view toolbar button. Thanks to @vroablec for reporting this.\n- (#1493, #1638) Kept task time tracking consistent when switching or clearing tasks during an active Pomodoro. Thanks to @ROS-SDN and @katonapng for reporting this, and to @anomatomato for confirming it.\n- (#1639) Respected the aliased-link overlay exclusion in Reading mode even when the alias text matches the task title. Thanks to @MiracleXYZ for reporting this.\n- Fixed actively tracked task cards so the blue time-tracking outline stays visible along the card edges.\n- (#1657) Preserved Bases view defaults when creating tasks from the TaskNotes Kanban/List view New button, so project-scoped views can pass their project assignment into the create task modal. Thanks to @casualQuads122 for reporting this.\n- (#728, #1831) Preserved frontmatter defaults supplied by Obsidian's Bases New action when opening the TaskNotes create task modal from custom Bases views, so filtered views can prefill matching tags, projects, contexts, and custom fields. Thanks to @DillPickle80 and @echo-saurav for suggesting this, and to @prayidae and @renatomen for the detailed follow-up.\n- (#726) Added an instant-conversion option to use the closest heading above the converted line as a project, so checkbox tasks under project headings can inherit that project automatically. Thanks to @ghelton for suggesting this.\n- (#1662) Preserved frontmatter from ICS event note templates when quoted event variables or Templater expressions are used. Thanks to @victorhg for reporting this.\n- (#1663) Fixed Japanese and other Unicode tags on task cards so Kanban tag pills keep the same rounded styling as ASCII tags. Thanks to @kutty-1119 for reporting this.\n- (#1649) Restored daily-note navigation from the Calendar Day view date header. Thanks to @BaccanoMob for reporting this.\n- (#1648, #1665) Fixed the API endpoint list in Integrations settings so it uses the configured bearer token when API authentication is enabled, instead of reporting the running local server as inaccessible. Thanks to @npondel and @warm-july for reporting this.\n- (#1668) Fixed the Create Task magic wand so NLP-triggered custom field values are copied into the custom property inputs before saving. Thanks to @hokfujow for reporting this.\n- (#1669) Stopped the startup settings migration check from rewriting `data.json` just because saved calendar defaults are `false`, `0`, empty, or `null`, reducing unnecessary sync churn. Thanks to @thehyperadvisor for reporting this.\n- (#1674) Improved the timeblock creation error when Daily Notes cannot read its configured folder, so the modal notice points to the Daily Notes core plugin settings instead of only logging the folder lookup failure. Thanks to @Ender367 for reporting this.\n- (#1680) Fixed TaskNotes Calendar Bases options stored under `options`, so Agenda views respect `showPropertyBasedEvents: false` and no longer show duplicate property-based rows for the same task. Thanks to @xiaoyaozhu1991 for reporting this and @KondrotM for confirming it.\n- (#1681) Reduced the cost of inline checkbox convert buttons by only scanning the visible editor range instead of the full document. Thanks to @en-ot for reporting this and @hokfujow for the follow-up.\n- (#1689) Fixed task reminders added or rescheduled through direct frontmatter edits so the notification queue refreshes immediately and relative reminders recalculate from the latest task dates. Thanks to @garzonjav for reporting this.\n- (#1693) Fixed generated default Bases formulas so empty due and scheduled dates are checked with `.isEmpty()` instead of date-field truthiness. Thanks to @benoitjadinon for reporting this.\n- (#1702) Removed the forced bottom gap under TaskNotes custom Bases views, so calendar and other TaskNotes views can fill the available pane height. Thanks to @AudreyLooby for reporting this.\n- (#1719) Fixed task cards in reading mode so Obsidian 1.12.x header changes no longer place the card above the title and properties or drop it after returning to a tab. Thanks to @tholbrook9 for reporting this and tracing the DOM change.\n- (#1722) Saved the source note immediately after converting an inline checkbox task to a TaskNote, so Kanban views do not keep showing the stale inline task alongside the new task file. Thanks to @literallydope for reporting this and sharing screenshots.\n- (#1750) Fixed generated default Bases filters for property-based task identification when the identifying property name contains spaces. Thanks to @Igorgro for reporting this.\n- (#1745) Clarified the inline task documentation so `Create new inline task` is distinguished from current-line conversion. Thanks to @yvos for reporting the mismatch.\n- (#1485) Stopped Google Calendar manual refresh from showing a success notice after token refresh or calendar-list failures. Thanks to @ebanDev for reporting this.\n- (#1474) Made priority-based Kanban swimlanes follow the configured priority order instead of alphabetical task data order. Thanks to @kanzaki1201 for reporting this and @SoTHISIsFitness for the follow-up investigation.\n- (#1470) Restored pointer cursors on TaskNotes interactive elements under Obsidian themes that set `--cursor` to the default cursor. Thanks to @TheFrostedDev for reporting this.\n- (#1463) Documented the supported `FilterQuery` payload for `POST /api/tasks/query`, including context filtering examples and generated API schema details. Thanks to @tcb678 for reporting this and @soloidx for sharing a working query example.\n- (#1464) Made `context` on `GET /api/tasks` follow the same filtering guidance as `project`, so the API now points clients to `POST /api/tasks/query` instead of ignoring the parameter. Thanks to @tcb678 for suggesting this.\n- (#1457) Rendered scheduled-to-due calendar spans with scheduled times as daily timed events instead of moving them to the all-day section. Thanks to @atos2212-blip for reporting this and @rayvermey for confirming it.\n- (#1450) Returned configured user fields in HTTP API task responses under `customProperties`, while keeping the configured frontmatter keys available on each task. Thanks to @Admorei for reporting this and @nschenone for the follow-up.\n- (#1449) Let embedded Agenda views use auto-height sizing by default, so one-day list embeds no longer reserve a large empty calendar block. Thanks to @GlebYavorski for reporting this.\n- (#1446) Kept custom Kanban columns from `columnOrder` available when they are empty, so `hideEmptyColumns: false` can show drop targets for custom grouped values. Thanks to @akhtsang for reporting this.\n- (#1459) Avoided double \"Failed to create task\" prefixes in task creation error notices. Thanks to @Sineapple for reporting this, and to @slipstyle and @Stockemer for the follow-up investigation.\n- (#1469) Fixed Convert current note to task so saving the untouched edit modal writes the task frontmatter instead of reporting no changes. Thanks to @slipstyle for reporting this, and to @jhoogeboom and @ngraham20 for confirming it.\n- (#1466) Prefilled the current note as the project when creating a task from an embedded Subtasks/Relationships Base filtered with `this.file.asLink()`. Thanks to @jhoogeboom for reporting this, and to @cybersader, @fsmontenegro, and @benmartinek for the follow-up discussion.\n- (#1476) Showed linked parent-task project titles instead of timestamp filenames in project stats and grouped task views when the linked task has a frontmatter title. Thanks to @RumiaKitinari for reporting this.\n- (#1487) Let Calendar task event titles wrap instead of clipping long names, and removed the redundant due-date prefix from due task events. Thanks to @Alexander-Bergmann for reporting this.\n- (#1488, #1739) Enabled Kanban touch dragging on touch-capable desktop and convertible devices, not only mobile Obsidian. Thanks to @tmoyland001 and @mgsima for reporting the drag failures, and @SoTHISIsFitness for investigating related task-property cases.\n- (#1738) Fixed Outlook calendar subscriptions whose event timezones reference the base Windows timezone name while the feed defines a suffixed timezone name. Thanks to @Mirrimo for reporting this, @rafavital for confirming it, and @rogerfsh for tracing the ICS timezone mismatch.\n- (#1734) Fixed dependency picker search when task priority values are stored as non-string frontmatter values. Thanks to @MatthewClarkeDev for reporting this and identifying the stack trace.\n- (#1733) Preserved wikilinks in task titles and rendered them as clickable links on task cards. Thanks to @bitscorch for suggesting this.\n- (#1728) Applied the \"Use parent note as project\" default when creating a new task from the command palette or ribbon. Thanks to @greatEmily for reporting this.\n- (#1759) Advanced stale due dates when recurring tasks move to their next scheduled occurrence, so work-window tasks do not remain overdue after completion. Thanks to @MattPryze for reporting this.\n- (#1766) Fixed Calendar Bases date navigation from custom note properties, so embedded calendar views can open on the date stored in the selected property instead of falling back to today. Thanks to @chrabia for reporting this.\n- (#1767) Aligned the start and end time rows in the timeblock creation modal. Thanks to @loiveli for reporting this.\n- (#1783) Replaced the default browser drag ghost for Kanban cards so dragging a card no longer makes the next card look semi-transparent. Thanks to @loukandr for reporting this and tracing the drag image behavior.\n- (#1796) Restored expanded subtasks immediately after renaming a parent task file and updating links. Thanks to @bung69 for reporting this.\n- (#1797) Improved manual ordering so long Kanban columns remain scrollable while dragging, mobile Kanban drops can place a card relative to another card, Kanban/Task List drops resolve the final drop position more reliably, generated manual-order ranks match Bases sorting, and manual-order properties such as `sort_order` render on task cards when enabled. Thanks to @SKIERZZ for reporting this and sharing videos.\n- (#1812) Separated Microsoft OAuth token status from calendar sync status, and surfaced Microsoft calendar fetch errors in the integrations settings card instead of leaving them console-only. Thanks to @henninger80 for the detailed report.\n- (#1814) Restored NLP project autosuggest in the Create or Open Task command, so `+` project suggestions use the same filtered project lookup as the Create Task modal. Thanks to @adammahad for reporting this.\n- (#1820) Kept API-created tasks readable immediately after creation even if Obsidian has not finished indexing the new file metadata yet. Thanks to @vadminas for reporting and tracing the cache desync.\n- (#1823) Prevented zero-duration timed external calendar events from rendering under more than one day in list-style calendar views. Thanks to @martin-forge for reporting and tracing the Google Calendar case.\n- (#1841) Prevented Kanban boards from duplicating columns when wikilinked status values are grouped through Bases. Thanks to @lendamico for reporting and sharing the screen recording.\n- (#1846) Saved NLP-triggered boolean custom fields as real booleans instead of quoted strings, so they match checkbox-created values and Bases filters. Thanks to @DevOps-Toast for reporting and sharing screenshots.\n- (#1849) Prevented repeated clicks on task-card scheduled and due date labels from stacking duplicate date menus when Obsidian native menus are disabled. Thanks to @3zra47 for reporting.\n- (#1850) Added mobile bottom spacing to TaskNotes list views so the final task can scroll above Obsidian's floating mobile controls. Thanks to @AlejandroRigau for reporting and sharing the iPhone screenshot.\n- (#1852) Improved mobile timed calendar event rendering with shorter time labels, tighter spacing, and event-colored task/calendar blocks. Thanks to @redrumthebum for reporting and sharing screenshots.\n- (#1757, #1853, #1775) Respected an existing `mdbase.yaml` `types_folder` when regenerating mdbase task type definitions, so the generated `task.md` can live outside the vault-root `_types` folder. Thanks to @aldrichtr for the original request and implementation exploration, and @hangryscribe3 for the follow-up request.\n- (#1858) Included task body details in single-task HTTP API and MCP reads. Thanks to @vanillaflava for reporting and outlining the expected behavior.\n- (#1859) Clarified the Google Calendar setup guide for OAuth testing-mode `access_denied` errors. Thanks to @PE-Boy for reporting and @tiagoarroz for the workaround.\n- (#1860) Preserved accented characters in tags when converting checkbox tasks to TaskNotes. Thanks to @e-zz for reporting.\n- (#1869) Preserved Calendar Month View scroll position after task updates. Thanks to @sisyowo for reporting and linking the earlier Kanban fix.\n- (#1873) Prevented Calendar Bases from rendering in Obsidian pop-out windows because restoring FullCalendar there can freeze Obsidian. Thanks to @misolex for reporting.\n- (#1497, #1870) Fixed NLP file suggestions for custom fields so selected wikilinks are captured as custom field values, including list-type fields. Thanks to @Naesue and @Sineapple for reporting this, and to @bradleyed and @Xananax for the follow-up details.\n- (#1888) Allowed project autosuggest required property filters to match any comma-separated value, such as `project, area`. Thanks to @BrianHicks for suggesting.\n- (#1886) Added a command to postpone active overdue scheduled tasks to today. Thanks to @chrabia for the suggestion.\n- (#1889) Fixed Kanban swimlanes for list-valued properties so tags and contexts use individual list items instead of comma-joined values. Thanks to @pkropotin for reporting.\n- (#1890) Fixed scheduled-date Kanban columns dropping tasks when date-only and timed tasks on the same day are sorted by a scheduled-time formula. Thanks to @chrabia for reporting and investigating.\n- (#773) Added ICS export filters for archived tasks, completed tasks, due dates, and scheduled dates. Thanks to @ras0q for suggesting this and @slipstyle for the scheduled-date follow-up.\n- (#765) Reduced side-pane gutters around embedded TaskNotes Bases views, so embedded task lists use about the same horizontal space as directly opened Bases views. Thanks to @TonyAtlas for suggesting this.\n- (#1892) Fixed nested Markdown list indentation in the Task Edit Modal details editor. Thanks to @Glint-Eye for reporting.\n- (#1891) Fixed TaskNotes modal markdown editors collapsing to one-character-wide lines when Pretty Properties is installed. Thanks to @bkennedy-improving for reporting.\n- (#1499) Respected excluded folders when opening tasks directly from view results and when building dependency/project indexes, so template-folder tasks no longer appear through TaskNotes views. Thanks to @Liya430 for reporting.\n- (#136, #1500) Made the Pomodoro countdown derive remaining time from the session clock instead of from counted interval ticks, so delayed, backgrounded, or screen-off ticks catch up cleanly without over-recording a completed session. Thanks to @Poly-0000 for reporting and documenting the original background timer issue, @Totobal5 for the earlier worker-based fix, and @CoffeaUrbana for the Android screen-off report.\n- Restored padding in task modal Markdown editors.\n- Made the markdown editor areas in task modals easier to click and focus.\n- Strengthened local CSS linting to catch unscoped selectors, unknown CSS, and fixed-position overlays before review.\n- Reduced false-positive plugin review warnings by making background auto-export and auto-archive schedulers non-overlapping and tightening type/string conversion paths.\n- (#1882) Made Google Calendar task descriptions use mobile-friendly plain text for Obsidian links and display labels for wiki-style project/context links. Thanks to @martin-forge for the contribution.\n- (#1883) Improved Google Calendar task sync recovery so failed deletions, offline sync requests, reconnects, and quick create/update races are retried more reliably. Thanks to @martin-forge for the contribution.\n","aliases":["/releases/4.8.0/","/releases/4.8.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#353) Added a Has Subtasks filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this.
  • \n
  • (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this.
  • \n
  • (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up.
  • \n
  • (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this.
  • \n
  • (#1052) Added a public JavaScript API for in-vault scripts at app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text), so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this.
  • \n
  • (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this.
  • \n
  • (#1254) Added ../ and ./ normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as {{currentNotePath}}/../Tasks. Thanks to @rdick for suggesting this.
  • \n
  • (#1267) Added Daily Notes-style date tokens such as YYYY, MM, DD, MMMM, and dddd to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this.
  • \n
  • (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this.
  • \n
  • (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this.
  • \n
  • (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this.
  • \n
  • (#1376) Added backslash escapes for NLP trigger tokens, so text like \\@context, \\*done, or \\tomorrow can stay in the task title. Thanks to @JerryLu086 for suggesting this.
  • \n
  • (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this.
  • \n
  • (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up.
  • \n
  • (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this.
  • \n
  • (#144) Added an "Open note in new tab" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback.
  • \n
  • (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback.
  • \n
  • (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up.
  • \n
  • (#1541) Added {{currentNotePath}} and {{currentNoteTitle}} support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback.
  • \n
  • (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback.
  • \n
  • (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case.
  • \n
  • (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case.
  • \n
  • (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this.
  • \n
  • (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this.
  • \n
  • (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as "tomorrow at 3pm" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this.
  • \n
  • (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.
  • \n
  • (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this.
  • \n
  • (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this.
  • \n
  • (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this.
  • \n
  • (#1625) Added Shift + Cmd/Ctrl + Enter in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this.
  • \n
  • (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this.
  • \n
  • (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short projectId. Thanks to @bendavis987 for the contribution.
  • \n
  • (#923) Added {{projectFilePath}} and {{projectFilePaths}} folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this.
  • \n
  • (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this.
  • \n
  • (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback.
  • \n
  • (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this.
  • \n
  • (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this.
  • \n
  • (#1776) Allowed calendar timeline end times after midnight, such as 26:00 for a 2 AM next-day end. Thanks to @chrabia for suggesting this.
  • \n
  • (#1784, #1833) Added a per-view pinnedColumns option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this.
  • \n
  • (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this.
  • \n
  • (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up.
  • \n
  • (#1808) Added advanced Kanban swimlane ordering through swimLaneOrder, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback.
  • \n
  • (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this.
  • \n
  • (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this.
  • \n
  • (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this.
  • \n
  • (#561) Added a "Last day" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up.
  • \n
  • (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this.
  • \n
  • (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this.
  • \n
  • (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this.
  • \n
  • (#1176) Added advanced Kanban WIP limits through wipLimits, so column headers can show (current/limit) counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this.
  • \n
  • (#914) Added a generated Due in countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this.
  • \n
  • (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this.
  • \n
  • (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this.
  • \n
  • (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback.
  • \n
  • (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this.
  • \n
  • (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions.
  • \n
  • (#791) Added a UUID v4 task filename format and {{uuid}} custom filename template variable. Thanks to @bangbangbanggit for suggesting this.
  • \n
  • (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback.
  • \n
  • (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this.
  • \n
  • (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this.
  • \n
  • (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback.
  • \n
  • (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this.
  • \n
  • Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes.
  • \n
\n

Changed#

\n
    \n
  • Expanded the bug report template to ask for Obsidian "Show debug info" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots.
  • \n
  • Release notes now show the default .base file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes.
  • \n
  • Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project.
  • \n
  • (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion.
  • \n
  • (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up.
  • \n
  • Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards.
  • \n
  • Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected.
  • \n
  • Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage.
  • \n
  • (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this.
  • \n
  • (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this.
  • \n
  • Made task-card priority dots and configured priority icons slightly larger for better visibility.
  • \n
  • (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this.
  • \n
  • (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this.
  • \n
  • (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this.
  • \n
  • (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this.
  • \n
  • (#1392) Made TaskNotes date fields accept compact YYYYMMDD typing and pasted dates. Thanks to @kazerniel for suggesting this.
  • \n
  • (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this.
  • \n
  • (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this.
  • \n
  • (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this.
  • \n
  • Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers.
  • \n
  • (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first picker where clicking a date saves immediately, with time entry still available in the picker. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.
  • \n
  • (#1642) Made completion-based custom recurrence use flexible weekly, monthly, and yearly intervals without forcing a fixed weekday, month day, or month. Thanks to @Volker-brdb for suggesting this.
  • \n
  • (#1724) Moved recurring task complete/skip instance actions into the date area of the task context menu. Thanks to @prepare4robots for suggesting this.
  • \n
  • (#1762) Used the configured Google Calendar task export target as the default calendar when creating manual external calendar events. Thanks to @chrabia for suggesting this.
  • \n
  • (#1774) Made expandable project chevrons visible and easier to tap on mobile. Thanks to @sh0nuff for suggesting this.
  • \n
  • (#190) Made task-card and inline task-link action controls easier to tap on mobile, including always-visible task options on touch layouts. Thanks to @Poly-0000 for suggesting this.
  • \n
  • (#518, #1710, #1785) Added an opt-in setting for Create subtask to inherit the parent task's projects, contexts, priority, and non-identifying tags while always keeping the parent-task project link. Thanks to @bepolymathe, @Jalpara, and @poulpoulsen for reporting this, and to @tomsymonds, @AndyEveritt, @wedgen, @lindsaylearns, and @hokfujow for the follow-up feedback.
  • \n
  • (#1790) Extended the identifying-tag hiding setting to task modal tag suggestions, and kept hidden identifying tag children in place when editing other tags. Thanks to @loukandr for suggesting this.
  • \n
  • (#1804) Made the inline-created task folder setting visible even when instant conversion is disabled, and clarified that leaving it empty uses the default tasks folder. Thanks to @CaFeZn for suggesting this.
  • \n
  • (#1822) Matched the Task Edit Modal subtask list order to the existing relationship sort, so active and higher-priority subtasks appear ahead of completed ones. Thanks to @Glint-Eye for suggesting this.
  • \n
  • (#1233, #1339) Added an Appearance setting to expand project subtasks by default in task cards, while still letting individual cards be collapsed. Thanks to @n1njaznutz and @hasanyilmaz for suggesting this and @kazerniel and @benmartinek for the follow-up.
  • \n
  • (#763) Made the Relationships widget appear on project notes that match Project Autosuggest tag or property filters, even before any tasks link to the project. Thanks to @ChadHattabaugh for suggesting this.
  • \n
  • (#732) Remembered the Task & Project Statistics filters between openings, including the selected date range, custom dates, and minimum time filter. Thanks to @RumiaKitinari for suggesting this.
  • \n
  • (#1335) Added optional default times for new task scheduled and due dates, so default-dated tasks can appear as timed calendar events instead of all-day events. Thanks to @echo-saurav for suggesting this.
  • \n
  • (#1327) Made TaskNotes Bases search match any word in a multi-word search instead of requiring the whole phrase. Thanks to @craziedde for suggesting this.
  • \n
  • (#1318) Made aliased inline task links use the alias text inside the task widget, so [[Task title|short label]] can display as short label. Thanks to @3zra47 for suggesting this and @kazerniel for the follow-up.
  • \n
  • (#1325) Added ./ and ../ support to Include folders filters for project and file autosuggest, resolved from the active note's folder. Thanks to @EpolPers for suggesting this.
  • \n
  • (#1313) Added generated llms.txt and llms-full.txt files to the documentation site, so the primary docs can be shared with LLM tools more easily. Thanks to @JacksonMcDonaldDev for suggesting this.
  • \n
  • (#1308) Added a Calendar view option to stop date links from creating missing daily notes, while still opening existing daily notes. Thanks to @Arachnidai for suggesting this.
  • \n
  • (#1300) Allowed priority, status, calendar subscription, and timeblock color settings to use Obsidian theme color names such as red, blue, and cyan. Thanks to @thestrike72 for suggesting this.
  • \n
  • (#1299) Added a command that creates or opens a task and immediately starts time tracking for it. Thanks to @slipstyle for suggesting this.
  • \n
  • (#1284) Added an exact-match option for hiding task identification tags, so #task can be hidden while nested tags such as #task/project remain visible. Thanks to @3zra47 for suggesting this.
  • \n
  • (#1009) Added a confirmed Delete button to the Edit Task modal, so unwanted task notes can be removed without first opening the note file. Thanks to @jalooc for suggesting this.
  • \n
  • Improved the internal structure of Calendar, Kanban, Bases, task cards, and task modals to make future changes easier to test and maintain.
  • \n
\n

Fixed#

\n
    \n
  • (#697, #1374) Recognized manually authored task notes that use a single scalar tag such as tags: task, so they appear in TaskNotes views and menus like notes using YAML list tags. Thanks to @aubreyz and @phortx for reporting this, and to @jleewastaken for the follow-up.
  • \n
  • Removed the upward hover shift from calendar events while keeping the hover shadow feedback.
  • \n
  • Made same-column manual-order drops in TaskNotes Kanban settle immediately when the local order patch is safe, including virtual columns through a stable reorder path that avoids layout jumps.
  • \n
  • Made single-card cross-column drops in TaskNotes Kanban settle through a local state patch when the move is safe, reducing the wait for the full Bases refresh.
  • \n
  • Fixed Calendar timeblocks created from a selected time range so they appear as soon as Obsidian indexes the daily note update, instead of waiting for a later refresh.
  • \n
  • Replaced the external calendar event emoji marker with the calendar icon and kept it in the same top-right event corner.
  • \n
  • Restored Task List group toggles and recurring calendar month controls to compact icon buttons instead of inherited boxed theme buttons.
  • \n
  • Refined the settings tab navigation styling so tabs read as quieter inline navigation instead of default buttons.
  • \n
  • (#263) Made the instant inline task conversion button respond to touch/pointer activation, so mobile multi-line selections can be converted into TaskNotes. Thanks to @cathywu for reporting this.
  • \n
  • (#216) Preserved @context markers when converting Tasks-plugin-style checkbox tasks into TaskNotes, while keeping those contexts out of the created task title. Thanks to @ksdavidc for suggesting this, and to @hangryscribe3, @nayatiuh, and @natleahh for the follow-up feedback.
  • \n
  • (#508) Showed project note names instead of full project paths in grouped Kanban and Task List headings, while keeping the headings linked to the project note. Thanks to @elvarb for reporting this and @dmodify for confirming it in Task List.
  • \n
  • (#408) Used the task title as the native system notification title for task reminders instead of always showing TaskNotes Reminder. Thanks to @DudeThatsErin for reporting this and @phillipadsmith for the follow-up.
  • \n
  • (#385) Let Mini Calendar month controls shrink and wrap cleanly in narrow sidebars. Thanks to @iholston for reporting this.
  • \n
  • Fixed Calendar List view task cards so they use the available row width without duplicate list cells, row-hover backgrounds, or linked-hover styling.
  • \n
  • (#552) Made instant task convert buttons appear for checkbox tasks inside callouts, and kept converted links inside the callout list. Thanks to @Oblique82 for reporting this and @ksdavidc for the follow-up.
  • \n
  • (#559) Treated notes linked to one loaded recurring calendar event instance as related to the other instances in that series. Thanks to @cathywu for reporting this and @mdbraber for the implementation notes.
  • \n
  • (#685) Made Calendar list views respect the All-day slot option by hiding all-day events from the list when that option is turned off. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#643) Stopped custom filename templates such as task-{year}{month}{day}{hour}{minute} from incorrectly showing the "filename shortened" notice when creating tasks. Thanks to @minchinweb for reporting this.
  • \n
  • (#722) Made Skip Break reset a queued Pomodoro break back to the next focus timer without starting a session. Thanks to @Goossiii for reporting this and @YIRU69 for the follow-up.
  • \n
  • (#782) Made recurrence weekday choices follow the configured first day of week, and made the quick "Weekdays only" recurrence use locale weekend data instead of assuming Monday through Friday everywhere. Thanks to @BKSalman for reporting this.
  • \n
  • (#872) Made note-level task cards appear immediately, and stay visible while editing, when a task note is embedded as a Canvas file node. Thanks to @bangbangbanggit for reporting this and @benmartinek for the follow-up.
  • \n
  • (#856) Fixed filters for number custom fields so numeric task values match equivalent filter values entered as text. Thanks to @thoughtcipher for reporting this.
  • \n
  • (#1039) Restored clearer TaskNotes Bases grouping for nested project paths, and made the Calendar refresh control an icon button again. Thanks to @dblinnikov for reporting this.
  • \n
  • (#1034) Let embedded TaskNotes Calendar views size to their content by default, so month, week, and day embeds no longer reserve full-pane proportions inside notes. Thanks to @same774 for reporting this.
  • \n
  • (#1023) Kept task modal custom fields scrollable above the iPhone keyboard while creating or editing tasks. Thanks to @3zra47 for reporting this.
  • \n
  • (#1019) Kept active Pomodoro and time-tracking task references working after the tracked task file is renamed. Thanks to @AndreMonthy for reporting this.
  • \n
  • (#1037) Let embedded TaskNotes Calendar year views size to their content and kept the year title from wrapping vertically. Thanks to @same774 for reporting this.
  • \n
  • (#1047) Wrapped long file paths in the Edit Task modal metadata section, so narrow mobile screens no longer get a sideways scrollbar from the File row. Thanks to @3zra47 for reporting this.
  • \n
  • (#1051) Preserved extra values on a property-based task identification field when saving a task, so list properties such as class: [task, habit] no longer get collapsed to only the identifying value. Thanks to @WhoIsSeanGalt for reporting this.
  • \n
  • (#1060) Reused and revealed an already-open Calendar/Base view when running view commands, so a view kept in the sidebar no longer reopens in a new main tab. Thanks to @kmaustral for reporting this.
  • \n
  • (#1075) Hid the native WebKit date-input label that could appear as Label when editing scheduled dates on macOS. Thanks to @3zra47 for reporting this.
  • \n
  • (#1076) Allowed timeblocks to end at midnight using 00:00, and accepted 24:00 as an explicit end-of-day value in timeblock validation. Thanks to @skoove for reporting this and @gregor202 for the follow-up.
  • \n
  • (#1086) Fixed the Calendar + more control in dark mode so expanded all-day task groups stay readable. Thanks to @same774 for reporting this.
  • \n
  • (#1100) Applied Advanced Calendar View search and title filters to the tasks used for calendar rendering, so filtering controls affect which tasks appear on the calendar. Thanks to @quiet-coder-io for reporting this.
  • \n
  • (#1147) Added a delete action for recent Pomodoro statistics sessions, so erroneous Pomodoro history can be removed without editing plugin storage or daily-note frontmatter manually. Thanks to @RumiaKitinari for reporting this and @BrucePlumb for the follow-up.
  • \n
  • (#1150) Kept recurring tasks' due dates visible in Calendar Bases views, and showed their scheduled date when recurrence instances are hidden. Thanks to @thomatino for reporting this and @BrucePlumb for the follow-up.
  • \n
  • (#1159) Softened Calendar time-entry styling so recorded time blocks no longer visually outweigh task events. Thanks to @hatespinach for reporting this.
  • \n
  • (#1191) Aligned the task-card and relationships widgets inside notes with Obsidian's editor margins, including readable-line-width layouts. Thanks to @minchinweb for reporting this.
  • \n
  • (#1183) Kept the Calendar create menu open after drag-selecting a time range, so the selected duration can be used when creating a task. Thanks to @randomness42 for reporting this.
  • \n
  • (#1179) Stopped Calendar Bases views from repainting after unrelated note updates when the visible calendar data has not changed. Thanks to @same774 for reporting this.
  • \n
  • (#1156) Kept property-based task identification through the tags property from rewriting task tags as a plain text value, and generated default Bases now use tag membership for that setting. Thanks to @seepage87 for the detailed migration report and @chrsdk for the follow-up.
  • \n
  • (#1232) Fixed generated Task List Base date filters so recurring tasks scheduled for today appear in the Today view, and today's completed recurring instances stay hidden. Thanks to @mvichosfm for reporting this and @ArthurGideon and @VarunNikam22 for the follow-up.
  • \n
  • (#1231) Fixed the generated Task List Base Overdue view so tasks with scheduled dates in the past appear alongside tasks with due dates in the past. Thanks to @Lorite for reporting this and @dictionarymouse for the follow-up.
  • \n
  • (#1228) Matched the task details editor's Markdown heading colors to the active Obsidian theme, including themes that customize heading colors. Thanks to @BrucePlumb for requesting this.
  • \n
  • (#1227) Refreshed the relationships widget when project references are indexed or updated so project notes can show related tasks automatically again. Thanks to @luckb0x for reporting this.
  • \n
  • (#1219) Fixed Kanban drags that start on an expanded subtask card so they move that subtask instead of dragging the parent card. Thanks to @craziedde for reporting this.
  • \n
  • (#990) Treated one-item status lists written by Obsidian Properties as the same status value in TaskNotes Kanban, so they no longer create duplicate columns. Thanks to @mlevison for reporting this.
  • \n
  • (#983) Let Agenda Calendar views wrap their header controls and task titles inside narrow sidebars, so Today and refresh controls and task icons remain visible without sideways scrolling. Thanks to @3zra47 for reporting this.
  • \n
  • (#982) Made TaskNotes task-card typography scale from Obsidian's text font size setting, so Bases and Agenda task text follows larger mobile font settings. Thanks to @3zra47 for suggesting this and @chrsdk and @scottaltham-payroc for the follow-up.
  • \n
  • (#966) Made reminder delete buttons larger and always visible on mobile, so reminders can be removed from the Manage All Reminders modal on iPad. Thanks to @PSG2017 for reporting this.
  • \n
  • (#964) Made Pomodoro and time-tracking task selection use the current recurring instance status, so a recurring task can still be selected after an earlier instance was completed. Thanks to @lomarcanys for reporting this.
  • \n
  • (#944) Preserved number and boolean custom field values when moving tasks between grouped Kanban or Task List columns, and when creating a task from a grouped Kanban column. Thanks to @thoughtcipher for reporting this.
  • \n
  • (#935) Fixed Task List priority sorting so descending order puts higher-weighted priorities first, and due dates are used before scheduled dates when priority values tie. Thanks to @Glint-Eye for reporting this and @kacoroski for the follow-up.
  • \n
  • (#922) Made the Blocked task-card pill expand the blocker tasks, and rendered blockedBy dependencies as clickable links when that property is shown on cards. Thanks to @prayidae for reporting this and following up.
  • \n
  • (#919) Fixed exported ICS task events so they use valid calendar event statuses and can be imported by stricter calendar apps. Thanks to @benoitjadinon for reporting this.
  • \n
  • (#1213) Fixed embedded Task List Bases in Obsidian pop-out windows so typing below the embed no longer leaves a large blank gap. Thanks to @same774 for reporting this.
  • \n
  • (#1243) Removed quoted multi-word custom field NLP expressions from created task titles after saving the custom field value. Thanks to @Arachnidai for reporting this.
  • \n
  • (#1252) Hardened the calendar-first task date picker for iPad taps so date buttons use direct touch manipulation. Thanks to @alxandrharris for reporting this.
  • \n
  • (#1261) Removed the extra Task List Base scrollbar when an embedded task list note is placed in a sidebar, while keeping normal embedded task lists scrollable in the main note area. Thanks to @cathywu for reporting this.
  • \n
  • (#1347) Lowered TaskNotes task-card tag CSS specificity so hierarchical tag colors from Obsidian themes and tag-color plugins can apply correctly. Thanks to @3Fish for reporting this.
  • \n
  • (#1374) Recognized status and priority labels entered through Obsidian Properties or Bases as their configured TaskNotes values. Thanks to @phortx for reporting this.
  • \n
  • (#1373) Parsed numeric natural-language dates with the configured calendar locale, so en-GB treats 11/06/2026 as 11 June instead of November 6, and YYYY/MM/DD works consistently. Thanks to @AleMunin for reporting this and @imsuck for the follow-up.
  • \n
  • (#1370) Prevented recurring task series from being queued for auto-archive when their parent status uses auto-archive, so ongoing recurring tasks are not moved away after completing an occurrence. Thanks to @Jomo94 for reporting this and @martin-forge for the follow-up discussion.
  • \n
  • (#1367) Made recurring task completion counts use the total expected instances for finite COUNT or UNTIL recurrences, and stopped showing a made-up percentage for unbounded recurrences. Thanks to @saurinni for reporting this.
  • \n
  • (#1365) Preserved email and other URI links from converted inline task titles by moving the original links into the new task body, and rendered message:/mailto: markdown links as external links in TaskNotes surfaces. Thanks to @phillipadsmith for reporting this and @hasanyilmaz for the follow-up.
  • \n
  • (#1350) Refreshed inline task widgets in Reading mode after task property edits, so changed dates and other visible properties no longer stay stale until the note is reopened. Thanks to @tmsbn for reporting this.
  • \n
  • (#1329) Pulled the relationships widget up to the end of the note content without removing its normal spacing, and kept that placement updated while editing and on load so it no longer covers the editor. Thanks to @Volker-brdb for reporting this.
  • \n
  • (#1326) Treated empty task frontmatter values as missing, so empty titles fall back to the filename and blank date, priority, and recurrence fields are ignored. Thanks to @craziedde for suggesting this.
  • \n
  • (#1316) Stopped stale Workspace state from overriding the configured Calendar view mode, so switching Workspaces no longer forces an old Day/Week/List choice over the view default. Thanks to @kmaustral for reporting this and following up.
  • \n
  • (#1302) Read task frontmatter directly from the task file when Obsidian has not indexed its metadata yet, so visible tasks can still be opened, updated, and selected instead of reporting "Task not found". Thanks to @WorldTeacher for reporting this and @Steven-AA for confirming it.
  • \n
  • Kept just-written task data available while Obsidian's metadata cache catches up, so immediate reads after task edits no longer briefly return stale values.
  • \n
  • (#1297) Made the Create or open task footer tappable, so mobile users can create the typed task without needing the Shift+Enter shortcut. Thanks to @slipstyle for reporting this.
  • \n
  • (#1288) Allowed formula properties to appear in Calendar property-based event start and end date selectors. Thanks to @hasanyilmaz for reporting this.
  • \n
  • Made TaskNotes Kanban drags show a lightweight held-card preview, so the dragged card remains easy to track while the source column opens the drop slot.
  • \n
  • (#1423) Refreshed TaskNotes Bases views when subtasks are deleted, so expanded project cards drop removed subtasks and stop showing project controls when the last subtask is gone. Thanks to @normenmueller for reporting this.
  • \n
  • (#1419) Kept custom user field name, key, and default-value edits in Task Properties settings when closing settings without first blurring the field. Thanks to @s33a for reporting this and @kacoroski for the follow-up.
  • \n
  • Reduced redundant settings writes by coalescing overlapping saves, so settings changes made in quick succession finish with the latest values without repeating every intermediate save cycle.
  • \n
  • (#1331, #1411) Made Agenda Calendar Bases respect the Base sort order within each day instead of falling back to alphabetical title order. Thanks to @bane73 and @ky1ejs for reporting this.
  • \n
  • (#1383) Made task modal markdown editors expose the active editor API expected by plugins such as Templater. Thanks to @tomsymonds for reporting this.
  • \n
  • Fixed the first-run Create/Edit Task modal so the default fields appear immediately after installing TaskNotes, without needing to open Modal Fields settings or restart Obsidian.
  • \n
  • (#1895) Restored the natural-language preview in the Create Task modal. Thanks to @ssonhub for reporting this.
  • \n
  • (#1898) Cleared stale Calendar time-axis column widths when switching views, so Day, Week, and 3-day views keep the time labels anchored on the left. Thanks to @ddevaal for reporting this.
  • \n
  • (#1439) Fixed generated Bases dependency filters so blockedBy entries stored as links, strings, or dependency objects are handled consistently in Not Blocked and Relationships views. Thanks to @prayidae for reporting this and following up.
  • \n
  • (#1435) Prevented malformed task dependency, status, or priority values from breaking the task context menu. Thanks to @23maverick23 for reporting this.
  • \n
  • (#1434) Kept older filename-titled tasks readable after turning off "Store title in filename" by falling back to the filename when a task has no usable title property. Thanks to @hujuDev for reporting this.
  • \n
  • (#1433) Made the Due date and Scheduled date weekday picker follow the configured first day of week. Thanks to @sandchipper for reporting this.
  • \n
  • (#1430) Showed custom user-field property keys in Modal Fields settings instead of internal field IDs. Thanks to @JerryLu086 for reporting this.
  • \n
  • (#1427) Fixed project autosuggest Required Tags filters so frontmatter tags parsed by Obsidian are handled the same way as direct tag-property filters. Thanks to @ProHaller for reporting this.
  • \n
  • (#1495) Added an Update default files action for generated Bases views, so task-tag or task-identification setting changes can refresh existing .base filters without deleting files manually. Thanks to @Liya430 for reporting this.
  • \n
  • (#1512) Prevented the split Create/Edit Task modal details pane from collapsing to a one-character-wide column under the Minimal theme. Thanks to @willfanguy for reporting this and sharing detailed CSS notes.
  • \n
  • (#1524) Fixed task-card font sizes shrinking when a Bases view is opened in an Obsidian pop-out window. Thanks to @Glint-Eye for reporting this.
  • \n
  • (#1535) Fixed the generated Relationships Base Subtasks filter so single project links do not trigger a Bases contains error. Thanks to @DanaKyle for reporting this.
  • \n
  • (#1102) Refreshed task cards when a task status is edited directly in Obsidian frontmatter, so the card no longer stays on the old status until it is clicked. Thanks to @Wayment9504 for reporting this.
  • \n
  • (#1105) Added an explicit Close action to the mobile task options menu, so iPhone users do not need to tap near the top system bar to dismiss it. Thanks to @J-R-Troutman for reporting this.
  • \n
  • (#1550) Prevented mobile Calendar event drags from opening the task context menu before the drag can begin. Thanks to @stil-sudo for suggesting this.
  • \n
  • (#1563) Removed duplicate entries from Calendar event related notes when the same linked file is also a TaskNote. Thanks to @VarunNikam22 for reporting this.
  • \n
  • (#1566) Rendered grouped multi-project values as individual links when a Bases group title contains multiple project links. Thanks to @ptsouchlos for suggesting this.
  • \n
  • (#1569) Allowed local ICS calendar paths inside the vault to be pasted as absolute filesystem paths, and showed a clearer error when the file is outside the vault. Thanks to @Photon89 for reporting this and following up.
  • \n
  • (#1584) Sanitized task-card status and priority class names, so custom values with spaces no longer create invalid CSS classes. Thanks to @omber for reporting this.
  • \n
  • (#1587) Stored dependencies added from the task context menu as wikilinks, matching the Edit Task modal. Thanks to @mgrecar for reporting this.
  • \n
  • (#1590) Clarified HTTP API task creation docs and OpenAPI schema for writable blockedBy dependencies, and marked blocking as a read-only derived relationship. Thanks to @hGriff0n for reporting this.
  • \n
  • (#1591) Added a startup guard that avoids saving default settings over an existing settings file if Obsidian temporarily returns no plugin data during an update. Thanks to @GGlider for reporting this.
  • \n
  • (#1593) Made the New button in TaskNotes Bases views open the TaskNotes create task modal again, so new tasks respect the configured default tasks folder. Thanks to @katlandreth for reporting this.
  • \n
  • (#1594) Made task cards inside recurring task notes complete the task's current scheduled occurrence instead of today's date when no calendar or view date is supplied. Thanks to @ngraham20 for reporting this.
  • \n
  • (#1601) Prevented overlapping Live Preview relationship-widget injections from leaving duplicate subtask/relationship sections in a note. Thanks to @wealthychef1 for reporting this and @benmartinek for confirming it.
  • \n
  • (#1610) Made expanded subtasks in TaskNotes Bases views follow the current view's sorted task order instead of a fixed fallback order. Thanks to @MrZzard for reporting this and @slipstyle for confirming it.
  • \n
  • (#1609) Restored scrolling in wide split-layout task edit modals when the form content is taller than the modal. Thanks to @3zra47 for reporting this.
  • \n
  • (#1614) Wrote unchecked boolean custom user-field defaults to new task frontmatter, including tasks created through instant conversion. Thanks to @kobalteule for reporting this.
  • \n
  • (#1611) Made generated default Bases urgency scores fall back safely when the next-date distance is missing. Thanks to @benoitjadinon for reporting this and suggesting the formula fix.
  • \n
  • (#1623) Honored "Store title in filename" across task creation and edits, so the mapped title property is omitted from frontmatter and stale title fields are removed on save. Thanks to @VenturaNotes for reporting this, and to @Ender367, @slipstyle, and @loukandr for confirming and tracing affected paths.
  • \n
  • (#1621) Made Kanban swimlane labels stop freezing on mobile and kept their label column compact, leaving more room for task cards while horizontally scrolling. Thanks to @karenchoe428 for reporting this.
  • \n
  • (#1615) Detected Obsidian custom multi-text properties exposed through widget: "multitext" as list properties, so Kanban can split those values into multiple columns. Thanks to @konton71 for reporting this.
  • \n
  • (#1626) Expanded recurring ICS subscription events through the one-year subscription window for high-frequency recurring calendars. Thanks to @pib for reporting this.
  • \n
  • (#1628) Refreshed Calendar Bases views promptly when switching between filtered Agenda views, so the previous view's task set does not stay visible until the delayed refresh. Thanks to @Lanalangz for reporting this.
  • \n
  • (#1629) Saved blockedBy dependencies selected in the Create Task modal. Thanks to @obsilover for reporting this.
  • \n
  • (#1634) Aligned custom status icons in inline tasks with the default inline status circle. Thanks to @ttlaylor for reporting this and @basbarten for confirming it.
  • \n
  • (#1636) Restored the active styling for the Calendar list-view toolbar button. Thanks to @vroablec for reporting this.
  • \n
  • (#1493, #1638) Kept task time tracking consistent when switching or clearing tasks during an active Pomodoro. Thanks to @ROS-SDN and @katonapng for reporting this, and to @anomatomato for confirming it.
  • \n
  • (#1639) Respected the aliased-link overlay exclusion in Reading mode even when the alias text matches the task title. Thanks to @MiracleXYZ for reporting this.
  • \n
  • Fixed actively tracked task cards so the blue time-tracking outline stays visible along the card edges.
  • \n
  • (#1657) Preserved Bases view defaults when creating tasks from the TaskNotes Kanban/List view New button, so project-scoped views can pass their project assignment into the create task modal. Thanks to @casualQuads122 for reporting this.
  • \n
  • (#728, #1831) Preserved frontmatter defaults supplied by Obsidian's Bases New action when opening the TaskNotes create task modal from custom Bases views, so filtered views can prefill matching tags, projects, contexts, and custom fields. Thanks to @DillPickle80 and @echo-saurav for suggesting this, and to @prayidae and @renatomen for the detailed follow-up.
  • \n
  • (#726) Added an instant-conversion option to use the closest heading above the converted line as a project, so checkbox tasks under project headings can inherit that project automatically. Thanks to @ghelton for suggesting this.
  • \n
  • (#1662) Preserved frontmatter from ICS event note templates when quoted event variables or Templater expressions are used. Thanks to @victorhg for reporting this.
  • \n
  • (#1663) Fixed Japanese and other Unicode tags on task cards so Kanban tag pills keep the same rounded styling as ASCII tags. Thanks to @kutty-1119 for reporting this.
  • \n
  • (#1649) Restored daily-note navigation from the Calendar Day view date header. Thanks to @BaccanoMob for reporting this.
  • \n
  • (#1648, #1665) Fixed the API endpoint list in Integrations settings so it uses the configured bearer token when API authentication is enabled, instead of reporting the running local server as inaccessible. Thanks to @npondel and @warm-july for reporting this.
  • \n
  • (#1668) Fixed the Create Task magic wand so NLP-triggered custom field values are copied into the custom property inputs before saving. Thanks to @hokfujow for reporting this.
  • \n
  • (#1669) Stopped the startup settings migration check from rewriting data.json just because saved calendar defaults are false, 0, empty, or null, reducing unnecessary sync churn. Thanks to @thehyperadvisor for reporting this.
  • \n
  • (#1674) Improved the timeblock creation error when Daily Notes cannot read its configured folder, so the modal notice points to the Daily Notes core plugin settings instead of only logging the folder lookup failure. Thanks to @Ender367 for reporting this.
  • \n
  • (#1680) Fixed TaskNotes Calendar Bases options stored under options, so Agenda views respect showPropertyBasedEvents: false and no longer show duplicate property-based rows for the same task. Thanks to @xiaoyaozhu1991 for reporting this and @KondrotM for confirming it.
  • \n
  • (#1681) Reduced the cost of inline checkbox convert buttons by only scanning the visible editor range instead of the full document. Thanks to @en-ot for reporting this and @hokfujow for the follow-up.
  • \n
  • (#1689) Fixed task reminders added or rescheduled through direct frontmatter edits so the notification queue refreshes immediately and relative reminders recalculate from the latest task dates. Thanks to @garzonjav for reporting this.
  • \n
  • (#1693) Fixed generated default Bases formulas so empty due and scheduled dates are checked with .isEmpty() instead of date-field truthiness. Thanks to @benoitjadinon for reporting this.
  • \n
  • (#1702) Removed the forced bottom gap under TaskNotes custom Bases views, so calendar and other TaskNotes views can fill the available pane height. Thanks to @AudreyLooby for reporting this.
  • \n
  • (#1719) Fixed task cards in reading mode so Obsidian 1.12.x header changes no longer place the card above the title and properties or drop it after returning to a tab. Thanks to @tholbrook9 for reporting this and tracing the DOM change.
  • \n
  • (#1722) Saved the source note immediately after converting an inline checkbox task to a TaskNote, so Kanban views do not keep showing the stale inline task alongside the new task file. Thanks to @literallydope for reporting this and sharing screenshots.
  • \n
  • (#1750) Fixed generated default Bases filters for property-based task identification when the identifying property name contains spaces. Thanks to @Igorgro for reporting this.
  • \n
  • (#1745) Clarified the inline task documentation so Create new inline task is distinguished from current-line conversion. Thanks to @yvos for reporting the mismatch.
  • \n
  • (#1485) Stopped Google Calendar manual refresh from showing a success notice after token refresh or calendar-list failures. Thanks to @ebanDev for reporting this.
  • \n
  • (#1474) Made priority-based Kanban swimlanes follow the configured priority order instead of alphabetical task data order. Thanks to @kanzaki1201 for reporting this and @SoTHISIsFitness for the follow-up investigation.
  • \n
  • (#1470) Restored pointer cursors on TaskNotes interactive elements under Obsidian themes that set --cursor to the default cursor. Thanks to @TheFrostedDev for reporting this.
  • \n
  • (#1463) Documented the supported FilterQuery payload for POST /api/tasks/query, including context filtering examples and generated API schema details. Thanks to @tcb678 for reporting this and @soloidx for sharing a working query example.
  • \n
  • (#1464) Made context on GET /api/tasks follow the same filtering guidance as project, so the API now points clients to POST /api/tasks/query instead of ignoring the parameter. Thanks to @tcb678 for suggesting this.
  • \n
  • (#1457) Rendered scheduled-to-due calendar spans with scheduled times as daily timed events instead of moving them to the all-day section. Thanks to @atos2212-blip for reporting this and @rayvermey for confirming it.
  • \n
  • (#1450) Returned configured user fields in HTTP API task responses under customProperties, while keeping the configured frontmatter keys available on each task. Thanks to @Admorei for reporting this and @nschenone for the follow-up.
  • \n
  • (#1449) Let embedded Agenda views use auto-height sizing by default, so one-day list embeds no longer reserve a large empty calendar block. Thanks to @GlebYavorski for reporting this.
  • \n
  • (#1446) Kept custom Kanban columns from columnOrder available when they are empty, so hideEmptyColumns: false can show drop targets for custom grouped values. Thanks to @akhtsang for reporting this.
  • \n
  • (#1459) Avoided double "Failed to create task" prefixes in task creation error notices. Thanks to @Sineapple for reporting this, and to @slipstyle and @Stockemer for the follow-up investigation.
  • \n
  • (#1469) Fixed Convert current note to task so saving the untouched edit modal writes the task frontmatter instead of reporting no changes. Thanks to @slipstyle for reporting this, and to @jhoogeboom and @ngraham20 for confirming it.
  • \n
  • (#1466) Prefilled the current note as the project when creating a task from an embedded Subtasks/Relationships Base filtered with this.file.asLink(). Thanks to @jhoogeboom for reporting this, and to @cybersader, @fsmontenegro, and @benmartinek for the follow-up discussion.
  • \n
  • (#1476) Showed linked parent-task project titles instead of timestamp filenames in project stats and grouped task views when the linked task has a frontmatter title. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#1487) Let Calendar task event titles wrap instead of clipping long names, and removed the redundant due-date prefix from due task events. Thanks to @Alexander-Bergmann for reporting this.
  • \n
  • (#1488, #1739) Enabled Kanban touch dragging on touch-capable desktop and convertible devices, not only mobile Obsidian. Thanks to @tmoyland001 and @mgsima for reporting the drag failures, and @SoTHISIsFitness for investigating related task-property cases.
  • \n
  • (#1738) Fixed Outlook calendar subscriptions whose event timezones reference the base Windows timezone name while the feed defines a suffixed timezone name. Thanks to @Mirrimo for reporting this, @rafavital for confirming it, and @rogerfsh for tracing the ICS timezone mismatch.
  • \n
  • (#1734) Fixed dependency picker search when task priority values are stored as non-string frontmatter values. Thanks to @MatthewClarkeDev for reporting this and identifying the stack trace.
  • \n
  • (#1733) Preserved wikilinks in task titles and rendered them as clickable links on task cards. Thanks to @bitscorch for suggesting this.
  • \n
  • (#1728) Applied the "Use parent note as project" default when creating a new task from the command palette or ribbon. Thanks to @greatEmily for reporting this.
  • \n
  • (#1759) Advanced stale due dates when recurring tasks move to their next scheduled occurrence, so work-window tasks do not remain overdue after completion. Thanks to @MattPryze for reporting this.
  • \n
  • (#1766) Fixed Calendar Bases date navigation from custom note properties, so embedded calendar views can open on the date stored in the selected property instead of falling back to today. Thanks to @chrabia for reporting this.
  • \n
  • (#1767) Aligned the start and end time rows in the timeblock creation modal. Thanks to @loiveli for reporting this.
  • \n
  • (#1783) Replaced the default browser drag ghost for Kanban cards so dragging a card no longer makes the next card look semi-transparent. Thanks to @loukandr for reporting this and tracing the drag image behavior.
  • \n
  • (#1796) Restored expanded subtasks immediately after renaming a parent task file and updating links. Thanks to @bung69 for reporting this.
  • \n
  • (#1797) Improved manual ordering so long Kanban columns remain scrollable while dragging, mobile Kanban drops can place a card relative to another card, Kanban/Task List drops resolve the final drop position more reliably, generated manual-order ranks match Bases sorting, and manual-order properties such as sort_order render on task cards when enabled. Thanks to @SKIERZZ for reporting this and sharing videos.
  • \n
  • (#1812) Separated Microsoft OAuth token status from calendar sync status, and surfaced Microsoft calendar fetch errors in the integrations settings card instead of leaving them console-only. Thanks to @henninger80 for the detailed report.
  • \n
  • (#1814) Restored NLP project autosuggest in the Create or Open Task command, so + project suggestions use the same filtered project lookup as the Create Task modal. Thanks to @adammahad for reporting this.
  • \n
  • (#1820) Kept API-created tasks readable immediately after creation even if Obsidian has not finished indexing the new file metadata yet. Thanks to @vadminas for reporting and tracing the cache desync.
  • \n
  • (#1823) Prevented zero-duration timed external calendar events from rendering under more than one day in list-style calendar views. Thanks to @martin-forge for reporting and tracing the Google Calendar case.
  • \n
  • (#1841) Prevented Kanban boards from duplicating columns when wikilinked status values are grouped through Bases. Thanks to @lendamico for reporting and sharing the screen recording.
  • \n
  • (#1846) Saved NLP-triggered boolean custom fields as real booleans instead of quoted strings, so they match checkbox-created values and Bases filters. Thanks to @DevOps-Toast for reporting and sharing screenshots.
  • \n
  • (#1849) Prevented repeated clicks on task-card scheduled and due date labels from stacking duplicate date menus when Obsidian native menus are disabled. Thanks to @3zra47 for reporting.
  • \n
  • (#1850) Added mobile bottom spacing to TaskNotes list views so the final task can scroll above Obsidian's floating mobile controls. Thanks to @AlejandroRigau for reporting and sharing the iPhone screenshot.
  • \n
  • (#1852) Improved mobile timed calendar event rendering with shorter time labels, tighter spacing, and event-colored task/calendar blocks. Thanks to @redrumthebum for reporting and sharing screenshots.
  • \n
  • (#1757, #1853, #1775) Respected an existing mdbase.yaml types_folder when regenerating mdbase task type definitions, so the generated task.md can live outside the vault-root _types folder. Thanks to @aldrichtr for the original request and implementation exploration, and @hangryscribe3 for the follow-up request.
  • \n
  • (#1858) Included task body details in single-task HTTP API and MCP reads. Thanks to @vanillaflava for reporting and outlining the expected behavior.
  • \n
  • (#1859) Clarified the Google Calendar setup guide for OAuth testing-mode access_denied errors. Thanks to @PE-Boy for reporting and @tiagoarroz for the workaround.
  • \n
  • (#1860) Preserved accented characters in tags when converting checkbox tasks to TaskNotes. Thanks to @e-zz for reporting.
  • \n
  • (#1869) Preserved Calendar Month View scroll position after task updates. Thanks to @sisyowo for reporting and linking the earlier Kanban fix.
  • \n
  • (#1873) Prevented Calendar Bases from rendering in Obsidian pop-out windows because restoring FullCalendar there can freeze Obsidian. Thanks to @misolex for reporting.
  • \n
  • (#1497, #1870) Fixed NLP file suggestions for custom fields so selected wikilinks are captured as custom field values, including list-type fields. Thanks to @Naesue and @Sineapple for reporting this, and to @bradleyed and @Xananax for the follow-up details.
  • \n
  • (#1888) Allowed project autosuggest required property filters to match any comma-separated value, such as project, area. Thanks to @BrianHicks for suggesting.
  • \n
  • (#1886) Added a command to postpone active overdue scheduled tasks to today. Thanks to @chrabia for the suggestion.
  • \n
  • (#1889) Fixed Kanban swimlanes for list-valued properties so tags and contexts use individual list items instead of comma-joined values. Thanks to @pkropotin for reporting.
  • \n
  • (#1890) Fixed scheduled-date Kanban columns dropping tasks when date-only and timed tasks on the same day are sorted by a scheduled-time formula. Thanks to @chrabia for reporting and investigating.
  • \n
  • (#773) Added ICS export filters for archived tasks, completed tasks, due dates, and scheduled dates. Thanks to @ras0q for suggesting this and @slipstyle for the scheduled-date follow-up.
  • \n
  • (#765) Reduced side-pane gutters around embedded TaskNotes Bases views, so embedded task lists use about the same horizontal space as directly opened Bases views. Thanks to @TonyAtlas for suggesting this.
  • \n
  • (#1892) Fixed nested Markdown list indentation in the Task Edit Modal details editor. Thanks to @Glint-Eye for reporting.
  • \n
  • (#1891) Fixed TaskNotes modal markdown editors collapsing to one-character-wide lines when Pretty Properties is installed. Thanks to @bkennedy-improving for reporting.
  • \n
  • (#1499) Respected excluded folders when opening tasks directly from view results and when building dependency/project indexes, so template-folder tasks no longer appear through TaskNotes views. Thanks to @Liya430 for reporting.
  • \n
  • (#136, #1500) Made the Pomodoro countdown derive remaining time from the session clock instead of from counted interval ticks, so delayed, backgrounded, or screen-off ticks catch up cleanly without over-recording a completed session. Thanks to @Poly-0000 for reporting and documenting the original background timer issue, @Totobal5 for the earlier worker-based fix, and @CoffeaUrbana for the Android screen-off report.
  • \n
  • Restored padding in task modal Markdown editors.
  • \n
  • Made the markdown editor areas in task modals easier to click and focus.
  • \n
  • Strengthened local CSS linting to catch unscoped selectors, unknown CSS, and fixed-position overlays before review.
  • \n
  • Reduced false-positive plugin review warnings by making background auto-export and auto-archive schedulers non-overlapping and tightening type/string conversion paths.
  • \n
  • (#1882) Made Google Calendar task descriptions use mobile-friendly plain text for Obsidian links and display labels for wiki-style project/context links. Thanks to @martin-forge for the contribution.
  • \n
  • (#1883) Improved Google Calendar task sync recovery so failed deletions, offline sync requests, reconnects, and quick create/update races are retried more reliably. Thanks to @martin-forge for the contribution.
  • \n
\n","text":"Added# (#353) Added a Has Subtasks filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this. (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this. (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up. (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this. (#1052) Added a public JavaScript API for in-vault scripts at app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text), so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this. (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this. (#1254) Added ../ and ./ normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as {{currentNotePath}}/../Tasks. Thanks to @rdick for suggesting this. (#1267) Added Daily Notes-style date tokens such as YYYY, MM, DD, MMMM, and dddd to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this. (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this. (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this. (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this. (#1376) Added backslash escapes for NLP trigger tokens, so text like \\@context, \\*done, or \\tomorrow can stay in the task title. Thanks to @JerryLu086 for suggesting this. (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this. (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up. (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this. (#144) Added an \"Open note in new tab\" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback. (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback. (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up. (#1541) Added {{currentNotePath}} and {{currentNoteTitle}} support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback. (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback. (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case. (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case. (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this. (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this. (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as \"tomorrow at 3pm\" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this. (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback. (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this. (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this. (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this. (#1625) Added Shift + Cmd/Ctrl + Enter in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this. (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this. (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short projectId. Thanks to @bendavis987 for the contribution. (#923) Added {{projectFilePath}} and {{projectFilePaths}} folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this. (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this. (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback. (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this. (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this. (#1776) Allowed calendar timeline end times after midnight, such as 26:00 for a 2 AM next-day end. Thanks to @chrabia for suggesting this. (#1784, #1833) Added a per-view pinnedColumns option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this. (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this. (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up. (#1808) Added advanced Kanban swimlane ordering through swimLaneOrder, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback. (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this. (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this. (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this. (#561) Added a \"Last day\" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up. (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this. (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this. (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this. (#1176) Added advanced Kanban WIP limits through wipLimits, so column headers can show (current/limit) counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this. (#914) Added a generated Due in countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this. (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this. (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this. (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback. (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this. (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions. (#791) Added a UUID v4 task filename format and {{uuid}} custom filename template variable. Thanks to @bangbangbanggit for suggesting this. (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback. (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this. (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this. (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback. (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this. Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes. Changed# Expanded the bug report template to ask for Obsidian \"Show debug info\" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots. Release notes now show the default .base file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes. Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project. (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion. (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up. Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards. Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected. Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage. (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this. (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this. Made task-card priority dots and configured priority icons slightly larger for better visibility. (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this. (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this. (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this. (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this. (#1392) Made TaskNotes date fields accept compact YYYYMMDD typing and pasted dates. Thanks to @kazerniel for suggesting this. (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this. (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this. (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this. Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers. (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first "},{"route":"/obsidian/releases/4.8.1/","title":"TaskNotes 4.8.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.8.1.md","namespace":"obsidian","relativePath":"releases/4.8.1.md","raw":"# TaskNotes 4.8.1\n\n## Fixed\n\n- (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space.\n - Thanks to @3zra47 for reporting the issue and sharing the screen recording.\n- (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices.\n - Thanks to @pxxush for reporting the issue.\n- (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00.\n - Thanks to @AndreMonthy for the report.\n- (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views.\n - Thanks to @kmaustral for reporting the issue.\n- (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like `high` or `low`.\n - Thanks to @RumiaKitinari for reporting the issue.\n- (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards.\n - Long tag pills can now wrap across lines and break within very long tag names on narrow screens.\n - Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution.\n- (#1901) Fixed the task context menu creating an `undefined` property when adding or removing tags.\n - Hardened task property updates so invalid frontmatter property names are rejected instead of written.\n - Thanks to @mgrecar for reporting the issue.\n- (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages.\n - Thanks to @minchinweb for reporting the issue.\n\n## Changed\n\n- Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain.\n","aliases":["/releases/4.8.1/","/releases/4.8.1/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space.
      \n
    • Thanks to @3zra47 for reporting the issue and sharing the screen recording.
    • \n
    \n
  • \n
  • (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices.
      \n
    • Thanks to @pxxush for reporting the issue.
    • \n
    \n
  • \n
  • (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00.
      \n
    • Thanks to @AndreMonthy for the report.
    • \n
    \n
  • \n
  • (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views.
      \n
    • Thanks to @kmaustral for reporting the issue.
    • \n
    \n
  • \n
  • (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like high or low.
      \n
    • Thanks to @RumiaKitinari for reporting the issue.
    • \n
    \n
  • \n
  • (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards.
      \n
    • Long tag pills can now wrap across lines and break within very long tag names on narrow screens.
    • \n
    • Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution.
    • \n
    \n
  • \n
  • (#1901) Fixed the task context menu creating an undefined property when adding or removing tags.
      \n
    • Hardened task property updates so invalid frontmatter property names are rejected instead of written.
    • \n
    • Thanks to @mgrecar for reporting the issue.
    • \n
    \n
  • \n
  • (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages.
      \n
    • Thanks to @minchinweb for reporting the issue.
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain.
  • \n
\n","text":"Fixed# (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space. Thanks to @3zra47 for reporting the issue and sharing the screen recording. (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices. Thanks to @pxxush for reporting the issue. (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00. Thanks to @AndreMonthy for the report. (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views. Thanks to @kmaustral for reporting the issue. (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like high or low. Thanks to @RumiaKitinari for reporting the issue. (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards. Long tag pills can now wrap across lines and break within very long tag names on narrow screens. Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution. (#1901) Fixed the task context menu creating an undefined property when adding or removing tags. Hardened task property updates so invalid frontmatter property names are rejected instead of written. Thanks to @mgrecar for reporting the issue. (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages. Thanks to @minchinweb for reporting the issue. Changed# Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain."},{"route":"/obsidian/releases/4.9.0/","title":"TaskNotes 4.9.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.9.0.md","namespace":"obsidian","relativePath":"releases/4.9.0.md","raw":"# TaskNotes 4.9.0\n\n## Security\n\n- (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins.\n - Thanks to @martin-forge for reporting.\n\n## Added\n\n- (#1932) Added middle-click support for opening task cards in a new tab.\n - Thanks to @imsuck for the request.\n\n## Fixed\n\n- (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views.\n - Thanks to @KittehBit for reporting.\n- (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find.\n - Thanks to @rayvermey for reporting.\n- (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening.\n - Thanks to @sumiyalairu03 for reporting.\n- (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task.\n - Thanks to @sumiyalairu03 for reporting.\n- (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes.\n - Thanks to @rchaklashiya for reporting and following up with the embed case.\n- (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields.\n - Thanks to @AndreMonthy for reporting.\n- (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects.\n - Thanks to @martin-forge for reporting and verifying the direct-edit reproduction.\n- (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes.\n - Thanks to @RumiaKitinari for reporting.\n- (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views.\n - Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1.\n- (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid.\n - Thanks to @benmartinek for suggesting this.\n- Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens.\n- (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay.\n - Thanks to @minchinweb for reporting.\n- (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view.\n - Thanks to @mikhailmarka for reporting.\n- (#1912) Fixed \"Create subtask\" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text.\n - Thanks to @pkuehne for reporting and @benmartinek for confirming.\n","aliases":["/releases/4.9.0/","/releases/4.9.0/"],"toc":[{"level":2,"id":"security","text":"Security"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Security#

\n
    \n
  • (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins.
      \n
    • Thanks to @martin-forge for reporting.
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#1932) Added middle-click support for opening task cards in a new tab.
      \n
    • Thanks to @imsuck for the request.
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views.
      \n
    • Thanks to @KittehBit for reporting.
    • \n
    \n
  • \n
  • (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find.
      \n
    • Thanks to @rayvermey for reporting.
    • \n
    \n
  • \n
  • (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening.
      \n
    • Thanks to @sumiyalairu03 for reporting.
    • \n
    \n
  • \n
  • (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task.
      \n
    • Thanks to @sumiyalairu03 for reporting.
    • \n
    \n
  • \n
  • (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes.
      \n
    • Thanks to @rchaklashiya for reporting and following up with the embed case.
    • \n
    \n
  • \n
  • (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields.
      \n
    • Thanks to @AndreMonthy for reporting.
    • \n
    \n
  • \n
  • (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects.
      \n
    • Thanks to @martin-forge for reporting and verifying the direct-edit reproduction.
    • \n
    \n
  • \n
  • (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes.
      \n
    • Thanks to @RumiaKitinari for reporting.
    • \n
    \n
  • \n
  • (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views.
      \n
    • Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1.
    • \n
    \n
  • \n
  • (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid.
      \n
    • Thanks to @benmartinek for suggesting this.
    • \n
    \n
  • \n
  • Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens.
  • \n
  • (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay.
      \n
    • Thanks to @minchinweb for reporting.
    • \n
    \n
  • \n
  • (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view.
      \n
    • Thanks to @mikhailmarka for reporting.
    • \n
    \n
  • \n
  • (#1912) Fixed "Create subtask" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text.
      \n
    • Thanks to @pkuehne for reporting and @benmartinek for confirming.
    • \n
    \n
  • \n
\n","text":"Security# (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins. Thanks to @martin-forge for reporting. Added# (#1932) Added middle-click support for opening task cards in a new tab. Thanks to @imsuck for the request. Fixed# (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views. Thanks to @KittehBit for reporting. (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find. Thanks to @rayvermey for reporting. (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening. Thanks to @sumiyalairu03 for reporting. (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task. Thanks to @sumiyalairu03 for reporting. (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes. Thanks to @rchaklashiya for reporting and following up with the embed case. (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields. Thanks to @AndreMonthy for reporting. (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects. Thanks to @martin-forge for reporting and verifying the direct-edit reproduction. (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes. Thanks to @RumiaKitinari for reporting. (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views. Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1. (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid. Thanks to @benmartinek for suggesting this. Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens. (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay. Thanks to @minchinweb for reporting. (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view. Thanks to @mikhailmarka for reporting. (#1912) Fixed \"Create subtask\" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming."},{"route":"/obsidian/releases/4.9.1/","title":"TaskNotes 4.9.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.9.1.md","namespace":"obsidian","relativePath":"releases/4.9.1.md","raw":"# TaskNotes 4.9.1\n\n## Added\n\n- (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active.\n - Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea.\n\n## Fixed\n\n- (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions.\n - Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case.\n- (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date.\n - Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event.\n - Thanks to @martin-forge for reporting and contributing the fix.\n- (#1912) Fixed \"Create subtask\" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text.\n - Thanks to @pkuehne for reporting and @benmartinek for confirming.\n- (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits.\n - TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup.\n - Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes.\n - Thanks to @martin-forge for reporting and contributing the fix.\n- (#1938) Fixed partial HTTP API task updates rewriting native tags with `#` prefixes or duplicate task tags.\n - Thanks to @joseluisgonzalezdelgado-ctrl for reporting.\n- (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back.\n - Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact.\n- Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled.\n- (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable.\n - Thanks to @pxxush for reporting.\n- (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts.\n - Thanks to @jordankbartos for reporting and proposing a fix in #1944.\n- (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up.\n - Thanks to @martin-forge for reporting and contributing the fix.\n- (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar.\n - Thanks to @3zra47 for reporting.\n- (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row.\n - Thanks to @Jomo94 for reporting.\n- (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern.\n - Thanks to @Jomo94 for reporting.\n","aliases":["/releases/4.9.1/","/releases/4.9.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active.
      \n
    • Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea.
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions.
      \n
    • Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case.
    • \n
    \n
  • \n
  • (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date.
      \n
    • Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event.
    • \n
    • Thanks to @martin-forge for reporting and contributing the fix.
    • \n
    \n
  • \n
  • (#1912) Fixed "Create subtask" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text.
      \n
    • Thanks to @pkuehne for reporting and @benmartinek for confirming.
    • \n
    \n
  • \n
  • (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits.
      \n
    • TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup.
    • \n
    • Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes.
    • \n
    • Thanks to @martin-forge for reporting and contributing the fix.
    • \n
    \n
  • \n
  • (#1938) Fixed partial HTTP API task updates rewriting native tags with # prefixes or duplicate task tags.
      \n
    • Thanks to @joseluisgonzalezdelgado-ctrl for reporting.
    • \n
    \n
  • \n
  • (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back.
      \n
    • Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact.
    • \n
    \n
  • \n
  • Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled.
  • \n
  • (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable.
      \n
    • Thanks to @pxxush for reporting.
    • \n
    \n
  • \n
  • (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts.
      \n
    • Thanks to @jordankbartos for reporting and proposing a fix in #1944.
    • \n
    \n
  • \n
  • (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up.
      \n
    • Thanks to @martin-forge for reporting and contributing the fix.
    • \n
    \n
  • \n
  • (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar.
      \n
    • Thanks to @3zra47 for reporting.
    • \n
    \n
  • \n
  • (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row.
      \n
    • Thanks to @Jomo94 for reporting.
    • \n
    \n
  • \n
  • (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern.
      \n
    • Thanks to @Jomo94 for reporting.
    • \n
    \n
  • \n
\n","text":"Added# (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active. Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea. Fixed# (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions. Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case. (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date. Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event. Thanks to @martin-forge for reporting and contributing the fix. (#1912) Fixed \"Create subtask\" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming. (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits. TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup. Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes. Thanks to @martin-forge for reporting and contributing the fix. (#1938) Fixed partial HTTP API task updates rewriting native tags with # prefixes or duplicate task tags. Thanks to @joseluisgonzalezdelgado-ctrl for reporting. (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back. Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact. Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled. (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable. Thanks to @pxxush for reporting. (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts. Thanks to @jordankbartos for reporting and proposing a fix in #1944. (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up. Thanks to @martin-forge for reporting and contributing the fix. (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar. Thanks to @3zra47 for reporting. (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row. Thanks to @Jomo94 for reporting. (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern. Thanks to @Jomo94 for reporting."},{"route":"/obsidian/releases/4.9.2/","title":"TaskNotes 4.9.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.9.2.md","namespace":"obsidian","relativePath":"releases/4.9.2.md","raw":"# TaskNotes 4.9.2\n\n## Added\n\n- (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option.\n - Thanks to @renatomen for the contribution.\n\n## Fixed\n\n- Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes.\n- (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps.\n - Thanks to @thechonta for reporting.\n- (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards.\n - Thanks to @sruiz-savia for reporting.\n- (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata.\n - Thanks to @christenbc for reporting.\n- (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use.\n - Thanks to @chmac for reporting.\n- (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility.\n - Thanks to @christenbc for reporting.\n- (#1959) Fixed the MCP `tasknotes_list_tasks` tool so circular internal task data and live Obsidian object references no longer break task-list responses.\n - Thanks to @kmaustral for reporting.\n- (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short.\n - Thanks to @sumiyalairu03 for reporting.\n- (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark.\n - Thanks to @jacksoluke for reporting.\n- (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text.\n - Thanks to @bgk0018 for reporting.\n- (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering.\n - Thanks to @KFrancoD for reporting.\n- (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact `YYYYMMDD` entry when a date is already set.\n - Thanks to @kazerniel for reporting and following up.\n- (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile.\n - Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem.\n","aliases":["/releases/4.9.2/","/releases/4.9.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option.
      \n
    • Thanks to @renatomen for the contribution.
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes.
  • \n
  • (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps.
      \n
    • Thanks to @thechonta for reporting.
    • \n
    \n
  • \n
  • (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards.
      \n
    • Thanks to @sruiz-savia for reporting.
    • \n
    \n
  • \n
  • (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata.
      \n
    • Thanks to @christenbc for reporting.
    • \n
    \n
  • \n
  • (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use.
      \n
    • Thanks to @chmac for reporting.
    • \n
    \n
  • \n
  • (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility.
      \n
    • Thanks to @christenbc for reporting.
    • \n
    \n
  • \n
  • (#1959) Fixed the MCP tasknotes_list_tasks tool so circular internal task data and live Obsidian object references no longer break task-list responses.
      \n
    • Thanks to @kmaustral for reporting.
    • \n
    \n
  • \n
  • (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short.
      \n
    • Thanks to @sumiyalairu03 for reporting.
    • \n
    \n
  • \n
  • (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark.
      \n
    • Thanks to @jacksoluke for reporting.
    • \n
    \n
  • \n
  • (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text.
      \n
    • Thanks to @bgk0018 for reporting.
    • \n
    \n
  • \n
  • (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering.
      \n
    • Thanks to @KFrancoD for reporting.
    • \n
    \n
  • \n
  • (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact YYYYMMDD entry when a date is already set.
      \n
    • Thanks to @kazerniel for reporting and following up.
    • \n
    \n
  • \n
  • (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile.
      \n
    • Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem.
    • \n
    \n
  • \n
\n","text":"Added# (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option. Thanks to @renatomen for the contribution. Fixed# Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes. (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps. Thanks to @thechonta for reporting. (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards. Thanks to @sruiz-savia for reporting. (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata. Thanks to @christenbc for reporting. (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use. Thanks to @chmac for reporting. (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility. Thanks to @christenbc for reporting. (#1959) Fixed the MCP tasknotes_list_tasks tool so circular internal task data and live Obsidian object references no longer break task-list responses. Thanks to @kmaustral for reporting. (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short. Thanks to @sumiyalairu03 for reporting. (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark. Thanks to @jacksoluke for reporting. (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text. Thanks to @bgk0018 for reporting. (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering. Thanks to @KFrancoD for reporting. (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact YYYYMMDD entry when a date is already set. Thanks to @kazerniel for reporting and following up. (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile. Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem."},{"route":"/obsidian/releases/unreleased/","title":"TaskNotes - Unreleased","description":"[!info] TaskNotes v5 beta","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/unreleased.md","namespace":"obsidian","relativePath":"releases/unreleased.md","raw":"# TaskNotes - Unreleased\n\n\n\n> [!info] TaskNotes v5 beta\n>\n> [TaskNotes v5](https://github.com/callumalpass/tasknotes/releases) is available\n> as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the\n> recommended stable release.\n>\n> The major change in v5 is support for portable TaskNotes collections. These\n> collections can be used in both Obsidian and the\n> [TaskNotes app](https://app.tasknotes.dev/), which is also available in beta, so\n> the same tasks can be managed through either interface.\n>\n> TaskNotes collections are built on [mdbase](https://mdbase.dev/), a\n> Markdown-native collection format. [mdbase Connect](https://mdbase.dev/connect/)\n> provides the permissioned bridge that makes those collections available to the\n> TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase\n> adds a shared structure that compatible tools can understand.\n>\n> TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active\n> development. Please use a backed-up vault, expect some rough edges, and\n> [report any problems you encounter](https://github.com/callumalpass/tasknotes/issues).\n\n## Security\n\n- Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' `data.json`, with automatic migration for existing connections. See [Calendar Integration](https://tasknotes.dev/features/calendar-integration/).\n - Thanks to @mcuste for the contribution\n\n## Added\n\n- (#2142) MCP `tasknotes_create_task` and `tasknotes_update_task` now accept\n `customProperties` for configured TaskNotes user fields. Thanks to\n @phillipadsmith for suggesting this.\n- (#2126, #2134) Added optional filename templates for materialized recurring\n occurrence notes, with explicit date, ISO week, month, year, and month-name\n variables plus per-parent overrides. Existing naming remains unchanged until a\n template is configured. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#occurrence-filenames).\n Thanks to @raphaelfaouakhiri for reporting and implementing this.\n- (#2105) Added `{{projectFolder}}` and `{{projectFolders}}` folder template\n variables for storing tasks alongside linked project notes. See\n [Template Variables](https://tasknotes.dev/features/template-variables/).\n Thanks to @carypruitt for this contribution.\n\n## Changed\n\n- Generated TaskNotes type contracts now include configured natural-language\n capture triggers, allowing compatible clients to offer the same field\n suggestions.\n- Rebuilt the TaskNotes documentation with\n reorganized navigation, full-text search, mobile and accessibility\n improvements, and references generated from the current commands, settings,\n compatibility metadata, HTTP routes, and default Bases. Added practical\n guides for adopting TaskNotes in an existing vault, mobile use, custom Bases,\n and backup and recovery. See the\n [TaskNotes documentation](https://tasknotes.dev/).\n- (#2088) Convert current note to task now uses your default scheduled date when\n the note does not already have `scheduled` frontmatter, while the **None**\n default still leaves converted notes unscheduled. See\n [Task Properties](https://tasknotes.dev/settings/task-properties/#scheduled-date).\n Thanks to @e-zz for suggesting this.\n\n## Fixed\n\n- (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview\n notes, matching the behavior of directly opened Bases and Reading mode embeds.\n Thanks to @jimbo108108 for reporting this.\n- (#2182) Checklist progress on task cards now excludes cancelled markdown\n checklist items such as `[-]` from the completed/total count. Thanks to\n @ctrl-q for reporting this.\n- (#2180) Inline task cards in Live Preview now keep their click and context menu\n handlers active on Obsidian 1.13, so clicking a rendered task link opens the\n edit modal instead of revealing the raw wikilink. Thanks to @npondel for the\n detailed diagnosis and @minchinweb for confirming the issue.\n- (#2171) Stopped recurring\n notification and status-bar scans from reading unindexed notes directly from\n disk while preserving the fallback for direct task lookups. Thanks to\n @tgrosinger for identifying and diagnosing the excessive vault reads.\n- (#2174) **Open or create occurrence note** from Quick Actions now uses the\n recurring task's scheduled occurrence date, preventing duplicate occurrence\n notes keyed to the day the action was run. Thanks to @chmac for reporting\n this.\n- (#2169) Regenerated default Base views now include tasks whose identifying\n property is stored as a list containing the configured task value. Thanks to\n @GlebYavorski for reporting this.\n- (#2166) Fixed Task List views configured to start collapsed so the first\n chevron click expands only the selected group instead of expanding every\n other group. Thanks to @renatomen for reporting and fixing this.\n- (#2165) **Convert current note to task** now reads configured field mappings,\n including list-valued title fields such as `aliases`, and preserves an\n existing aliases list when the title is unchanged. Thanks to @jkuball for\n reporting this.\n- (#2164) Flat Kanban boards now clear stale swimlane layout state when they\n rerender, preventing columns from occasionally stacking into one vertical\n strip after switching tabs. Thanks to @brienna for reporting this.\n- (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status\n property and configuration block. Rich Bases status values render as their\n configured labels, while pinned columns and saved column order are honored.\n Thanks to @kevin-4c for the detailed reports and diagnosis.\n- (#2111, #2159) Recurring task instances now remain visible through the final\n day of Calendar and Agenda ranges in positive-offset time zones, regardless\n of the configured first day of the week. Thanks to @Arachnidai and @odxn0803\n for reporting this.\n- (#2155) Regenerated default Calendar Bases now inherit the app-level time slot\n duration instead of hardcoding 30 minutes. Existing per-Base time settings\n remain intentional overrides. Thanks to @SZZ504232 for reporting this.\n- (#2154) Timed ICS events without a `TZID` now preserve their floating wall\n time in the user's local timezone instead of being interpreted as UTC. Thanks\n to @cloesophia for the reproducible calendar sample.\n- (#2152) Fixed paginated Google Calendar refreshes for calendars with many\n events so secondary calendars do not disappear after Google returns a second\n page. Thanks to @wobafett for reporting and diagnosing this.\n- (#2141) Fixed Task List groups for tasks without scheduled or due dates showing\n a raw Bases icon object instead of **None**. Thanks to @ks-studio-net for\n reporting this.\n- (#2140) The edit task modal now shows saved task-identification tags when\n hiding identification tags is disabled. Thanks to @3zra47 for reporting this.\n- (#2148) Empty list-like frontmatter values no longer become literal `\"null\"`\n entries when tasks are edited. Thanks to @minchinweb for reporting this.\n- (#2120, #2135) Long all-day event titles in Calendar week and day views now\n truncate instead of stretching the all-day row. Thanks to @same774 and\n @ks-studio-net for reporting this.\n- (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately\n after moving a task between list-valued swimlanes such as contexts. Thanks to\n @Decia-C for reporting this.\n- (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring\n task now advances the parent from the moved occurrence date instead of an\n earlier original occurrence date. Thanks to @chrabia for reporting this.\n- (#2113) Failed Google Calendar manual refreshes no longer make the next\n immediate refresh show a misleading success notice. Thanks to @JohWQ for\n reporting this.\n- (#2109) TaskNotes no longer injects instant-conversion controls into embedded\n or detached Markdown editors, preventing checkbox notes opened from unrelated\n Bases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear\n reproduction and recording.\n- (#2107, #2108) Creating tasks with **Store title in filename** enabled now\n handles duplicate or case-variant titles without failing or replacing the task\n title with a suffixed filename. Thanks to @AdmiralClackington for reporting and\n diagnosing this.\n- (#2106) Regenerated default Calendar Base files now use your configured first\n day of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly,\n and @idontcode34 for reporting this.\n- (#2100) Tags added while creating a task now keep the same frontmatter order as\n tags added later from the task context menu. Thanks to @mgrecar for reporting\n this.\n- (#2092) New non-recurring tasks created directly in a completed status now get\n a completed date, so completed-date views can find them immediately. Thanks\n to @Crell for reporting this.\n- (#2096) Fixed TaskNotes Kanban swimlanes falling back to **None** when the\n swimlane used a Bases formula that was not already cached by Bases. Thanks to\n @ddevaal for reporting this.\n- (#2093) TaskNotes now retries custom Bases view registration when the Bases\n core plugin is enabled after TaskNotes, preventing default views from showing\n **Unknown view type** until TaskNotes is reloaded. Thanks to @yaye-work for\n reporting this.\n- (#2084) The Relationships widget no longer prevents editor text selection from\n autoscrolling when dragging below the bottom edge of a task note. Thanks to\n @lostwildland for reporting this.\n- (#2081, #2103) Kept task card and relationships widgets visible in reading mode\n when Obsidian scroll or preview updates remove their DOM, and refreshed visible\n widgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and\n debugging this and @martin-forge for fixing it.\n- (#2064, #2066) Recurring tasks now advance correctly after their next\n scheduled date is manually adjusted, preserving due-date offsets and times\n without jumping back to an earlier occurrence. Thanks to @chmac for reporting\n and fixing this.\n- (#2018) Fixed **Hide empty columns** in Kanban views with swimlanes so columns\n with no visible tasks are hidden while pinned columns remain. Thanks to\n @scottTomaszewski for reporting and fixing this.\n- Fixed recurring all-day ICS subscription events keeping the original end date\n on later instances, which could cause calendar list views to show events under\n the wrong day. Thanks to @abbiefalls90.\n- (#2033) Fixed the project folder badge on task cards so, when expandable\n subtasks are enabled, it expands or collapses inline subtasks instead of\n showing an unavailable-action notice. Thanks to @abbiefalls90.\n- (#2040, #2041) Stopped newly created tasks from filling the Google Calendar\n retry queue when calendar export is disabled. Thanks to @chmac for reporting\n and fixing this.\n- (#2046, #2051) The date and time picker now focuses the natural-language input\n when it is enabled, making keyboard-driven quick actions ready for immediate\n typing. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it.\n- (#2125, #2129) Materialized recurring occurrence notes now record the date\n they were actually completed, while the parent recurring task continues to\n track the occurrence date. Thanks to @raphaelfaouakhiri for reporting and\n fixing this.\n- (#2173, #2175) Completion-anchored recurring tasks with materialized\n occurrence notes now schedule the next occurrence from the day the occurrence\n was actually completed. Thanks to @chmac for reporting and fixing this.\n- (#1982) Preserved the Task List's own scroll position during Bases refreshes so\n long mobile lists do not jump back to the top after task updates. Thanks to\n @3zra47 for the follow-up report.\n- (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar\n IDs instead of failing local validation before contacting Microsoft Graph.\n Thanks to @fmacondray for reporting this and providing the follow-up stack\n trace.\n","aliases":["/releases/unreleased/","/releases/unreleased/"],"toc":[{"level":2,"id":"security","text":"Security"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"\n\n
\n

[!info] TaskNotes v5 beta

\n

TaskNotes v5 is available\nas an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the\nrecommended stable release.

\n

The major change in v5 is support for portable TaskNotes collections. These\ncollections can be used in both Obsidian and the\nTaskNotes app, which is also available in beta, so\nthe same tasks can be managed through either interface.

\n

TaskNotes collections are built on mdbase, a\nMarkdown-native collection format. mdbase Connect\nprovides the permissioned bridge that makes those collections available to the\nTaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase\nadds a shared structure that compatible tools can understand.

\n

TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active\ndevelopment. Please use a backed-up vault, expect some rough edges, and\nreport any problems you encounter.

\n
\n

Security#

\n
    \n
  • Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' data.json, with automatic migration for existing connections. See Calendar Integration.
      \n
    • Thanks to @mcuste for the contribution
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#2142) MCP tasknotes_create_task and tasknotes_update_task now accept\ncustomProperties for configured TaskNotes user fields. Thanks to\n@phillipadsmith for suggesting this.
  • \n
  • (#2126, #2134) Added optional filename templates for materialized recurring\noccurrence notes, with explicit date, ISO week, month, year, and month-name\nvariables plus per-parent overrides. Existing naming remains unchanged until a\ntemplate is configured. See Recurring Tasks.\nThanks to @raphaelfaouakhiri for reporting and implementing this.
  • \n
  • (#2105) Added {{projectFolder}} and {{projectFolders}} folder template\nvariables for storing tasks alongside linked project notes. See\nTemplate Variables.\nThanks to @carypruitt for this contribution.
  • \n
\n

Changed#

\n
    \n
  • Generated TaskNotes type contracts now include configured natural-language\ncapture triggers, allowing compatible clients to offer the same field\nsuggestions.
  • \n
  • Rebuilt the TaskNotes documentation with\nreorganized navigation, full-text search, mobile and accessibility\nimprovements, and references generated from the current commands, settings,\ncompatibility metadata, HTTP routes, and default Bases. Added practical\nguides for adopting TaskNotes in an existing vault, mobile use, custom Bases,\nand backup and recovery. See the\nTaskNotes documentation.
  • \n
  • (#2088) Convert current note to task now uses your default scheduled date when\nthe note does not already have scheduled frontmatter, while the None\ndefault still leaves converted notes unscheduled. See\nTask Properties.\nThanks to @e-zz for suggesting this.
  • \n
\n

Fixed#

\n
    \n
  • (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview\nnotes, matching the behavior of directly opened Bases and Reading mode embeds.\nThanks to @jimbo108108 for reporting this.
  • \n
  • (#2182) Checklist progress on task cards now excludes cancelled markdown\nchecklist items such as [-] from the completed/total count. Thanks to\n@ctrl-q for reporting this.
  • \n
  • (#2180) Inline task cards in Live Preview now keep their click and context menu\nhandlers active on Obsidian 1.13, so clicking a rendered task link opens the\nedit modal instead of revealing the raw wikilink. Thanks to @npondel for the\ndetailed diagnosis and @minchinweb for confirming the issue.
  • \n
  • (#2171) Stopped recurring\nnotification and status-bar scans from reading unindexed notes directly from\ndisk while preserving the fallback for direct task lookups. Thanks to\n@tgrosinger for identifying and diagnosing the excessive vault reads.
  • \n
  • (#2174) Open or create occurrence note from Quick Actions now uses the\nrecurring task's scheduled occurrence date, preventing duplicate occurrence\nnotes keyed to the day the action was run. Thanks to @chmac for reporting\nthis.
  • \n
  • (#2169) Regenerated default Base views now include tasks whose identifying\nproperty is stored as a list containing the configured task value. Thanks to\n@GlebYavorski for reporting this.
  • \n
  • (#2166) Fixed Task List views configured to start collapsed so the first\nchevron click expands only the selected group instead of expanding every\nother group. Thanks to @renatomen for reporting and fixing this.
  • \n
  • (#2165) Convert current note to task now reads configured field mappings,\nincluding list-valued title fields such as aliases, and preserves an\nexisting aliases list when the title is unchanged. Thanks to @jkuball for\nreporting this.
  • \n
  • (#2164) Flat Kanban boards now clear stale swimlane layout state when they\nrerender, preventing columns from occasionally stacking into one vertical\nstrip after switching tabs. Thanks to @brienna for reporting this.
  • \n
  • (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status\nproperty and configuration block. Rich Bases status values render as their\nconfigured labels, while pinned columns and saved column order are honored.\nThanks to @kevin-4c for the detailed reports and diagnosis.
  • \n
  • (#2111, #2159) Recurring task instances now remain visible through the final\nday of Calendar and Agenda ranges in positive-offset time zones, regardless\nof the configured first day of the week. Thanks to @Arachnidai and @odxn0803\nfor reporting this.
  • \n
  • (#2155) Regenerated default Calendar Bases now inherit the app-level time slot\nduration instead of hardcoding 30 minutes. Existing per-Base time settings\nremain intentional overrides. Thanks to @SZZ504232 for reporting this.
  • \n
  • (#2154) Timed ICS events without a TZID now preserve their floating wall\ntime in the user's local timezone instead of being interpreted as UTC. Thanks\nto @cloesophia for the reproducible calendar sample.
  • \n
  • (#2152) Fixed paginated Google Calendar refreshes for calendars with many\nevents so secondary calendars do not disappear after Google returns a second\npage. Thanks to @wobafett for reporting and diagnosing this.
  • \n
  • (#2141) Fixed Task List groups for tasks without scheduled or due dates showing\na raw Bases icon object instead of None. Thanks to @ks-studio-net for\nreporting this.
  • \n
  • (#2140) The edit task modal now shows saved task-identification tags when\nhiding identification tags is disabled. Thanks to @3zra47 for reporting this.
  • \n
  • (#2148) Empty list-like frontmatter values no longer become literal "null"\nentries when tasks are edited. Thanks to @minchinweb for reporting this.
  • \n
  • (#2120, #2135) Long all-day event titles in Calendar week and day views now\ntruncate instead of stretching the all-day row. Thanks to @same774 and\n@ks-studio-net for reporting this.
  • \n
  • (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately\nafter moving a task between list-valued swimlanes such as contexts. Thanks to\n@Decia-C for reporting this.
  • \n
  • (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring\ntask now advances the parent from the moved occurrence date instead of an\nearlier original occurrence date. Thanks to @chrabia for reporting this.
  • \n
  • (#2113) Failed Google Calendar manual refreshes no longer make the next\nimmediate refresh show a misleading success notice. Thanks to @JohWQ for\nreporting this.
  • \n
  • (#2109) TaskNotes no longer injects instant-conversion controls into embedded\nor detached Markdown editors, preventing checkbox notes opened from unrelated\nBases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear\nreproduction and recording.
  • \n
  • (#2107, #2108) Creating tasks with Store title in filename enabled now\nhandles duplicate or case-variant titles without failing or replacing the task\ntitle with a suffixed filename. Thanks to @AdmiralClackington for reporting and\ndiagnosing this.
  • \n
  • (#2106) Regenerated default Calendar Base files now use your configured first\nday of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly,\nand @idontcode34 for reporting this.
  • \n
  • (#2100) Tags added while creating a task now keep the same frontmatter order as\ntags added later from the task context menu. Thanks to @mgrecar for reporting\nthis.
  • \n
  • (#2092) New non-recurring tasks created directly in a completed status now get\na completed date, so completed-date views can find them immediately. Thanks\nto @Crell for reporting this.
  • \n
  • (#2096) Fixed TaskNotes Kanban swimlanes falling back to None when the\nswimlane used a Bases formula that was not already cached by Bases. Thanks to\n@ddevaal for reporting this.
  • \n
  • (#2093) TaskNotes now retries custom Bases view registration when the Bases\ncore plugin is enabled after TaskNotes, preventing default views from showing\nUnknown view type until TaskNotes is reloaded. Thanks to @yaye-work for\nreporting this.
  • \n
  • (#2084) The Relationships widget no longer prevents editor text selection from\nautoscrolling when dragging below the bottom edge of a task note. Thanks to\n@lostwildland for reporting this.
  • \n
  • (#2081, #2103) Kept task card and relationships widgets visible in reading mode\nwhen Obsidian scroll or preview updates remove their DOM, and refreshed visible\nwidgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and\ndebugging this and @martin-forge for fixing it.
  • \n
  • (#2064, #2066) Recurring tasks now advance correctly after their next\nscheduled date is manually adjusted, preserving due-date offsets and times\nwithout jumping back to an earlier occurrence. Thanks to @chmac for reporting\nand fixing this.
  • \n
  • (#2018) Fixed Hide empty columns in Kanban views with swimlanes so columns\nwith no visible tasks are hidden while pinned columns remain. Thanks to\n@scottTomaszewski for reporting and fixing this.
  • \n
  • Fixed recurring all-day ICS subscription events keeping the original end date\non later instances, which could cause calendar list views to show events under\nthe wrong day. Thanks to @abbiefalls90.
  • \n
  • (#2033) Fixed the project folder badge on task cards so, when expandable\nsubtasks are enabled, it expands or collapses inline subtasks instead of\nshowing an unavailable-action notice. Thanks to @abbiefalls90.
  • \n
  • (#2040, #2041) Stopped newly created tasks from filling the Google Calendar\nretry queue when calendar export is disabled. Thanks to @chmac for reporting\nand fixing this.
  • \n
  • (#2046, #2051) The date and time picker now focuses the natural-language input\nwhen it is enabled, making keyboard-driven quick actions ready for immediate\ntyping. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it.
  • \n
  • (#2125, #2129) Materialized recurring occurrence notes now record the date\nthey were actually completed, while the parent recurring task continues to\ntrack the occurrence date. Thanks to @raphaelfaouakhiri for reporting and\nfixing this.
  • \n
  • (#2173, #2175) Completion-anchored recurring tasks with materialized\noccurrence notes now schedule the next occurrence from the day the occurrence\nwas actually completed. Thanks to @chmac for reporting and fixing this.
  • \n
  • (#1982) Preserved the Task List's own scroll position during Bases refreshes so\nlong mobile lists do not jump back to the top after task updates. Thanks to\n@3zra47 for the follow-up report.
  • \n
  • (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar\nIDs instead of failing local validation before contacting Microsoft Graph.\nThanks to @fmacondray for reporting this and providing the follow-up stack\ntrace.
  • \n
\n","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Security# Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' data.json, with automatic migration for existing connections. See Calendar Integration. Thanks to @mcuste for the contribution Added# (#2142) MCP tasknotes_create_task and tasknotes_update_task now accept customProperties for configured TaskNotes user fields. Thanks to @phillipadsmith for suggesting this. (#2126, #2134) Added optional filename templates for materialized recurring occurrence notes, with explicit date, ISO week, month, year, and month-name variables plus per-parent overrides. Existing naming remains unchanged until a template is configured. See Recurring Tasks. Thanks to @raphaelfaouakhiri for reporting and implementing this. (#2105) Added {{projectFolder}} and {{projectFolders}} folder template variables for storing tasks alongside linked project notes. See Template Variables. Thanks to @carypruitt for this contribution. Changed# Generated TaskNotes type contracts now include configured natural-language capture triggers, allowing compatible clients to offer the same field suggestions. Rebuilt the TaskNotes documentation with reorganized navigation, full-text search, mobile and accessibility improvements, and references generated from the current commands, settings, compatibility metadata, HTTP routes, and default Bases. Added practical guides for adopting TaskNotes in an existing vault, mobile use, custom Bases, and backup and recovery. See the TaskNotes documentation. (#2088) Convert current note to task now uses your default scheduled date when the note does not already have scheduled frontmatter, while the None default still leaves converted notes unscheduled. See Task Properties. Thanks to @e-zz for suggesting this. Fixed# (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview notes, matching the behavior of directly opened Bases and Reading mode embeds. Thanks to @jimbo108108 for reporting this. (#2182) Checklist progress on task cards now excludes cancelled markdown checklist items such as [-] from the completed/total count. Thanks to @ctrl-q for reporting this. (#2180) Inline task cards in Live Preview now keep their click and context menu handlers active on Obsidian 1.13, so clicking a rendered task link opens the edit modal instead of revealing the raw wikilink. Thanks to @npondel for the detailed diagnosis and @minchinweb for confirming the issue. (#2171) Stopped recurring notification and status-bar scans from reading unindexed notes directly from disk while preserving the fallback for direct task lookups. Thanks to @tgrosinger for identifying and diagnosing the excessive vault reads. (#2174) Open or create occurrence note from Quick Actions now uses the recurring task's scheduled occurrence date, preventing duplicate occurrence notes keyed to the day the action was run. Thanks to @chmac for reporting this. (#2169) Regenerated default Base views now include tasks whose identifying property is stored as a list containing the configured task value. Thanks to @GlebYavorski for reporting this. (#2166) Fixed Task List views configured to start collapsed so the first chevron click expands only the selected group instead of expanding every other group. Thanks to @renatomen for reporting and fixing this. (#2165) Convert current note to task now reads configured field mappings, including list-valued title fields such as aliases, and preserves an existing aliases list when the title is unchanged. Thanks to @jkuball for reporting this. (#2164) Flat Kanban boards now clear stale swimlane layout state when they rerender, preventing columns from occasionally stacking into one vertical strip after switching tabs. Thanks to @brienna for reporting this. (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status property and configuration block. Rich Bases status values render as their configured labels, while pinned columns and saved column order are honored. Thanks to @kevin-4c for the detailed reports and diagnosis. (#2111, #2159) Recurring task instances now remain visible through the final day of Calendar and Agenda ranges in positive-offset time zones, regardless of the configured first day of the week. Thanks to @Arachnidai and @odxn0803 for reporting this. (#2155) Regenerated default Calendar Bases now inherit the app-level time slot duration instead of hardcoding 30 minutes. Existing per-Base time settings remain intentional overrides. Thanks to @SZZ504232 for reporting this. (#2154) Timed ICS events without a TZID now preserve their floating wall time in the user's local timezone instead of being interpreted as UTC. Thanks to @cloesophia for the reproducible calendar sample. (#2152) Fixed paginated Google Calendar refreshes for calendars with many events so secondary calendars do not disappear after Google returns a second page. Thanks to @wobafett for reporting and diagnosing this. (#2141) Fixed Task List groups for tasks without scheduled or due dates showing a raw Bases icon object instead of None. Thanks to @ks-studio-net for reporting this. (#2140) The edit task modal now shows saved task-identification tags when hiding identification tags is disabled. Thanks to @3zra47 for reporting this. (#2148) Empty list-like frontmatter values no longer become literal \"null\" entries when tasks are edited. Thanks to @minchinweb for reporting this. (#2120, #2135) Long all-day event titles in Calendar week and day views now truncate instead of stretching the all-day row. Thanks to @same774 and @ks-studio-net for reporting this. (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately after moving a task between list-valued swimlanes such as contexts. Thanks to @Decia-C for reporting this. (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring task now advances the parent from the moved occurrence date instead of an earlier original occurrence date. Thanks to @chrabia for reporting this. (#2113) Failed Google Calendar manual refreshes no longer make the next immediate refresh show a misleading success notice. Thanks to @JohWQ for reporting this. (#2109) TaskNotes no longer injects instant-conversion controls into embedded or detached Markdown editors, preventing checkbox notes opened from unrelated Bases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear reproduction and recording. (#2107, #2108) Creating tasks with Store title in filename enabled now handles duplicate or case-variant titles without failing or replacing the task title with a suffixed filename. Thanks to @AdmiralClackington for reporting and diagnosing this. (#2106) Regenerated default Calendar Base files now use your configured first day of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly, and @idontcode34 for reporting this. (#2100) Tags added while creating a task now keep the same frontmatter order as tags added later from the task context menu. Thanks to @mgrecar for reporting this. (#2092) New non-recurring tasks created directly in a completed status now get a completed date, so completed-date views can find them immediately. Thanks to @Crell for reporting this. (#2096) Fixed TaskNotes Kanban swimlanes falling back to None when the swimlane used a Bases formula that was not already cached by Bases. Thanks to @ddevaal for reporting this. (#2093) TaskNotes now retries custom Bases view registration when the Bases core plugin is enabled after TaskNotes, preventing default views from showing Unknown view type until TaskNotes is reloaded. Thanks to @yaye-work for reporting this. (#2084) The Relationships widget no longer prevents editor text selection from autoscrolling when dragging below the bottom edge of a task note. Thanks to @lostwildland for reporting this. (#2081, #2103) Kept task card and relationships widgets visible in reading mode when Obsidian scroll or preview updates remove their DOM, and refreshed visible widgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and debugging this and @martin-forge for fixing it. (#2064, #2066) Recurring tasks now advance correctly after their next scheduled date is manually adjusted, preserving due-date offsets and times without jumping back to an earlier occurrence. Thanks to @chmac for reporting and fixing this. (#2018) Fixed Hide empty columns in Kanban views with swimlanes so columns with no visible tasks are hidden while pinned columns remain. Thanks to @scottTomaszewski for reporting and fixing this. Fixed recurring all-day ICS subscription events keeping the original end date on later instances, which could cause calendar list views to show events under the wrong day. Thanks to @abbiefalls90. (#2033) Fixed the project folder badge on task cards so, when expandable subtasks are enabled, it expands or collapses inline subtasks instead of showing an unavailable-action notice. Thanks to @abbiefalls90. (#2040, #2041) Stopped newly created tasks from filling the Google Calendar retry queue when calendar export is disabled. Thanks to @chmac for reporting and fixing this. (#2046, #2051) The date and time picker now focuses the natural-language input when it is enabled, making keyboard-driven quick actions ready for immediate typing. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it. (#2125, #2129) Materialized recurring occurrence notes now record the date they were actually completed, while the parent recurring task continues to track the occurrence date. Thanks to @raphaelfaouakhiri for reporting and fixing this. (#2173, #2175) Completion-anchored recurring tasks with materialized occurrence notes now schedule the next occurrence from the day the occurrence was actually completed. Thanks to @chmac for reporting and fixing this. (#1982) Preserved the Task List's own scroll position during Bases refreshes so long mobile lists do not jump back to the top after task updates. Thanks to @3zra47 for the follow-up report. (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar IDs instead of failing local validation before contacting Microsoft Graph. Thanks to @fmacondray for reporting this and providing the follow-up stack trace."},{"route":"/obsidian/settings/","title":"Settings","description":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings.md","namespace":"obsidian","relativePath":"settings.md","raw":"# Settings\n\nTaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.\n\n\n## General\n\nThe General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures.\n\nFor more information, see the [General Settings](settings/general.md) documentation.\n\n## Task Properties\n\nTask Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration.\n\nFor more detailed information, see the [Task Properties Settings](settings/task-properties.md) documentation.\n\n## Modal Fields\n\nModal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise.\n\nFor more information, see the [Modal Fields Settings](settings/modal-fields.md) documentation.\n\n## Appearance & UI\n\nAppearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance.\n\nFor more detailed information, see the [Appearance & UI Settings](settings/appearance.md) documentation.\n\n## Features\n\nFeatures groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults.\n\nFor more information, see the [Features Settings](settings/features.md) documentation.\n\n## Integrations\n\nIntegrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints.\n\nFor more detailed information, see the [Integrations Settings](settings/integrations.md) documentation.\n","aliases":["/settings/"],"toc":[{"level":2,"id":"general","text":"General"},{"level":2,"id":"task-properties","text":"Task Properties"},{"level":2,"id":"modal-fields","text":"Modal Fields"},{"level":2,"id":"appearance-ui","text":"Appearance & UI"},{"level":2,"id":"features","text":"Features"},{"level":2,"id":"integrations","text":"Integrations"}],"html":"

TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.

\n

General#

\n

The General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures.

\n

For more information, see the General Settings documentation.

\n

Task Properties#

\n

Task Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration.

\n

For more detailed information, see the Task Properties Settings documentation.

\n

Modal Fields#

\n

Modal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise.

\n

For more information, see the Modal Fields Settings documentation.

\n

Appearance & UI#

\n

Appearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance.

\n

For more detailed information, see the Appearance & UI Settings documentation.

\n

Features#

\n

Features groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults.

\n

For more information, see the Features Settings documentation.

\n

Integrations#

\n

Integrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints.

\n

For more detailed information, see the Integrations Settings documentation.

\n","text":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior. General# The General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures. For more information, see the General Settings documentation. Task Properties# Task Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration. For more detailed information, see the Task Properties Settings documentation. Modal Fields# Modal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise. For more information, see the Modal Fields Settings documentation. Appearance & UI# Appearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance. For more detailed information, see the Appearance & UI Settings documentation. Features# Features groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults. For more information, see the Features Settings documentation. Integrations# Integrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints. For more detailed information, see the Integrations Settings documentation."},{"route":"/obsidian/settings/appearance/","title":"Appearance & UI Settings","description":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/appearance.md","namespace":"obsidian","relativePath":"settings/appearance.md","raw":"# Appearance & UI Settings\n\nThese settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.\n\n\n![Appearance Settings](../assets/settings-appearance.png)\n\n## Task Cards\n\nUse **Default visible properties** to decide what metadata appears on task cards without opening each task. This is the primary control for card density.\n\nChecklist progress is available as a visible property in task cards. In Bases view `order` arrays, the corresponding source property is `file.tasks` (shown as `tasks` in Bases property pickers once present in the view `order` list).\n\nNested task cards use CSS variables for their indentation. Add a CSS snippet if\nyou want a denser hierarchy than the default:\n\n```css\n.tasknotes-plugin {\n --tn-nested-task-indent: 12px;\n --tn-nested-task-padding: 8px;\n}\n\nbody.is-mobile .tasknotes-plugin {\n --tn-nested-task-indent: 8px;\n --tn-nested-task-padding: 6px;\n}\n```\n\nIf task links inside normal markdown lists feel visually doubled with both a\nlist marker and the task status indicator, a CSS snippet can hide those markers\nfor task-link lines:\n\n```css\n.markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker {\n content: \"\";\n}\n\n.markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list {\n display: none;\n}\n```\n\n## Display Formatting\n\nUse **Time format** to switch between 12-hour and 24-hour display across all TaskNotes surfaces.\n\n## Calendar View\n\nCalendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. **Selection mirror** controls whether drag selections show a visual preview before committing.\n\nUse **Calendar locale** for region-specific formatting and calendar systems (for example `en`, `de`, or `fa`). Leave it empty to use automatic detection.\n\n## Default Event Visibility\n\nThis section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events.\n\n## Time Settings\n\nTime settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape.\n\n## UI Elements\n\nUI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button.\n\n## Related Settings\n\nSome appearance-related settings are configured elsewhere:\n\n- **Task filename format**: Configured in [Task Properties](task-properties.md) → Title card\n- **Project autosuggest display**: Configured in [Task Properties](task-properties.md) → Projects card\n","aliases":["/settings/appearance/"],"toc":[{"level":2,"id":"task-cards","text":"Task Cards"},{"level":2,"id":"display-formatting","text":"Display Formatting"},{"level":2,"id":"calendar-view","text":"Calendar View"},{"level":2,"id":"default-event-visibility","text":"Default Event Visibility"},{"level":2,"id":"time-settings","text":"Time Settings"},{"level":2,"id":"ui-elements","text":"UI Elements"},{"level":2,"id":"related-settings","text":"Related Settings"}],"html":"

These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.

\n

\"Appearance

\n

Task Cards#

\n

Use Default visible properties to decide what metadata appears on task cards without opening each task. This is the primary control for card density.

\n

Checklist progress is available as a visible property in task cards. In Bases view order arrays, the corresponding source property is file.tasks (shown as tasks in Bases property pickers once present in the view order list).

\n

Nested task cards use CSS variables for their indentation. Add a CSS snippet if\nyou want a denser hierarchy than the default:

\n
.tasknotes-plugin {\n  --tn-nested-task-indent: 12px;\n  --tn-nested-task-padding: 8px;\n}\n\nbody.is-mobile .tasknotes-plugin {\n  --tn-nested-task-indent: 8px;\n  --tn-nested-task-padding: 6px;\n}\n

If task links inside normal markdown lists feel visually doubled with both a\nlist marker and the task status indicator, a CSS snippet can hide those markers\nfor task-link lines:

\n
.markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker {\n  content: "";\n}\n\n.markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list {\n  display: none;\n}\n

Display Formatting#

\n

Use Time format to switch between 12-hour and 24-hour display across all TaskNotes surfaces.

\n

Calendar View#

\n

Calendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. Selection mirror controls whether drag selections show a visual preview before committing.

\n

Use Calendar locale for region-specific formatting and calendar systems (for example en, de, or fa). Leave it empty to use automatic detection.

\n

Default Event Visibility#

\n

This section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events.

\n

Time Settings#

\n

Time settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape.

\n

UI Elements#

\n

UI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button.

\n

Related Settings#

\n

Some appearance-related settings are configured elsewhere:

\n\n","text":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements. Task Cards# Use Default visible properties to decide what metadata appears on task cards without opening each task. This is the primary control for card density. Checklist progress is available as a visible property in task cards. In Bases view order arrays, the corresponding source property is file.tasks (shown as tasks in Bases property pickers once present in the view order list). Nested task cards use CSS variables for their indentation. Add a CSS snippet if you want a denser hierarchy than the default: .tasknotes-plugin { --tn-nested-task-indent: 12px; --tn-nested-task-padding: 8px; } body.is-mobile .tasknotes-plugin { --tn-nested-task-indent: 8px; --tn-nested-task-padding: 6px; } If task links inside normal markdown lists feel visually doubled with both a list marker and the task status indicator, a CSS snippet can hide those markers for task-link lines: .markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker { content: \"\"; } .markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list { display: none; } Display Formatting# Use Time format to switch between 12-hour and 24-hour display across all TaskNotes surfaces. Calendar View# Calendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. Selection mirror controls whether drag selections show a visual preview before committing. Use Calendar locale for region-specific formatting and calendar systems (for example en, de, or fa). Leave it empty to use automatic detection. Default Event Visibility# This section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events. Time Settings# Time settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape. UI Elements# UI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button. Related Settings# Some appearance-related settings are configured elsewhere: Task filename format: Configured in Task Properties → Title card Project autosuggest display: Configured in Task Properties → Projects card"},{"route":"/obsidian/settings/features/","title":"Features Settings","description":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notific...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/features.md","namespace":"obsidian","relativePath":"settings/features.md","raw":"# Features Settings\n\nThese settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications.\n\n\n![Features Settings](../assets/settings-features.png)\n\n## Inline Tasks\n\nInline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. **Task link overlay** enables the Live Preview card behavior for task links, while **Instant task convert** surfaces conversion buttons next to list items and checkboxes. **Keep checkbox when converting** leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, **Inline task convert folder** sets destination behavior and supports `{{currentNotePath}}`, and **Use task defaults on instant convert** applies your default task values at conversion time.\n\nThe separate **Convert current note to task** command keeps the current note body as the task details. If the note has no `scheduled` frontmatter, the command uses the Scheduled Date default from **Task Properties**; it does not apply body templates.\n\n## Body Template\n\nBody template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like `{{title}}`, `{{date}}`, `{{time}}`, `{{priority}}`, `{{status}}`, `{{contexts}}`, `{{tags}}`, and `{{projects}}`.\n\nMaterialized occurrence notes can use a separate template. Set **Occurrence note template file** to provide a global fallback for occurrence notes; a recurring task's `occurrence_template` frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior.\n\n## Natural Language Processing\n\nNLP settings define how text input is interpreted during task capture. **Enable natural language task input** activates date and metadata parsing, **Default to scheduled** changes ambiguous date handling, **NLP language** selects parsing patterns, and **Status suggestion trigger** controls optional status autocomplete activation.\n\nWrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, `BIO \"123H\" - HW1` keeps `123H` in the title instead of treating it as a 123-hour estimate, while `Review \"Today\" notes` keeps `Today` as text instead of parsing it as a date.\n\n## Pomodoro Timer\n\nPomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. **Pomodoro data storage** chooses whether history is kept in plugin data or daily notes.\n\n## Notifications\n\nUse this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control.\n\n## Performance & Behavior\n\nPerformance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing.\n\n## Time Tracking\n\nTime tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification.\n\n## Recurring Tasks\n\nUse **Maintain due date offset in recurring tasks** to keep due/scheduled spacing consistent when recurring tasks roll forward.\n\nOccurrence note behavior is configured per recurring task from the task context menu: open **Recurrence → Occurrence notes** to choose manual creation or automatic creation of the next materialized occurrence after completion. See [Recurring Tasks](../features/recurring-tasks.md#materialized-occurrence-notes) for the workflow and storage model.\n\n## Timeblocking\n\nTimeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views.\n\n### Usage\n\nIn the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select \"Create timeblock\" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration.\n","aliases":["/settings/features/"],"toc":[{"level":2,"id":"inline-tasks","text":"Inline Tasks"},{"level":2,"id":"body-template","text":"Body Template"},{"level":2,"id":"natural-language-processing","text":"Natural Language Processing"},{"level":2,"id":"pomodoro-timer","text":"Pomodoro Timer"},{"level":2,"id":"notifications","text":"Notifications"},{"level":2,"id":"performance-behavior","text":"Performance & Behavior"},{"level":2,"id":"time-tracking","text":"Time Tracking"},{"level":2,"id":"recurring-tasks","text":"Recurring Tasks"},{"level":2,"id":"timeblocking","text":"Timeblocking"},{"level":3,"id":"usage","text":"Usage"}],"html":"

These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications.

\n

\"Features

\n

Inline Tasks#

\n

Inline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. Task link overlay enables the Live Preview card behavior for task links, while Instant task convert surfaces conversion buttons next to list items and checkboxes. Keep checkbox when converting leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, Inline task convert folder sets destination behavior and supports {{currentNotePath}}, and Use task defaults on instant convert applies your default task values at conversion time.

\n

The separate Convert current note to task command keeps the current note body as the task details. If the note has no scheduled frontmatter, the command uses the Scheduled Date default from Task Properties; it does not apply body templates.

\n

Body Template#

\n

Body template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, {{contexts}}, {{tags}}, and {{projects}}.

\n

Materialized occurrence notes can use a separate template. Set Occurrence note template file to provide a global fallback for occurrence notes; a recurring task's occurrence_template frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior.

\n

Natural Language Processing#

\n

NLP settings define how text input is interpreted during task capture. Enable natural language task input activates date and metadata parsing, Default to scheduled changes ambiguous date handling, NLP language selects parsing patterns, and Status suggestion trigger controls optional status autocomplete activation.

\n

Wrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, BIO "123H" - HW1 keeps 123H in the title instead of treating it as a 123-hour estimate, while Review "Today" notes keeps Today as text instead of parsing it as a date.

\n

Pomodoro Timer#

\n

Pomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. Pomodoro data storage chooses whether history is kept in plugin data or daily notes.

\n

Notifications#

\n

Use this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control.

\n

Performance & Behavior#

\n

Performance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing.

\n

Time Tracking#

\n

Time tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification.

\n

Recurring Tasks#

\n

Use Maintain due date offset in recurring tasks to keep due/scheduled spacing consistent when recurring tasks roll forward.

\n

Occurrence note behavior is configured per recurring task from the task context menu: open Recurrence → Occurrence notes to choose manual creation or automatic creation of the next materialized occurrence after completion. See Recurring Tasks for the workflow and storage model.

\n

Timeblocking#

\n

Timeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views.

\n

Usage#

\n

In the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select "Create timeblock" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration.

\n","text":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications. Inline Tasks# Inline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. Task link overlay enables the Live Preview card behavior for task links, while Instant task convert surfaces conversion buttons next to list items and checkboxes. Keep checkbox when converting leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, Inline task convert folder sets destination behavior and supports {{currentNotePath}}, and Use task defaults on instant convert applies your default task values at conversion time. The separate Convert current note to task command keeps the current note body as the task details. If the note has no scheduled frontmatter, the command uses the Scheduled Date default from Task Properties; it does not apply body templates. Body Template# Body template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, {{contexts}}, {{tags}}, and {{projects}}. Materialized occurrence notes can use a separate template. Set Occurrence note template file to provide a global fallback for occurrence notes; a recurring task's occurrence_template frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior. Natural Language Processing# NLP settings define how text input is interpreted during task capture. Enable natural language task input activates date and metadata parsing, Default to scheduled changes ambiguous date handling, NLP language selects parsing patterns, and Status suggestion trigger controls optional status autocomplete activation. Wrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, BIO \"123H\" - HW1 keeps 123H in the title instead of treating it as a 123-hour estimate, while Review \"Today\" notes keeps Today as text instead of parsing it as a date. Pomodoro Timer# Pomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. Pomodoro data storage chooses whether history is kept in plugin data or daily notes. Notifications# Use this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control. Performance & Behavior# Performance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing. Time Tracking# Time tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification. Recurring Tasks# Use Maintain due date offset in recurring tasks to keep due/scheduled spacing consistent when recurring tasks roll forward. Occurrence note behavior is configured per recurring task from the task context menu: open Recurrence → Occurrence notes to choose manual creation or automatic creation of the next materialized occurrence after completion. See Recurring Tasks for the workflow and storage model. Timeblocking# Timeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views. Usage# In the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select \"Create timeblock\" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration."},{"route":"/obsidian/settings/general/","title":"General Settings","description":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/general.md","namespace":"obsidian","relativePath":"settings/general.md","raw":"# General Settings\n\nThese settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.\n\n\n![General Settings](../assets/settings-general.png)\n\n## Task Storage\n\nTask storage settings define where new and inline-created task files are created and how archived tasks are relocated. **Default tasks folder** sets the base location and supports folder template variables, including `{{currentNotePath}}` and `{{currentNoteTitle}}` for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as `{{year}}` and Daily Notes-style date tokens such as `YYYY/MM/DD`. **Folder for inline-created tasks** controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use `{{currentNotePath}}` and `{{currentNoteTitle}}` placeholders for contextual routing. Relative path segments such as `../` are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder.\n\n## Task Identification\n\nTaskNotes can identify task notes using either a tag or a frontmatter property.\n\nUse **Identify tasks by** to select a strategy.\n\n- **Tag mode** uses a configured task tag (for example `task`) and can optionally hide that identifying tag in card displays.\n- **Property mode** matches a property/value pair (for example `isTask: true` or `category: task`) and is useful when you avoid tag-based identification.\n\nIf you change the task tag after creating default Base views, existing `.base` filters will still point at the old tag until you update the default Base files or edit those filters.\n\n### Hide Identification Tags\n\nWhen using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter.\n\nThe **Hide identification tags in task cards** setting allows you to do this. When enabled:\n\n- Tags that exactly match your task identification tag (e.g., `#task`) will be hidden\n- Hierarchical child tags (e.g., `#task/project`, `#task/work/urgent`) will also be hidden\n- Other tags that don't match the identification pattern will still be displayed\n- The setting only affects the visual display—tags remain in the frontmatter\n\n![Hide identification tags demo](../assets/demo-hide-identification-tags.gif)\n\n**Example:**\n\nIf your task identification tag is `task` and a task has the tags `#task`, `#task/project`, `#important`, and `#review`:\n\n- With the setting **disabled** (default): All tags are shown: `#task`, `#task/project`, `#important`, `#review`\n- With the setting **enabled**: Only non-identifying tags are shown: `#important`, `#review`\n\n## Folder Management\n\nUse **Excluded folders** to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing.\n\n## Views & Base Files\n\nTaskNotes uses Obsidian Bases files (`.base`) to power its task views. By default, missing view files are created automatically on startup.\n\nUse **Create files** to generate missing default files in `TaskNotes/Views/` without overwriting existing files. Use **Update files** to overwrite the configured default files with templates generated from your current TaskNotes settings.\n\n## Frontmatter\n\nThis section only appears when you have markdown links enabled globally in Obsidian settings.\n\n**Use markdown links in frontmatter** switches project/dependency serialization from wikilinks (`[[path]]`) to markdown links (`[text](path)`). This requires the `obsidian-frontmatter-markdown-links` plugin.\n\n## Task Interaction\n\nTask interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click).\n\n## Release Notes\n\n**View release notes** opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette.\n","aliases":["/settings/general/"],"toc":[{"level":2,"id":"task-storage","text":"Task Storage"},{"level":2,"id":"task-identification","text":"Task Identification"},{"level":3,"id":"hide-identification-tags","text":"Hide Identification Tags"},{"level":2,"id":"folder-management","text":"Folder Management"},{"level":2,"id":"views-base-files","text":"Views & Base Files"},{"level":2,"id":"frontmatter","text":"Frontmatter"},{"level":2,"id":"task-interaction","text":"Task Interaction"},{"level":2,"id":"release-notes","text":"Release Notes"}],"html":"

These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.

\n

\"General

\n

Task Storage#

\n

Task storage settings define where new and inline-created task files are created and how archived tasks are relocated. Default tasks folder sets the base location and supports folder template variables, including {{currentNotePath}} and {{currentNoteTitle}} for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as {{year}} and Daily Notes-style date tokens such as YYYY/MM/DD. Folder for inline-created tasks controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use {{currentNotePath}} and {{currentNoteTitle}} placeholders for contextual routing. Relative path segments such as ../ are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder.

\n

Task Identification#

\n

TaskNotes can identify task notes using either a tag or a frontmatter property.

\n

Use Identify tasks by to select a strategy.

\n
    \n
  • Tag mode uses a configured task tag (for example task) and can optionally hide that identifying tag in card displays.
  • \n
  • Property mode matches a property/value pair (for example isTask: true or category: task) and is useful when you avoid tag-based identification.
  • \n
\n

If you change the task tag after creating default Base views, existing .base filters will still point at the old tag until you update the default Base files or edit those filters.

\n

Hide Identification Tags#

\n

When using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter.

\n

The Hide identification tags in task cards setting allows you to do this. When enabled:

\n
    \n
  • Tags that exactly match your task identification tag (e.g., #task) will be hidden
  • \n
  • Hierarchical child tags (e.g., #task/project, #task/work/urgent) will also be hidden
  • \n
  • Other tags that don't match the identification pattern will still be displayed
  • \n
  • The setting only affects the visual display—tags remain in the frontmatter
  • \n
\n

\"Hide

\n

Example:

\n

If your task identification tag is task and a task has the tags #task, #task/project, #important, and #review:

\n
    \n
  • With the setting disabled (default): All tags are shown: #task, #task/project, #important, #review
  • \n
  • With the setting enabled: Only non-identifying tags are shown: #important, #review
  • \n
\n

Folder Management#

\n

Use Excluded folders to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing.

\n

Views & Base Files#

\n

TaskNotes uses Obsidian Bases files (.base) to power its task views. By default, missing view files are created automatically on startup.

\n

Use Create files to generate missing default files in TaskNotes/Views/ without overwriting existing files. Use Update files to overwrite the configured default files with templates generated from your current TaskNotes settings.

\n

Frontmatter#

\n

This section only appears when you have markdown links enabled globally in Obsidian settings.

\n

Use markdown links in frontmatter switches project/dependency serialization from wikilinks ([[path]]) to markdown links ([text](path)). This requires the obsidian-frontmatter-markdown-links plugin.

\n

Task Interaction#

\n

Task interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click).

\n

Release Notes#

\n

View release notes opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette.

\n","text":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior. Task Storage# Task storage settings define where new and inline-created task files are created and how archived tasks are relocated. Default tasks folder sets the base location and supports folder template variables, including {{currentNotePath}} and {{currentNoteTitle}} for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as {{year}} and Daily Notes-style date tokens such as YYYY/MM/DD. Folder for inline-created tasks controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use {{currentNotePath}} and {{currentNoteTitle}} placeholders for contextual routing. Relative path segments such as ../ are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder. Task Identification# TaskNotes can identify task notes using either a tag or a frontmatter property. Use Identify tasks by to select a strategy. Tag mode uses a configured task tag (for example task) and can optionally hide that identifying tag in card displays. Property mode matches a property/value pair (for example isTask: true or category: task) and is useful when you avoid tag-based identification. If you change the task tag after creating default Base views, existing .base filters will still point at the old tag until you update the default Base files or edit those filters. Hide Identification Tags# When using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter. The Hide identification tags in task cards setting allows you to do this. When enabled: Tags that exactly match your task identification tag (e.g., #task) will be hidden Hierarchical child tags (e.g., #task/project, #task/work/urgent) will also be hidden Other tags that don't match the identification pattern will still be displayed The setting only affects the visual display—tags remain in the frontmatter Example: If your task identification tag is task and a task has the tags #task, #task/project, #important, and #review: With the setting disabled (default): All tags are shown: #task, #task/project, #important, #review With the setting enabled: Only non-identifying tags are shown: #important, #review Folder Management# Use Excluded folders to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing. Views & Base Files# TaskNotes uses Obsidian Bases files (.base) to power its task views. By default, missing view files are created automatically on startup. Use Create files to generate missing default files in TaskNotes/Views/ without overwriting existing files. Use Update files to overwrite the configured default files with templates generated from your current TaskNotes settings. Frontmatter# This section only appears when you have markdown links enabled globally in Obsidian settings. Use markdown links in frontmatter switches project/dependency serialization from wikilinks ([[path]]) to markdown links ([text](path)). This requires the obsidian-frontmatter-markdown-links plugin. Task Interaction# Task interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click). Release Notes# View release notes opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette."},{"route":"/obsidian/settings/integrations/","title":"Integrations Settings","description":"These settings control the integration with other plugins and services, such as Bases and external calendars.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/integrations.md","namespace":"obsidian","relativePath":"settings/integrations.md","raw":"# Integrations Settings\n\nThese settings control the integration with other plugins and services, such as Bases and external calendars.\n\n\n![Integrations Settings](../assets/settings-integrations.png)\n\n## Bases\n\nTaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see [Core Concepts](../core-concepts.md#bases-integration).\n\n### View Commands Configuration\n\nView command settings map TaskNotes commands and ribbon actions to specific `.base` files. This is useful when you maintain custom variants of the default views and want first-class command access to those files.\n\nAccess these settings in **Settings → TaskNotes → General → Views & base files**.\n\nDefault mappings:\n\n- **Open Mini Calendar View** → `TaskNotes/Views/mini-calendar-default.base`\n- **Open Kanban View** → `TaskNotes/Views/kanban-default.base`\n- **Open Tasks View** → `TaskNotes/Views/tasks-default.base`\n- **Open Calendar View** → `TaskNotes/Views/calendar-default.base`\n- **Open Agenda View** → `TaskNotes/Views/agenda-default.base`\n- **Pomodoro Statistics Base** → `TaskNotes/Views/pomodoro-stats.base`\n- **Relationships Widget** → `TaskNotes/Views/relationships.base`\n\nEach command allows you to specify a custom `.base` file path and includes a reset button to restore the default path.\n\n**Auto-create default files**: When enabled, TaskNotes creates missing default `.base` files automatically on startup.\n\n**Create files**: Button to generate all default `.base` files in the `TaskNotes/Views/` directory. Existing files are not overwritten.\n\nThe generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from **Settings → TaskNotes → Features** before using that Base file.\n\n## OAuth Calendar Integration\n\nConnect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule).\n\nEnable **Disable calendar integrations on mobile** when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally.\n\n### Setup Requirements\n\nOAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider.\n\n**Setup Guide**: See [Calendar Integration Setup](../calendar-setup.md) for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal.\n\n### Google Calendar\n\nProvide **Client ID** and **Client Secret** from Google Cloud Console, then use **Connect Google Calendar** to complete OAuth loopback authentication. **Disconnect** revokes account tokens while retaining the OAuth app credentials for reconnection. Use **Forget saved credentials** to remove the client ID and client secret.\n\nThe **Target calendar** setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar.\n\nFor timed task exports, **Default reminder** accepts one or more minute offsets separated by commas, such as `60, 1440`. All-day task exports use the target Google Calendar's default reminder settings.\n\nWhen connected, displays:\n- Connected account email\n- Connection time\n- Last sync time\n- Manual refresh button\n\n### Microsoft Outlook Calendar\n\nProvide **Client ID** and **Client Secret** from Azure App Registration, then use **Connect Microsoft Calendar** to authenticate. **Disconnect** revokes account tokens while retaining the OAuth app credentials for reconnection. Use **Forget saved credentials** to remove the client ID and client secret.\n\nWhen connected, displays:\n- Connected account email\n- Connection time\n- Last sync time\n\n### Security\n\n- OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system\n- OAuth credentials and account tokens are not written to TaskNotes' `data.json`\n- Access tokens refresh automatically\n- Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers)\n- Disconnect at any time to revoke account access; use **Forget saved credentials** to remove the OAuth app credentials\n\n## Calendar subscriptions (ICS)\n\nICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use **Add Calendar Subscription** to register URLs or local files, and **Refresh all subscriptions** for manual synchronization.\n\n**Recurring event related notes** controls how notes linked from recurring external calendar events are matched. **Series-wide** keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. **Selected instance only** limits related notes and counts to the exact recurrence instance that was linked.\n\n## Automatic ICS export\n\nAutomatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use **Export now** for immediate output.\n\nExport filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates.\n\n## HTTP API\n\nHTTP API settings control the local server lifecycle, listening port, and request authentication token.\n\nChanges to API enablement or port require an Obsidian restart to take effect.\n\n!!! warning\n The HTTP API binds to loopback only and browser CORS is limited to loopback origins. If the authentication token is empty, local API requests are still unauthenticated. Set a token unless your local environment is fully trusted.\n\n## Webhooks\n\n- **Add Webhook**: Register a new webhook endpoint.\n","aliases":["/settings/integrations/"],"toc":[{"level":2,"id":"bases","text":"Bases"},{"level":3,"id":"view-commands-configuration","text":"View Commands Configuration"},{"level":2,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"setup-requirements","text":"Setup Requirements"},{"level":3,"id":"google-calendar","text":"Google Calendar"},{"level":3,"id":"microsoft-outlook-calendar","text":"Microsoft Outlook Calendar"},{"level":3,"id":"security","text":"Security"},{"level":2,"id":"calendar-subscriptions-ics","text":"Calendar subscriptions (ICS)"},{"level":2,"id":"automatic-ics-export","text":"Automatic ICS export"},{"level":2,"id":"http-api","text":"HTTP API"},{"level":2,"id":"webhooks","text":"Webhooks"}],"html":"

These settings control the integration with other plugins and services, such as Bases and external calendars.

\n

\"Integrations

\n

Bases#

\n

TaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see Core Concepts.

\n

View Commands Configuration#

\n

View command settings map TaskNotes commands and ribbon actions to specific .base files. This is useful when you maintain custom variants of the default views and want first-class command access to those files.

\n

Access these settings in Settings → TaskNotes → General → Views & base files.

\n

Default mappings:

\n
    \n
  • Open Mini Calendar View → TaskNotes/Views/mini-calendar-default.base
  • \n
  • Open Kanban View → TaskNotes/Views/kanban-default.base
  • \n
  • Open Tasks View → TaskNotes/Views/tasks-default.base
  • \n
  • Open Calendar View → TaskNotes/Views/calendar-default.base
  • \n
  • Open Agenda View → TaskNotes/Views/agenda-default.base
  • \n
  • Pomodoro Statistics Base → TaskNotes/Views/pomodoro-stats.base
  • \n
  • Relationships Widget → TaskNotes/Views/relationships.base
  • \n
\n

Each command allows you to specify a custom .base file path and includes a reset button to restore the default path.

\n

Auto-create default files: When enabled, TaskNotes creates missing default .base files automatically on startup.

\n

Create files: Button to generate all default .base files in the TaskNotes/Views/ directory. Existing files are not overwritten.

\n

The generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from Settings → TaskNotes → Features before using that Base file.

\n

OAuth Calendar Integration#

\n

Connect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule).

\n

Enable Disable calendar integrations on mobile when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally.

\n

Setup Requirements#

\n

OAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider.

\n

Setup Guide: See Calendar Integration Setup for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal.

\n

Google Calendar#

\n

Provide Client ID and Client Secret from Google Cloud Console, then use Connect Google Calendar to complete OAuth loopback authentication. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret.

\n

The Target calendar setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar.

\n

For timed task exports, Default reminder accepts one or more minute offsets separated by commas, such as 60, 1440. All-day task exports use the target Google Calendar's default reminder settings.

\n

When connected, displays:

\n
    \n
  • Connected account email
  • \n
  • Connection time
  • \n
  • Last sync time
  • \n
  • Manual refresh button
  • \n
\n

Microsoft Outlook Calendar#

\n

Provide Client ID and Client Secret from Azure App Registration, then use Connect Microsoft Calendar to authenticate. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret.

\n

When connected, displays:

\n
    \n
  • Connected account email
  • \n
  • Connection time
  • \n
  • Last sync time
  • \n
\n

Security#

\n
    \n
  • OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system
  • \n
  • OAuth credentials and account tokens are not written to TaskNotes' data.json
  • \n
  • Access tokens refresh automatically
  • \n
  • Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers)
  • \n
  • Disconnect at any time to revoke account access; use Forget saved credentials to remove the OAuth app credentials
  • \n
\n

Calendar subscriptions (ICS)#

\n

ICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use Add Calendar Subscription to register URLs or local files, and Refresh all subscriptions for manual synchronization.

\n

Recurring event related notes controls how notes linked from recurring external calendar events are matched. Series-wide keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. Selected instance only limits related notes and counts to the exact recurrence instance that was linked.

\n

Automatic ICS export#

\n

Automatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use Export now for immediate output.

\n

Export filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates.

\n

HTTP API#

\n

HTTP API settings control the local server lifecycle, listening port, and request authentication token.

\n

Changes to API enablement or port require an Obsidian restart to take effect.

\n\n

Webhooks#

\n
    \n
  • Add Webhook: Register a new webhook endpoint.
  • \n
\n","text":"These settings control the integration with other plugins and services, such as Bases and external calendars. Bases# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see Core Concepts. View Commands Configuration# View command settings map TaskNotes commands and ribbon actions to specific .base files. This is useful when you maintain custom variants of the default views and want first-class command access to those files. Access these settings in Settings → TaskNotes → General → Views & base files. Default mappings: Open Mini Calendar View → TaskNotes/Views/mini-calendar-default.base Open Kanban View → TaskNotes/Views/kanban-default.base Open Tasks View → TaskNotes/Views/tasks-default.base Open Calendar View → TaskNotes/Views/calendar-default.base Open Agenda View → TaskNotes/Views/agenda-default.base Pomodoro Statistics Base → TaskNotes/Views/pomodoro-stats.base Relationships Widget → TaskNotes/Views/relationships.base Each command allows you to specify a custom .base file path and includes a reset button to restore the default path. Auto-create default files: When enabled, TaskNotes creates missing default .base files automatically on startup. Create files: Button to generate all default .base files in the TaskNotes/Views/ directory. Existing files are not overwritten. The generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from Settings → TaskNotes → Features before using that Base file. OAuth Calendar Integration# Connect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule). Enable Disable calendar integrations on mobile when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally. Setup Requirements# OAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider. Setup Guide: See Calendar Integration Setup for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal. Google Calendar# Provide Client ID and Client Secret from Google Cloud Console, then use Connect Google Calendar to complete OAuth loopback authentication. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. The Target calendar setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar. For timed task exports, Default reminder accepts one or more minute offsets separated by commas, such as 60, 1440. All-day task exports use the target Google Calendar's default reminder settings. When connected, displays: Connected account email Connection time Last sync time Manual refresh button Microsoft Outlook Calendar# Provide Client ID and Client Secret from Azure App Registration, then use Connect Microsoft Calendar to authenticate. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. When connected, displays: Connected account email Connection time Last sync time Security# OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system OAuth credentials and account tokens are not written to TaskNotes' data.json Access tokens refresh automatically Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers) Disconnect at any time to revoke account access; use Forget saved credentials to remove the OAuth app credentials Calendar subscriptions (ICS)# ICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use Add Calendar Subscription to register URLs or local files, and Refresh all subscriptions for manual synchronization. Recurring event related notes controls how notes linked from recurring external calendar events are matched. Series-wide keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. Selected instance only limits related notes and counts to the exact recurrence instance that was linked. Automatic ICS export# Automatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use Export now for immediate output. Export filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates. HTTP API# HTTP API settings control the local server lifecycle, listening port, and request authentication token. Changes to API enablement or port require an Obsidian restart to take effect. WarningThe HTTP API binds to loopback only and browser CORS is limited to loopback origins. If the authentication token is empty, local API requests are still unauthenticated. Set a token unless your local environment is fully trusted. Webhooks# Add Webhook: Register a new webhook endpoint."},{"route":"/obsidian/settings/modal-fields/","title":"Modal Fields Settings","description":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/modal-fields.md","namespace":"obsidian","relativePath":"settings/modal-fields.md","raw":"# Modal Fields Settings\n\nThe Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open **Settings → TaskNotes → Modal Fields** to manage the configuration.\n\n![Modal Fields Settings](../assets/settings-modal-fields.png)\n\n## Field Groups\n\nFields are organized into draggable groups:\n\n- **Basic Information** – Title and Details\n- **Metadata** – Contexts, Tags, Time Estimate\n- **Organization** – Projects and Subtasks\n- **Dependencies** – Blocked By and Blocking\n- **Custom Fields** – Any user-defined fields that you add through Task Properties\n\nEach group can be collapsed, and their order in the manager matches the order shown in the modal.\n\n## Managing Fields\n\nEvery field entry includes:\n\n- **Visibility toggles** for creation and edit modals\n- **Enable/disable** checkbox\n- **Drag handle** for ordering within its group\n- **Required** toggle (where applicable, e.g., Title)\n\nChanges are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow.\n\n## Syncing User Fields\n\nThe **Sync User Fields** button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields.\n\n## Resetting to Defaults\n\nSelect **Reset to Defaults** to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility.\n","aliases":["/settings/modal-fields/"],"toc":[{"level":2,"id":"field-groups","text":"Field Groups"},{"level":2,"id":"managing-fields","text":"Managing Fields"},{"level":2,"id":"syncing-user-fields","text":"Syncing User Fields"},{"level":2,"id":"resetting-to-defaults","text":"Resetting to Defaults"}],"html":"

The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration.

\n

\"Modal

\n

Field Groups#

\n

Fields are organized into draggable groups:

\n
    \n
  • Basic Information – Title and Details
  • \n
  • Metadata – Contexts, Tags, Time Estimate
  • \n
  • Organization – Projects and Subtasks
  • \n
  • Dependencies – Blocked By and Blocking
  • \n
  • Custom Fields – Any user-defined fields that you add through Task Properties
  • \n
\n

Each group can be collapsed, and their order in the manager matches the order shown in the modal.

\n

Managing Fields#

\n

Every field entry includes:

\n
    \n
  • Visibility toggles for creation and edit modals
  • \n
  • Enable/disable checkbox
  • \n
  • Drag handle for ordering within its group
  • \n
  • Required toggle (where applicable, e.g., Title)
  • \n
\n

Changes are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow.

\n

Syncing User Fields#

\n

The Sync User Fields button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields.

\n

Resetting to Defaults#

\n

Select Reset to Defaults to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility.

\n","text":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration. Field Groups# Fields are organized into draggable groups: Basic Information – Title and Details Metadata – Contexts, Tags, Time Estimate Organization – Projects and Subtasks Dependencies – Blocked By and Blocking Custom Fields – Any user-defined fields that you add through Task Properties Each group can be collapsed, and their order in the manager matches the order shown in the modal. Managing Fields# Every field entry includes: Visibility toggles for creation and edit modals Enable/disable checkbox Drag handle for ordering within its group Required toggle (where applicable, e.g., Title) Changes are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow. Syncing User Fields# The Sync User Fields button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields. Resetting to Defaults# Select Reset to Defaults to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility."},{"route":"/obsidian/settings/property-identification/","title":"Property-based Task Identification","description":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/property-identification.md","namespace":"obsidian","relativePath":"settings/property-identification.md","raw":"# Property-based Task Identification\n\nWhen you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.\n\n## Boolean values\n- Enter the setting value as true or false (without quotes) in the settings UI.\n- Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly:\n - \"true\" in settings matches frontmatter boolean true\n - \"false\" in settings matches frontmatter boolean false\n - Arrays are supported (e.g., property: [false, true])\n\nTip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent.\n\n## Examples\n- Setting: Property Name = isTask, Property Value = true\n - Matches: `isTask: true`\n - Does not match: `isTask: false`\n- Setting: Property Name = isTask, Property Value = false\n - Matches: `isTask: false`\n - Does not match: `isTask: true`\n\nFor related configuration details, see [Task Properties](task-properties.md).\n","aliases":["/settings/property-identification/"],"toc":[{"level":2,"id":"boolean-values","text":"Boolean values"},{"level":2,"id":"examples","text":"Examples"}],"html":"

When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.

\n

Boolean values#

\n
    \n
  • Enter the setting value as true or false (without quotes) in the settings UI.
  • \n
  • Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly:
      \n
    • "true" in settings matches frontmatter boolean true
    • \n
    • "false" in settings matches frontmatter boolean false
    • \n
    • Arrays are supported (e.g., property: [false, true])
    • \n
    \n
  • \n
\n

Tip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent.

\n

Examples#

\n
    \n
  • Setting: Property Name = isTask, Property Value = true
      \n
    • Matches: isTask: true
    • \n
    • Does not match: isTask: false
    • \n
    \n
  • \n
  • Setting: Property Name = isTask, Property Value = false
      \n
    • Matches: isTask: false
    • \n
    • Does not match: isTask: true
    • \n
    \n
  • \n
\n

For related configuration details, see Task Properties.

\n","text":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value. Boolean values# Enter the setting value as true or false (without quotes) in the settings UI. Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly: \"true\" in settings matches frontmatter boolean true \"false\" in settings matches frontmatter boolean false Arrays are supported (e.g., property: [false, true]) Tip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent. Examples# Setting: Property Name = isTask, Property Value = true Matches: isTask: true Does not match: isTask: false Setting: Property Name = isTask, Property Value = false Matches: isTask: false Does not match: isTask: true For related configuration details, see Task Properties."},{"route":"/obsidian/settings/property-types-reference/","title":"Property Types Reference","description":"This reference documents the expected data types for each frontmatter property that TaskNotes uses.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/property-types-reference.md","namespace":"obsidian","relativePath":"settings/property-types-reference.md","raw":"# Property Types Reference\n\nThis reference documents the expected data types for each frontmatter property that TaskNotes uses.\n\n\n## Quick Reference\n\n| Property | Type | Example |\n|----------|------|---------|\n| title | text | `\"My Task\"` |\n| status | text | `\"open\"`, `\"in-progress\"`, `\"done\"` |\n| priority | text | `\"low\"`, `\"normal\"`, `\"high\"` |\n| due | text (date) | `\"2025-01-15\"` |\n| scheduled | text (date) | `\"2025-01-10\"` |\n| completedDate | text (date) | `\"2025-01-20\"` |\n| dateCreated | text (datetime) | `\"2025-01-01T08:00:00Z\"` |\n| dateModified | text (datetime) | `\"2025-01-15T10:30:00Z\"` |\n| tags | list | `[\"work\", \"urgent\"]` |\n| contexts | list | `[\"office\", \"home\"]` |\n| projects | list | `[\"[[Project A]]\"]` |\n| timeEstimate | number | `120` (minutes) |\n| recurrence | text | `\"FREQ=WEEKLY;BYDAY=MO\"` |\n| recurrence_anchor | text | `\"scheduled\"` or `\"completion\"` |\n| timeEntries | list (objects) | See [Time Entries](#time-entries) |\n| blockedBy | list (objects) | See [Dependencies](#dependencies-blockedby) |\n| reminders | list (objects) | See [Reminders](#reminders) |\n| complete_instances | list | `[\"2025-01-08\", \"2025-01-15\"]` |\n| skipped_instances | list | `[\"2025-01-22\"]` |\n| recurrence_parent | text (link/path) | `\"[[Tasks/Weekly review]]\"` |\n| occurrence_date | text (date) | `\"2025-01-15\"` |\n| occurrence_materialization | text | `\"manual\"` or `\"on_completion\"` |\n| occurrence_next_trigger | text | `\"completion\"` or `\"completion_or_skip\"` |\n| occurrence_template | text (link/path) | `\"[[Templates/Occurrence]]\"` |\n| occurrence_past_horizon | text (duration) | `\"P7D\"` |\n| occurrence_future_horizon | text (duration) | `\"P14D\"` |\n| icsEventId | list | `[\"event-abc123\"]` |\n\nUse this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values.\n\n---\n\n## Property Details\n\nThe sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct.\n\n### Text Properties\n\n#### title\n- **Type:** text (string)\n- **Description:** The task's title or name\n- **Example:** `title: \"Complete project documentation\"`\n\n#### status\n- **Type:** text (string)\n- **Description:** The task's current status. Must match one of the status values configured in your settings.\n- **Default values:** `\"open\"`, `\"in-progress\"`, `\"done\"`\n- **Example:** `status: \"in-progress\"`\n- **Note:** Also supports boolean values (`true`/`false`) for Obsidian checkbox compatibility. See [Boolean Status Values](task-properties.md#boolean-status-values).\n\n#### priority\n- **Type:** text (string)\n- **Description:** The task's priority level. Must match one of the priority values configured in your settings.\n- **Default values:** `\"low\"`, `\"normal\"`, `\"high\"`\n- **Example:** `priority: \"high\"`\n\n---\n\n### Date Properties\n\nAll date properties are stored as **text strings** in your frontmatter. TaskNotes expects specific formats:\nWhen in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently.\n\n#### due\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD` or ISO 8601 timestamp\n- **Description:** The task's due date\n- **Examples:**\n\n ```yaml\n due: \"2025-01-15\"\n due: \"2025-01-15T17:00:00\"\n ```\n\n#### scheduled\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD` or ISO 8601 timestamp\n- **Description:** When the task is scheduled to be worked on\n- **Examples:**\n\n ```yaml\n scheduled: \"2025-01-10\"\n scheduled: \"2025-01-10T09:00:00\"\n ```\n\n#### completedDate\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD`\n- **Description:** The date when the task was completed\n- **Example:** `completedDate: \"2025-01-20\"`\n\n#### dateCreated\n\n- **Type:** text (datetime string)\n- **Format:** ISO 8601 timestamp\n- **Description:** When the task was created\n- **Example:** `dateCreated: \"2025-01-01T08:00:00Z\"`\n\n#### dateModified\n\n- **Type:** text (datetime string)\n- **Format:** ISO 8601 timestamp\n- **Description:** When the task was last modified\n- **Example:** `dateModified: \"2025-01-15T10:30:00Z\"`\n\n---\n\n### List Properties\n\nList properties must be arrays, even when containing a single value.\nSingle-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics.\n\n#### tags\n\n- **Type:** list (array of strings)\n- **Description:** Tags associated with the task\n- **Examples:**\n\n ```yaml\n tags: [\"work\", \"documentation\"]\n tags:\n - work\n - documentation\n ```\n\n#### contexts\n\n- **Type:** list (array of strings)\n- **Description:** Context labels for the task\n- **Examples:**\n\n ```yaml\n contexts: [\"office\", \"computer\"]\n contexts:\n - \"office\"\n - \"computer\"\n ```\n\n#### projects\n\n- **Type:** list (array of strings)\n- **Description:** Project references (typically wiki-links)\n- **Examples:**\n\n ```yaml\n projects: [\"[[Website Redesign]]\", \"[[Q1 Planning]]\"]\n projects:\n - \"[[Website Redesign]]\"\n - \"[[Q1 Planning]]\"\n ```\n\n---\n\n### Numeric Properties\n\n#### timeEstimate\n- **Type:** number\n- **Unit:** minutes\n- **Description:** Estimated time to complete the task\n- **Example:** `timeEstimate: 120` (2 hours)\n\n---\n\n### Recurrence Properties\n\n#### recurrence\n\n- **Type:** text (string)\n- **Format:** RFC 5545 RRULE format\n- **Description:** Defines how the task repeats\n- **Examples:**\n\n ```yaml\n recurrence: \"FREQ=DAILY\"\n recurrence: \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"\n recurrence: \"FREQ=MONTHLY;BYMONTHDAY=1\"\n ```\n\n#### recurrence_anchor\n\n- **Type:** text (string)\n- **Valid values:** `\"scheduled\"` or `\"completion\"`\n- **Description:** Determines whether the next occurrence is calculated from the scheduled date or when the task was completed\n- **Example:** `recurrence_anchor: \"scheduled\"`\n\n#### complete_instances\n\n- **Type:** list (array of date strings)\n- **Format:** `YYYY-MM-DD`\n- **Description:** Dates when recurring task instances were completed\n- **Example:**\n\n ```yaml\n complete_instances:\n - \"2025-01-08\"\n - \"2025-01-15\"\n ```\n\n#### skipped_instances\n\n- **Type:** list (array of date strings)\n- **Format:** `YYYY-MM-DD`\n- **Description:** Dates when recurring task instances were skipped\n- **Example:**\n\n ```yaml\n skipped_instances:\n - \"2025-01-22\"\n ```\n\n### Materialized Occurrence Properties\n\nMaterialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments.\n\nWhen an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as `recurrence`, `complete_instances`, `skipped_instances`, `completedDate`, provider event IDs, or `timeEntries`.\n\n#### recurrence_parent\n\n- **Type:** text (link or path string)\n- **Description:** Parent recurring task for a materialized occurrence note\n- **Example:** `recurrence_parent: \"[[Tasks/Weekly review]]\"`\n\n#### occurrence_date\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD`\n- **Description:** Target recurrence date represented by a materialized occurrence note\n- **Example:** `occurrence_date: \"2025-01-15\"`\n\n#### occurrence_materialization\n\n- **Type:** text (string)\n- **Valid values:** `\"manual\"`, `\"on_completion\"`, `\"rolling\"`\n- **Description:** Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet.\n- **Example:** `occurrence_materialization: \"on_completion\"`\n\n#### occurrence_next_trigger\n\n- **Type:** text (string)\n- **Valid values:** `\"completion\"` or `\"completion_or_skip\"`\n- **Description:** Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to `on_completion`\n- **Example:** `occurrence_next_trigger: \"completion_or_skip\"`\n\n#### occurrence_template\n\n- **Type:** text (link or path string)\n- **Description:** Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings.\n- **Example:** `occurrence_template: \"[[Templates/Weekly occurrence]]\"`\n\n#### occurrence_past_horizon and occurrence_future_horizon\n\n- **Type:** text (ISO 8601 duration string)\n- **Description:** Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin.\n- **Examples:**\n\n ```yaml\n occurrence_past_horizon: \"P7D\"\n occurrence_future_horizon: \"P14D\"\n ```\n\n---\n\n### Complex Properties\n\nThese properties contain structured data with multiple fields.\nFor these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks.\n\n#### Time Entries\n\n- **Type:** list (array of objects)\n- **Description:** Time tracking entries for the task\n- **Structure:**\n\n ```yaml\n timeEntries:\n - startTime: \"2025-01-15T10:30:00Z\" # Required: ISO 8601 timestamp\n endTime: \"2025-01-15T11:15:00Z\" # Optional: ISO 8601 timestamp\n description: \"Initial work\" # Optional: text\n ```\n\n#### Dependencies (blockedBy)\n\n- **Type:** list (array of objects)\n- **Description:** Tasks that must be completed before this task can start\n- **Structure:**\n\n ```yaml\n blockedBy:\n - uid: \"path/to/blocking-task.md\" # Required: path to blocking task\n reltype: \"FINISHTOSTART\" # Required: relationship type\n gap: \"P1D\" # Optional: ISO 8601 duration offset\n ```\n\n- **Relationship types accepted in stored data:** `FINISHTOSTART`, `STARTTOSTART`, `FINISHTOFINISH`, `STARTTOFINISH`\n- **Current behavior:** Dependencies created from the UI use `FINISHTOSTART`. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different `reltype` values or `gap`.\n\n#### Reminders\n\n- **Type:** list (array of objects)\n- **Description:** Reminder notifications for the task\n- **Structure for relative reminders:**\n\n ```yaml\n reminders:\n - id: \"rem_1\" # Required: unique identifier\n type: \"relative\" # Required: \"relative\" or \"absolute\"\n relatedTo: \"due\" # Required for relative: \"due\" or \"scheduled\"\n offset: \"-PT1H\" # Required for relative: ISO 8601 duration\n description: \"1 hour before due\" # Optional: description\n ```\n\n- **Structure for absolute reminders:**\n\n ```yaml\n reminders:\n - id: \"rem_2\"\n type: \"absolute\"\n absoluteTime: \"2025-01-15T09:00:00Z\" # Required for absolute: ISO 8601 timestamp\n description: \"Morning reminder\"\n ```\n\n#### icsEventId\n\n- **Type:** list (array of strings)\n- **Description:** ICS calendar event IDs linked to this task\n- **Example:**\n \n ```yaml\n icsEventId:\n - \"event-abc123\"\n - \"event-def456\"\n ```\n\n\n---\n\n## Complete Example\n\nHere's a complete task with all property types:\n\n```yaml\n---\ntitle: \"Complete quarterly report\"\nstatus: \"in-progress\"\npriority: \"high\"\ndue: \"2025-01-31\"\nscheduled: \"2025-01-25\"\ntags:\n - work\n - reports\ncontexts:\n - office\nprojects:\n - \"[[Q1 Planning]]\"\ntimeEstimate: 240\ndateCreated: \"2025-01-01T08:00:00Z\"\ndateModified: \"2025-01-20T14:30:00Z\"\ntimeEntries:\n - startTime: \"2025-01-20T10:00:00Z\"\n endTime: \"2025-01-20T11:30:00Z\"\nblockedBy:\n - uid: \"tasks/gather-data.md\"\n reltype: \"FINISHTOSTART\"\nreminders:\n - id: \"rem_1\"\n type: \"relative\"\n relatedTo: \"due\"\n offset: \"-P1D\"\n description: \"Due tomorrow\"\n---\n```\n\n---\n\n## Field Mapping\n\nAll property names can be customized via **Settings → Task Properties → Field Mapping**. If you change a field mapping, TaskNotes will read and write using your custom property name.\n\nCustom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as `note[\"TN-status\"]` or `note[\"Task Type\"]` instead of dot notation. Dot notation only works reliably for simple identifier-style names.\n\nFor example, if you map `due` to `dueDate`, TaskNotes will expect:\n\n```yaml\ndueDate: \"2025-01-15\"\n```\n\nSee [Task Properties settings](task-properties.md) for configuration details.\n\n---\n\n## Custom User Fields\n\nYou can define additional properties with these types:\n\n- **text** - Single text value\n- **number** - Numeric value\n- **date** - Date string (YYYY-MM-DD)\n- **boolean** - true/false\n- **list** - Array of values\n\nSee [Custom User Fields](task-properties.md#custom-user-fields) for configuration details.\n","aliases":["/settings/property-types-reference/"],"toc":[{"level":2,"id":"quick-reference","text":"Quick Reference"},{"level":2,"id":"property-details","text":"Property Details"},{"level":3,"id":"text-properties","text":"Text Properties"},{"level":3,"id":"date-properties","text":"Date Properties"},{"level":3,"id":"list-properties","text":"List Properties"},{"level":3,"id":"numeric-properties","text":"Numeric Properties"},{"level":3,"id":"recurrence-properties","text":"Recurrence Properties"},{"level":3,"id":"materialized-occurrence-properties","text":"Materialized Occurrence Properties"},{"level":3,"id":"complex-properties","text":"Complex Properties"},{"level":2,"id":"complete-example","text":"Complete Example"},{"level":2,"id":"field-mapping","text":"Field Mapping"},{"level":2,"id":"custom-user-fields","text":"Custom User Fields"}],"html":"

This reference documents the expected data types for each frontmatter property that TaskNotes uses.

\n

Quick Reference#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PropertyTypeExample
titletext"My Task"
statustext"open", "in-progress", "done"
prioritytext"low", "normal", "high"
duetext (date)"2025-01-15"
scheduledtext (date)"2025-01-10"
completedDatetext (date)"2025-01-20"
dateCreatedtext (datetime)"2025-01-01T08:00:00Z"
dateModifiedtext (datetime)"2025-01-15T10:30:00Z"
tagslist["work", "urgent"]
contextslist["office", "home"]
projectslist["[[Project A]]"]
timeEstimatenumber120 (minutes)
recurrencetext"FREQ=WEEKLY;BYDAY=MO"
recurrence_anchortext"scheduled" or "completion"
timeEntrieslist (objects)See Time Entries
blockedBylist (objects)See Dependencies
reminderslist (objects)See Reminders
complete_instanceslist["2025-01-08", "2025-01-15"]
skipped_instanceslist["2025-01-22"]
recurrence_parenttext (link/path)"[[Tasks/Weekly review]]"
occurrence_datetext (date)"2025-01-15"
occurrence_materializationtext"manual" or "on_completion"
occurrence_next_triggertext"completion" or "completion_or_skip"
occurrence_templatetext (link/path)"[[Templates/Occurrence]]"
occurrence_past_horizontext (duration)"P7D"
occurrence_future_horizontext (duration)"P14D"
icsEventIdlist["event-abc123"]
\n

Use this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values.

\n
\n

Property Details#

\n

The sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct.

\n

Text Properties#

\n

title#

\n
    \n
  • Type: text (string)
  • \n
  • Description: The task's title or name
  • \n
  • Example: title: "Complete project documentation"
  • \n
\n

status#

\n
    \n
  • Type: text (string)
  • \n
  • Description: The task's current status. Must match one of the status values configured in your settings.
  • \n
  • Default values: "open", "in-progress", "done"
  • \n
  • Example: status: "in-progress"
  • \n
  • Note: Also supports boolean values (true/false) for Obsidian checkbox compatibility. See Boolean Status Values.
  • \n
\n

priority#

\n
    \n
  • Type: text (string)
  • \n
  • Description: The task's priority level. Must match one of the priority values configured in your settings.
  • \n
  • Default values: "low", "normal", "high"
  • \n
  • Example: priority: "high"
  • \n
\n
\n

Date Properties#

\n

All date properties are stored as text strings in your frontmatter. TaskNotes expects specific formats:\nWhen in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently.

\n

due#

\n
    \n
  • Type: text (date string)

    \n
  • \n
  • Format: YYYY-MM-DD or ISO 8601 timestamp

    \n
  • \n
  • Description: The task's due date

    \n
  • \n
  • Examples:

    \n
    due: "2025-01-15"\ndue: "2025-01-15T17:00:00"\n
  • \n
\n

scheduled#

\n
    \n
  • Type: text (date string)

    \n
  • \n
  • Format: YYYY-MM-DD or ISO 8601 timestamp

    \n
  • \n
  • Description: When the task is scheduled to be worked on

    \n
  • \n
  • Examples:

    \n
    scheduled: "2025-01-10"\nscheduled: "2025-01-10T09:00:00"\n
  • \n
\n

completedDate#

\n
    \n
  • Type: text (date string)
  • \n
  • Format: YYYY-MM-DD
  • \n
  • Description: The date when the task was completed
  • \n
  • Example: completedDate: "2025-01-20"
  • \n
\n

dateCreated#

\n
    \n
  • Type: text (datetime string)
  • \n
  • Format: ISO 8601 timestamp
  • \n
  • Description: When the task was created
  • \n
  • Example: dateCreated: "2025-01-01T08:00:00Z"
  • \n
\n

dateModified#

\n
    \n
  • Type: text (datetime string)
  • \n
  • Format: ISO 8601 timestamp
  • \n
  • Description: When the task was last modified
  • \n
  • Example: dateModified: "2025-01-15T10:30:00Z"
  • \n
\n
\n

List Properties#

\n

List properties must be arrays, even when containing a single value.\nSingle-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics.

\n

tags#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: Tags associated with the task

    \n
  • \n
  • Examples:

    \n
    tags: ["work", "documentation"]\ntags:\n  - work\n  - documentation\n
  • \n
\n

contexts#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: Context labels for the task

    \n
  • \n
  • Examples:

    \n
    contexts: ["office", "computer"]\ncontexts:\n  - "office"\n  - "computer"\n
  • \n
\n

projects#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: Project references (typically wiki-links)

    \n
  • \n
  • Examples:

    \n
    projects: ["[[Website Redesign]]", "[[Q1 Planning]]"]\nprojects:\n  - "[[Website Redesign]]"\n  - "[[Q1 Planning]]"\n
  • \n
\n
\n

Numeric Properties#

\n

timeEstimate#

\n
    \n
  • Type: number
  • \n
  • Unit: minutes
  • \n
  • Description: Estimated time to complete the task
  • \n
  • Example: timeEstimate: 120 (2 hours)
  • \n
\n
\n

Recurrence Properties#

\n

recurrence#

\n
    \n
  • Type: text (string)

    \n
  • \n
  • Format: RFC 5545 RRULE format

    \n
  • \n
  • Description: Defines how the task repeats

    \n
  • \n
  • Examples:

    \n
    recurrence: "FREQ=DAILY"\nrecurrence: "FREQ=WEEKLY;BYDAY=MO,WE,FR"\nrecurrence: "FREQ=MONTHLY;BYMONTHDAY=1"\n
  • \n
\n

recurrence_anchor#

\n
    \n
  • Type: text (string)
  • \n
  • Valid values: "scheduled" or "completion"
  • \n
  • Description: Determines whether the next occurrence is calculated from the scheduled date or when the task was completed
  • \n
  • Example: recurrence_anchor: "scheduled"
  • \n
\n

complete_instances#

\n
    \n
  • Type: list (array of date strings)

    \n
  • \n
  • Format: YYYY-MM-DD

    \n
  • \n
  • Description: Dates when recurring task instances were completed

    \n
  • \n
  • Example:

    \n
    complete_instances:\n  - "2025-01-08"\n  - "2025-01-15"\n
  • \n
\n

skipped_instances#

\n
    \n
  • Type: list (array of date strings)

    \n
  • \n
  • Format: YYYY-MM-DD

    \n
  • \n
  • Description: Dates when recurring task instances were skipped

    \n
  • \n
  • Example:

    \n
    skipped_instances:\n  - "2025-01-22"\n
  • \n
\n

Materialized Occurrence Properties#

\n

Materialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments.

\n

When an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as recurrence, complete_instances, skipped_instances, completedDate, provider event IDs, or timeEntries.

\n

recurrence_parent#

\n
    \n
  • Type: text (link or path string)
  • \n
  • Description: Parent recurring task for a materialized occurrence note
  • \n
  • Example: recurrence_parent: "[[Tasks/Weekly review]]"
  • \n
\n

occurrence_date#

\n
    \n
  • Type: text (date string)
  • \n
  • Format: YYYY-MM-DD
  • \n
  • Description: Target recurrence date represented by a materialized occurrence note
  • \n
  • Example: occurrence_date: "2025-01-15"
  • \n
\n

occurrence_materialization#

\n
    \n
  • Type: text (string)
  • \n
  • Valid values: "manual", "on_completion", "rolling"
  • \n
  • Description: Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet.
  • \n
  • Example: occurrence_materialization: "on_completion"
  • \n
\n

occurrence_next_trigger#

\n
    \n
  • Type: text (string)
  • \n
  • Valid values: "completion" or "completion_or_skip"
  • \n
  • Description: Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to on_completion
  • \n
  • Example: occurrence_next_trigger: "completion_or_skip"
  • \n
\n

occurrence_template#

\n
    \n
  • Type: text (link or path string)
  • \n
  • Description: Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings.
  • \n
  • Example: occurrence_template: "[[Templates/Weekly occurrence]]"
  • \n
\n

occurrence_past_horizon and occurrence_future_horizon#

\n
    \n
  • Type: text (ISO 8601 duration string)

    \n
  • \n
  • Description: Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin.

    \n
  • \n
  • Examples:

    \n
    occurrence_past_horizon: "P7D"\noccurrence_future_horizon: "P14D"\n
  • \n
\n
\n

Complex Properties#

\n

These properties contain structured data with multiple fields.\nFor these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks.

\n

Time Entries#

\n
    \n
  • Type: list (array of objects)

    \n
  • \n
  • Description: Time tracking entries for the task

    \n
  • \n
  • Structure:

    \n
    timeEntries:\n  - startTime: "2025-01-15T10:30:00Z"    # Required: ISO 8601 timestamp\n    endTime: "2025-01-15T11:15:00Z"      # Optional: ISO 8601 timestamp\n    description: "Initial work"          # Optional: text\n
  • \n
\n

Dependencies (blockedBy)#

\n
    \n
  • Type: list (array of objects)

    \n
  • \n
  • Description: Tasks that must be completed before this task can start

    \n
  • \n
  • Structure:

    \n
    blockedBy:\n  - uid: "path/to/blocking-task.md"    # Required: path to blocking task\n    reltype: "FINISHTOSTART"           # Required: relationship type\n    gap: "P1D"                         # Optional: ISO 8601 duration offset\n
  • \n
  • Relationship types accepted in stored data: FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH

    \n
  • \n
  • Current behavior: Dependencies created from the UI use FINISHTOSTART. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different reltype values or gap.

    \n
  • \n
\n

Reminders#

\n
    \n
  • Type: list (array of objects)

    \n
  • \n
  • Description: Reminder notifications for the task

    \n
  • \n
  • Structure for relative reminders:

    \n
    reminders:\n  - id: "rem_1"                        # Required: unique identifier\n    type: "relative"                   # Required: "relative" or "absolute"\n    relatedTo: "due"                   # Required for relative: "due" or "scheduled"\n    offset: "-PT1H"                    # Required for relative: ISO 8601 duration\n    description: "1 hour before due"   # Optional: description\n
  • \n
  • Structure for absolute reminders:

    \n
    reminders:\n  - id: "rem_2"\n    type: "absolute"\n    absoluteTime: "2025-01-15T09:00:00Z"  # Required for absolute: ISO 8601 timestamp\n    description: "Morning reminder"\n
  • \n
\n

icsEventId#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: ICS calendar event IDs linked to this task

    \n
  • \n
  • Example:

    \n
    icsEventId:\n  - "event-abc123"\n  - "event-def456"\n
  • \n
\n
\n

Complete Example#

\n

Here's a complete task with all property types:

\n
---\ntitle: "Complete quarterly report"\nstatus: "in-progress"\npriority: "high"\ndue: "2025-01-31"\nscheduled: "2025-01-25"\ntags:\n  - work\n  - reports\ncontexts:\n  - office\nprojects:\n  - "[[Q1 Planning]]"\ntimeEstimate: 240\ndateCreated: "2025-01-01T08:00:00Z"\ndateModified: "2025-01-20T14:30:00Z"\ntimeEntries:\n  - startTime: "2025-01-20T10:00:00Z"\n    endTime: "2025-01-20T11:30:00Z"\nblockedBy:\n  - uid: "tasks/gather-data.md"\n    reltype: "FINISHTOSTART"\nreminders:\n  - id: "rem_1"\n    type: "relative"\n    relatedTo: "due"\n    offset: "-P1D"\n    description: "Due tomorrow"\n---\n

\n

Field Mapping#

\n

All property names can be customized via Settings → Task Properties → Field Mapping. If you change a field mapping, TaskNotes will read and write using your custom property name.

\n

Custom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as note["TN-status"] or note["Task Type"] instead of dot notation. Dot notation only works reliably for simple identifier-style names.

\n

For example, if you map due to dueDate, TaskNotes will expect:

\n
dueDate: "2025-01-15"\n

See Task Properties settings for configuration details.

\n
\n

Custom User Fields#

\n

You can define additional properties with these types:

\n
    \n
  • text - Single text value
  • \n
  • number - Numeric value
  • \n
  • date - Date string (YYYY-MM-DD)
  • \n
  • boolean - true/false
  • \n
  • list - Array of values
  • \n
\n

See Custom User Fields for configuration details.

\n","text":"This reference documents the expected data types for each frontmatter property that TaskNotes uses. Quick Reference# Property Type Example title text \"My Task\" status text \"open\", \"in-progress\", \"done\" priority text \"low\", \"normal\", \"high\" due text (date) \"2025-01-15\" scheduled text (date) \"2025-01-10\" completedDate text (date) \"2025-01-20\" dateCreated text (datetime) \"2025-01-01T08:00:00Z\" dateModified text (datetime) \"2025-01-15T10:30:00Z\" tags list [\"work\", \"urgent\"] contexts list [\"office\", \"home\"] projects list [\"[[Project A]]\"] timeEstimate number 120 (minutes) recurrence text \"FREQ=WEEKLY;BYDAY=MO\" recurrence_anchor text \"scheduled\" or \"completion\" timeEntries list (objects) See Time Entries blockedBy list (objects) See Dependencies reminders list (objects) See Reminders complete_instances list [\"2025-01-08\", \"2025-01-15\"] skipped_instances list [\"2025-01-22\"] recurrence_parent text (link/path) \"[[Tasks/Weekly review]]\" occurrence_date text (date) \"2025-01-15\" occurrence_materialization text \"manual\" or \"on_completion\" occurrence_next_trigger text \"completion\" or \"completion_or_skip\" occurrence_template text (link/path) \"[[Templates/Occurrence]]\" occurrence_past_horizon text (duration) \"P7D\" occurrence_future_horizon text (duration) \"P14D\" icsEventId list [\"event-abc123\"] Use this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values. Property Details# The sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct. Text Properties# title# Type: text (string) Description: The task's title or name Example: title: \"Complete project documentation\" status# Type: text (string) Description: The task's current status. Must match one of the status values configured in your settings. Default values: \"open\", \"in-progress\", \"done\" Example: status: \"in-progress\" Note: Also supports boolean values (true/false) for Obsidian checkbox compatibility. See Boolean Status Values. priority# Type: text (string) Description: The task's priority level. Must match one of the priority values configured in your settings. Default values: \"low\", \"normal\", \"high\" Example: priority: \"high\" Date Properties# All date properties are stored as text strings in your frontmatter. TaskNotes expects specific formats: When in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently. due# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: The task's due date Examples: due: \"2025-01-15\" due: \"2025-01-15T17:00:00\" scheduled# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: When the task is scheduled to be worked on Examples: scheduled: \"2025-01-10\" scheduled: \"2025-01-10T09:00:00\" completedDate# Type: text (date string) Format: YYYY-MM-DD Description: The date when the task was completed Example: completedDate: \"2025-01-20\" dateCreated# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was created Example: dateCreated: \"2025-01-01T08:00:00Z\" dateModified# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was last modified Example: dateModified: \"2025-01-15T10:30:00Z\" List Properties# List properties must be arrays, even when containing a single value. Single-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics. tags# Type: list (array of strings) Description: Tags associated with the task Examples: tags: [\"work\", \"documentation\"] tags: - work - documentation contexts# Type: list (array of strings) Description: Context labels for the task Examples: contexts: [\"office\", \"computer\"] contexts: - \"office\" - \"computer\" projects# Type: list (array of strings) Description: Project references (typically wiki-links) Examples: projects: [\"[[Website Redesign]]\", \"[[Q1 Planning]]\"] projects: - \"[[Website Redesign]]\" - \"[[Q1 Planning]]\" Numeric Properties# timeEstimate# Type: number Unit: minutes Description: Estimated time to complete the task Example: timeEstimate: 120 (2 hours) Recurrence Properties# recurrence# Type: text (string) Format: RFC 5545 RRULE format Description: Defines how the task repeats Examples: recurrence: \"FREQ=DAILY\" recurrence: \"FREQ=WEEKLY;BYDAY=MO,WE,FR\" recurrence: \"FREQ=MONTHLY;BYMONTHDAY=1\" recurrence_anchor# Type: text (string) Valid values: \"scheduled\" or \"completion\" Description: Determines whether the next occurrence is calculated from the scheduled date or when the task was completed Example: recurrence_anchor: \"scheduled\" complete_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were completed Example: complete_instances: - \"2025-01-08\" - \"2025-01-15\" skipped_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were skipped Example: skipped_instances: - \"2025-01-22\" Materialized Occurrence Properties# Materialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments. When an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as recurrence, complete_instances, skipped_instances, completedDate, provider event IDs, or timeEntries. recurrence_parent# Type: text (link or path string) Description: Parent recurring task for a materialized occurrence note Example: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date# Type: text (date string) Format: YYYY-MM-DD Description: Target recurrence date represented by a materialized occurrence note Example: occurrence_date: \"2025-01-15\" occurrence_materialization# Type: text (string) Valid values: \"manual\", \"on_completion\", \"rolling\" Description: Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet. Example: occurrence_materialization: \"on_completion\" occurrence_next_trigger# Type: text (string) Valid values: \"completion\" or \"completion_or_skip\" Description: Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to on_completion Example: occurrence_next_trigger: \"completion_or_skip\" occurrence_template# Type: text (link or path string) Description: Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings. Example: occurrence_template: \"[[Templates/Weekly occurrence]]\" occurrence_past_horizon and occurrence_future_horizon# Type: text (ISO 8601 duration string) Description: Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin. Examples: occurrence_past_horizon: \"P7D\" occurrence_future_horizon: \"P14D\" Complex Properties# These properties contain structured data with multiple fields. For these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks. Time Entries# Type: list (array of objects) Description: Time tracking entries for the task Structure: timeEntries: - startTime: \"2025-01-15T10:30:00Z\" # Required: ISO 8601 timestamp endTime: \"2025-01-15T11:15:00Z\" # Optional: ISO 8601 timestamp description: \"Initial work\" # Optional: text Dependencies (blockedBy)# Type: list (array of objects) Description: Tasks that must be completed before this task can start Structure: blockedBy: - uid: \"path/to/blocking-task.md\" # Required: path to blocking task reltype: \"FINISHTOSTART\" # Required: relationship type gap: \"P1D\" # Optional: ISO 8601 duration offset Relationship types accepted in stored data: FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH Current behavior: Dependencies created from the UI use FINISHTOSTART. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different reltype values or gap. Reminders# Type: list (array of objects) Description: Reminder notifications for the task Structure for relative reminders: reminders: - id: \"rem_1\" # Required: unique identifier type: \"relative\" # Required: \"relative\" or \"absolute\" relatedTo: \"due\" # Required for relative: \"due\" or \"scheduled\" offset: \"-PT1H\" # Required for relative: ISO 8601 duration description: \"1 hour before due\" # Optional: description Structure for absolute reminders: reminders: - id: \"rem_2\" type: \"absolute\" absoluteTime: \"2025-01-15T09:00:00Z\" # Required for absolute: ISO 8601 timestamp description: \"Morning reminder\" icsEventId# Type: list (array of strings) Description: ICS calendar event IDs linked to this task Example: icsEventId: - \"event-abc123\" - \"event-def456\" Complete Example# Here's a complete task with all property types: --- title: \"Complete quarterly report\" status: \"in-progress\" priority: \"high\" due: \"2025-01-31\" scheduled: \"2025-01-25\" tags: - work - reports contexts: - office projects: - \"[[Q1 Planning]]\" timeEstimate: 240 dateCreated: \"2025-01-01T08:00:00Z\" dateModified: \"2025-01-20T14:30:00Z\" timeEntries: - startTime: \"2025-01-20T10:00:00Z\" endTime: \"2025-01-20T11:30:00Z\" blockedBy: - uid: \"tasks/gather-data.md\" reltype: \"FINISHTOSTART\" reminders: - id: \"rem_1\" type: \"relative\" relatedTo: \"due\" offset: \"-P1D\" description: \"Due tomorrow\" --- Field Mapping# All property names can be customized via Settings → Task Properties → Field Mapping. If you change a field mapping, TaskNotes will read and write using your custom property name. Custom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as note[\"TN-status\"] or note[\"Task Type\"] instead of dot notation. Dot notation only works reliably for simple identifier-style names. For example, if you map due to dueDate, TaskNotes will expect: dueDate: \"2025-01-15\" See Task Properties settings for configuration details. Custom User Fields# You can define additional properties with these types: text - Single text value number - Numeric value date - Date string (YYYY-MM-DD) boolean - true/false list - Array of values See Custom User Fields for configuration details."},{"route":"/obsidian/settings/task-properties/","title":"Task Properties Settings","description":"This tab configures all task properties. Each property is displayed as a card containing its configuration options.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/task-properties.md","namespace":"obsidian","relativePath":"settings/task-properties.md","raw":"# Task Properties Settings\n\nThis tab configures all task properties. Each property is displayed as a card containing its configuration options.\n\n\n![Task Properties Settings](../assets/settings-task-properties.png)\n\n!!! tip \"Looking for property type documentation?\"\n See the [Property Types Reference](property-types-reference.md) for detailed documentation on the expected data types (text, list, date, etc.) for each frontmatter property.\n\n## Property Card Structure\n\nEach property card contains:\n\n- **Property key**: The frontmatter field name used to store this property\n- **Default**: The default value applied to new tasks (where applicable)\n- **NLP trigger**: Toggle and character configuration for natural language parsing (where applicable)\n- **Property-specific settings**: Additional configuration options specific to that property\nThis tab defines the task schema used by creation flows, NLP parsing, views, and API payloads.\n\nProperty keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example `note[\"TN-status\"]`, rather than dot syntax such as `note.TN-status`.\n\n## Core Properties\n\n### Title\n\nThe task title property. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `title`)\n- **Store title in filename**: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes.\n- **Filename format**: When \"Store title in filename\" is disabled, choose how filenames are generated:\n - Title-based\n - Zettelkasten-style\n - Timestamp-based\n - UUID v4\n - Custom template\n- **Custom template**: Define a custom filename pattern using variables (shown when \"custom\" format is selected)\n\n### Status\n\nTask completion state. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `status`)\n- **Default**: Default status for new tasks\n- **NLP trigger**: Character that triggers status parsing (default: `*`)\n- **Status Values**: Expandable section containing individual status cards\n\nEach status value has:\n\n- **Value**: Internal identifier stored in frontmatter (e.g., \"in-progress\")\n- **Label**: Display name shown in the interface (e.g., \"In Progress\")\n- **Color**: Visual indicator color\n- **Icon**: Optional icon identifier\n- **Completed**: Whether this status represents a finished task\n- **Skip when cycling**: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits\n- **Next status**: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence\n- **Auto-archive**: Automatically archive tasks after a delay (1-1440 minutes)\n\nStatus cards support drag-and-drop reordering.\n\nUse the **Value** field as the stable stored identifier and the **Label** field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored **Value**, so use prefixes such as `1-open`, `2-doing`, `3-done` if you need predictable native Bases order.\n\n#### Boolean Status Values\n\nTaskNotes supports using boolean values (`true` and `false`) as status values, which integrates with Obsidian's native checkbox property format:\n\n- When you set a task's status to `\"true\"` or `\"false\"` (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter\n- When reading tasks with boolean status values from frontmatter, they are converted back to the strings `\"true\"` or `\"false\"`\n- This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes\n\n**Example:**\n```yaml\n---\nstatus: true # Boolean checkbox in Obsidian\n---\n```\n\n### Priority\n\nTask priority level. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `priority`)\n- **Default**: Default priority for new tasks (can be set to \"No default\")\n- **NLP trigger**: Character that triggers priority parsing (default: `!`, disabled by default)\n- **Priority Values**: Expandable section containing individual priority cards\n\nEach priority value has:\n\n- **Value**: Internal identifier stored in frontmatter (e.g., \"high\")\n- **Label**: Display name shown in the interface (e.g., \"High Priority\")\n- **Color**: Visual indicator color\n\nPriority cards support drag-and-drop reordering.\nStatus and priority values are stored in frontmatter; renaming them later may require migration of existing task files.\n\n> **Note for Bases plugin users:** Obsidian's Bases plugin sorts priorities alphabetically by their **Value**. To control sort order, name values to sort alphabetically in the desired order:\n> - Example: `1-urgent`, `2-high`, `3-medium`, `4-normal`, `5-low`\n> - Or: `a-urgent`, `b-high`, `c-medium`, `d-normal`, `e-low`\n\n## Date Properties\n\n### Due Date\n\nWhen the task must be completed. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `due`)\n- **Default**: Default due date for new tasks (None, Today, Tomorrow, Next Week)\n\n### Scheduled Date\n\nWhen to work on the task. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `scheduled`)\n- **Default**: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week)\n\nWhen you use **Convert current note to task**, this default is also applied if the source note does not already have `scheduled` frontmatter. Choose **None** to keep converted notes unscheduled by default.\n\n`due` tracks commitment deadlines, while `scheduled` tracks intended execution time.\n\n## Organization Properties\n\n### Contexts\n\nWhere or how the task can be done. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `contexts`)\n- **Default**: Comma-separated list of default contexts (e.g., @home, @work)\n- **NLP trigger**: Character that triggers context parsing (default: `@`)\n\n### Projects\n\nProjects the task belongs to. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `projects`)\n- **Default projects**: Select project notes to automatically link to new tasks\n- **Use active note for new tasks**: Automatically link the active note as a project when opening task creation from the command palette or ribbon\n- **Use parent note for inline/instant conversion**: Automatically link the source note as a project when using inline task creation or instant task conversion\n- **NLP trigger**: Character that triggers project parsing (default: `+`)\n- **Autosuggest Filters**: Expandable section to filter which notes appear in project suggestions\n- **Customize Display**: Expandable section to configure how project suggestions appear\n\n#### Autosuggest Filters\n\nControl which notes appear when selecting projects:\n\n- **Required tags**: Comma-separated list of tags (shows notes with ANY of these tags)\n- **Include folders**: Comma-separated list of folder paths (shows notes in ANY of these folders)\n- **Required property key**: Frontmatter property that must exist\n- **Required property value**: Expected value for the property (optional)\nThese filters reduce suggestion noise in large vaults.\n\nA \"Filters On\" badge appears when any filters are configured.\n\n#### Customize Display\n\nConfigure project suggestion appearance:\n\n- **Enable fuzzy matching**: Allow typos and partial matches in project search\n- **Row 1, 2, 3**: Configure up to 3 lines of information for each project suggestion\n\n### Tags\n\nObsidian tags for categorization. Configuration options:\n\n- **Default**: Comma-separated list of default tags (without #)\n- **NLP trigger**: Character that triggers tag parsing (default: `#`)\n\nNote: Tags use native Obsidian tags and do not have a separate property key setting.\n\n## Task Details\n\n### Time Estimate\n\nEstimated time to complete the task. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `timeEstimate`)\n- **Default**: Default time estimate in minutes (0 = no default)\n\n### Recurrence\n\nPattern for repeating tasks. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `recurrence`)\n- **Default**: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly)\n\nRecurring tasks also use the **Recurrence anchor** metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under **Recurrence → Occurrence notes** rather than as a global default.\n\n### Reminders\n\nNotifications before task deadlines. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `reminders`)\n- **Default Reminders**: Expandable section containing default reminder cards\n\nEach default reminder can be:\n\n**Relative reminders** (triggered relative to due or scheduled date):\n\n- Anchor date (due date or scheduled date)\n- Offset amount and unit (minutes, hours, days)\n- Direction (before or after)\n- Description\n\n**Absolute reminders** (triggered at specific times):\n\n- Date\n- Time\n- Description\n\n## Metadata Properties\n\nThese properties are system-managed and typically only require property key configuration:\n\n- **Date Created**: When the task was created\n- **Date Modified**: When the task was last modified\n- **Completed Date**: When the task was completed\n- **Archive Tag**: Tag used to mark archived tasks\n- **Time Entries**: Time tracking entries for the task\n- **Complete Instances**: Completion history for recurring tasks\n- **Skipped Instances**: Skip history for recurring tasks\n- **Recurrence Anchor**: Whether recurring progression is based on scheduled date or completion date\n- **Blocked By**: Tasks that must be completed first\n\nMaterialized occurrence notes also use system-managed frontmatter fields such as `recurrence_parent`, `occurrence_date`, `occurrence_materialization`, `occurrence_next_trigger`, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the [Property Types Reference](property-types-reference.md#materialized-occurrence-properties) and are normally changed through recurrence and occurrence-note controls instead of by hand.\n\n## Feature Properties\n\nThese properties are used by specific TaskNotes features and are not stored in task frontmatter:\n\n- **Pomodoros**: Property key for Pomodoro session counts. When Pomodoro data storage is set to \"Daily notes\", this property is written to daily notes rather than task files.\n- **ICS Event ID**: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event.\n- **ICS Event Tag**: Property key for calendar event tags. Added to notes created from ICS calendar events for identification.\n\n## Custom User Fields\n\nDefine custom frontmatter properties to appear as filter options across views. Configuration options for each field:\n\n- **Display Name**: How the field appears in the UI\n- **Property Key**: The frontmatter property name\n- **Type**: Data type (text, number, boolean, date, or list)\n- **Default Value**: Pre-fill value for new tasks (format varies by type)\n- **NLP trigger**: Toggle and character for natural language parsing\n- **Autosuggest Filters**: Filter which files appear when using `[[` wikilink autocomplete\nCustom fields are most maintainable when they map to repeated workflow decisions (for example `effort`, `owner`, or `client`).\n\n### Link Values\n\nUse a **Text** custom field for a single link and a **List** custom field for multiple links. Task cards render `[[wikilinks]]`, `[label](https://example.com)`, ``, and bare `https://example.com` values as clickable links.\n\nAutosuggest filters work with text and list fields when entering `[[` wikilinks, so a field such as `Related Note` can suggest only files from a chosen folder or tag.\n\n### Default Values\n\nEach field type has a different input format for default values:\n\n- **Text**: Enter the default text value\n- **Number**: Enter the default number\n- **Boolean**: Toggle switch to set default checked/unchecked state\n- **Date**: Select from presets (None, Today, Tomorrow, Next Week)\n- **List**: Enter comma-separated default values\n\nDefault values are applied when creating tasks via:\n\n- Task creation modal\n- Instant task conversion\n- \"Create or open task\" command\n- HTTP API (when using task creation defaults)\n\n### Autosuggestion Filters\n\nEach custom field can configure filters to control which files appear in wikilink suggestions:\n\n- **Required tags**: Comma-separated list of tags (shows files with ANY of these tags)\n- **Include folders**: Comma-separated list of folder paths (shows files in ANY of these folders)\n- **Required property key**: Frontmatter property that must exist\n- **Required property value**: Expected value for the property (optional)\n\nA \"Filters On\" badge appears when filters are configured.\n\nSee [User Fields Feature Documentation](../features/user-fields.md#file-suggestion-filtering-advanced) for detailed examples.\n","aliases":["/settings/task-properties/"],"toc":[{"level":2,"id":"property-card-structure","text":"Property Card Structure"},{"level":2,"id":"core-properties","text":"Core Properties"},{"level":3,"id":"title","text":"Title"},{"level":3,"id":"status","text":"Status"},{"level":3,"id":"priority","text":"Priority"},{"level":2,"id":"date-properties","text":"Date Properties"},{"level":3,"id":"due-date","text":"Due Date"},{"level":3,"id":"scheduled-date","text":"Scheduled Date"},{"level":2,"id":"organization-properties","text":"Organization Properties"},{"level":3,"id":"contexts","text":"Contexts"},{"level":3,"id":"projects","text":"Projects"},{"level":3,"id":"tags","text":"Tags"},{"level":2,"id":"task-details","text":"Task Details"},{"level":3,"id":"time-estimate","text":"Time Estimate"},{"level":3,"id":"recurrence","text":"Recurrence"},{"level":3,"id":"reminders","text":"Reminders"},{"level":2,"id":"metadata-properties","text":"Metadata Properties"},{"level":2,"id":"feature-properties","text":"Feature Properties"},{"level":2,"id":"custom-user-fields","text":"Custom User Fields"},{"level":3,"id":"link-values","text":"Link Values"},{"level":3,"id":"default-values","text":"Default Values"},{"level":3,"id":"autosuggestion-filters","text":"Autosuggestion Filters"}],"html":"

This tab configures all task properties. Each property is displayed as a card containing its configuration options.

\n

\"Task

\n\n

Property Card Structure#

\n

Each property card contains:

\n
    \n
  • Property key: The frontmatter field name used to store this property
  • \n
  • Default: The default value applied to new tasks (where applicable)
  • \n
  • NLP trigger: Toggle and character configuration for natural language parsing (where applicable)
  • \n
  • Property-specific settings: Additional configuration options specific to that property\nThis tab defines the task schema used by creation flows, NLP parsing, views, and API payloads.
  • \n
\n

Property keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example note["TN-status"], rather than dot syntax such as note.TN-status.

\n

Core Properties#

\n

Title#

\n

The task title property. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: title)
  • \n
  • Store title in filename: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes.
  • \n
  • Filename format: When "Store title in filename" is disabled, choose how filenames are generated:
      \n
    • Title-based
    • \n
    • Zettelkasten-style
    • \n
    • Timestamp-based
    • \n
    • UUID v4
    • \n
    • Custom template
    • \n
    \n
  • \n
  • Custom template: Define a custom filename pattern using variables (shown when "custom" format is selected)
  • \n
\n

Status#

\n

Task completion state. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: status)
  • \n
  • Default: Default status for new tasks
  • \n
  • NLP trigger: Character that triggers status parsing (default: *)
  • \n
  • Status Values: Expandable section containing individual status cards
  • \n
\n

Each status value has:

\n
    \n
  • Value: Internal identifier stored in frontmatter (e.g., "in-progress")
  • \n
  • Label: Display name shown in the interface (e.g., "In Progress")
  • \n
  • Color: Visual indicator color
  • \n
  • Icon: Optional icon identifier
  • \n
  • Completed: Whether this status represents a finished task
  • \n
  • Skip when cycling: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits
  • \n
  • Next status: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence
  • \n
  • Auto-archive: Automatically archive tasks after a delay (1-1440 minutes)
  • \n
\n

Status cards support drag-and-drop reordering.

\n

Use the Value field as the stable stored identifier and the Label field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored Value, so use prefixes such as 1-open, 2-doing, 3-done if you need predictable native Bases order.

\n

Boolean Status Values#

\n

TaskNotes supports using boolean values (true and false) as status values, which integrates with Obsidian's native checkbox property format:

\n
    \n
  • When you set a task's status to "true" or "false" (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter
  • \n
  • When reading tasks with boolean status values from frontmatter, they are converted back to the strings "true" or "false"
  • \n
  • This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes
  • \n
\n

Example:

\n
---\nstatus: true    # Boolean checkbox in Obsidian\n---\n

Priority#

\n

Task priority level. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: priority)
  • \n
  • Default: Default priority for new tasks (can be set to "No default")
  • \n
  • NLP trigger: Character that triggers priority parsing (default: !, disabled by default)
  • \n
  • Priority Values: Expandable section containing individual priority cards
  • \n
\n

Each priority value has:

\n
    \n
  • Value: Internal identifier stored in frontmatter (e.g., "high")
  • \n
  • Label: Display name shown in the interface (e.g., "High Priority")
  • \n
  • Color: Visual indicator color
  • \n
\n

Priority cards support drag-and-drop reordering.\nStatus and priority values are stored in frontmatter; renaming them later may require migration of existing task files.

\n
\n

Note for Bases plugin users: Obsidian's Bases plugin sorts priorities alphabetically by their Value. To control sort order, name values to sort alphabetically in the desired order:

\n
    \n
  • Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low
  • \n
  • Or: a-urgent, b-high, c-medium, d-normal, e-low
  • \n
\n
\n

Date Properties#

\n

Due Date#

\n

When the task must be completed. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: due)
  • \n
  • Default: Default due date for new tasks (None, Today, Tomorrow, Next Week)
  • \n
\n

Scheduled Date#

\n

When to work on the task. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: scheduled)
  • \n
  • Default: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week)
  • \n
\n

When you use Convert current note to task, this default is also applied if the source note does not already have scheduled frontmatter. Choose None to keep converted notes unscheduled by default.

\n

due tracks commitment deadlines, while scheduled tracks intended execution time.

\n

Organization Properties#

\n

Contexts#

\n

Where or how the task can be done. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: contexts)
  • \n
  • Default: Comma-separated list of default contexts (e.g., @home, @work)
  • \n
  • NLP trigger: Character that triggers context parsing (default: @)
  • \n
\n

Projects#

\n

Projects the task belongs to. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: projects)
  • \n
  • Default projects: Select project notes to automatically link to new tasks
  • \n
  • Use active note for new tasks: Automatically link the active note as a project when opening task creation from the command palette or ribbon
  • \n
  • Use parent note for inline/instant conversion: Automatically link the source note as a project when using inline task creation or instant task conversion
  • \n
  • NLP trigger: Character that triggers project parsing (default: +)
  • \n
  • Autosuggest Filters: Expandable section to filter which notes appear in project suggestions
  • \n
  • Customize Display: Expandable section to configure how project suggestions appear
  • \n
\n

Autosuggest Filters#

\n

Control which notes appear when selecting projects:

\n
    \n
  • Required tags: Comma-separated list of tags (shows notes with ANY of these tags)
  • \n
  • Include folders: Comma-separated list of folder paths (shows notes in ANY of these folders)
  • \n
  • Required property key: Frontmatter property that must exist
  • \n
  • Required property value: Expected value for the property (optional)\nThese filters reduce suggestion noise in large vaults.
  • \n
\n

A "Filters On" badge appears when any filters are configured.

\n

Customize Display#

\n

Configure project suggestion appearance:

\n
    \n
  • Enable fuzzy matching: Allow typos and partial matches in project search
  • \n
  • Row 1, 2, 3: Configure up to 3 lines of information for each project suggestion
  • \n
\n

Tags#

\n

Obsidian tags for categorization. Configuration options:

\n
    \n
  • Default: Comma-separated list of default tags (without #)
  • \n
  • NLP trigger: Character that triggers tag parsing (default: #)
  • \n
\n

Note: Tags use native Obsidian tags and do not have a separate property key setting.

\n

Task Details#

\n

Time Estimate#

\n

Estimated time to complete the task. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: timeEstimate)
  • \n
  • Default: Default time estimate in minutes (0 = no default)
  • \n
\n

Recurrence#

\n

Pattern for repeating tasks. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: recurrence)
  • \n
  • Default: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly)
  • \n
\n

Recurring tasks also use the Recurrence anchor metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under Recurrence → Occurrence notes rather than as a global default.

\n

Reminders#

\n

Notifications before task deadlines. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: reminders)
  • \n
  • Default Reminders: Expandable section containing default reminder cards
  • \n
\n

Each default reminder can be:

\n

Relative reminders (triggered relative to due or scheduled date):

\n
    \n
  • Anchor date (due date or scheduled date)
  • \n
  • Offset amount and unit (minutes, hours, days)
  • \n
  • Direction (before or after)
  • \n
  • Description
  • \n
\n

Absolute reminders (triggered at specific times):

\n
    \n
  • Date
  • \n
  • Time
  • \n
  • Description
  • \n
\n

Metadata Properties#

\n

These properties are system-managed and typically only require property key configuration:

\n
    \n
  • Date Created: When the task was created
  • \n
  • Date Modified: When the task was last modified
  • \n
  • Completed Date: When the task was completed
  • \n
  • Archive Tag: Tag used to mark archived tasks
  • \n
  • Time Entries: Time tracking entries for the task
  • \n
  • Complete Instances: Completion history for recurring tasks
  • \n
  • Skipped Instances: Skip history for recurring tasks
  • \n
  • Recurrence Anchor: Whether recurring progression is based on scheduled date or completion date
  • \n
  • Blocked By: Tasks that must be completed first
  • \n
\n

Materialized occurrence notes also use system-managed frontmatter fields such as recurrence_parent, occurrence_date, occurrence_materialization, occurrence_next_trigger, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the Property Types Reference and are normally changed through recurrence and occurrence-note controls instead of by hand.

\n

Feature Properties#

\n

These properties are used by specific TaskNotes features and are not stored in task frontmatter:

\n
    \n
  • Pomodoros: Property key for Pomodoro session counts. When Pomodoro data storage is set to "Daily notes", this property is written to daily notes rather than task files.
  • \n
  • ICS Event ID: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event.
  • \n
  • ICS Event Tag: Property key for calendar event tags. Added to notes created from ICS calendar events for identification.
  • \n
\n

Custom User Fields#

\n

Define custom frontmatter properties to appear as filter options across views. Configuration options for each field:

\n
    \n
  • Display Name: How the field appears in the UI
  • \n
  • Property Key: The frontmatter property name
  • \n
  • Type: Data type (text, number, boolean, date, or list)
  • \n
  • Default Value: Pre-fill value for new tasks (format varies by type)
  • \n
  • NLP trigger: Toggle and character for natural language parsing
  • \n
  • Autosuggest Filters: Filter which files appear when using [[ wikilink autocomplete\nCustom fields are most maintainable when they map to repeated workflow decisions (for example effort, owner, or client).
  • \n
\n\n

Use a Text custom field for a single link and a List custom field for multiple links. Task cards render [[wikilinks]], [label](https://example.com), <https://example.com>, and bare https://example.com values as clickable links.

\n

Autosuggest filters work with text and list fields when entering [[ wikilinks, so a field such as Related Note can suggest only files from a chosen folder or tag.

\n

Default Values#

\n

Each field type has a different input format for default values:

\n
    \n
  • Text: Enter the default text value
  • \n
  • Number: Enter the default number
  • \n
  • Boolean: Toggle switch to set default checked/unchecked state
  • \n
  • Date: Select from presets (None, Today, Tomorrow, Next Week)
  • \n
  • List: Enter comma-separated default values
  • \n
\n

Default values are applied when creating tasks via:

\n
    \n
  • Task creation modal
  • \n
  • Instant task conversion
  • \n
  • "Create or open task" command
  • \n
  • HTTP API (when using task creation defaults)
  • \n
\n

Autosuggestion Filters#

\n

Each custom field can configure filters to control which files appear in wikilink suggestions:

\n
    \n
  • Required tags: Comma-separated list of tags (shows files with ANY of these tags)
  • \n
  • Include folders: Comma-separated list of folder paths (shows files in ANY of these folders)
  • \n
  • Required property key: Frontmatter property that must exist
  • \n
  • Required property value: Expected value for the property (optional)
  • \n
\n

A "Filters On" badge appears when filters are configured.

\n

See User Fields Feature Documentation for detailed examples.

\n","text":"This tab configures all task properties. Each property is displayed as a card containing its configuration options. Looking for property type documentation?See the Property Types Reference for detailed documentation on the expected data types (text, list, date, etc.) for each frontmatter property. Property Card Structure# Each property card contains: Property key: The frontmatter field name used to store this property Default: The default value applied to new tasks (where applicable) NLP trigger: Toggle and character configuration for natural language parsing (where applicable) Property-specific settings: Additional configuration options specific to that property This tab defines the task schema used by creation flows, NLP parsing, views, and API payloads. Property keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example note[\"TN-status\"], rather than dot syntax such as note.TN-status. Core Properties# Title# The task title property. Configuration options: Property key: Frontmatter field name (default: title) Store title in filename: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes. Filename format: When \"Store title in filename\" is disabled, choose how filenames are generated: Title-based Zettelkasten-style Timestamp-based UUID v4 Custom template Custom template: Define a custom filename pattern using variables (shown when \"custom\" format is selected) Status# Task completion state. Configuration options: Property key: Frontmatter field name (default: status) Default: Default status for new tasks NLP trigger: Character that triggers status parsing (default: *) Status Values: Expandable section containing individual status cards Each status value has: Value: Internal identifier stored in frontmatter (e.g., \"in-progress\") Label: Display name shown in the interface (e.g., \"In Progress\") Color: Visual indicator color Icon: Optional icon identifier Completed: Whether this status represents a finished task Skip when cycling: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits Next status: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence Auto-archive: Automatically archive tasks after a delay (1-1440 minutes) Status cards support drag-and-drop reordering. Use the Value field as the stable stored identifier and the Label field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored Value, so use prefixes such as 1-open, 2-doing, 3-done if you need predictable native Bases order. Boolean Status Values# TaskNotes supports using boolean values (true and false) as status values, which integrates with Obsidian's native checkbox property format: When you set a task's status to \"true\" or \"false\" (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter When reading tasks with boolean status values from frontmatter, they are converted back to the strings \"true\" or \"false\" This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes Example: --- status: true # Boolean checkbox in Obsidian --- Priority# Task priority level. Configuration options: Property key: Frontmatter field name (default: priority) Default: Default priority for new tasks (can be set to \"No default\") NLP trigger: Character that triggers priority parsing (default: !, disabled by default) Priority Values: Expandable section containing individual priority cards Each priority value has: Value: Internal identifier stored in frontmatter (e.g., \"high\") Label: Display name shown in the interface (e.g., \"High Priority\") Color: Visual indicator color Priority cards support drag-and-drop reordering. Status and priority values are stored in frontmatter; renaming them later may require migration of existing task files. Note for Bases plugin users: Obsidian's Bases plugin sorts priorities alphabetically by their Value. To control sort order, name values to sort alphabetically in the desired order: Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Date Properties# Due Date# When the task must be completed. Configuration options: Property key: Frontmatter field name (default: due) Default: Default due date for new tasks (None, Today, Tomorrow, Next Week) Scheduled Date# When to work on the task. Configuration options: Property key: Frontmatter field name (default: scheduled) Default: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week) When you use Convert current note to task, this default is also applied if the source note does not already have scheduled frontmatter. Choose None to keep converted notes unscheduled by default. due tracks commitment deadlines, while scheduled tracks intended execution time. Organization Properties# Contexts# Where or how the task can be done. Configuration options: Property key: Frontmatter field name (default: contexts) Default: Comma-separated list of default contexts (e.g., @home, @work) NLP trigger: Character that triggers context parsing (default: @) Projects# Projects the task belongs to. Configuration options: Property key: Frontmatter field name (default: projects) Default projects: Select project notes to automatically link to new tasks Use active note for new tasks: Automatically link the active note as a project when opening task creation from the command palette or ribbon Use parent note for inline/instant conversion: Automatically link the source note as a project when using inline task creation or instant task conversion NLP trigger: Character that triggers project parsing (default: +) Autosuggest Filters: Expandable section to filter which notes appear in project suggestions Customize Display: Expandable section to configure how project suggestions appear Autosuggest Filters# Control which notes appear when selecting projects: Required tags: Comma-separated list of tags (shows notes with ANY of these tags) Include folders: Comma-separated list of folder paths (shows notes in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) These filters reduce suggestion noise in large vaults. A \"Filters On\" badge appears when any filters are configured. Customize Display# Configure project suggestion appearance: Enable fuzzy matching: Allow typos and partial matches in project search Row 1, 2, 3: Configure up to 3 lines of information for each project suggestion Tags# Obsidian tags for categorization. Configuration options: Default: Comma-separated list of default tags (without #) NLP trigger: Character that triggers tag parsing (default: #) Note: Tags use native Obsidian tags and do not have a separate property key setting. Task Details# Time Estimate# Estimated time to complete the task. Configuration options: Property key: Frontmatter field name (default: timeEstimate) Default: Default time estimate in minutes (0 = no default) Recurrence# Pattern for repeating tasks. Configuration options: Property key: Frontmatter field name (default: recurrence) Default: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly) Recurring tasks also use the Recurrence anchor metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under Recurrence → Occurrence notes rather than as a global default. Reminders# Notifications before task deadlines. Configuration options: Property key: Frontmatter field name (default: reminders) Default Reminders: Expandable section containing default reminder cards Each default reminder can be: Relative reminders (triggered relative to due or scheduled date): Anchor date (due date or scheduled date) Offset amount and unit (minutes, hours, days) Direction (before or after) Description Absolute reminders (triggered at specific times): Date Time Description Metadata Properties# These properties are system-managed and typically only require property key configuration: Date Created: When the task was created Date Modified: When the task was last modified Completed Date: When the task was completed Archive Tag: Tag used to mark archived tasks Time Entries: Time tracking entries for the task Complete Instances: Completion history for recurring tasks Skipped Instances: Skip history for recurring tasks Recurrence Anchor: Whether recurring progression is based on scheduled date or completion date Blocked By: Tasks that must be completed first Materialized occurrence notes also use system-managed frontmatter fields such as recurrence_parent, occurrence_date, occurrence_materialization, occurrence_next_trigger, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the Property Types Reference and are normally changed through recurrence and occurrence-note controls instead of by hand. Feature Properties# These properties are used by specific TaskNotes features and are not stored in task frontmatter: Pomodoros: Property key for Pomodoro session counts. When Pomodoro data storage is set to \"Daily notes\", this property is written to daily notes rather than task files. ICS Event ID: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event. ICS Event Tag: Property key for calendar event tags. Added to notes created from ICS calendar events for identification. Custom User Fields# Define custom frontmatter properties to appear as filter options across views. Configuration options for each field: Display Name: How the field appears in the UI Property Key: The frontmatter property name Type: Data type (text, number, boolean, date, or list) Default Value: Pre-fill value for new tasks (format varies by type) NLP trigger: Toggle and character for natural language parsing Autosuggest Filters: Filter which files appear when using [[ wikilink autocomplete Custom fields are most maintainable when they map to repeated workflow decisions (for example effort, owner, or client). Link Values# Use a Text custom field for a single link and a List custom field for multiple links. Task cards render [[wikilinks]], [label](https://example.com), , and bare https://example.com values as clickable links. Autosuggest filters work with text and list fields when entering [[ wikilinks, so a field such as Related Note can suggest only files from a chosen folder or tag. Default Values# Each field type has a different input format for default values: Text: Enter the default text value Number: Enter the default number Boolean: Toggle switch to set default checked/unchecked state Date: Select from presets (None, Today, Tomorrow, Next Week) List: Enter comma-separated default values Default values are applied when creating tasks via: Task creation modal Instant task conversion \"Create or open task\" command HTTP API (when using task creation defaults) Autosuggestion Filters# Each custom field can configure filters to control which files appear in wikilink suggestions: Required tags: Comma-separated list of tags (shows files with ANY of these tags) Include folders: Comma-separated list of folder paths (shows files in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) A \"Filters On\" badge appears when filters are configured. See User Fields Feature Documentation for detailed examples."},{"route":"/obsidian/troubleshooting/","title":"Troubleshooting","description":"Common issues and solutions for TaskNotes.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/troubleshooting.md","namespace":"obsidian","relativePath":"troubleshooting.md","raw":"# Troubleshooting\n\nCommon issues and solutions for TaskNotes.\n\nWhen debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from **About**, the operating system, and whether the problem also occurs in a fresh default Base.\n\n## First checks\n\n1. Confirm Obsidian meets the current [version requirement](reference/compatibility.md) and **Bases** is enabled.\n2. Open the affected task as Markdown and validate the `---` frontmatter delimiters and indentation.\n3. Confirm the task matches **Settings → TaskNotes → General → Task identification** and is not in an excluded folder.\n4. Run **TaskNotes: Refresh cache** from the command palette.\n5. Close and reopen the affected `.base` file.\n6. Restart Obsidian only after the targeted checks above.\n\nIf the issue remains, enable **Settings → TaskNotes → Features → Debug logging**, reproduce it once, and inspect the developer console with `Ctrl/Cmd + Shift + I`. Disable debug logging after collecting the relevant entries.\n\n## Bases and Views (v4)\n\n### Views Not Loading\n\n**Symptoms**: TaskNotes views show errors or don't display tasks\n\nFirst confirm Bases is enabled (`Settings -> Core Plugins -> Bases`), then restart Obsidian once. If views are still missing, verify `.base` files exist in `TaskNotes/Views/`. If needed, regenerate defaults from `Settings -> TaskNotes -> General -> Views & base files` (`Create files`).\n\n### Commands Open Wrong Files\n\n**Symptoms**: Ribbon icons or commands open unexpected files\n\nCheck command mappings in `Settings -> TaskNotes -> General` (`View Commands`). Reset mappings that were changed unintentionally, then verify each referenced `.base` file exists at the configured path.\n\n## Common Issues\n\n### Tasks Not Appearing in Views\n\n**Symptoms**: Tasks you've created don't show up in TaskNotes views\n\nFollow this decision tree:\n\n1. **Does Quick actions for current task work on the note?**\n - **No:** compare its tag or identification property with **General → Task identification**.\n - **Yes:** task recognition works; continue to the Base filter.\n2. **Is the note inside an excluded folder?**\n - **Yes:** move it or update **Excluded folders**.\n - **No:** continue.\n3. **Does a newly generated default task Base show it?**\n - **Yes:** the custom Base has a stale property name or filter.\n - **No:** run **TaskNotes: Refresh cache** and validate the frontmatter.\n4. **Did identification or field mapping change recently?**\n - **Yes:** update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change.\n\n### Task Link Widgets Not Working\n\n**Symptoms**: Links to task files appear as normal wikilinks instead of interactive widgets\n\nCheck that **Task link overlay** is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design.\n\n### Instant Conversion Buttons Missing\n\n**Symptoms**: Convert buttons don't appear next to checkbox tasks\n\nInstant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox.\n\n### Calendar View Performance Issues\n\n**Symptoms**: Calendar views are slow or unresponsive\n\nReduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below.\n\n### Natural Language Parsing Not Working\n\n**Symptoms**: Natural language input doesn't extract expected task properties\n\nEnable NLP in `Settings -> TaskNotes -> Features`, then verify your trigger characters (`@`, `#`, `!` by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in [NLP API](nlp-api.md).\n\n### Time Tracking Issues\n\n**Symptoms**: Time tracking doesn't start/stop properly or data is lost\n\nMost tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter.\n\n## Data Issues\n\n### Corrupted Task Files\n\n**Symptoms**: Tasks appear broken or cause errors in views\n\nOpen the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption.\n\n### Missing Task Properties\n\n**Symptoms**: Tasks missing expected properties or using default values unexpectedly\n\nCheck field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied.\n\n### Date Format Issues\n\n**Symptoms**: Dates not displaying correctly or causing parse errors\n\nUse supported formats (`YYYY-MM-DD` or `YYYY-MM-DDTHH:MM:SS`), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling.\n\n## Performance Troubleshooting\n\n### Slow View Loading\n\nTo improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use.\n\n## External Calendar Issues\n\n### OAuth Calendar Not Connecting\n\n**Symptoms**: Google Calendar or Microsoft Outlook won't connect\n\nVerify credentials and loopback redirect configuration (`127.0.0.1` with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use [Calendar Setup](calendar-setup.md).\n\n### OAuth Calendar Not Syncing\n\n**Symptoms**: Connected calendar shows old events or doesn't update\n\nRun manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior.\n\n### ICS Subscriptions Not Loading\n\n**Symptoms**: ICS calendar events don't appear in calendar views\n\nConfirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures.\n\n### Calendar Sync Problems\n\n**Symptoms**: External calendar changes not reflected in TaskNotes\n\nCheck refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state.\n\n## Getting Help\n\n### Reporting Issues\n\nReport bugs on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues). Include:\n\n- Exact TaskNotes and Obsidian versions\n- Operating system\n- The smallest affected task frontmatter with private values removed\n- The `.base` path and whether a regenerated default has the same problem\n- Steps to reproduce from a fresh Obsidian start\n- Relevant console errors and TaskNotes debug entries\n- Screenshots if relevant\n\n### Configuration Reset\n\nUse a reversible reset only after the checks above:\n\n1. Close Obsidian\n2. Navigate to `.obsidian/plugins/tasknotes/`\n3. Copy `data.json` to a backup outside the plugin directory\n4. Rename the original to `data.json.backup-YYYY-MM-DD`\n5. Restart Obsidian\n\n!!! warning\n A reset affects settings, status and priority configurations, integration state, saved views, and plugin-stored Pomodoro history. Keep the backup until the problem is resolved. Restore it only while Obsidian is closed.\n\nFor full restore and uninstall guidance, see [Backup, restore, and removal](guides/backup-recovery.md).\n","aliases":["/troubleshooting/"],"toc":[{"level":2,"id":"first-checks","text":"First checks"},{"level":2,"id":"bases-and-views-v4","text":"Bases and Views (v4)"},{"level":3,"id":"views-not-loading","text":"Views Not Loading"},{"level":3,"id":"commands-open-wrong-files","text":"Commands Open Wrong Files"},{"level":2,"id":"common-issues","text":"Common Issues"},{"level":3,"id":"tasks-not-appearing-in-views","text":"Tasks Not Appearing in Views"},{"level":3,"id":"task-link-widgets-not-working","text":"Task Link Widgets Not Working"},{"level":3,"id":"instant-conversion-buttons-missing","text":"Instant Conversion Buttons Missing"},{"level":3,"id":"calendar-view-performance-issues","text":"Calendar View Performance Issues"},{"level":3,"id":"natural-language-parsing-not-working","text":"Natural Language Parsing Not Working"},{"level":3,"id":"time-tracking-issues","text":"Time Tracking Issues"},{"level":2,"id":"data-issues","text":"Data Issues"},{"level":3,"id":"corrupted-task-files","text":"Corrupted Task Files"},{"level":3,"id":"missing-task-properties","text":"Missing Task Properties"},{"level":3,"id":"date-format-issues","text":"Date Format Issues"},{"level":2,"id":"performance-troubleshooting","text":"Performance Troubleshooting"},{"level":3,"id":"slow-view-loading","text":"Slow View Loading"},{"level":2,"id":"external-calendar-issues","text":"External Calendar Issues"},{"level":3,"id":"oauth-calendar-not-connecting","text":"OAuth Calendar Not Connecting"},{"level":3,"id":"oauth-calendar-not-syncing","text":"OAuth Calendar Not Syncing"},{"level":3,"id":"ics-subscriptions-not-loading","text":"ICS Subscriptions Not Loading"},{"level":3,"id":"calendar-sync-problems","text":"Calendar Sync Problems"},{"level":2,"id":"getting-help","text":"Getting Help"},{"level":3,"id":"reporting-issues","text":"Reporting Issues"},{"level":3,"id":"configuration-reset","text":"Configuration Reset"}],"html":"

Common issues and solutions for TaskNotes.

\n

When debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from About, the operating system, and whether the problem also occurs in a fresh default Base.

\n

First checks#

\n
    \n
  1. Confirm Obsidian meets the current version requirement and Bases is enabled.
  2. \n
  3. Open the affected task as Markdown and validate the --- frontmatter delimiters and indentation.
  4. \n
  5. Confirm the task matches Settings → TaskNotes → General → Task identification and is not in an excluded folder.
  6. \n
  7. Run TaskNotes: Refresh cache from the command palette.
  8. \n
  9. Close and reopen the affected .base file.
  10. \n
  11. Restart Obsidian only after the targeted checks above.
  12. \n
\n

If the issue remains, enable Settings → TaskNotes → Features → Debug logging, reproduce it once, and inspect the developer console with Ctrl/Cmd + Shift + I. Disable debug logging after collecting the relevant entries.

\n

Bases and Views (v4)#

\n

Views Not Loading#

\n

Symptoms: TaskNotes views show errors or don't display tasks

\n

First confirm Bases is enabled (Settings -> Core Plugins -> Bases), then restart Obsidian once. If views are still missing, verify .base files exist in TaskNotes/Views/. If needed, regenerate defaults from Settings -> TaskNotes -> General -> Views & base files (Create files).

\n

Commands Open Wrong Files#

\n

Symptoms: Ribbon icons or commands open unexpected files

\n

Check command mappings in Settings -> TaskNotes -> General (View Commands). Reset mappings that were changed unintentionally, then verify each referenced .base file exists at the configured path.

\n

Common Issues#

\n

Tasks Not Appearing in Views#

\n

Symptoms: Tasks you've created don't show up in TaskNotes views

\n

Follow this decision tree:

\n
    \n
  1. Does Quick actions for current task work on the note?
      \n
    • No: compare its tag or identification property with General → Task identification.
    • \n
    • Yes: task recognition works; continue to the Base filter.
    • \n
    \n
  2. \n
  3. Is the note inside an excluded folder?
      \n
    • Yes: move it or update Excluded folders.
    • \n
    • No: continue.
    • \n
    \n
  4. \n
  5. Does a newly generated default task Base show it?
      \n
    • Yes: the custom Base has a stale property name or filter.
    • \n
    • No: run TaskNotes: Refresh cache and validate the frontmatter.
    • \n
    \n
  6. \n
  7. Did identification or field mapping change recently?
      \n
    • Yes: update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change.
    • \n
    \n
  8. \n
\n\n

Symptoms: Links to task files appear as normal wikilinks instead of interactive widgets

\n

Check that Task link overlay is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design.

\n

Instant Conversion Buttons Missing#

\n

Symptoms: Convert buttons don't appear next to checkbox tasks

\n

Instant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox.

\n

Calendar View Performance Issues#

\n

Symptoms: Calendar views are slow or unresponsive

\n

Reduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below.

\n

Natural Language Parsing Not Working#

\n

Symptoms: Natural language input doesn't extract expected task properties

\n

Enable NLP in Settings -> TaskNotes -> Features, then verify your trigger characters (@, #, ! by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in NLP API.

\n

Time Tracking Issues#

\n

Symptoms: Time tracking doesn't start/stop properly or data is lost

\n

Most tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter.

\n

Data Issues#

\n

Corrupted Task Files#

\n

Symptoms: Tasks appear broken or cause errors in views

\n

Open the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption.

\n

Missing Task Properties#

\n

Symptoms: Tasks missing expected properties or using default values unexpectedly

\n

Check field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied.

\n

Date Format Issues#

\n

Symptoms: Dates not displaying correctly or causing parse errors

\n

Use supported formats (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling.

\n

Performance Troubleshooting#

\n

Slow View Loading#

\n

To improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use.

\n

External Calendar Issues#

\n

OAuth Calendar Not Connecting#

\n

Symptoms: Google Calendar or Microsoft Outlook won't connect

\n

Verify credentials and loopback redirect configuration (127.0.0.1 with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use Calendar Setup.

\n

OAuth Calendar Not Syncing#

\n

Symptoms: Connected calendar shows old events or doesn't update

\n

Run manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior.

\n

ICS Subscriptions Not Loading#

\n

Symptoms: ICS calendar events don't appear in calendar views

\n

Confirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures.

\n

Calendar Sync Problems#

\n

Symptoms: External calendar changes not reflected in TaskNotes

\n

Check refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state.

\n

Getting Help#

\n

Reporting Issues#

\n

Report bugs on GitHub Issues. Include:

\n
    \n
  • Exact TaskNotes and Obsidian versions
  • \n
  • Operating system
  • \n
  • The smallest affected task frontmatter with private values removed
  • \n
  • The .base path and whether a regenerated default has the same problem
  • \n
  • Steps to reproduce from a fresh Obsidian start
  • \n
  • Relevant console errors and TaskNotes debug entries
  • \n
  • Screenshots if relevant
  • \n
\n

Configuration Reset#

\n

Use a reversible reset only after the checks above:

\n
    \n
  1. Close Obsidian
  2. \n
  3. Navigate to .obsidian/plugins/tasknotes/
  4. \n
  5. Copy data.json to a backup outside the plugin directory
  6. \n
  7. Rename the original to data.json.backup-YYYY-MM-DD
  8. \n
  9. Restart Obsidian
  10. \n
\n\n

For full restore and uninstall guidance, see Backup, restore, and removal.

\n","text":"Common issues and solutions for TaskNotes. When debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from About, the operating system, and whether the problem also occurs in a fresh default Base. First checks# Confirm Obsidian meets the current version requirement and Bases is enabled. Open the affected task as Markdown and validate the --- frontmatter delimiters and indentation. Confirm the task matches Settings → TaskNotes → General → Task identification and is not in an excluded folder. Run TaskNotes: Refresh cache from the command palette. Close and reopen the affected .base file. Restart Obsidian only after the targeted checks above. If the issue remains, enable Settings → TaskNotes → Features → Debug logging, reproduce it once, and inspect the developer console with Ctrl/Cmd + Shift + I. Disable debug logging after collecting the relevant entries. Bases and Views (v4)# Views Not Loading# Symptoms: TaskNotes views show errors or don't display tasks First confirm Bases is enabled (Settings -> Core Plugins -> Bases), then restart Obsidian once. If views are still missing, verify .base files exist in TaskNotes/Views/. If needed, regenerate defaults from Settings -> TaskNotes -> General -> Views & base files (Create files). Commands Open Wrong Files# Symptoms: Ribbon icons or commands open unexpected files Check command mappings in Settings -> TaskNotes -> General (View Commands). Reset mappings that were changed unintentionally, then verify each referenced .base file exists at the configured path. Common Issues# Tasks Not Appearing in Views# Symptoms: Tasks you've created don't show up in TaskNotes views Follow this decision tree: Does Quick actions for current task work on the note? No: compare its tag or identification property with General → Task identification. Yes: task recognition works; continue to the Base filter. Is the note inside an excluded folder? Yes: move it or update Excluded folders. No: continue. Does a newly generated default task Base show it? Yes: the custom Base has a stale property name or filter. No: run TaskNotes: Refresh cache and validate the frontmatter. Did identification or field mapping change recently? Yes: update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change. Task Link Widgets Not Working# Symptoms: Links to task files appear as normal wikilinks instead of interactive widgets Check that Task link overlay is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design. Instant Conversion Buttons Missing# Symptoms: Convert buttons don't appear next to checkbox tasks Instant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox. Calendar View Performance Issues# Symptoms: Calendar views are slow or unresponsive Reduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below. Natural Language Parsing Not Working# Symptoms: Natural language input doesn't extract expected task properties Enable NLP in Settings -> TaskNotes -> Features, then verify your trigger characters (@, #, ! by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in NLP API. Time Tracking Issues# Symptoms: Time tracking doesn't start/stop properly or data is lost Most tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter. Data Issues# Corrupted Task Files# Symptoms: Tasks appear broken or cause errors in views Open the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption. Missing Task Properties# Symptoms: Tasks missing expected properties or using default values unexpectedly Check field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied. Date Format Issues# Symptoms: Dates not displaying correctly or causing parse errors Use supported formats (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling. Performance Troubleshooting# Slow View Loading# To improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use. External Calendar Issues# OAuth Calendar Not Connecting# Symptoms: Google Calendar or Microsoft Outlook won't connect Verify credentials and loopback redirect configuration (127.0.0.1 with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use Calendar Setup. OAuth Calendar Not Syncing# Symptoms: Connected calendar shows old events or doesn't update Run manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior. ICS Subscriptions Not Loading# Symptoms: ICS calendar events don't appear in calendar views Confirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures. Calendar Sync Problems# Symptoms: External calendar changes not reflected in TaskNotes Check refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state. Getting Help# Reporting Issues# Report bugs on GitHub Issues. Include: Exact TaskNotes and Obsidian versions Operating system The smallest affected task frontmatter with private values removed The .base path and whether a regenerated default has the same problem Steps to reproduce from a fresh Obsidian start Relevant console errors and TaskNotes debug entries Screenshots if relevant Configuration Reset# Use a reversible reset only after the checks above: Close Obsidian Navigate to .obsidian/plugins/tasknotes/ Copy data.json to a backup outside the plugin directory Rename the original to data.json.backup-YYYY-MM-DD Restart Obsidian WarningA reset affects settings, status and priority configurations, integration state, saved views, and plugin-stored Pomodoro history. Keep the backup until the problem is resolved. Restore it only while Obsidian is closed. For full restore and uninstall guidance, see Backup, restore, and removal."},{"route":"/obsidian/views/","title":"Views","description":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and requi...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views.md","namespace":"obsidian","relativePath":"views.md","raw":"# Views\n\nTaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as `.base` files located in the `TaskNotes/Views/` directory and require Obsidian's Bases core plugin to be enabled.\n\n\nFor details on Bases integration and how to enable it, see [Core Concepts](core-concepts.md#bases-integration). For view templates and configuration examples, see [Default Base Templates](views/default-base-templates.md).\n\n## Task-Focused Views\n\nTask-focused views are different entry points into the same underlying task notes. The [Task List View](views/task-list.md) is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format.\n\nWhen you want workflow by status, [Kanban View](views/kanban-view.md) organizes cards into columns and can optionally add swimlanes for an extra organizational layer. [Calendar Views](views/calendar-views.md) are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support.\n\n[Agenda View](views/agenda-view.md) is a preconfigured list-oriented calendar layout designed for short-horizon planning, while [MiniCalendar View](views/calendar-views.md#mini-calendar-view) gives a compact month heatmap and fast keyboard navigation.\n\n![Task List view](assets/views-tasks-list.png)\n\n![Calendar week view](assets/views-calendar-week.png)\n\n## Productivity-Focused Views\n\nThese views support time management and work tracking.\n\n[Pomodoro View](views/pomodoro-view.md) supports focused intervals directly inside Obsidian, and [Pomodoro Stats View](views/pomodoro-view.md#pomodoro-stats-view) summarizes completed sessions so you can see pace and consistency over time.\n\n![Pomodoro view](assets/feature-pomodoro-timer.png)\n\nScreenshots in this section are captured via the Playwright docs suite (`npm run e2e:docs`).\n","aliases":["/views/"],"toc":[{"level":2,"id":"task-focused-views","text":"Task-Focused Views"},{"level":2,"id":"productivity-focused-views","text":"Productivity-Focused Views"}],"html":"

TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and require Obsidian's Bases core plugin to be enabled.

\n

For details on Bases integration and how to enable it, see Core Concepts. For view templates and configuration examples, see Default Base Templates.

\n

Task-Focused Views#

\n

Task-focused views are different entry points into the same underlying task notes. The Task List View is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format.

\n

When you want workflow by status, Kanban View organizes cards into columns and can optionally add swimlanes for an extra organizational layer. Calendar Views are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support.

\n

Agenda View is a preconfigured list-oriented calendar layout designed for short-horizon planning, while MiniCalendar View gives a compact month heatmap and fast keyboard navigation.

\n

\"Task

\n

\"Calendar

\n

Productivity-Focused Views#

\n

These views support time management and work tracking.

\n

Pomodoro View supports focused intervals directly inside Obsidian, and Pomodoro Stats View summarizes completed sessions so you can see pace and consistency over time.

\n

\"Pomodoro

\n

Screenshots in this section are captured via the Playwright docs suite (npm run e2e:docs).

\n","text":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and require Obsidian's Bases core plugin to be enabled. For details on Bases integration and how to enable it, see Core Concepts. For view templates and configuration examples, see Default Base Templates. Task-Focused Views# Task-focused views are different entry points into the same underlying task notes. The Task List View is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format. When you want workflow by status, Kanban View organizes cards into columns and can optionally add swimlanes for an extra organizational layer. Calendar Views are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support. Agenda View is a preconfigured list-oriented calendar layout designed for short-horizon planning, while MiniCalendar View gives a compact month heatmap and fast keyboard navigation. Productivity-Focused Views# These views support time management and work tracking. Pomodoro View supports focused intervals directly inside Obsidian, and Pomodoro Stats View summarizes completed sessions so you can see pace and consistency over time. Screenshots in this section are captured via the Playwright docs suite (npm run e2e:docs)."},{"route":"/obsidian/views/agenda-view/","title":"Agenda View","description":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without ne...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/agenda-view.md","namespace":"obsidian","relativePath":"views/agenda-view.md","raw":"# Agenda View\n\n\nThe Agenda view is a dedicated `.base` file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually.\n\n![Agenda View](../assets/views-agenda.png)\n\n## File Location\n\n- Default file: `TaskNotes/Views/agenda-default.base`\n- Command: **Open Agenda View** (ribbon icon and command palette)\n- Configure the file path in **Settings → TaskNotes → General → View Commands**\n\nTaskNotes creates missing default `.base` files automatically on startup when **Auto-create default files** is enabled. You can replace the command path with your own `.base` file if you maintain multiple agendas.\n\n## Default Configuration\n\nThe stock agenda file renders the calendar in `listWeek` mode:\n\n```yaml\nviews:\n - type: tasknotesCalendar\n name: \"Agenda\"\n calendarView: \"listWeek\"\n listDayCount: 7\n startDateProperty: file.ctime\n titleProperty: file.basename\n order:\n - note.status\n - note.priority\n - note.due\n - formula.dueIn\n - note.scheduled\n```\n\nThis configuration displays seven days at a time, derives entries from `file.ctime`/`file.basename`, shows the generated `Due in` countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view.\n\n## Customization\n\nEdit the `.base` file to tailor the agenda:\n\n- Change `calendarView` to `listDay` or `listMonth` for different spans\n- Adjust `listDayCount` for shorter or longer agendas; the Bases option supports up to 365 days\n- Add `filters` to focus on specific projects, tags, or statuses\n- Modify `order` to control which task properties appear in the row layout\n\nBecause the view runs inside Bases, any YAML changes are applied immediately after saving the file.\n\n## Usage Tips\n\n- Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries\n- Saved views within Bases let you maintain multiple agenda variants (e.g., \"Work Week\" vs. \"Personal\")\n- Calendar display options (show due, show scheduled, etc.) persist when you save the `.base` file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks\n","aliases":["/views/agenda-view/"],"toc":[{"level":2,"id":"file-location","text":"File Location"},{"level":2,"id":"default-configuration","text":"Default Configuration"},{"level":2,"id":"customization","text":"Customization"},{"level":2,"id":"usage-tips","text":"Usage Tips"}],"html":"

The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually.

\n

\"Agenda

\n

File Location#

\n
    \n
  • Default file: TaskNotes/Views/agenda-default.base
  • \n
  • Command: Open Agenda View (ribbon icon and command palette)
  • \n
  • Configure the file path in Settings → TaskNotes → General → View Commands
  • \n
\n

TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled. You can replace the command path with your own .base file if you maintain multiple agendas.

\n

Default Configuration#

\n

The stock agenda file renders the calendar in listWeek mode:

\n
views:\n  - type: tasknotesCalendar\n    name: "Agenda"\n    calendarView: "listWeek"\n    listDayCount: 7\n    startDateProperty: file.ctime\n    titleProperty: file.basename\n    order:\n      - note.status\n      - note.priority\n      - note.due\n      - formula.dueIn\n      - note.scheduled\n

This configuration displays seven days at a time, derives entries from file.ctime/file.basename, shows the generated Due in countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view.

\n

Customization#

\n

Edit the .base file to tailor the agenda:

\n
    \n
  • Change calendarView to listDay or listMonth for different spans
  • \n
  • Adjust listDayCount for shorter or longer agendas; the Bases option supports up to 365 days
  • \n
  • Add filters to focus on specific projects, tags, or statuses
  • \n
  • Modify order to control which task properties appear in the row layout
  • \n
\n

Because the view runs inside Bases, any YAML changes are applied immediately after saving the file.

\n

Usage Tips#

\n
    \n
  • Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries
  • \n
  • Saved views within Bases let you maintain multiple agenda variants (e.g., "Work Week" vs. "Personal")
  • \n
  • Calendar display options (show due, show scheduled, etc.) persist when you save the .base file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks
  • \n
\n","text":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually. File Location# Default file: TaskNotes/Views/agenda-default.base Command: Open Agenda View (ribbon icon and command palette) Configure the file path in Settings → TaskNotes → General → View Commands TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled. You can replace the command path with your own .base file if you maintain multiple agendas. Default Configuration# The stock agenda file renders the calendar in listWeek mode: views: - type: tasknotesCalendar name: \"Agenda\" calendarView: \"listWeek\" listDayCount: 7 startDateProperty: file.ctime titleProperty: file.basename order: - note.status - note.priority - note.due - formula.dueIn - note.scheduled This configuration displays seven days at a time, derives entries from file.ctime/file.basename, shows the generated Due in countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view. Customization# Edit the .base file to tailor the agenda: Change calendarView to listDay or listMonth for different spans Adjust listDayCount for shorter or longer agendas; the Bases option supports up to 365 days Add filters to focus on specific projects, tags, or statuses Modify order to control which task properties appear in the row layout Because the view runs inside Bases, any YAML changes are applied immediately after saving the file. Usage Tips# Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries Saved views within Bases let you maintain multiple agenda variants (e.g., \"Work Week\" vs. \"Personal\") Calendar display options (show due, show scheduled, etc.) persist when you save the .base file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks"},{"route":"/obsidian/views/calendar-views/","title":"Calendar Views","description":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled i...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/calendar-views.md","namespace":"obsidian","relativePath":"views/calendar-views.md","raw":"# Calendar Views\n\n\nTaskNotes provides two calendar-based views: the **Mini Calendar** and the **Calendar View**. Both operate as Bases views (`.base` files) and require the Bases core plugin to be enabled in Obsidian.\nMini Calendar is date-density and navigation focused, while Calendar View is scheduling focused.\n\n![Calendar Month View](../assets/views-calendar-month.png)\n\n## Bases View Architecture\n\nCalendar views in TaskNotes v4 are implemented as Bases views, which means:\n\n- Calendar views are created as `.base` files in your vault\n- Configuration is controlled through YAML frontmatter in the base file\n- The Bases plugin is an official Obsidian core plugin and must be enabled\n- Views can be opened in tabs, pinned, and managed like other Obsidian views\nThis architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups.\n\n## Mini Calendar View\n\nThe Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time.\n\n![Mini Calendar View](../assets/views-mini-calendar.png)\n\n### Features\n\n- **Date Navigation**: Click any date to open a fuzzy selector modal showing all notes associated with that date\n- **Keyboard Navigation**: Navigate the calendar using arrow keys and select dates with Enter\n- **Heatmap Styling**: Visual indicators show the density of tasks or notes on each day\n- **Configurable Date Property**: Set which date property to track (not limited to tasks - can display any dated notes based on configured property)\n- **Month Navigation**: Browse forward and backward through months to view historical and future task distribution\nMini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution.\n\n## Calendar View\n\nThe Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times.\n\n### View Modes\n\nThe Calendar View supports the following view modes:\n\n- **Month**: Month grid showing all-day and timed events\n- **Week**: Week view with hourly time slots for detailed scheduling\n- **Day**: Single day view with hourly breakdown\n- **Year**: Annual overview showing event distribution across months\n- **List**: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own `.base` file for quick reviews.\n- **Custom Days**: Configurable multi-day view (2-10 days)\nView modes can be switched within a single `.base` file based on planning horizon (day, week, month, year, or custom range).\n\n| Week View | Day View | Year View |\n|-----------|----------|-----------|\n| ![Week View](../assets/views-calendar-week.png) | ![Day View](../assets/views-calendar-day.png) | ![Year View](../assets/views-calendar-year.png) |\n\n### Performance Improvements\n\nThe Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness.\n\n### Custom Days View\n\nThe Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view.\n\n#### Key Features\n\n- **Configurable Duration**: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count\n- **TimeGrid Format**: Uses the same hourly time slots and time-based event layout as Week and Day views\n- **Real-time Updates**: The view updates immediately when the day count setting is changed\n- **Default Configuration**: Ships with 3 days displayed by default for optimal space utilization\n\n#### Use Cases\n\nThe Custom Days view is particularly useful for:\n- Users who find the single-day view too wide and wasteful of screen space\n- Planning workflows that require seeing a few days at a glance without the full week\n- Detailed scheduling tasks that benefit from the time-grid format\n- Customizing the viewing window to match personal preference and screen size\n\n#### Configuration\n\n1. **Select the View**: Choose \"Custom Days\" from the calendar toolbar alongside Month, Week, Day, and Year views\n2. **Adjust Day Count**: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days\n3. **Set as Default**: Optionally set \"Custom Days\" as your default view in Settings > Calendar > Default view\n\n### Recurring Task Support\n\nThe Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior.\n\n#### Visual Hierarchy\n\nRecurring tasks are displayed with distinct visual styling:\n\n- **Next Scheduled Occurrence**: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance\n- **Pattern Instances**: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule\n\n#### Drag and Drop Behavior\n\nThe calendar provides different behaviors depending on which type of recurring event you drag:\n\n**Dragging Next Scheduled Occurrence (Solid Border)**:\n\n- Updates only the `scheduled` field in the task\n- Reschedules just that specific occurrence to the new date/time\n- Leaves the recurrence pattern unchanged\n- Notice: \"Rescheduled next occurrence. This does not change the recurrence pattern.\"\n\n**Dragging Pattern Instances (Dashed Border)**:\n\n- Updates the DTSTART time in the recurrence rule\n- Changes when all future pattern instances appear\n- Does not affect the independently scheduled next occurrence\n- Notice: \"Updated recurring pattern time. All future instances now appear at this time.\"\n\n#### Flexible Scheduling\n\nThe next scheduled occurrence can appear on any date, even:\n\n- Before the DTSTART date\n- On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern)\n- At different times than the pattern instances\n\nThis flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling.\n\n### View Options\n\nThe Calendar View provides several display options that control what types of events appear on the calendar:\n\n- **Show scheduled**: Display tasks with scheduled dates\n- **Show due**: Display tasks with due dates\n- **Show timeblocks**: Display time-blocking entries\n- **Show recurring**: Display recurring task events\n- **Show ICS events**: Display events from imported ICS calendars\n- **Show time entries**: Display time tracking entries\n- **All-day slot**: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views)\n- **Create daily notes from date links**: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes.\n- **Drag/drop resolution**: Set `snapDuration` when you want events to drag or resize in smaller increments than the visible `slotDuration`, such as 5-minute dragging on a 30-minute grid.\n- **Span tasks between scheduled and due dates**: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below)\nMultiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles.\n\nThe **All-day slot** option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view.\n\n#### Multi-Day Task Spans\n\nThe **Span tasks between scheduled and due dates** option provides a visual representation of task duration on the calendar. When enabled:\n\n- Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date\n- This replaces the separate scheduled and due markers for qualifying tasks\n- Tasks with only a scheduled date or only a due date continue to display as single-day events\n- Span events are shown as all-day bars with the task's priority color\n- Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify)\n\nThis option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views.\n\nThese display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions.\n\n### OAuth Calendar Integration\n\nThe Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication:\n\n- **Google Calendar**: Connect to Google Calendar accounts to display and sync events\n- **Microsoft Outlook**: Connect to Microsoft Outlook accounts for calendar integration\n\n#### Synchronization Behavior\n\n- External calendar events appear alongside TaskNotes tasks in all calendar views\n- Drag and drop events to reschedule them - changes sync back to the external calendar service\n- Events from external calendars respect the same view options and display settings as native TaskNotes tasks\n\n#### Configuration\n\nOAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services.\n\n### Time Entry Editor Modal\n\nThe Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface.\n\n#### Creating Time Entries\n\n- Drag on the calendar to select a time range\n- When the selection menu appears, choose **Create time entry**\n- The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone\n\n#### Editing Time Entries\n\nTime entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata.\n\n### Filtering and View Configuration\n\nCalendar filtering is configured through the Bases YAML frontmatter in the `.base` file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin.\n\nSaved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes.\n","aliases":["/views/calendar-views/"],"toc":[{"level":2,"id":"bases-view-architecture","text":"Bases View Architecture"},{"level":2,"id":"mini-calendar-view","text":"Mini Calendar View"},{"level":3,"id":"features","text":"Features"},{"level":2,"id":"calendar-view","text":"Calendar View"},{"level":3,"id":"view-modes","text":"View Modes"},{"level":3,"id":"performance-improvements","text":"Performance Improvements"},{"level":3,"id":"custom-days-view","text":"Custom Days View"},{"level":3,"id":"recurring-task-support","text":"Recurring Task Support"},{"level":3,"id":"view-options","text":"View Options"},{"level":3,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"time-entry-editor-modal","text":"Time Entry Editor Modal"},{"level":3,"id":"filtering-and-view-configuration","text":"Filtering and View Configuration"}],"html":"

TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled in Obsidian.\nMini Calendar is date-density and navigation focused, while Calendar View is scheduling focused.

\n

\"Calendar

\n

Bases View Architecture#

\n

Calendar views in TaskNotes v4 are implemented as Bases views, which means:

\n
    \n
  • Calendar views are created as .base files in your vault
  • \n
  • Configuration is controlled through YAML frontmatter in the base file
  • \n
  • The Bases plugin is an official Obsidian core plugin and must be enabled
  • \n
  • Views can be opened in tabs, pinned, and managed like other Obsidian views\nThis architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups.
  • \n
\n

Mini Calendar View#

\n

The Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time.

\n

\"Mini

\n

Features#

\n
    \n
  • Date Navigation: Click any date to open a fuzzy selector modal showing all notes associated with that date
  • \n
  • Keyboard Navigation: Navigate the calendar using arrow keys and select dates with Enter
  • \n
  • Heatmap Styling: Visual indicators show the density of tasks or notes on each day
  • \n
  • Configurable Date Property: Set which date property to track (not limited to tasks - can display any dated notes based on configured property)
  • \n
  • Month Navigation: Browse forward and backward through months to view historical and future task distribution\nMini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution.
  • \n
\n

Calendar View#

\n

The Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times.

\n

View Modes#

\n

The Calendar View supports the following view modes:

\n
    \n
  • Month: Month grid showing all-day and timed events
  • \n
  • Week: Week view with hourly time slots for detailed scheduling
  • \n
  • Day: Single day view with hourly breakdown
  • \n
  • Year: Annual overview showing event distribution across months
  • \n
  • List: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own .base file for quick reviews.
  • \n
  • Custom Days: Configurable multi-day view (2-10 days)\nView modes can be switched within a single .base file based on planning horizon (day, week, month, year, or custom range).
  • \n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n
Week ViewDay ViewYear View
\"Week\"Day\"Year
\n

Performance Improvements#

\n

The Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness.

\n

Custom Days View#

\n

The Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view.

\n

Key Features#

\n
    \n
  • Configurable Duration: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count
  • \n
  • TimeGrid Format: Uses the same hourly time slots and time-based event layout as Week and Day views
  • \n
  • Real-time Updates: The view updates immediately when the day count setting is changed
  • \n
  • Default Configuration: Ships with 3 days displayed by default for optimal space utilization
  • \n
\n

Use Cases#

\n

The Custom Days view is particularly useful for:

\n
    \n
  • Users who find the single-day view too wide and wasteful of screen space
  • \n
  • Planning workflows that require seeing a few days at a glance without the full week
  • \n
  • Detailed scheduling tasks that benefit from the time-grid format
  • \n
  • Customizing the viewing window to match personal preference and screen size
  • \n
\n

Configuration#

\n
    \n
  1. Select the View: Choose "Custom Days" from the calendar toolbar alongside Month, Week, Day, and Year views
  2. \n
  3. Adjust Day Count: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days
  4. \n
  5. Set as Default: Optionally set "Custom Days" as your default view in Settings > Calendar > Default view
  6. \n
\n

Recurring Task Support#

\n

The Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior.

\n

Visual Hierarchy#

\n

Recurring tasks are displayed with distinct visual styling:

\n
    \n
  • Next Scheduled Occurrence: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance
  • \n
  • Pattern Instances: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule
  • \n
\n

Drag and Drop Behavior#

\n

The calendar provides different behaviors depending on which type of recurring event you drag:

\n

Dragging Next Scheduled Occurrence (Solid Border):

\n
    \n
  • Updates only the scheduled field in the task
  • \n
  • Reschedules just that specific occurrence to the new date/time
  • \n
  • Leaves the recurrence pattern unchanged
  • \n
  • Notice: "Rescheduled next occurrence. This does not change the recurrence pattern."
  • \n
\n

Dragging Pattern Instances (Dashed Border):

\n
    \n
  • Updates the DTSTART time in the recurrence rule
  • \n
  • Changes when all future pattern instances appear
  • \n
  • Does not affect the independently scheduled next occurrence
  • \n
  • Notice: "Updated recurring pattern time. All future instances now appear at this time."
  • \n
\n

Flexible Scheduling#

\n

The next scheduled occurrence can appear on any date, even:

\n
    \n
  • Before the DTSTART date
  • \n
  • On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern)
  • \n
  • At different times than the pattern instances
  • \n
\n

This flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling.

\n

View Options#

\n

The Calendar View provides several display options that control what types of events appear on the calendar:

\n
    \n
  • Show scheduled: Display tasks with scheduled dates
  • \n
  • Show due: Display tasks with due dates
  • \n
  • Show timeblocks: Display time-blocking entries
  • \n
  • Show recurring: Display recurring task events
  • \n
  • Show ICS events: Display events from imported ICS calendars
  • \n
  • Show time entries: Display time tracking entries
  • \n
  • All-day slot: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views)
  • \n
  • Create daily notes from date links: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes.
  • \n
  • Drag/drop resolution: Set snapDuration when you want events to drag or resize in smaller increments than the visible slotDuration, such as 5-minute dragging on a 30-minute grid.
  • \n
  • Span tasks between scheduled and due dates: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below)\nMultiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles.
  • \n
\n

The All-day slot option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view.

\n

Multi-Day Task Spans#

\n

The Span tasks between scheduled and due dates option provides a visual representation of task duration on the calendar. When enabled:

\n
    \n
  • Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date
  • \n
  • This replaces the separate scheduled and due markers for qualifying tasks
  • \n
  • Tasks with only a scheduled date or only a due date continue to display as single-day events
  • \n
  • Span events are shown as all-day bars with the task's priority color
  • \n
  • Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify)
  • \n
\n

This option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views.

\n

These display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions.

\n

OAuth Calendar Integration#

\n

The Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication:

\n
    \n
  • Google Calendar: Connect to Google Calendar accounts to display and sync events
  • \n
  • Microsoft Outlook: Connect to Microsoft Outlook accounts for calendar integration
  • \n
\n

Synchronization Behavior#

\n
    \n
  • External calendar events appear alongside TaskNotes tasks in all calendar views
  • \n
  • Drag and drop events to reschedule them - changes sync back to the external calendar service
  • \n
  • Events from external calendars respect the same view options and display settings as native TaskNotes tasks
  • \n
\n

Configuration#

\n

OAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services.

\n

Time Entry Editor Modal#

\n

The Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface.

\n

Creating Time Entries#

\n
    \n
  • Drag on the calendar to select a time range
  • \n
  • When the selection menu appears, choose Create time entry
  • \n
  • The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone
  • \n
\n

Editing Time Entries#

\n

Time entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata.

\n

Filtering and View Configuration#

\n

Calendar filtering is configured through the Bases YAML frontmatter in the .base file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin.

\n

Saved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes.

\n","text":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled in Obsidian. Mini Calendar is date-density and navigation focused, while Calendar View is scheduling focused. Bases View Architecture# Calendar views in TaskNotes v4 are implemented as Bases views, which means: Calendar views are created as .base files in your vault Configuration is controlled through YAML frontmatter in the base file The Bases plugin is an official Obsidian core plugin and must be enabled Views can be opened in tabs, pinned, and managed like other Obsidian views This architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups. Mini Calendar View# The Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time. Features# Date Navigation: Click any date to open a fuzzy selector modal showing all notes associated with that date Keyboard Navigation: Navigate the calendar using arrow keys and select dates with Enter Heatmap Styling: Visual indicators show the density of tasks or notes on each day Configurable Date Property: Set which date property to track (not limited to tasks - can display any dated notes based on configured property) Month Navigation: Browse forward and backward through months to view historical and future task distribution Mini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution. Calendar View# The Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times. View Modes# The Calendar View supports the following view modes: Month: Month grid showing all-day and timed events Week: Week view with hourly time slots for detailed scheduling Day: Single day view with hourly breakdown Year: Annual overview showing event distribution across months List: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own .base file for quick reviews. Custom Days: Configurable multi-day view (2-10 days) View modes can be switched within a single .base file based on planning horizon (day, week, month, year, or custom range). Week View Day View Year View Performance Improvements# The Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness. Custom Days View# The Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view. Key Features# Configurable Duration: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count TimeGrid Format: Uses the same hourly time slots and time-based event layout as Week and Day views Real-time Updates: The view updates immediately when the day count setting is changed Default Configuration: Ships with 3 days displayed by default for optimal space utilization Use Cases# The Custom Days view is particularly useful for: Users who find the single-day view too wide and wasteful of screen space Planning workflows that require seeing a few days at a glance without the full week Detailed scheduling tasks that benefit from the time-grid format Customizing the viewing window to match personal preference and screen size Configuration# Select the View: Choose \"Custom Days\" from the calendar toolbar alongside Month, Week, Day, and Year views Adjust Day Count: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days Set as Default: Optionally set \"Custom Days\" as your default view in Settings > Calendar > Default view Recurring Task Support# The Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior. Visual Hierarchy# Recurring tasks are displayed with distinct visual styling: Next Scheduled Occurrence: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance Pattern Instances: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule Drag and Drop Behavior# The calendar provides different behaviors depending on which type of recurring event you drag: Dragging Next Scheduled Occurrence (Solid Border): Updates only the scheduled field in the task Reschedules just that specific occurrence to the new date/time Leaves the recurrence pattern unchanged Notice: \"Rescheduled next occurrence. This does not change the recurrence pattern.\" Dragging Pattern Instances (Dashed Border): Updates the DTSTART time in the recurrence rule Changes when all future pattern instances appear Does not affect the independently scheduled next occurrence Notice: \"Updated recurring pattern time. All future instances now appear at this time.\" Flexible Scheduling# The next scheduled occurrence can appear on any date, even: Before the DTSTART date On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern) At different times than the pattern instances This flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling. View Options# The Calendar View provides several display options that control what types of events appear on the calendar: Show scheduled: Display tasks with scheduled dates Show due: Display tasks with due dates Show timeblocks: Display time-blocking entries Show recurring: Display recurring task events Show ICS events: Display events from imported ICS calendars Show time entries: Display time tracking entries All-day slot: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views) Create daily notes from date links: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes. Drag/drop resolution: Set snapDuration when you want events to drag or resize in smaller increments than the visible slotDuration, such as 5-minute dragging on a 30-minute grid. Span tasks between scheduled and due dates: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below) Multiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles. The All-day slot option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view. Multi-Day Task Spans# The Span tasks between scheduled and due dates option provides a visual representation of task duration on the calendar. When enabled: Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date This replaces the separate scheduled and due markers for qualifying tasks Tasks with only a scheduled date or only a due date continue to display as single-day events Span events are shown as all-day bars with the task's priority color Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify) This option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views. These display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions. OAuth Calendar Integration# The Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication: Google Calendar: Connect to Google Calendar accounts to display and sync events Microsoft Outlook: Connect to Microsoft Outlook accounts for calendar integration Synchronization Behavior# External calendar events appear alongside TaskNotes tasks in all calendar views Drag and drop events to reschedule them - changes sync back to the external calendar service Events from external calendars respect the same view options and display settings as native TaskNotes tasks Configuration# OAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services. Time Entry Editor Modal# The Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface. Creating Time Entries# Drag on the calendar to select a time range When the selection menu appears, choose Create time entry The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone Editing Time Entries# Time entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata. Filtering and View Configuration# Calendar filtering is configured through the Bases YAML frontmatter in the .base file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin. Saved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes."},{"route":"/obsidian/views/kanban-view/","title":"Kanban View","description":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag o...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/kanban-view.md","namespace":"obsidian","relativePath":"views/kanban-view.md","raw":"# Kanban View\n\n\nThe Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property.\nKanban emphasizes state transitions and drag operations over dense list scanning.\n\n![Kanban View](../assets/views-kanban.png)\n\n## Configuration\n\nKanban views are stored as `.base` files in `TaskNotes/Views/`. The `groupBy` property determines the column structure—each unique value becomes a column in the board. Open a `.base` file and access the view settings panel to configure options.\n\n### Core Settings (Bases)\n\n- **Data source**: Select which files or folders to include in the view\n- **Filter**: Define criteria to include or exclude specific tasks\n- **Sort**: Specify the order of tasks within each column\n- **Group by**: Required. Defines the property that creates columns (e.g., status, priority)\nChoosing a stable `groupBy` field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder.\n\n### Kanban-Specific Options\n\nAccess these options through the Bases view settings panel:\n\n- **Swim Lane**: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane)\n- **Column Width**: Controls the width of columns in pixels. Range: 200-500px. Default: 280px\n- **Max Swimlane Height**: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px\n- **Hide Empty Columns**: When enabled, columns containing no tasks are hidden from the view\n- **Pinned Columns**: Optional comma-separated list of column values that should stay visible even when empty. This is useful with **Hide Empty Columns** when each board needs a small stable subset of shared statuses or categories\n- **WIP Limits**: Advanced JSON configuration for showing per-column work-in-progress limits in column headers\n- **Hide Empty Swimlanes**: When enabled, ordered swimlanes with no tasks are hidden from the view\n- **Card Layout**: Chooses the task card density for this board. **Default** uses the standard TaskNotes card layout. **Compact** uses a tighter card layout for denser boards\n- **Show items in multiple columns**: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with `contexts: [work, call]` appears in both the \"work\" and \"call\" columns. When disabled, tasks appear in a single combined column (e.g., \"work, call\")\n- **Hide top-level subtasks**: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks\n- **Column Order**: Managed automatically when dragging column headers. Stores custom column ordering\n- **Swim Lane Order**: Advanced JSON configuration for pinning swimlane rows in a stable order\nA common setup is to keep one board grouped by status and another grouped by project or context, each in a separate `.base` file.\n\n## Interface Layout\n\n### Standard Layout\n\nIn standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the `groupBy` property.\n\nEach column includes:\n- A header showing the property value and task count\n- A scrollable area containing task cards\n- An add button that opens the TaskNotes creation modal with the column value filled in\n- Drag-and-drop functionality for reordering columns or moving tasks between columns\n\n### Swimlane Layout\n\nWhen a `swimLane` property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes.\n\nEach swimlane row includes:\n- A label cell showing the swimlane property value and total task count\n- Multiple cells, each representing a column within that swimlane\n- Scrollable cells containing task cards\n- Add buttons inside cells that fill in both the column value and swimlane value\n\nTo pin swimlanes in a stable order, set the advanced `swimLaneOrder` option to a JSON object keyed by the swimlane property:\n\n```yaml\nconfig:\n swimLane: note.contexts\n swimLaneOrder: '{\"note.contexts\":[\"transitcal\",\"bill\",\"cycles-research\",\"astrolabe\"]}'\n```\n\nListed swimlane values render first in the configured order. Values not listed in `swimLaneOrder` render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If `hideEmptySwimLanes` is disabled, listed values can remain visible even when no matching tasks are currently present.\n\nTo show WIP limits in column headers, set the advanced `wipLimits` option to a JSON object keyed by column value:\n\n```yaml\nconfig:\n wipLimits: '{\"in-progress\":5,\"review\":2}'\n```\n\nColumns with limits display counts as `(current/limit)`. When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes.\n\n## Task Cards\n\nEach task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date.\n\nUse the **Card Layout** setting when a board needs a different density from other task views. Existing boards use **Default** unless `cardLayout: compact` is set in the view options.\n\nTo show checklist progress on cards, include `file.tasks` in the view `order` array.\nFor existing `.base` files, add this in YAML manually first; after it is in `order`, it appears in the Bases picker as `tasks`.\n\nClick a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties.\n\n## Column Operations\n\n### Reordering Columns\n\nDrag column headers to reorder columns. The new order persists across sessions and is stored in the `columnOrder` configuration.\n\n### Drag-and-Drop Tasks\n\nDrag task cards between columns to update the `groupBy` property value. In swimlane mode, dragging a task to a different cell updates both the `groupBy` and `swimLane` properties.\n\nWhen grouping by a list property (contexts, tags, projects) with \"Show items in multiple columns\" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the \"work\" column to the \"home\" column changes `contexts: [work, call]` to `contexts: [call, home]`.\nDrag operations write directly to task metadata, so consistent grouping values reduce ambiguity.\n\nThe add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location.\n\n### Manual Reordering Within Columns\n\nKanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is `tasknotes_manual_order`.\n\nTo enable persistent manual ordering within Kanban columns:\n\n```yaml\nsort:\n - column: tasknotes_manual_order\n direction: DESC\n```\n\nOnce the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions.\n\nIn swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the \"In Progress\" column for the \"High\" swimlane only adjusts the tasks in that cell.\n\nImportant constraints:\n\n- Manual drag-to-reorder only works when the view sort includes the manual-order property.\n- Moving a card to a different column or swimlane still updates the grouped property values as usual.\n- In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.\n- Large reorder operations may show a confirmation dialog before writing changes.\n\nThe default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists.\n\n## Performance Optimization\n\nThe Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks.\n\nVirtual scrolling activates automatically based on task count. No configuration is required.\n\n## Example Configuration\n\nA typical Kanban view `.base` file includes:\n\n```yaml\n---\ntype: query\nsource: TaskNotes\nview: TaskNotes Kanban\nviews:\n - name: TaskNotes Kanban\n type: tasknotesKanban\n groupBy:\n property: task.status\n config:\n swimLane: task.priority\n swimLaneOrder: '{\"task.priority\":[\"high\",\"normal\",\"low\"]}'\n columnWidth: 300\n hideEmptyColumns: true\n pinnedColumns: to-do, in-progress, done\n wipLimits: '{\"in-progress\":5}'\n---\n```\n\nThis configuration creates a Kanban board with:\n- Columns based on task status\n- Swimlanes based on task priority\n- Priority swimlanes pinned in high, normal, low order\n- 300px column width\n- Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets\n- A WIP limit of 5 tasks on the in-progress column\n\n## Filtering and Sorting\n\nFiltering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column.\n","aliases":["/views/kanban-view/"],"toc":[{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"core-settings-bases","text":"Core Settings (Bases)"},{"level":3,"id":"kanban-specific-options","text":"Kanban-Specific Options"},{"level":2,"id":"interface-layout","text":"Interface Layout"},{"level":3,"id":"standard-layout","text":"Standard Layout"},{"level":3,"id":"swimlane-layout","text":"Swimlane Layout"},{"level":2,"id":"task-cards","text":"Task Cards"},{"level":2,"id":"column-operations","text":"Column Operations"},{"level":3,"id":"reordering-columns","text":"Reordering Columns"},{"level":3,"id":"drag-and-drop-tasks","text":"Drag-and-Drop Tasks"},{"level":3,"id":"manual-reordering-within-columns","text":"Manual Reordering Within Columns"},{"level":2,"id":"performance-optimization","text":"Performance Optimization"},{"level":2,"id":"example-configuration","text":"Example Configuration"},{"level":2,"id":"filtering-and-sorting","text":"Filtering and Sorting"}],"html":"

The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property.\nKanban emphasizes state transitions and drag operations over dense list scanning.

\n

\"Kanban

\n

Configuration#

\n

Kanban views are stored as .base files in TaskNotes/Views/. The groupBy property determines the column structure—each unique value becomes a column in the board. Open a .base file and access the view settings panel to configure options.

\n

Core Settings (Bases)#

\n
    \n
  • Data source: Select which files or folders to include in the view
  • \n
  • Filter: Define criteria to include or exclude specific tasks
  • \n
  • Sort: Specify the order of tasks within each column
  • \n
  • Group by: Required. Defines the property that creates columns (e.g., status, priority)\nChoosing a stable groupBy field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder.
  • \n
\n

Kanban-Specific Options#

\n

Access these options through the Bases view settings panel:

\n
    \n
  • Swim Lane: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane)
  • \n
  • Column Width: Controls the width of columns in pixels. Range: 200-500px. Default: 280px
  • \n
  • Max Swimlane Height: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px
  • \n
  • Hide Empty Columns: When enabled, columns containing no tasks are hidden from the view
  • \n
  • Pinned Columns: Optional comma-separated list of column values that should stay visible even when empty. This is useful with Hide Empty Columns when each board needs a small stable subset of shared statuses or categories
  • \n
  • WIP Limits: Advanced JSON configuration for showing per-column work-in-progress limits in column headers
  • \n
  • Hide Empty Swimlanes: When enabled, ordered swimlanes with no tasks are hidden from the view
  • \n
  • Card Layout: Chooses the task card density for this board. Default uses the standard TaskNotes card layout. Compact uses a tighter card layout for denser boards
  • \n
  • Show items in multiple columns: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with contexts: [work, call] appears in both the "work" and "call" columns. When disabled, tasks appear in a single combined column (e.g., "work, call")
  • \n
  • Hide top-level subtasks: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks
  • \n
  • Column Order: Managed automatically when dragging column headers. Stores custom column ordering
  • \n
  • Swim Lane Order: Advanced JSON configuration for pinning swimlane rows in a stable order\nA common setup is to keep one board grouped by status and another grouped by project or context, each in a separate .base file.
  • \n
\n

Interface Layout#

\n

Standard Layout#

\n

In standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the groupBy property.

\n

Each column includes:

\n
    \n
  • A header showing the property value and task count
  • \n
  • A scrollable area containing task cards
  • \n
  • An add button that opens the TaskNotes creation modal with the column value filled in
  • \n
  • Drag-and-drop functionality for reordering columns or moving tasks between columns
  • \n
\n

Swimlane Layout#

\n

When a swimLane property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes.

\n

Each swimlane row includes:

\n
    \n
  • A label cell showing the swimlane property value and total task count
  • \n
  • Multiple cells, each representing a column within that swimlane
  • \n
  • Scrollable cells containing task cards
  • \n
  • Add buttons inside cells that fill in both the column value and swimlane value
  • \n
\n

To pin swimlanes in a stable order, set the advanced swimLaneOrder option to a JSON object keyed by the swimlane property:

\n
config:\n  swimLane: note.contexts\n  swimLaneOrder: '{"note.contexts":["transitcal","bill","cycles-research","astrolabe"]}'\n

Listed swimlane values render first in the configured order. Values not listed in swimLaneOrder render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If hideEmptySwimLanes is disabled, listed values can remain visible even when no matching tasks are currently present.

\n

To show WIP limits in column headers, set the advanced wipLimits option to a JSON object keyed by column value:

\n
config:\n  wipLimits: '{"in-progress":5,"review":2}'\n

Columns with limits display counts as (current/limit). When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes.

\n

Task Cards#

\n

Each task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date.

\n

Use the Card Layout setting when a board needs a different density from other task views. Existing boards use Default unless cardLayout: compact is set in the view options.

\n

To show checklist progress on cards, include file.tasks in the view order array.\nFor existing .base files, add this in YAML manually first; after it is in order, it appears in the Bases picker as tasks.

\n

Click a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties.

\n

Column Operations#

\n

Reordering Columns#

\n

Drag column headers to reorder columns. The new order persists across sessions and is stored in the columnOrder configuration.

\n

Drag-and-Drop Tasks#

\n

Drag task cards between columns to update the groupBy property value. In swimlane mode, dragging a task to a different cell updates both the groupBy and swimLane properties.

\n

When grouping by a list property (contexts, tags, projects) with "Show items in multiple columns" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the "work" column to the "home" column changes contexts: [work, call] to contexts: [call, home].\nDrag operations write directly to task metadata, so consistent grouping values reduce ambiguity.

\n

The add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location.

\n

Manual Reordering Within Columns#

\n

Kanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order.

\n

To enable persistent manual ordering within Kanban columns:

\n
sort:\n  - column: tasknotes_manual_order\n    direction: DESC\n

Once the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions.

\n

In swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the "In Progress" column for the "High" swimlane only adjusts the tasks in that cell.

\n

Important constraints:

\n
    \n
  • Manual drag-to-reorder only works when the view sort includes the manual-order property.
  • \n
  • Moving a card to a different column or swimlane still updates the grouped property values as usual.
  • \n
  • In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.
  • \n
  • Large reorder operations may show a confirmation dialog before writing changes.
  • \n
\n

The default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists.

\n

Performance Optimization#

\n

The Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks.

\n

Virtual scrolling activates automatically based on task count. No configuration is required.

\n

Example Configuration#

\n

A typical Kanban view .base file includes:

\n
---\ntype: query\nsource: TaskNotes\nview: TaskNotes Kanban\nviews:\n  - name: TaskNotes Kanban\n    type: tasknotesKanban\n    groupBy:\n      property: task.status\n    config:\n      swimLane: task.priority\n      swimLaneOrder: '{"task.priority":["high","normal","low"]}'\n      columnWidth: 300\n      hideEmptyColumns: true\n      pinnedColumns: to-do, in-progress, done\n      wipLimits: '{"in-progress":5}'\n---\n

This configuration creates a Kanban board with:

\n
    \n
  • Columns based on task status
  • \n
  • Swimlanes based on task priority
  • \n
  • Priority swimlanes pinned in high, normal, low order
  • \n
  • 300px column width
  • \n
  • Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets
  • \n
  • A WIP limit of 5 tasks on the in-progress column
  • \n
\n

Filtering and Sorting#

\n

Filtering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column.

\n","text":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag operations over dense list scanning. Configuration# Kanban views are stored as .base files in TaskNotes/Views/. The groupBy property determines the column structure—each unique value becomes a column in the board. Open a .base file and access the view settings panel to configure options. Core Settings (Bases)# Data source: Select which files or folders to include in the view Filter: Define criteria to include or exclude specific tasks Sort: Specify the order of tasks within each column Group by: Required. Defines the property that creates columns (e.g., status, priority) Choosing a stable groupBy field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder. Kanban-Specific Options# Access these options through the Bases view settings panel: Swim Lane: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane) Column Width: Controls the width of columns in pixels. Range: 200-500px. Default: 280px Max Swimlane Height: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px Hide Empty Columns: When enabled, columns containing no tasks are hidden from the view Pinned Columns: Optional comma-separated list of column values that should stay visible even when empty. This is useful with Hide Empty Columns when each board needs a small stable subset of shared statuses or categories WIP Limits: Advanced JSON configuration for showing per-column work-in-progress limits in column headers Hide Empty Swimlanes: When enabled, ordered swimlanes with no tasks are hidden from the view Card Layout: Chooses the task card density for this board. Default uses the standard TaskNotes card layout. Compact uses a tighter card layout for denser boards Show items in multiple columns: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with contexts: [work, call] appears in both the \"work\" and \"call\" columns. When disabled, tasks appear in a single combined column (e.g., \"work, call\") Hide top-level subtasks: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks Column Order: Managed automatically when dragging column headers. Stores custom column ordering Swim Lane Order: Advanced JSON configuration for pinning swimlane rows in a stable order A common setup is to keep one board grouped by status and another grouped by project or context, each in a separate .base file. Interface Layout# Standard Layout# In standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the groupBy property. Each column includes: A header showing the property value and task count A scrollable area containing task cards An add button that opens the TaskNotes creation modal with the column value filled in Drag-and-drop functionality for reordering columns or moving tasks between columns Swimlane Layout# When a swimLane property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes. Each swimlane row includes: A label cell showing the swimlane property value and total task count Multiple cells, each representing a column within that swimlane Scrollable cells containing task cards Add buttons inside cells that fill in both the column value and swimlane value To pin swimlanes in a stable order, set the advanced swimLaneOrder option to a JSON object keyed by the swimlane property: config: swimLane: note.contexts swimLaneOrder: '{\"note.contexts\":[\"transitcal\",\"bill\",\"cycles-research\",\"astrolabe\"]}' Listed swimlane values render first in the configured order. Values not listed in swimLaneOrder render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If hideEmptySwimLanes is disabled, listed values can remain visible even when no matching tasks are currently present. To show WIP limits in column headers, set the advanced wipLimits option to a JSON object keyed by column value: config: wipLimits: '{\"in-progress\":5,\"review\":2}' Columns with limits display counts as (current/limit). When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes. Task Cards# Each task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date. Use the Card Layout setting when a board needs a different density from other task views. Existing boards use Default unless cardLayout: compact is set in the view options. To show checklist progress on cards, include file.tasks in the view order array. For existing .base files, add this in YAML manually first; after it is in order, it appears in the Bases picker as tasks. Click a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties. Column Operations# Reordering Columns# Drag column headers to reorder columns. The new order persists across sessions and is stored in the columnOrder configuration. Drag-and-Drop Tasks# Drag task cards between columns to update the groupBy property value. In swimlane mode, dragging a task to a different cell updates both the groupBy and swimLane properties. When grouping by a list property (contexts, tags, projects) with \"Show items in multiple columns\" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the \"work\" column to the \"home\" column changes contexts: [work, call] to contexts: [call, home]. Drag operations write directly to task metadata, so consistent grouping values reduce ambiguity. The add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location. Manual Reordering Within Columns# Kanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering within Kanban columns: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions. In swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the \"In Progress\" column for the \"High\" swimlane only adjusts the tasks in that cell. Important constraints: Manual drag-to-reorder only works when the view sort includes the manual-order property. Moving a card to a different column or swimlane still updates the grouped property values as usual. In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists. Performance Optimization# The Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks. Virtual scrolling activates automatically based on task count. No configuration is required. Example Configuration# A typical Kanban view .base file includes: --- type: query source: TaskNotes view: TaskNotes Kanban views: - name: TaskNotes Kanban type: tasknotesKanban groupBy: property: task.status config: swimLane: task.priority swimLaneOrder: '{\"task.priority\":[\"high\",\"normal\",\"low\"]}' columnWidth: 300 hideEmptyColumns: true pinnedColumns: to-do, in-progress, done wipLimits: '{\"in-progress\":5}' --- This configuration creates a Kanban board with: Columns based on task status Swimlanes based on task priority Priority swimlanes pinned in high, normal, low order 300px column width Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets A WIP limit of 5 tasks on the in-progress column Filtering and Sorting# Filtering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column."},{"route":"/obsidian/views/pomodoro-view/","title":"Pomodoro View","description":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/pomodoro-view.md","namespace":"obsidian","relativePath":"views/pomodoro-view.md","raw":"# Pomodoro View\n\n\nThe Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.\n\n## Timer Interface\n\nThe Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete.\n\n![Pomodoro Timer](../assets/feature-pomodoro-timer.png)\n\n## Pomodoro Stats View\n\nThe Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks.\n\n![Pomodoro Statistics](../assets/feature-pomodoro-stats.png)\n","aliases":["/views/pomodoro-view/"],"toc":[{"level":2,"id":"timer-interface","text":"Timer Interface"},{"level":2,"id":"pomodoro-stats-view","text":"Pomodoro Stats View"}],"html":"

The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.

\n

Timer Interface#

\n

The Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete.

\n

\"Pomodoro

\n

Pomodoro Stats View#

\n

The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks.

\n

\"Pomodoro

\n","text":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique. Timer Interface# The Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete. Pomodoro Stats View# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks."},{"route":"/obsidian/views/task-list/","title":"Task List View","description":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/task-list.md","namespace":"obsidian","relativePath":"views/task-list.md","raw":"# Task List View\n\n\nThe Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML.\nThis view is optimized for high task volume and explicit filter definitions.\n\n![Task List View](../assets/views-tasks-list.png)\n\n## Bases Architecture\n\nTask List is implemented as a `.base` file located in `TaskNotes/Views/tasks-default.base` by default. It requires the Bases core plugin to be enabled.\n\n### What is Bases?\n\nBases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks.\n\nTo enable Bases:\n1. Open `Settings -> Core Plugins`\n2. Enable \"Bases\"\n3. TaskNotes view commands will now open `.base` files from `TaskNotes/Views/`\nIf commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended `.base` file.\n\n### View File Location\n\nWhen you use the \"Open Tasks View\" command or ribbon icon, TaskNotes opens the `.base` file configured under `Settings -> TaskNotes -> General -> Views & base files` (initially `TaskNotes/Views/tasks-default.base`). TaskNotes creates missing default `.base` files automatically on startup when **Auto-create default files** is enabled, and you can point the command to any other `.base` file if you maintain multiple task-list layouts.\n\n## Configuration\n\nTask List views are configured through YAML frontmatter in the `.base` file. The YAML defines which tasks to show, how to sort them, and how to group them.\n\n### Basic Structure\n\n```yaml\n# All Tasks\n\nviews:\n - type: tasknotesTaskList\n name: \"All Tasks\"\n order:\n - note.status\n - note.priority\n - note.due\n - note.scheduled\n - note.projects\n - note.contexts\n - file.tags\n sort:\n - column: due\n direction: ASC\n```\n\n### Configuration Options\n\n**`type`**: Must be `tasknotesTaskList` for Task List views\n\n**`name`**: Display name shown in the view header\n\n**`order`**: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., `note.status`, `note.priority`, `note.due`, `file.tasks`).\nFor existing `.base` files, add `file.tasks` in YAML manually; once present in `order`, it appears in the Bases picker as `tasks`.\n\n**`sort`**: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria.\n- `column`: Property to sort by (e.g., `due`, `scheduled`, `priority`, `title`)\n- `direction`: `ASC` (ascending) or `DESC` (descending)\n\n**`groupBy`**: Optional grouping configuration\n- `property`: Property to group by (e.g., `note.status`, `note.priority`)\n- `direction`: Sort direction for group headers\n\n**`hideTopLevelSubtasks`**: Optional boolean. When `true`, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks.\n\n**`filters`**: Optional filter conditions using Bases query syntax\n```yaml\nfilters:\n and:\n - note.status == \"Open\"\n - note.priority == \"High\"\n```\nStart with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites.\n\n### Property Mapping\n\nTaskNotes properties are accessed in Bases YAML using these paths:\n\n| TaskNotes Property | Bases Property Path | Description |\n|-------------------|-------------------|-------------|\n| Status | `note.status` | Task status value |\n| Priority | `note.priority` | Priority level |\n| Due date | `note.due` | Due date/time |\n| Scheduled date | `note.scheduled` | Scheduled date/time |\n| Projects | `note.projects` | Associated projects |\n| Contexts | `note.contexts` | Task contexts |\n| Tags | `file.tags` | File tags |\n| Checklist progress | `file.tasks` | First-level markdown checkbox progress shown as the TaskNotes checklist progress bar |\n| Time estimate | `note.timeEstimate` | Estimated duration |\n| Recurrence | `note.recurrence` | Recurrence pattern |\n| Blocked by | `note.blockedBy` | Blocking dependencies |\n| Title | `file.name` | Task title (file name) |\n| Created | `file.ctime` | File creation date |\n| Modified | `file.mtime` | File modification date |\n\nThe exact property names depend on your TaskNotes field mapping settings (`Settings -> TaskNotes -> Task Properties`). The table above shows default mappings.\n\n## Filtering and Sorting\n\n### Adding Filters\n\nEdit the `.base` file to add filter conditions using Bases query syntax:\n\n```yaml\nviews:\n - type: tasknotesTaskList\n name: \"High Priority Tasks\"\n filters:\n and:\n - note.priority == \"High\"\n - note.status != \"Completed\"\n order:\n - note.status\n - note.priority\n - note.due\n```\n\n### Filter Operators\n\nBases supports standard comparison operators:\n- `==` (equals), `!=` (not equals)\n- `>`, `<`, `>=`, `<=` (comparison)\n- `contains()` (substring/array membership)\n- Boolean logic: `and`, `or`\n\nFor detailed filter syntax, see the [Bases documentation](https://help.obsidian.md/Plugins/Bases).\n\n### Sorting Examples\n\nSingle sort criterion:\n```yaml\nsort:\n - column: due\n direction: ASC\n```\n\nMultiple sort criteria:\n```yaml\nsort:\n - column: priority\n direction: DESC\n - column: due\n direction: ASC\n - column: title\n direction: ASC\n```\n\n### Drag-to-Reorder\n\nTask List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is `tasknotes_manual_order`.\n\nTo enable persistent manual ordering in a Task List view:\n\n```yaml\nsort:\n - column: tasknotes_manual_order\n direction: DESC\n```\n\nOnce the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions.\n\nIf your field mapping changes the sort-order property name, use that mapped property name instead of `tasknotes_manual_order`.\n\n### Drag-to-Reorder with Grouping\n\nGrouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the \"In Progress\" group updates the manual order for tasks in that group.\n\nImportant constraints:\n\n- Drag-to-reorder only works when the view sort includes the manual-order property.\n- Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly.\n- In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.\n- Large reorder operations may show a confirmation dialog before writing changes.\n\nThe default generated TaskNotes task-list templates include a **Manual Order** view that is already configured for this behavior.\n\n## Grouping\n\nGroups organize tasks under collapsible headers based on a property value.\n\n### Enable Grouping\n\nAdd `groupBy` configuration to your view:\n\n```yaml\nviews:\n - type: tasknotesTaskList\n name: \"Tasks by Status\"\n groupBy:\n property: note.status\n direction: ASC\n order:\n - note.status\n - note.priority\n - note.due\n```\n\n### Available Grouping Properties\n\nCommon grouping properties:\n- `note.status` - Group by task status\n- `note.priority` - Group by priority level\n- `note.contexts` - Group by first context\n- `note.projects` - Group by project (tasks can appear in multiple groups)\n\n### Interactive Group Headers\n\nGroup headers support interaction:\n- Click to expand/collapse the group\n- Click on project links in headers to navigate to project notes\n- Hover over project links with Ctrl to preview project notes\n\n### Collapsed State Persistence\n\nCollapsed/expanded state for each group is preserved across sessions.\n\n## Creating Multiple Views\n\nYou can create multiple `.base` files for different task perspectives:\n\n1. Duplicate an existing `.base` file in `TaskNotes/Views/`\n2. Rename it (e.g., `High Priority.base`)\n3. Edit the YAML configuration for that view\n4. Open the file to see the customized view\n\n### Example: Context-Specific View\n\n```yaml\n# Work Tasks\n\nviews:\n - type: tasknotesTaskList\n name: \"Work Context\"\n filters:\n and:\n - note.contexts.contains(\"work\")\n groupBy:\n property: note.priority\n direction: DESC\n order:\n - note.status\n - note.priority\n - note.due\n```\n\n## Migrating from v3 Saved Views\n\nTaskNotes v3 stored filter configurations in plugin settings. These saved views are **not automatically migrated** to v4.\n\nTo recreate a v3 saved view:\n1. Create a new `.base` file in `TaskNotes/Views/`\n2. Translate your v3 filter conditions to Bases YAML syntax\n3. Configure sorting and grouping through YAML\n4. Save the file\n\nThe v3 FilterBar UI component no longer exists - all configuration is done through YAML editing.\n\n## Task Actions\n\nThe Task List View provides interaction with tasks through clicking and context menus:\n\n- **Click on a task**: Opens the task for editing or navigates to the task note (behavior configured in `Settings -> TaskNotes -> General` in click-action controls)\n- **Right-click on a task**: Opens a context menu with actions:\n - Mark as complete\n - Change priority\n - Change status\n - Edit dates\n - Delete task\n - And more\n\nContext menu availability depends on your TaskNotes settings and task properties.\n\n## Virtual Scrolling\n\nThe Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides:\n\n- Approximately 90% memory reduction for large lists\n- Elimination of UI lag when scrolling through hundreds of tasks\n- Smooth performance with unlimited task counts\n\nVirtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll.\n\n## Further Reading\n\n- [Default Base Templates](default-base-templates.md) - Complete templates for all TaskNotes views\n- [Bases Plugin Documentation](https://help.obsidian.md/Plugins/Bases) - Official Obsidian documentation for Bases syntax and features\n- [Kanban View](kanban-view.md) - Alternative board-based task visualization\n- [Calendar Views](calendar-views.md) - Time-based task visualization\n- [Views Overview](../views.md) - All available TaskNotes views\n","aliases":["/views/task-list/"],"toc":[{"level":2,"id":"bases-architecture","text":"Bases Architecture"},{"level":3,"id":"what-is-bases","text":"What is Bases?"},{"level":3,"id":"view-file-location","text":"View File Location"},{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"basic-structure","text":"Basic Structure"},{"level":3,"id":"configuration-options","text":"Configuration Options"},{"level":3,"id":"property-mapping","text":"Property Mapping"},{"level":2,"id":"filtering-and-sorting","text":"Filtering and Sorting"},{"level":3,"id":"adding-filters","text":"Adding Filters"},{"level":3,"id":"filter-operators","text":"Filter Operators"},{"level":3,"id":"sorting-examples","text":"Sorting Examples"},{"level":3,"id":"drag-to-reorder","text":"Drag-to-Reorder"},{"level":3,"id":"drag-to-reorder-with-grouping","text":"Drag-to-Reorder with Grouping"},{"level":2,"id":"grouping","text":"Grouping"},{"level":3,"id":"enable-grouping","text":"Enable Grouping"},{"level":3,"id":"available-grouping-properties","text":"Available Grouping Properties"},{"level":3,"id":"interactive-group-headers","text":"Interactive Group Headers"},{"level":3,"id":"collapsed-state-persistence","text":"Collapsed State Persistence"},{"level":2,"id":"creating-multiple-views","text":"Creating Multiple Views"},{"level":3,"id":"example-context-specific-view","text":"Example: Context-Specific View"},{"level":2,"id":"migrating-from-v3-saved-views","text":"Migrating from v3 Saved Views"},{"level":2,"id":"task-actions","text":"Task Actions"},{"level":2,"id":"virtual-scrolling","text":"Virtual Scrolling"},{"level":2,"id":"further-reading","text":"Further Reading"}],"html":"

The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML.\nThis view is optimized for high task volume and explicit filter definitions.

\n

\"Task

\n

Bases Architecture#

\n

Task List is implemented as a .base file located in TaskNotes/Views/tasks-default.base by default. It requires the Bases core plugin to be enabled.

\n

What is Bases?#

\n

Bases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks.

\n

To enable Bases:

\n
    \n
  1. Open Settings -> Core Plugins
  2. \n
  3. Enable "Bases"
  4. \n
  5. TaskNotes view commands will now open .base files from TaskNotes/Views/\nIf commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended .base file.
  6. \n
\n

View File Location#

\n

When you use the "Open Tasks View" command or ribbon icon, TaskNotes opens the .base file configured under Settings -> TaskNotes -> General -> Views & base files (initially TaskNotes/Views/tasks-default.base). TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled, and you can point the command to any other .base file if you maintain multiple task-list layouts.

\n

Configuration#

\n

Task List views are configured through YAML frontmatter in the .base file. The YAML defines which tasks to show, how to sort them, and how to group them.

\n

Basic Structure#

\n
# All Tasks\n\nviews:\n  - type: tasknotesTaskList\n    name: "All Tasks"\n    order:\n      - note.status\n      - note.priority\n      - note.due\n      - note.scheduled\n      - note.projects\n      - note.contexts\n      - file.tags\n    sort:\n      - column: due\n        direction: ASC\n

Configuration Options#

\n

type: Must be tasknotesTaskList for Task List views

\n

name: Display name shown in the view header

\n

order: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., note.status, note.priority, note.due, file.tasks).\nFor existing .base files, add file.tasks in YAML manually; once present in order, it appears in the Bases picker as tasks.

\n

sort: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria.

\n
    \n
  • column: Property to sort by (e.g., due, scheduled, priority, title)
  • \n
  • direction: ASC (ascending) or DESC (descending)
  • \n
\n

groupBy: Optional grouping configuration

\n
    \n
  • property: Property to group by (e.g., note.status, note.priority)
  • \n
  • direction: Sort direction for group headers
  • \n
\n

hideTopLevelSubtasks: Optional boolean. When true, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks.

\n

filters: Optional filter conditions using Bases query syntax

\n
filters:\n  and:\n    - note.status == "Open"\n    - note.priority == "High"\n

Start with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites.

\n

Property Mapping#

\n

TaskNotes properties are accessed in Bases YAML using these paths:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TaskNotes PropertyBases Property PathDescription
Statusnote.statusTask status value
Prioritynote.priorityPriority level
Due datenote.dueDue date/time
Scheduled datenote.scheduledScheduled date/time
Projectsnote.projectsAssociated projects
Contextsnote.contextsTask contexts
Tagsfile.tagsFile tags
Checklist progressfile.tasksFirst-level markdown checkbox progress shown as the TaskNotes checklist progress bar
Time estimatenote.timeEstimateEstimated duration
Recurrencenote.recurrenceRecurrence pattern
Blocked bynote.blockedByBlocking dependencies
Titlefile.nameTask title (file name)
Createdfile.ctimeFile creation date
Modifiedfile.mtimeFile modification date
\n

The exact property names depend on your TaskNotes field mapping settings (Settings -> TaskNotes -> Task Properties). The table above shows default mappings.

\n

Filtering and Sorting#

\n

Adding Filters#

\n

Edit the .base file to add filter conditions using Bases query syntax:

\n
views:\n  - type: tasknotesTaskList\n    name: "High Priority Tasks"\n    filters:\n      and:\n        - note.priority == "High"\n        - note.status != "Completed"\n    order:\n      - note.status\n      - note.priority\n      - note.due\n

Filter Operators#

\n

Bases supports standard comparison operators:

\n
    \n
  • == (equals), != (not equals)
  • \n
  • >, <, >=, <= (comparison)
  • \n
  • contains() (substring/array membership)
  • \n
  • Boolean logic: and, or
  • \n
\n

For detailed filter syntax, see the Bases documentation.

\n

Sorting Examples#

\n

Single sort criterion:

\n
sort:\n  - column: due\n    direction: ASC\n

Multiple sort criteria:

\n
sort:\n  - column: priority\n    direction: DESC\n  - column: due\n    direction: ASC\n  - column: title\n    direction: ASC\n

Drag-to-Reorder#

\n

Task List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order.

\n

To enable persistent manual ordering in a Task List view:

\n
sort:\n  - column: tasknotes_manual_order\n    direction: DESC\n

Once the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions.

\n

If your field mapping changes the sort-order property name, use that mapped property name instead of tasknotes_manual_order.

\n

Drag-to-Reorder with Grouping#

\n

Grouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the "In Progress" group updates the manual order for tasks in that group.

\n

Important constraints:

\n
    \n
  • Drag-to-reorder only works when the view sort includes the manual-order property.
  • \n
  • Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly.
  • \n
  • In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.
  • \n
  • Large reorder operations may show a confirmation dialog before writing changes.
  • \n
\n

The default generated TaskNotes task-list templates include a Manual Order view that is already configured for this behavior.

\n

Grouping#

\n

Groups organize tasks under collapsible headers based on a property value.

\n

Enable Grouping#

\n

Add groupBy configuration to your view:

\n
views:\n  - type: tasknotesTaskList\n    name: "Tasks by Status"\n    groupBy:\n      property: note.status\n      direction: ASC\n    order:\n      - note.status\n      - note.priority\n      - note.due\n

Available Grouping Properties#

\n

Common grouping properties:

\n
    \n
  • note.status - Group by task status
  • \n
  • note.priority - Group by priority level
  • \n
  • note.contexts - Group by first context
  • \n
  • note.projects - Group by project (tasks can appear in multiple groups)
  • \n
\n

Interactive Group Headers#

\n

Group headers support interaction:

\n
    \n
  • Click to expand/collapse the group
  • \n
  • Click on project links in headers to navigate to project notes
  • \n
  • Hover over project links with Ctrl to preview project notes
  • \n
\n

Collapsed State Persistence#

\n

Collapsed/expanded state for each group is preserved across sessions.

\n

Creating Multiple Views#

\n

You can create multiple .base files for different task perspectives:

\n
    \n
  1. Duplicate an existing .base file in TaskNotes/Views/
  2. \n
  3. Rename it (e.g., High Priority.base)
  4. \n
  5. Edit the YAML configuration for that view
  6. \n
  7. Open the file to see the customized view
  8. \n
\n

Example: Context-Specific View#

\n
# Work Tasks\n\nviews:\n  - type: tasknotesTaskList\n    name: "Work Context"\n    filters:\n      and:\n        - note.contexts.contains("work")\n    groupBy:\n      property: note.priority\n      direction: DESC\n    order:\n      - note.status\n      - note.priority\n      - note.due\n

Migrating from v3 Saved Views#

\n

TaskNotes v3 stored filter configurations in plugin settings. These saved views are not automatically migrated to v4.

\n

To recreate a v3 saved view:

\n
    \n
  1. Create a new .base file in TaskNotes/Views/
  2. \n
  3. Translate your v3 filter conditions to Bases YAML syntax
  4. \n
  5. Configure sorting and grouping through YAML
  6. \n
  7. Save the file
  8. \n
\n

The v3 FilterBar UI component no longer exists - all configuration is done through YAML editing.

\n

Task Actions#

\n

The Task List View provides interaction with tasks through clicking and context menus:

\n
    \n
  • Click on a task: Opens the task for editing or navigates to the task note (behavior configured in Settings -> TaskNotes -> General in click-action controls)
  • \n
  • Right-click on a task: Opens a context menu with actions:
      \n
    • Mark as complete
    • \n
    • Change priority
    • \n
    • Change status
    • \n
    • Edit dates
    • \n
    • Delete task
    • \n
    • And more
    • \n
    \n
  • \n
\n

Context menu availability depends on your TaskNotes settings and task properties.

\n

Virtual Scrolling#

\n

The Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides:

\n
    \n
  • Approximately 90% memory reduction for large lists
  • \n
  • Elimination of UI lag when scrolling through hundreds of tasks
  • \n
  • Smooth performance with unlimited task counts
  • \n
\n

Virtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll.

\n

Further Reading#

\n\n","text":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML. This view is optimized for high task volume and explicit filter definitions. Bases Architecture# Task List is implemented as a .base file located in TaskNotes/Views/tasks-default.base by default. It requires the Bases core plugin to be enabled. What is Bases?# Bases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks. To enable Bases: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes view commands will now open .base files from TaskNotes/Views/ If commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended .base file. View File Location# When you use the \"Open Tasks View\" command or ribbon icon, TaskNotes opens the .base file configured under Settings -> TaskNotes -> General -> Views & base files (initially TaskNotes/Views/tasks-default.base). TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled, and you can point the command to any other .base file if you maintain multiple task-list layouts. Configuration# Task List views are configured through YAML frontmatter in the .base file. The YAML defines which tasks to show, how to sort them, and how to group them. Basic Structure# # All Tasks views: - type: tasknotesTaskList name: \"All Tasks\" order: - note.status - note.priority - note.due - note.scheduled - note.projects - note.contexts - file.tags sort: - column: due direction: ASC Configuration Options# type: Must be tasknotesTaskList for Task List views name: Display name shown in the view header order: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., note.status, note.priority, note.due, file.tasks). For existing .base files, add file.tasks in YAML manually; once present in order, it appears in the Bases picker as tasks. sort: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria. column: Property to sort by (e.g., due, scheduled, priority, title) direction: ASC (ascending) or DESC (descending) groupBy: Optional grouping configuration property: Property to group by (e.g., note.status, note.priority) direction: Sort direction for group headers hideTopLevelSubtasks: Optional boolean. When true, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks. filters: Optional filter conditions using Bases query syntax filters: and: - note.status == \"Open\" - note.priority == \"High\" Start with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites. Property Mapping# TaskNotes properties are accessed in Bases YAML using these paths: TaskNotes Property Bases Property Path Description Status note.status Task status value Priority note.priority Priority level Due date note.due Due date/time Scheduled date note.scheduled Scheduled date/time Projects note.projects Associated projects Contexts note.contexts Task contexts Tags file.tags File tags Checklist progress file.tasks First-level markdown checkbox progress shown as the TaskNotes checklist progress bar Time estimate note.timeEstimate Estimated duration Recurrence note.recurrence Recurrence pattern Blocked by note.blockedBy Blocking dependencies Title file.name Task title (file name) Created file.ctime File creation date Modified file.mtime File modification date The exact property names depend on your TaskNotes field mapping settings (Settings -> TaskNotes -> Task Properties). The table above shows default mappings. Filtering and Sorting# Adding Filters# Edit the .base file to add filter conditions using Bases query syntax: views: - type: tasknotesTaskList name: \"High Priority Tasks\" filters: and: - note.priority == \"High\" - note.status != \"Completed\" order: - note.status - note.priority - note.due Filter Operators# Bases supports standard comparison operators: == (equals), != (not equals) >, <, >=, <= (comparison) contains() (substring/array membership) Boolean logic: and, or For detailed filter syntax, see the Bases documentation. Sorting Examples# Single sort criterion: sort: - column: due direction: ASC Multiple sort criteria: sort: - column: priority direction: DESC - column: due direction: ASC - column: title direction: ASC Drag-to-Reorder# Task List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering in a Task List view: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions. If your field mapping changes the sort-order property name, use that mapped property name instead of tasknotes_manual_order. Drag-to-Reorder with Grouping# Grouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the \"In Progress\" group updates the manual order for tasks in that group. Important constraints: Drag-to-reorder only works when the view sort includes the manual-order property. Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly. In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes task-list templates include a Manual Order view that is already configured for this behavior. Grouping# Groups organize tasks under collapsible headers based on a property value. Enable Grouping# Add groupBy configuration to your view: views: - type: tasknotesTaskList name: \"Tasks by Status\" groupBy: property: note.status direction: ASC order: - note.status - note.priority - note.due Available Grouping Properties# Common grouping properties: note.status - Group by task status note.priority - Group by priority level note.contexts - Group by first context note.projects - Group by project (tasks can appear in multiple groups) Interactive Group Headers# Group headers support interaction: Click to expand/collapse the group Click on project links in headers to navigate to project notes Hover over project links with Ctrl to preview project notes Collapsed State Persistence# Collapsed/expanded state for each group is preserved across sessions. Creating Multiple Views# You can create multiple .base files for different task perspectives: Duplicate an existing .base file in TaskNotes/Views/ Rename it (e.g., High Priority.base) Edit the YAML configuration for that view Open the file to see the customized view Example: Context-Specific View# # Work Tasks views: - type: tasknotesTaskList name: \"Work Context\" filters: and: - note.contexts.contains(\"work\") groupBy: property: note.priority direction: DESC order: - note.status - note.priority - note.due Migrating from v3 Saved Views# TaskNotes v3 stored filter configurations in plugin settings. These saved views are not automatically migrated to v4. To recreate a v3 saved view: Create a new .base file in TaskNotes/Views/ Translate your v3 filter conditions to Bases YAML syntax Configure sorting and grouping through YAML Save the file The v3 FilterBar UI component no longer exists - all configuration is done through YAML editing. Task Actions# The Task List View provides interaction with tasks through clicking and context menus: Click on a task: Opens the task for editing or navigates to the task note (behavior configured in Settings -> TaskNotes -> General in click-action controls) Right-click on a task: Opens a context menu with actions: Mark as complete Change priority Change status Edit dates Delete task And more Context menu availability depends on your TaskNotes settings and task properties. Virtual Scrolling# The Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides: Approximately 90% memory reduction for large lists Elimination of UI lag when scrolling through hundreds of tasks Smooth performance with unlimited task counts Virtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll. Further Reading# Default Base Templates - Complete templates for all TaskNotes views Bases Plugin Documentation - Official Obsidian documentation for Bases syntax and features Kanban View - Alternative board-based task visualization Calendar Views - Time-based task visualization Views Overview - All available TaskNotes views"},{"route":"/obsidian/webhooks/","title":"TaskNotes Webhooks","description":"TaskNotes webhooks send HTTP POST requests when selected events occur.","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/webhooks.md","namespace":"obsidian","relativePath":"webhooks.md","raw":"# TaskNotes Webhooks\n\nTaskNotes webhooks send HTTP POST requests when selected events occur.\n\n## Prerequisites\n\n1. Enable HTTP API in `Settings -> TaskNotes -> Integrations -> HTTP API`.\n2. Create at least one webhook (settings UI or API).\n3. Subscribe it to one or more events.\n\n## Event Types\n\nTask events:\n\n- `task.created`\n- `task.updated`\n- `task.deleted`\n- `task.completed`\n- `task.archived`\n- `task.unarchived`\n\nTime events:\n\n- `time.started`\n- `time.stopped`\n\nPomodoro events:\n\n- `pomodoro.started`\n- `pomodoro.completed`\n- `pomodoro.interrupted`\n\nRecurring events:\n\n- `recurring.instance.completed`\n- `recurring.instance.skipped`\n\nCompleting a materialized occurrence note emits `recurring.instance.completed` with the reconciled parent task plus the completed `occurrence` and `date` in the event data. Skipping virtual recurring instances emits `recurring.instance.skipped`; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook.\n\nReminder events:\n\n- `reminder.triggered`\n\n## Payload Shape\n\nAll webhook payloads use the same top-level envelope:\n\n```json\n{\n \"event\": \"task.created\",\n \"timestamp\": \"2026-02-21T10:30:00.000Z\",\n \"vault\": {\n \"name\": \"My Vault\",\n \"path\": \"/path/to/vault\"\n },\n \"data\": {}\n}\n```\n\n`data` is event-specific.\n\n## Register and Manage Webhooks via API\n\n### Create\n\n`POST /api/webhooks`\n\nRequired fields:\n\n- `url` (string)\n- `events` (non-empty array)\n\nOptional fields:\n\n- `id`\n- `secret` (auto-generated if omitted)\n- `active` (default `true`)\n- `transformFile`\n- `corsHeaders` (default `true`)\n\nExample:\n\n```bash\ncurl -X POST http://localhost:8080/api/webhooks \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"url\": \"https://example.com/tasknotes\",\n \"events\": [\"task.completed\", \"task.created\"],\n \"transformFile\": \"TaskNotes/webhooks/slack.json\"\n }'\n```\n\n### List\n\n`GET /api/webhooks`\n\nReturns registered hooks. Secrets are not returned.\n\n### Delete\n\n`DELETE /api/webhooks/:id`\n\n### Delivery History\n\n`GET /api/webhooks/deliveries`\n\nReturns last 100 in-memory deliveries.\n\n## Delivery Behavior\n\nCurrent implementation behavior:\n\n- Webhook processing is asynchronous (fire-and-forget from task operation).\n- Each delivery starts with one attempt.\n- Failed deliveries retry with exponential backoff: `1s`, `2s`, `4s`.\n- Maximum retries: `3` retries after initial attempt (up to 4 attempts total).\n- If cumulative `failureCount` for a webhook exceeds `10`, webhook is auto-disabled.\n- No explicit request timeout is set in delivery fetch.\n\nBecause retries and duplicates are possible, handlers should be idempotent.\n\n## Signature Verification\n\nWhen `corsHeaders` is enabled (default), delivery includes:\n\n- `X-TaskNotes-Event`\n- `X-TaskNotes-Signature`\n- `X-TaskNotes-Delivery-ID`\n\nSignature is HMAC-SHA256 over `JSON.stringify(payload)` using webhook `secret`.\n\nNode.js example:\n\n```javascript\nconst crypto = require(\"crypto\");\n\nfunction verifyWebhook(payload, signature, secret) {\n const expected = crypto\n .createHmac(\"sha256\", secret)\n .update(JSON.stringify(payload))\n .digest(\"hex\");\n return signature === expected;\n}\n```\n\n## Payload Transformations\n\nA webhook can specify `transformFile` pointing to a file in your vault.\n\nSupported file types:\n\n- `.json`: event template map with variable interpolation\n\nIf transform execution fails, TaskNotes falls back to original payload.\n\nJavaScript transform files are no longer supported.\n\n### JSON Transform Files\n\nStructure:\n\n```json\n{\n \"task.completed\": {\n \"text\": \"Task completed: ${data.task.title}\",\n \"vault\": \"${vault.name}\"\n },\n \"default\": {\n \"text\": \"TaskNotes event: ${event}\"\n }\n}\n```\n\nRules:\n\n- Matching order: exact event key, then `default`.\n- Variables use `${path.to.value}`.\n- Missing variables are left unchanged.\n\n## CORS and Headers\n\nWebhook delivery requests are outbound server-side requests from TaskNotes.\n\n`corsHeaders` behavior:\n\n- `true` (default): sends TaskNotes custom headers including signature.\n- `false`: only sends `Content-Type: application/json`.\n\nDisable custom headers for endpoints that reject non-standard headers.\n\n## Testing\n\n### Local Test Server\n\nUse repository script:\n\n```bash\nnode test-webhook.js\n```\n\nOptional custom port:\n\n```bash\nnode test-webhook.js 8080\n```\n\nDefault server values:\n\n- URL: `http://localhost:3000/webhook`\n- Test secret: `test-secret-key-for-tasknotes-webhooks`\n\n### External Inspection\n\nFor quick inspection, use a request-bin tool such as `webhook.site`.\n\n## Troubleshooting\n\n### No deliveries\n\n1. Confirm HTTP API is enabled.\n2. Confirm webhook is active.\n3. Confirm event is subscribed.\n\n### Signature mismatch\n\n1. Confirm secret matches webhook config.\n2. Verify your verifier hashes the exact JSON body.\n3. Verify hex digest comparison.\n\n### Webhook disabled automatically\n\nIf failures continue and `failureCount` exceeds 10, webhook is disabled.\n\n1. Fix endpoint availability or response handling.\n2. Re-enable webhook in TaskNotes settings, or recreate it via `POST /api/webhooks`.\n\n### Transform errors\n\n1. Confirm `transformFile` exists in vault.\n2. Confirm the file is a `.json` transform template.\n3. Check Obsidian console logs for transform exceptions.\n","aliases":["/webhooks/"],"toc":[{"level":2,"id":"prerequisites","text":"Prerequisites"},{"level":2,"id":"event-types","text":"Event Types"},{"level":2,"id":"payload-shape","text":"Payload Shape"},{"level":2,"id":"register-and-manage-webhooks-via-api","text":"Register and Manage Webhooks via API"},{"level":3,"id":"create","text":"Create"},{"level":3,"id":"list","text":"List"},{"level":3,"id":"delete","text":"Delete"},{"level":3,"id":"delivery-history","text":"Delivery History"},{"level":2,"id":"delivery-behavior","text":"Delivery Behavior"},{"level":2,"id":"signature-verification","text":"Signature Verification"},{"level":2,"id":"payload-transformations","text":"Payload Transformations"},{"level":3,"id":"json-transform-files","text":"JSON Transform Files"},{"level":2,"id":"cors-and-headers","text":"CORS and Headers"},{"level":2,"id":"testing","text":"Testing"},{"level":3,"id":"local-test-server","text":"Local Test Server"},{"level":3,"id":"external-inspection","text":"External Inspection"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"no-deliveries","text":"No deliveries"},{"level":3,"id":"signature-mismatch","text":"Signature mismatch"},{"level":3,"id":"webhook-disabled-automatically","text":"Webhook disabled automatically"},{"level":3,"id":"transform-errors","text":"Transform errors"}],"html":"

TaskNotes webhooks send HTTP POST requests when selected events occur.

\n

Prerequisites#

\n
    \n
  1. Enable HTTP API in Settings -> TaskNotes -> Integrations -> HTTP API.
  2. \n
  3. Create at least one webhook (settings UI or API).
  4. \n
  5. Subscribe it to one or more events.
  6. \n
\n

Event Types#

\n

Task events:

\n
    \n
  • task.created
  • \n
  • task.updated
  • \n
  • task.deleted
  • \n
  • task.completed
  • \n
  • task.archived
  • \n
  • task.unarchived
  • \n
\n

Time events:

\n
    \n
  • time.started
  • \n
  • time.stopped
  • \n
\n

Pomodoro events:

\n
    \n
  • pomodoro.started
  • \n
  • pomodoro.completed
  • \n
  • pomodoro.interrupted
  • \n
\n

Recurring events:

\n
    \n
  • recurring.instance.completed
  • \n
  • recurring.instance.skipped
  • \n
\n

Completing a materialized occurrence note emits recurring.instance.completed with the reconciled parent task plus the completed occurrence and date in the event data. Skipping virtual recurring instances emits recurring.instance.skipped; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook.

\n

Reminder events:

\n
    \n
  • reminder.triggered
  • \n
\n

Payload Shape#

\n

All webhook payloads use the same top-level envelope:

\n
{\n  "event": "task.created",\n  "timestamp": "2026-02-21T10:30:00.000Z",\n  "vault": {\n    "name": "My Vault",\n    "path": "/path/to/vault"\n  },\n  "data": {}\n}\n

data is event-specific.

\n

Register and Manage Webhooks via API#

\n

Create#

\n

POST /api/webhooks

\n

Required fields:

\n
    \n
  • url (string)
  • \n
  • events (non-empty array)
  • \n
\n

Optional fields:

\n
    \n
  • id
  • \n
  • secret (auto-generated if omitted)
  • \n
  • active (default true)
  • \n
  • transformFile
  • \n
  • corsHeaders (default true)
  • \n
\n

Example:

\n
curl -X POST http://localhost:8080/api/webhooks \\\n  -H "Content-Type: application/json" \\\n  -d '{\n    "url": "https://example.com/tasknotes",\n    "events": ["task.completed", "task.created"],\n    "transformFile": "TaskNotes/webhooks/slack.json"\n  }'\n

List#

\n

GET /api/webhooks

\n

Returns registered hooks. Secrets are not returned.

\n

Delete#

\n

DELETE /api/webhooks/:id

\n

Delivery History#

\n

GET /api/webhooks/deliveries

\n

Returns last 100 in-memory deliveries.

\n

Delivery Behavior#

\n

Current implementation behavior:

\n
    \n
  • Webhook processing is asynchronous (fire-and-forget from task operation).
  • \n
  • Each delivery starts with one attempt.
  • \n
  • Failed deliveries retry with exponential backoff: 1s, 2s, 4s.
  • \n
  • Maximum retries: 3 retries after initial attempt (up to 4 attempts total).
  • \n
  • If cumulative failureCount for a webhook exceeds 10, webhook is auto-disabled.
  • \n
  • No explicit request timeout is set in delivery fetch.
  • \n
\n

Because retries and duplicates are possible, handlers should be idempotent.

\n

Signature Verification#

\n

When corsHeaders is enabled (default), delivery includes:

\n
    \n
  • X-TaskNotes-Event
  • \n
  • X-TaskNotes-Signature
  • \n
  • X-TaskNotes-Delivery-ID
  • \n
\n

Signature is HMAC-SHA256 over JSON.stringify(payload) using webhook secret.

\n

Node.js example:

\n
const crypto = require("crypto");\n\nfunction verifyWebhook(payload, signature, secret) {\n  const expected = crypto\n    .createHmac("sha256", secret)\n    .update(JSON.stringify(payload))\n    .digest("hex");\n  return signature === expected;\n}\n

Payload Transformations#

\n

A webhook can specify transformFile pointing to a file in your vault.

\n

Supported file types:

\n
    \n
  • .json: event template map with variable interpolation
  • \n
\n

If transform execution fails, TaskNotes falls back to original payload.

\n

JavaScript transform files are no longer supported.

\n

JSON Transform Files#

\n

Structure:

\n
{\n  "task.completed": {\n    "text": "Task completed: ${data.task.title}",\n    "vault": "${vault.name}"\n  },\n  "default": {\n    "text": "TaskNotes event: ${event}"\n  }\n}\n

Rules:

\n
    \n
  • Matching order: exact event key, then default.
  • \n
  • Variables use ${path.to.value}.
  • \n
  • Missing variables are left unchanged.
  • \n
\n

CORS and Headers#

\n

Webhook delivery requests are outbound server-side requests from TaskNotes.

\n

corsHeaders behavior:

\n
    \n
  • true (default): sends TaskNotes custom headers including signature.
  • \n
  • false: only sends Content-Type: application/json.
  • \n
\n

Disable custom headers for endpoints that reject non-standard headers.

\n

Testing#

\n

Local Test Server#

\n

Use repository script:

\n
node test-webhook.js\n

Optional custom port:

\n
node test-webhook.js 8080\n

Default server values:

\n
    \n
  • URL: http://localhost:3000/webhook
  • \n
  • Test secret: test-secret-key-for-tasknotes-webhooks
  • \n
\n

External Inspection#

\n

For quick inspection, use a request-bin tool such as webhook.site.

\n

Troubleshooting#

\n

No deliveries#

\n
    \n
  1. Confirm HTTP API is enabled.
  2. \n
  3. Confirm webhook is active.
  4. \n
  5. Confirm event is subscribed.
  6. \n
\n

Signature mismatch#

\n
    \n
  1. Confirm secret matches webhook config.
  2. \n
  3. Verify your verifier hashes the exact JSON body.
  4. \n
  5. Verify hex digest comparison.
  6. \n
\n

Webhook disabled automatically#

\n

If failures continue and failureCount exceeds 10, webhook is disabled.

\n
    \n
  1. Fix endpoint availability or response handling.
  2. \n
  3. Re-enable webhook in TaskNotes settings, or recreate it via POST /api/webhooks.
  4. \n
\n

Transform errors#

\n
    \n
  1. Confirm transformFile exists in vault.
  2. \n
  3. Confirm the file is a .json transform template.
  4. \n
  5. Check Obsidian console logs for transform exceptions.
  6. \n
\n","text":"TaskNotes webhooks send HTTP POST requests when selected events occur. Prerequisites# Enable HTTP API in Settings -> TaskNotes -> Integrations -> HTTP API. Create at least one webhook (settings UI or API). Subscribe it to one or more events. Event Types# Task events: task.created task.updated task.deleted task.completed task.archived task.unarchived Time events: time.started time.stopped Pomodoro events: pomodoro.started pomodoro.completed pomodoro.interrupted Recurring events: recurring.instance.completed recurring.instance.skipped Completing a materialized occurrence note emits recurring.instance.completed with the reconciled parent task plus the completed occurrence and date in the event data. Skipping virtual recurring instances emits recurring.instance.skipped; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook. Reminder events: reminder.triggered Payload Shape# All webhook payloads use the same top-level envelope: { \"event\": \"task.created\", \"timestamp\": \"2026-02-21T10:30:00.000Z\", \"vault\": { \"name\": \"My Vault\", \"path\": \"/path/to/vault\" }, \"data\": {} } data is event-specific. Register and Manage Webhooks via API# Create# POST /api/webhooks Required fields: url (string) events (non-empty array) Optional fields: id secret (auto-generated if omitted) active (default true) transformFile corsHeaders (default true) Example: curl -X POST http://localhost:8080/api/webhooks \\ -H \"Content-Type: application/json\" \\ -d '{ \"url\": \"https://example.com/tasknotes\", \"events\": [\"task.completed\", \"task.created\"], \"transformFile\": \"TaskNotes/webhooks/slack.json\" }' List# GET /api/webhooks Returns registered hooks. Secrets are not returned. Delete# DELETE /api/webhooks/:id Delivery History# GET /api/webhooks/deliveries Returns last 100 in-memory deliveries. Delivery Behavior# Current implementation behavior: Webhook processing is asynchronous (fire-and-forget from task operation). Each delivery starts with one attempt. Failed deliveries retry with exponential backoff: 1s, 2s, 4s. Maximum retries: 3 retries after initial attempt (up to 4 attempts total). If cumulative failureCount for a webhook exceeds 10, webhook is auto-disabled. No explicit request timeout is set in delivery fetch. Because retries and duplicates are possible, handlers should be idempotent. Signature Verification# When corsHeaders is enabled (default), delivery includes: X-TaskNotes-Event X-TaskNotes-Signature X-TaskNotes-Delivery-ID Signature is HMAC-SHA256 over JSON.stringify(payload) using webhook secret. Node.js example: const crypto = require(\"crypto\"); function verifyWebhook(payload, signature, secret) { const expected = crypto .createHmac(\"sha256\", secret) .update(JSON.stringify(payload)) .digest(\"hex\"); return signature === expected; } Payload Transformations# A webhook can specify transformFile pointing to a file in your vault. Supported file types: .json: event template map with variable interpolation If transform execution fails, TaskNotes falls back to original payload. JavaScript transform files are no longer supported. JSON Transform Files# Structure: { \"task.completed\": { \"text\": \"Task completed: ${data.task.title}\", \"vault\": \"${vault.name}\" }, \"default\": { \"text\": \"TaskNotes event: ${event}\" } } Rules: Matching order: exact event key, then default. Variables use ${path.to.value}. Missing variables are left unchanged. CORS and Headers# Webhook delivery requests are outbound server-side requests from TaskNotes. corsHeaders behavior: true (default): sends TaskNotes custom headers including signature. false: only sends Content-Type: application/json. Disable custom headers for endpoints that reject non-standard headers. Testing# Local Test Server# Use repository script: node test-webhook.js Optional custom port: node test-webhook.js 8080 Default server values: URL: http://localhost:3000/webhook Test secret: test-secret-key-for-tasknotes-webhooks External Inspection# For quick inspection, use a request-bin tool such as webhook.site. Troubleshooting# No deliveries# Confirm HTTP API is enabled. Confirm webhook is active. Confirm event is subscribed. Signature mismatch# Confirm secret matches webhook config. Verify your verifier hashes the exact JSON body. Verify hex digest comparison. Webhook disabled automatically# If failures continue and failureCount exceeds 10, webhook is disabled. Fix endpoint availability or response handling. Re-enable webhook in TaskNotes settings, or recreate it via POST /api/webhooks. Transform errors# Confirm transformFile exists in vault. Confirm the file is a .json transform template. Check Obsidian console logs for transform exceptions."},{"route":"/obsidian/workflows/","title":"Workflows","description":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit toge...","product":"obsidian","platforms":[],"version":"4.11.1","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/workflows.md","namespace":"obsidian","relativePath":"workflows.md","raw":"# Workflows\n\nThis page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use.\n\n## Habit Tracking with Recurring Tasks\n\nHabit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, \"Exercise daily\" or \"Gym every Monday and Wednesday\") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions.\n\nOnce a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in `complete_instances`, so a recurring task can remain open while still recording daily/weekly completion behavior.\n\n![Recurring task calendar](assets/views-calendar-month.png)\n\n```yaml\ntitle: Morning Exercise\nrecurrence: \"FREQ=DAILY\"\nscheduled: \"07:00\"\ncomplete_instances:\n - \"2025-01-01\"\n - \"2025-01-02\"\n - \"2025-01-04\"\n```\n\nUse Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view.\n\nFor richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose **Open or create occurrence note**. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern.\n\n## Project-Centered Planning\n\nProjects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation.\n\n```yaml\ntitle: \"Research competitors\"\nprojects: [\"[[Market Research]]\", \"[[Q1 Strategy]]\"]\n```\n\nDuring task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on `note.projects contains [[Project Name]]` to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly.\n\n![Task list view](assets/views-tasks-list.png)\n\nWhen work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization.\n\n```yaml\ntitle: \"Prepare presentation slides\"\nprojects: [\"[[Q4 Planning]]\"]\ncontexts: [\"computer\", \"office\"]\ntags: [\"review\"]\n```\n\n## Execution Workflow (Daily)\n\nA typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system.\n\nIf you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes.\n\n![Calendar quick add workflow](assets/workflow-quick-add-calendar.png)\n\n## Maintenance Workflow (Weekly)\n\nA weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health.\n\nFor teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes.\n","aliases":["/workflows/"],"toc":[{"level":2,"id":"habit-tracking-with-recurring-tasks","text":"Habit Tracking with Recurring Tasks"},{"level":2,"id":"project-centered-planning","text":"Project-Centered Planning"},{"level":2,"id":"execution-workflow-daily","text":"Execution Workflow (Daily)"},{"level":2,"id":"maintenance-workflow-weekly","text":"Maintenance Workflow (Weekly)"}],"html":"

This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use.

\n

Habit Tracking with Recurring Tasks#

\n

Habit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, "Exercise daily" or "Gym every Monday and Wednesday") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions.

\n

Once a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in complete_instances, so a recurring task can remain open while still recording daily/weekly completion behavior.

\n

\"Recurring

\n
title: Morning Exercise\nrecurrence: "FREQ=DAILY"\nscheduled: "07:00"\ncomplete_instances:\n  - "2025-01-01"\n  - "2025-01-02"\n  - "2025-01-04"\n

Use Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view.

\n

For richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose Open or create occurrence note. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern.

\n

Project-Centered Planning#

\n

Projects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation.

\n
title: "Research competitors"\nprojects: ["[[Market Research]]", "[[Q1 Strategy]]"]\n

During task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on note.projects contains [[Project Name]] to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly.

\n

\"Task

\n

When work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization.

\n
title: "Prepare presentation slides"\nprojects: ["[[Q4 Planning]]"]\ncontexts: ["computer", "office"]\ntags: ["review"]\n

Execution Workflow (Daily)#

\n

A typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system.

\n

If you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes.

\n

\"Calendar

\n

Maintenance Workflow (Weekly)#

\n

A weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health.

\n

For teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes.

\n","text":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use. Habit Tracking with Recurring Tasks# Habit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, \"Exercise daily\" or \"Gym every Monday and Wednesday\") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions. Once a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in complete_instances, so a recurring task can remain open while still recording daily/weekly completion behavior. title: Morning Exercise recurrence: \"FREQ=DAILY\" scheduled: \"07:00\" complete_instances: - \"2025-01-01\" - \"2025-01-02\" - \"2025-01-04\" Use Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view. For richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose Open or create occurrence note. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern. Project-Centered Planning# Projects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation. title: \"Research competitors\" projects: [\"[[Market Research]]\", \"[[Q1 Strategy]]\"] During task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on note.projects contains [[Project Name]] to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly. When work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization. title: \"Prepare presentation slides\" projects: [\"[[Q4 Planning]]\"] contexts: [\"computer\", \"office\"] tags: [\"review\"] Execution Workflow (Daily)# A typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system. If you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes. Maintenance Workflow (Weekly)# A weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health. For teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes."},{"route":"/privacy/","title":"TaskNotes privacy overview","description":"How the TaskNotes app and Obsidian plugin store data and when optional services are involved.","product":"shared","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/policies/privacy.md","namespace":"policies","relativePath":"privacy.md","raw":"---\ntitle: TaskNotes privacy overview\ndescription: How the TaskNotes app and Obsidian plugin store data and when optional services are involved.\nroute: /privacy/\nproduct: shared\nlast_updated: 2026-08-06\n---\n\n# TaskNotes privacy overview\n\nLast updated: August 6, 2026\n\nTaskNotes products are built around portable Markdown records. The storage and\nnetwork boundaries depend on the client and collection you choose.\n\n## TaskNotes app\n\n- The TaskNotes app opens every collection through mdbase and requires a\n connection to read or change it.\n- A hosted collection stores the authoritative Markdown with the hosted\n provider.\n- A computer collection keeps the authoritative Markdown on that computer.\n TaskNotes reaches it through an end-to-end encrypted relay that cannot read\n record contents; the computer must remain reachable and run mdbase Connect.\n- TaskNotes keeps only a temporary in-memory session cache. It does not retain\n a separate offline collection after the app or page closes.\n- Reminder notifications for mdbase collections require explicit permission\n and use content-free event payloads. Task content is refreshed through the\n authorized collection connection.\n\n## Obsidian plugin\n\nThe plugin keeps task and note content in the local Obsidian vault. Plugin\nsettings live in Obsidian's plugin configuration. Network access occurs only\nfor enabled features that require it, including release checks, calendar\nproviders, ICS subscriptions, webhooks, and remotely loaded API documentation\nassets.\n\n## Analytics\n\nTaskNotes does not include a product telemetry or analytics pipeline. Services\nyou choose to connect may keep their own operational, account, security, or\nbilling records under their respective policies.\n\n## Removal\n\nRemoving a client does not necessarily remove its authoritative collection.\nUse the hosted provider's controls for a hosted collection, or manage the\nMarkdown folder on the computer that owns a computer collection. Back up\nrecords before removing an authoritative copy.\n\n## Questions and source code\n\nUse the relevant TaskNotes GitHub repository to report a privacy problem or\ninspect the implementation:\n\n- [TaskNotes app](https://github.com/callumalpass/tasknotes-app)\n- [TaskNotes Obsidian plugin](https://github.com/callumalpass/tasknotes)\n","aliases":[],"toc":[{"level":2,"id":"tasknotes-app","text":"TaskNotes app"},{"level":2,"id":"obsidian-plugin","text":"Obsidian plugin"},{"level":2,"id":"analytics","text":"Analytics"},{"level":2,"id":"removal","text":"Removal"},{"level":2,"id":"questions-and-source-code","text":"Questions and source code"}],"html":"

Last updated: August 6, 2026

\n

TaskNotes products are built around portable Markdown records. The storage and\nnetwork boundaries depend on the client and collection you choose.

\n

TaskNotes app#

\n
    \n
  • The TaskNotes app opens every collection through mdbase and requires a\nconnection to read or change it.
  • \n
  • A hosted collection stores the authoritative Markdown with the hosted\nprovider.
  • \n
  • A computer collection keeps the authoritative Markdown on that computer.\nTaskNotes reaches it through an end-to-end encrypted relay that cannot read\nrecord contents; the computer must remain reachable and run mdbase Connect.
  • \n
  • TaskNotes keeps only a temporary in-memory session cache. It does not retain\na separate offline collection after the app or page closes.
  • \n
  • Reminder notifications for mdbase collections require explicit permission\nand use content-free event payloads. Task content is refreshed through the\nauthorized collection connection.
  • \n
\n

Obsidian plugin#

\n

The plugin keeps task and note content in the local Obsidian vault. Plugin\nsettings live in Obsidian's plugin configuration. Network access occurs only\nfor enabled features that require it, including release checks, calendar\nproviders, ICS subscriptions, webhooks, and remotely loaded API documentation\nassets.

\n

Analytics#

\n

TaskNotes does not include a product telemetry or analytics pipeline. Services\nyou choose to connect may keep their own operational, account, security, or\nbilling records under their respective policies.

\n

Removal#

\n

Removing a client does not necessarily remove its authoritative collection.\nUse the hosted provider's controls for a hosted collection, or manage the\nMarkdown folder on the computer that owns a computer collection. Back up\nrecords before removing an authoritative copy.

\n

Questions and source code#

\n

Use the relevant TaskNotes GitHub repository to report a privacy problem or\ninspect the implementation:

\n\n","text":"Last updated: August 6, 2026 TaskNotes products are built around portable Markdown records. The storage and network boundaries depend on the client and collection you choose. TaskNotes app# The TaskNotes app opens every collection through mdbase and requires a connection to read or change it. A hosted collection stores the authoritative Markdown with the hosted provider. A computer collection keeps the authoritative Markdown on that computer. TaskNotes reaches it through an end-to-end encrypted relay that cannot read record contents; the computer must remain reachable and run mdbase Connect. TaskNotes keeps only a temporary in-memory session cache. It does not retain a separate offline collection after the app or page closes. Reminder notifications for mdbase collections require explicit permission and use content-free event payloads. Task content is refreshed through the authorized collection connection. Obsidian plugin# The plugin keeps task and note content in the local Obsidian vault. Plugin settings live in Obsidian's plugin configuration. Network access occurs only for enabled features that require it, including release checks, calendar providers, ICS subscriptions, webhooks, and remotely loaded API documentation assets. Analytics# TaskNotes does not include a product telemetry or analytics pipeline. Services you choose to connect may keep their own operational, account, security, or billing records under their respective policies. Removal# Removing a client does not necessarily remove its authoritative collection. Use the hosted provider's controls for a hosted collection, or manage the Markdown folder on the computer that owns a computer collection. Back up records before removing an authoritative copy. Questions and source code# Use the relevant TaskNotes GitHub repository to report a privacy problem or inspect the implementation: TaskNotes app TaskNotes Obsidian plugin"}]} +{"generatedAt":"2026-08-10T11:59:24.540Z","versions":{"app":"0.1.0","obsidian":"4.12.3"},"navigation":[{"label":"Start here","items":[{"title":"TaskNotes documentation","route":"/"},{"title":"TaskNotes app","route":"/app/"},{"title":"Obsidian plugin","route":"/obsidian/"},{"title":"Shared concepts","route":"/concepts/task-records/"}]},{"label":"TaskNotes app","items":[{"title":"Get started","route":"/app/getting-started/"},{"title":"Interactive demo","route":"/app/demo/"},{"title":"Choose a collection","route":"/app/collections/"},{"title":"What is mdbase?","route":"/app/mdbase/"},{"title":"Tasks","route":"/app/tasks/"},{"title":"Views and navigation","route":"/app/views/"},{"title":"Connection and availability","route":"/app/connection/"},{"title":"Reminders","route":"/app/reminders/"},{"title":"Troubleshooting","route":"/app/troubleshooting/"}]},{"label":"Obsidian plugin","items":[{"title":"Get started","route":"/obsidian/"},{"title":"Core concepts","route":"/obsidian/core-concepts/"},{"title":"Task management","route":"/obsidian/features/task-management/"},{"title":"Recurring tasks","route":"/obsidian/features/recurring-tasks/"},{"title":"Views","route":"/obsidian/views/"},{"title":"Settings","route":"/obsidian/settings/"},{"title":"APIs and automation","route":"/obsidian/HTTP_API/"},{"title":"Companion plugins","route":"/obsidian/companion-plugins/"},{"title":"Release notes","route":"/obsidian/releases/"},{"title":"Troubleshooting","route":"/obsidian/troubleshooting/"}]},{"label":"Developers","items":[{"title":"TaskNotes specification","route":"/developers/specification/"},{"title":"App integration manifest","route":"/app/reference/manifest/"},{"title":"Command reference","route":"/obsidian/reference/commands/"},{"title":"Settings source","route":"/obsidian/reference/settings-source/"},{"title":"HTTP route index","route":"/obsidian/reference/http-routes/"}]},{"label":"Policies","items":[{"title":"Privacy","route":"/privacy/"}]}],"redirects":{"/app/sync-and-conflicts/":"/app/connection/","/core-concepts/":"/obsidian/core-concepts/","/getting-started/existing-vault/":"/obsidian/getting-started/existing-vault/","/getting-started/mobile/":"/obsidian/getting-started/mobile/","/migration-v3-to-v4/":"/obsidian/migration-v3-to-v4/","/features/":"/obsidian/features/","/views/":"/obsidian/views/","/settings/":"/obsidian/settings/","/calendar-setup/":"/obsidian/calendar-setup/","/troubleshooting/":"/obsidian/troubleshooting/","/HTTP_API/":"/obsidian/HTTP_API/","/javascript-api/":"/obsidian/javascript-api/","/nlp-api/":"/obsidian/nlp-api/","/obsidian-cli/":"/obsidian/obsidian-cli/","/mdbase-tasknotes-cli/":"/obsidian/mdbase-tasknotes-cli/","/webhooks/":"/obsidian/webhooks/","/workflows/":"/obsidian/workflows/","/companion-plugins/":"/obsidian/companion-plugins/","/releases/":"/obsidian/releases/","/spec/":"/developers/specification/","/views/default-base-templates/":"/obsidian/reference/default-base-templates/","/settings/defaults/":"/obsidian/settings/task-properties/","/settings/task-defaults/":"/obsidian/settings/task-properties/","/settings/inline-task-settings/":"/obsidian/settings/features/","/settings/calendar-settings/":"/obsidian/settings/appearance/","/settings/misc-settings/":"/obsidian/settings/features/","/settings/advanced-settings/":"/obsidian/settings/features/","/companion-plugins/canvas-bases/":"/obsidian/companion-plugins/canvas-bases/","/companion-plugins/tasknotes-workflows/":"/obsidian/companion-plugins/tasknotes-workflows/","/features/calendar-integration/":"/obsidian/features/calendar-integration/","/features/ics-integration/":"/obsidian/features/ics-integration/","/features/inline-tasks/":"/obsidian/features/inline-tasks/","/features/integrations/":"/obsidian/features/integrations/","/features/recurring-tasks/":"/obsidian/features/recurring-tasks/","/features/reminders/":"/obsidian/features/reminders/","/features/task-management/":"/obsidian/features/task-management/","/features/template-variables/":"/obsidian/features/template-variables/","/features/time-management/":"/obsidian/features/time-management/","/features/user-fields/":"/obsidian/features/user-fields/","/guides/backup-recovery/":"/obsidian/guides/backup-recovery/","/guides/custom-bases/":"/obsidian/guides/custom-bases/","/settings/appearance/":"/obsidian/settings/appearance/","/settings/features/":"/obsidian/settings/features/","/settings/general/":"/obsidian/settings/general/","/settings/integrations/":"/obsidian/settings/integrations/","/settings/modal-fields/":"/obsidian/settings/modal-fields/","/settings/property-identification/":"/obsidian/settings/property-identification/","/settings/property-types-reference/":"/obsidian/settings/property-types-reference/","/settings/task-properties/":"/obsidian/settings/task-properties/","/views/agenda-view/":"/obsidian/views/agenda-view/","/views/calendar-views/":"/obsidian/views/calendar-views/","/views/kanban-view/":"/obsidian/views/kanban-view/","/views/pomodoro-view/":"/obsidian/views/pomodoro-view/","/views/task-list/":"/obsidian/views/task-list/","/releases/0.2.2/":"/obsidian/releases/0.2.2/","/releases/0.2.3/":"/obsidian/releases/0.2.3/","/releases/0.2.4/":"/obsidian/releases/0.2.4/","/releases/0.3.0/":"/obsidian/releases/0.3.0/","/releases/0.4.0/":"/obsidian/releases/0.4.0/","/releases/0.4.1/":"/obsidian/releases/0.4.1/","/releases/0.4.2/":"/obsidian/releases/0.4.2/","/releases/0.6.0/":"/obsidian/releases/0.6.0/","/releases/0.6.1/":"/obsidian/releases/0.6.1/","/releases/0.6.2/":"/obsidian/releases/0.6.2/","/releases/0.6.3/":"/obsidian/releases/0.6.3/","/releases/0.7.0/":"/obsidian/releases/0.7.0/","/releases/0.8.0/":"/obsidian/releases/0.8.0/","/releases/1.0.0/":"/obsidian/releases/1.0.0/","/releases/1.1.0/":"/obsidian/releases/1.1.0/","/releases/1.2.0/":"/obsidian/releases/1.2.0/","/releases/2.0.0/":"/obsidian/releases/2.0.0/","/releases/2.0.1/":"/obsidian/releases/2.0.1/","/releases/2.0.2/":"/obsidian/releases/2.0.2/","/releases/2.0.3/":"/obsidian/releases/2.0.3/","/releases/2.0.4/":"/obsidian/releases/2.0.4/","/releases/2.1.0/":"/obsidian/releases/2.1.0/","/releases/2.2.0/":"/obsidian/releases/2.2.0/","/releases/2.2.1/":"/obsidian/releases/2.2.1/","/releases/2.2.2/":"/obsidian/releases/2.2.2/","/releases/2.2.3/":"/obsidian/releases/2.2.3/","/releases/3.0.0/":"/obsidian/releases/3.0.0/","/releases/3.0.1/":"/obsidian/releases/3.0.1/","/releases/3.1.0/":"/obsidian/releases/3.1.0/","/releases/3.1.1/":"/obsidian/releases/3.1.1/","/releases/3.10.0/":"/obsidian/releases/3.10.0/","/releases/3.11.0/":"/obsidian/releases/3.11.0/","/releases/3.11.1/":"/obsidian/releases/3.11.1/","/releases/3.11.2/":"/obsidian/releases/3.11.2/","/releases/3.12.0/":"/obsidian/releases/3.12.0/","/releases/3.12.1/":"/obsidian/releases/3.12.1/","/releases/3.12.2/":"/obsidian/releases/3.12.2/","/releases/3.13.0/":"/obsidian/releases/3.13.0/","/releases/3.13.1/":"/obsidian/releases/3.13.1/","/releases/3.13.2/":"/obsidian/releases/3.13.2/","/releases/3.13.3/":"/obsidian/releases/3.13.3/","/releases/3.13.4/":"/obsidian/releases/3.13.4/","/releases/3.14.0/":"/obsidian/releases/3.14.0/","/releases/3.15.0/":"/obsidian/releases/3.15.0/","/releases/3.15.1/":"/obsidian/releases/3.15.1/","/releases/3.16.0/":"/obsidian/releases/3.16.0/","/releases/3.16.1/":"/obsidian/releases/3.16.1/","/releases/3.16.2/":"/obsidian/releases/3.16.2/","/releases/3.16.3/":"/obsidian/releases/3.16.3/","/releases/3.16.4/":"/obsidian/releases/3.16.4/","/releases/3.17.0/":"/obsidian/releases/3.17.0/","/releases/3.17.1/":"/obsidian/releases/3.17.1/","/releases/3.18.0/":"/obsidian/releases/3.18.0/","/releases/3.18.1/":"/obsidian/releases/3.18.1/","/releases/3.18.2/":"/obsidian/releases/3.18.2/","/releases/3.19.0/":"/obsidian/releases/3.19.0/","/releases/3.19.1/":"/obsidian/releases/3.19.1/","/releases/3.20.0/":"/obsidian/releases/3.20.0/","/releases/3.20.1/":"/obsidian/releases/3.20.1/","/releases/3.21.0/":"/obsidian/releases/3.21.0/","/releases/3.22.0/":"/obsidian/releases/3.22.0/","/releases/3.22.1/":"/obsidian/releases/3.22.1/","/releases/3.23.0/":"/obsidian/releases/3.23.0/","/releases/3.23.1/":"/obsidian/releases/3.23.1/","/releases/3.23.2/":"/obsidian/releases/3.23.2/","/releases/3.23.3/":"/obsidian/releases/3.23.3/","/releases/3.23.4/":"/obsidian/releases/3.23.4/","/releases/3.24.0/":"/obsidian/releases/3.24.0/","/releases/3.24.1/":"/obsidian/releases/3.24.1/","/releases/3.24.2/":"/obsidian/releases/3.24.2/","/releases/3.24.3/":"/obsidian/releases/3.24.3/","/releases/3.24.4/":"/obsidian/releases/3.24.4/","/releases/3.24.5/":"/obsidian/releases/3.24.5/","/releases/3.24.6/":"/obsidian/releases/3.24.6/","/releases/3.25.0/":"/obsidian/releases/3.25.0/","/releases/3.25.1/":"/obsidian/releases/3.25.1/","/releases/3.25.2/":"/obsidian/releases/3.25.2/","/releases/3.25.3/":"/obsidian/releases/3.25.3/","/releases/3.25.4/":"/obsidian/releases/3.25.4/","/releases/3.25.6/":"/obsidian/releases/3.25.6/","/releases/3.3.0/":"/obsidian/releases/3.3.0/","/releases/3.4.0/":"/obsidian/releases/3.4.0/","/releases/3.4.1/":"/obsidian/releases/3.4.1/","/releases/3.4.2/":"/obsidian/releases/3.4.2/","/releases/3.5.1/":"/obsidian/releases/3.5.1/","/releases/3.6.0/":"/obsidian/releases/3.6.0/","/releases/3.7.0/":"/obsidian/releases/3.7.0/","/releases/3.7.1/":"/obsidian/releases/3.7.1/","/releases/3.8.1/":"/obsidian/releases/3.8.1/","/releases/3.8.5/":"/obsidian/releases/3.8.5/","/releases/3.8.6/":"/obsidian/releases/3.8.6/","/releases/3.8.7/":"/obsidian/releases/3.8.7/","/releases/3.9.0/":"/obsidian/releases/3.9.0/","/releases/3.9.1/":"/obsidian/releases/3.9.1/","/releases/4.0.0-beta.0/":"/obsidian/releases/4.0.0-beta.0/","/releases/4.0.0-beta.1/":"/obsidian/releases/4.0.0-beta.1/","/releases/4.0.0-beta.2/":"/obsidian/releases/4.0.0-beta.2/","/releases/4.0.0-beta.3/":"/obsidian/releases/4.0.0-beta.3/","/releases/4.0.1/":"/obsidian/releases/4.0.1/","/releases/4.0.2/":"/obsidian/releases/4.0.2/","/releases/4.0.3/":"/obsidian/releases/4.0.3/","/releases/4.0.4/":"/obsidian/releases/4.0.4/","/releases/4.0.5/":"/obsidian/releases/4.0.5/","/releases/4.1.0/":"/obsidian/releases/4.1.0/","/releases/4.1.1/":"/obsidian/releases/4.1.1/","/releases/4.1.2/":"/obsidian/releases/4.1.2/","/releases/4.1.3/":"/obsidian/releases/4.1.3/","/releases/4.10.0/":"/obsidian/releases/4.10.0/","/releases/4.10.1/":"/obsidian/releases/4.10.1/","/releases/4.10.2/":"/obsidian/releases/4.10.2/","/releases/4.11.0/":"/obsidian/releases/4.11.0/","/releases/4.11.1/":"/obsidian/releases/4.11.1/","/releases/4.12.0/":"/obsidian/releases/4.12.0/","/releases/4.12.1/":"/obsidian/releases/4.12.1/","/releases/4.12.2/":"/obsidian/releases/4.12.2/","/releases/4.12.3/":"/obsidian/releases/4.12.3/","/releases/4.2.0/":"/obsidian/releases/4.2.0/","/releases/4.2.1/":"/obsidian/releases/4.2.1/","/releases/4.3.0/":"/obsidian/releases/4.3.0/","/releases/4.3.1/":"/obsidian/releases/4.3.1/","/releases/4.3.2/":"/obsidian/releases/4.3.2/","/releases/4.3.3/":"/obsidian/releases/4.3.3/","/releases/4.4.0/":"/obsidian/releases/4.4.0/","/releases/4.5.0/":"/obsidian/releases/4.5.0/","/releases/4.5.1/":"/obsidian/releases/4.5.1/","/releases/4.5.2/":"/obsidian/releases/4.5.2/","/releases/4.5.3/":"/obsidian/releases/4.5.3/","/releases/4.6.0/":"/obsidian/releases/4.6.0/","/releases/4.7.0/":"/obsidian/releases/4.7.0/","/releases/4.7.1/":"/obsidian/releases/4.7.1/","/releases/4.7.2/":"/obsidian/releases/4.7.2/","/releases/4.8.0/":"/obsidian/releases/4.8.0/","/releases/4.8.1/":"/obsidian/releases/4.8.1/","/releases/4.9.0/":"/obsidian/releases/4.9.0/","/releases/4.9.1/":"/obsidian/releases/4.9.1/","/releases/4.9.2/":"/obsidian/releases/4.9.2/","/releases/unreleased/":"/obsidian/releases/unreleased/","/reference/commands/":"/obsidian/reference/commands/","/reference/compatibility/":"/obsidian/reference/compatibility/","/reference/settings-source/":"/obsidian/reference/settings-source/","/reference/http-routes/":"/obsidian/reference/http-routes/","/reference/default-base-templates/":"/obsidian/reference/default-base-templates/","/spec/00-overview/":"/developers/specification/","/spec/01-terminology/":"/developers/specification/01-terminology/","/spec/02-model-and-mapping/":"/developers/specification/02-model-and-mapping/","/spec/03-temporal-semantics/":"/developers/specification/03-temporal-semantics/","/spec/04-recurrence/":"/developers/specification/04-recurrence/","/spec/05-operations/":"/developers/specification/05-operations/","/spec/06-validation/":"/developers/specification/06-validation/","/spec/07-conformance/":"/developers/specification/07-conformance/","/spec/08-compatibility-and-migrations/":"/developers/specification/08-compatibility-and-migrations/","/spec/09-configuration/":"/developers/specification/09-configuration/","/spec/10-dependencies-and-reminders/":"/developers/specification/10-dependencies-and-reminders/","/spec/11-links/":"/developers/specification/11-links/","/spec/12-mdbase-v0.3-binding/":"/developers/specification/12-mdbase-v0.3-binding/","/spec/CHANGELOG/":"/developers/specification/CHANGELOG/"},"pages":[{"route":"/","title":"TaskNotes documentation","description":"Guides and reference material for the TaskNotes app, the Obsidian plugin, and the portable task format they share.","product":"shared","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":true,"source":"tasknotes.dev:content/index.md","namespace":"index.md","relativePath":"","raw":"---\ntitle: TaskNotes documentation\ndescription: Guides and reference material for the TaskNotes app, the Obsidian plugin, and the portable task format they share.\nroute: /\nproduct: shared\nhide_toc: true\n---\n\n# TaskNotes documentation\n\nTaskNotes keeps structured task information in portable Markdown records. Use\nthe dedicated app on the web, Android, or iOS, or work inside Obsidian with the\nTaskNotes plugin.\n\n\n\n## One portable task model\n\nBoth clients understand the same TaskNotes concepts: status, priority, dates,\nprojects, contexts, recurrence, reminders, relationships, and custom fields.\nThe interface and available integrations differ, but your task records are not\nlocked to one screen or application.\n\n- Start with [portable task records](/concepts/task-records/) if you want to\n understand what the products share.\n- Read the [formal specification](/developers/specification/) when implementing\n or integrating with TaskNotes.\n- Review the [privacy overview](/privacy/) before choosing a hosted or\n computer-connected collection.\n","aliases":[],"toc":[{"level":2,"id":"one-portable-task-model","text":"One portable task model"}],"html":"

TaskNotes keeps structured task information in portable Markdown records. Use\nthe dedicated app on the web, Android, or iOS, or work inside Obsidian with the\nTaskNotes plugin.

\n\n\n

One portable task model#

\n

Both clients understand the same TaskNotes concepts: status, priority, dates,\nprojects, contexts, recurrence, reminders, relationships, and custom fields.\nThe interface and available integrations differ, but your task records are not\nlocked to one screen or application.

\n\n","text":"TaskNotes keeps structured task information in portable Markdown records. Use the dedicated app on the web, Android, or iOS, or work inside Obsidian with the TaskNotes plugin. Beta · Web · Android · iOS TaskNotes app Manage portable TaskNotes v5 collections on the web, Android, and iOS through mdbase. Open the app guide → Obsidian TaskNotes plugin Task and note management inside an Obsidian vault using Bases and Markdown. Open the plugin guide → One portable task model# Both clients understand the same TaskNotes concepts: status, priority, dates, projects, contexts, recurrence, reminders, relationships, and custom fields. The interface and available integrations differ, but your task records are not locked to one screen or application. Start with portable task records if you want to understand what the products share. Read the formal specification when implementing or integrating with TaskNotes. Review the privacy overview before choosing a hosted or computer-connected collection."},{"route":"/app/","title":"TaskNotes app","description":"Use TaskNotes on the web, Android, and iOS with portable Markdown through mdbase.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/index.md","namespace":"app","relativePath":"index.md","raw":"---\ntitle: TaskNotes app\ndescription: Use TaskNotes on the web, Android, and iOS with portable Markdown through mdbase.\nroute: /app/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# TaskNotes app\n\nThe TaskNotes app is currently in beta. It is a web-first client packaged for\nAndroid and iOS, designed for quick capture, daily review, editing, and\ncompletion while keeping task records portable.\n\nThe app is compatible with **TaskNotes v5 collections**, which use the\n**mdbase 0.3.0 specification**. The same collection can be used by other\ncompatible TaskNotes and mdbase tools.\n\nEvery TaskNotes session opens an mdbase collection. You can use a collection\nhosted online or connect to a Markdown collection on your computer through the\nencrypted mdbase relay. TaskNotes reads and writes that collection directly, so\nchanges require a connection.\n\n
\n \"TaskNotes\n
The Today workspace in the desktop layout.
\n
\n\n
\n Disposable sample collection\n Try TaskNotes before connecting your own collection.\n Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets.\n Open the interactive demo →\n
\n\n## Begin here\n\n1. [Try TaskNotes with sample tasks](/app/demo/) or [open or install TaskNotes](/app/getting-started/).\n2. [Learn how mdbase supports TaskNotes](/app/mdbase/).\n3. [Choose where your collection lives](/app/collections/).\n4. Create a task and open **Today**.\n5. Turn on reminders only if the collection and platform support delivery.\n\n## What the app includes\n\n- Today, Upcoming, Projects, lists, boards, and calendars\n- Capture, editing, completion, archive, and search\n- Projects, contexts, tags, priorities, relationships, and custom fields\n- Recurrence, materialized occurrence notes, reminders, and time tracking\n- Hosted mdbase and end-to-end encrypted relay connections\n- Browser, Android, and iOS packaging from the same application\n\nPlugin-only functionality such as inline Obsidian widgets, the command palette,\nexternal calendar integrations, HTTP APIs, and companion plugins is documented\nunder the [Obsidian plugin](/obsidian/).\n","aliases":[],"toc":[{"level":2,"id":"begin-here","text":"Begin here"},{"level":2,"id":"what-the-app-includes","text":"What the app includes"}],"html":"

The TaskNotes app is currently in beta. It is a web-first client packaged for\nAndroid and iOS, designed for quick capture, daily review, editing, and\ncompletion while keeping task records portable.

\n

The app is compatible with TaskNotes v5 collections, which use the\nmdbase 0.3.0 specification. The same collection can be used by other\ncompatible TaskNotes and mdbase tools.

\n

Every TaskNotes session opens an mdbase collection. You can use a collection\nhosted online or connect to a Markdown collection on your computer through the\nencrypted mdbase relay. TaskNotes reads and writes that collection directly, so\nchanges require a connection.

\n
\n \"TaskNotes\n
The Today workspace in the desktop layout.
\n
\n\n
\n Disposable sample collection\n Try TaskNotes before connecting your own collection.\n Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets.\n Open the interactive demo →\n
\n\n

Begin here#

\n
    \n
  1. Try TaskNotes with sample tasks or open or install TaskNotes.
  2. \n
  3. Learn how mdbase supports TaskNotes.
  4. \n
  5. Choose where your collection lives.
  6. \n
  7. Create a task and open Today.
  8. \n
  9. Turn on reminders only if the collection and platform support delivery.
  10. \n
\n

What the app includes#

\n
    \n
  • Today, Upcoming, Projects, lists, boards, and calendars
  • \n
  • Capture, editing, completion, archive, and search
  • \n
  • Projects, contexts, tags, priorities, relationships, and custom fields
  • \n
  • Recurrence, materialized occurrence notes, reminders, and time tracking
  • \n
  • Hosted mdbase and end-to-end encrypted relay connections
  • \n
  • Browser, Android, and iOS packaging from the same application
  • \n
\n

Plugin-only functionality such as inline Obsidian widgets, the command palette,\nexternal calendar integrations, HTTP APIs, and companion plugins is documented\nunder the Obsidian plugin.

\n","text":"The TaskNotes app is currently in beta. It is a web-first client packaged for Android and iOS, designed for quick capture, daily review, editing, and completion while keeping task records portable. The app is compatible with TaskNotes v5 collections, which use the mdbase 0.3.0 specification. The same collection can be used by other compatible TaskNotes and mdbase tools. Every TaskNotes session opens an mdbase collection. You can use a collection hosted online or connect to a Markdown collection on your computer through the encrypted mdbase relay. TaskNotes reads and writes that collection directly, so changes require a connection. The Today workspace in the desktop layout. Disposable sample collection Try TaskNotes before connecting your own collection. Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets. Open the interactive demo → Begin here# Try TaskNotes with sample tasks or open or install TaskNotes. Learn how mdbase supports TaskNotes. Choose where your collection lives. Create a task and open Today. Turn on reminders only if the collection and platform support delivery. What the app includes# Today, Upcoming, Projects, lists, boards, and calendars Capture, editing, completion, archive, and search Projects, contexts, tags, priorities, relationships, and custom fields Recurrence, materialized occurrence notes, reminders, and time tracking Hosted mdbase and end-to-end encrypted relay connections Browser, Android, and iOS packaging from the same application Plugin-only functionality such as inline Obsidian widgets, the command palette, external calendar integrations, HTTP APIs, and companion plugins is documented under the Obsidian plugin."},{"route":"/app/collections/","title":"Choose a collection","description":"Compare hosted mdbase with a collection connected from your own computer.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/collections.md","namespace":"app","relativePath":"collections.md","raw":"---\ntitle: Choose a collection\ndescription: Compare hosted mdbase with a collection connected from your own computer.\nroute: /app/collections/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Choose a collection\n\nTaskNotes opens every collection through mdbase. The choice is where the main\ncopy of your Markdown lives: hosted online or on your own computer.\n\nIf mdbase is new to you, start with [mdbase and TaskNotes](/app/mdbase/) for a\nplain-language explanation of the format, Connect desktop app, and hosting\nchoices.\n\n## Hosted mdbase\n\nHosted mdbase is the recommended choice for convenient access across the web,\nAndroid, and iOS. The provider keeps the main collection online, so it is\navailable from any TaskNotes device with a network connection and can deliver\nreminders while TaskNotes is closed.\n\nTaskNotes reads and writes the hosted collection directly. It does not keep a\nseparate offline copy, so you need a network connection to open the collection\nor make changes.\n\n## Connect to a computer\n\nmdbase Connect can make a Markdown collection on your computer available to\nTaskNotes. Requests and responses travel through an end-to-end encrypted relay;\nthe relay cannot read your task contents and you do not need to open a port on\nyour router.\n\nThe computer holds the main copy, so it must be awake, online, and running the\nmdbase Connect background service whenever you use TaskNotes. See how to\n[install mdbase Connect and use a computer collection](/app/mdbase/#use-a-collection-on-your-computer).\n\n## Change collections later\n\nOpen **More** and choose **Change collection**. Opening another collection does\nnot copy or move records from the collection you were using.\n","aliases":[],"toc":[{"level":2,"id":"hosted-mdbase","text":"Hosted mdbase"},{"level":2,"id":"connect-to-a-computer","text":"Connect to a computer"},{"level":2,"id":"change-collections-later","text":"Change collections later"}],"html":"

TaskNotes opens every collection through mdbase. The choice is where the main\ncopy of your Markdown lives: hosted online or on your own computer.

\n

If mdbase is new to you, start with mdbase and TaskNotes for a\nplain-language explanation of the format, Connect desktop app, and hosting\nchoices.

\n

Hosted mdbase#

\n

Hosted mdbase is the recommended choice for convenient access across the web,\nAndroid, and iOS. The provider keeps the main collection online, so it is\navailable from any TaskNotes device with a network connection and can deliver\nreminders while TaskNotes is closed.

\n

TaskNotes reads and writes the hosted collection directly. It does not keep a\nseparate offline copy, so you need a network connection to open the collection\nor make changes.

\n

Connect to a computer#

\n

mdbase Connect can make a Markdown collection on your computer available to\nTaskNotes. Requests and responses travel through an end-to-end encrypted relay;\nthe relay cannot read your task contents and you do not need to open a port on\nyour router.

\n

The computer holds the main copy, so it must be awake, online, and running the\nmdbase Connect background service whenever you use TaskNotes. See how to\ninstall mdbase Connect and use a computer collection.

\n

Change collections later#

\n

Open More and choose Change collection. Opening another collection does\nnot copy or move records from the collection you were using.

\n","text":"TaskNotes opens every collection through mdbase. The choice is where the main copy of your Markdown lives: hosted online or on your own computer. If mdbase is new to you, start with mdbase and TaskNotes for a plain-language explanation of the format, Connect desktop app, and hosting choices. Hosted mdbase# Hosted mdbase is the recommended choice for convenient access across the web, Android, and iOS. The provider keeps the main collection online, so it is available from any TaskNotes device with a network connection and can deliver reminders while TaskNotes is closed. TaskNotes reads and writes the hosted collection directly. It does not keep a separate offline copy, so you need a network connection to open the collection or make changes. Connect to a computer# mdbase Connect can make a Markdown collection on your computer available to TaskNotes. Requests and responses travel through an end-to-end encrypted relay; the relay cannot read your task contents and you do not need to open a port on your router. The computer holds the main copy, so it must be awake, online, and running the mdbase Connect background service whenever you use TaskNotes. See how to install mdbase Connect and use a computer collection. Change collections later# Open More and choose Change collection. Opening another collection does not copy or move records from the collection you were using."},{"route":"/app/connection/","title":"Connection and availability","description":"Understand when TaskNotes can reach hosted and computer-connected mdbase collections.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/connection.md","namespace":"app","relativePath":"connection.md","raw":"---\ntitle: Connection and availability\ndescription: Understand when TaskNotes can reach hosted and computer-connected mdbase collections.\nroute: /app/connection/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Connection and availability\n\nTaskNotes reads and writes the selected mdbase collection directly. It does not\nkeep a separate offline collection or a queue of changes waiting to sync.\n\n## What each status means\n\n| Status | Meaning |\n| --- | --- |\n| Connected | TaskNotes can read and change the selected collection |\n| Connecting | TaskNotes is checking the collection connection |\n| Collection unavailable | The hosted service or connected computer cannot be reached |\n\nOpen **More** to see the current status and use **Refresh now** to read the\nlatest collection state.\n\n## Hosted collections\n\nA hosted collection needs a network connection and an available hosted mdbase\nservice. If either is unavailable, TaskNotes cannot open the collection or save\nchanges. Reconnect the collection if its authorization has expired.\n\n## Collections on your computer\n\nA computer collection also needs the computer holding the Markdown to be\nawake, online, and running the mdbase Connect background service. TaskNotes\nreaches it through the end-to-end encrypted relay. If the computer becomes\nunavailable, access returns when the computer and connector return.\n\n## During a connection problem\n\nTasks already visible in the current session may remain on screen during a\nshort interruption, but TaskNotes cannot safely save new changes until mdbase\nis reachable. A failed action is not silently queued for later.\n\nIf the problem continues, open **More** and choose **Change collection** to use\nanother mdbase collection.\n","aliases":[],"toc":[{"level":2,"id":"what-each-status-means","text":"What each status means"},{"level":2,"id":"hosted-collections","text":"Hosted collections"},{"level":2,"id":"collections-on-your-computer","text":"Collections on your computer"},{"level":2,"id":"during-a-connection-problem","text":"During a connection problem"}],"html":"

TaskNotes reads and writes the selected mdbase collection directly. It does not\nkeep a separate offline collection or a queue of changes waiting to sync.

\n

What each status means#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusMeaning
ConnectedTaskNotes can read and change the selected collection
ConnectingTaskNotes is checking the collection connection
Collection unavailableThe hosted service or connected computer cannot be reached
\n

Open More to see the current status and use Refresh now to read the\nlatest collection state.

\n

Hosted collections#

\n

A hosted collection needs a network connection and an available hosted mdbase\nservice. If either is unavailable, TaskNotes cannot open the collection or save\nchanges. Reconnect the collection if its authorization has expired.

\n

Collections on your computer#

\n

A computer collection also needs the computer holding the Markdown to be\nawake, online, and running the mdbase Connect background service. TaskNotes\nreaches it through the end-to-end encrypted relay. If the computer becomes\nunavailable, access returns when the computer and connector return.

\n

During a connection problem#

\n

Tasks already visible in the current session may remain on screen during a\nshort interruption, but TaskNotes cannot safely save new changes until mdbase\nis reachable. A failed action is not silently queued for later.

\n

If the problem continues, open More and choose Change collection to use\nanother mdbase collection.

\n","text":"TaskNotes reads and writes the selected mdbase collection directly. It does not keep a separate offline collection or a queue of changes waiting to sync. What each status means# Status Meaning Connected TaskNotes can read and change the selected collection Connecting TaskNotes is checking the collection connection Collection unavailable The hosted service or connected computer cannot be reached Open More to see the current status and use Refresh now to read the latest collection state. Hosted collections# A hosted collection needs a network connection and an available hosted mdbase service. If either is unavailable, TaskNotes cannot open the collection or save changes. Reconnect the collection if its authorization has expired. Collections on your computer# A computer collection also needs the computer holding the Markdown to be awake, online, and running the mdbase Connect background service. TaskNotes reaches it through the end-to-end encrypted relay. If the computer becomes unavailable, access returns when the computer and connector return. During a connection problem# Tasks already visible in the current session may remain on screen during a short interruption, but TaskNotes cannot safely save new changes until mdbase is reachable. A failed action is not silently queued for later. If the problem continues, open More and choose Change collection to use another mdbase collection."},{"route":"/app/demo/","title":"Interactive demo","description":"Explore the TaskNotes app with disposable sample tasks before connecting a collection.","product":"app","platforms":["web"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":true,"source":"tasknotes.dev:content/app/demo.md","namespace":"app","relativePath":"demo.md","raw":"---\ntitle: Interactive demo\ndescription: Explore the TaskNotes app with disposable sample tasks before connecting a collection.\nroute: /app/demo/\nproduct: app\nplatforms: [web]\nhide_toc: true\n---\n\n# Interactive demo\n\nExplore the TaskNotes app using a disposable collection of sample tasks. You\ncan complete and edit tasks, use Scratchpad, search, and move between views\nwithout signing in or connecting a collection.\n\nThe demo keeps changes only for the current session. Reloading or resetting it\nstarts again with the original sample data.\n","aliases":[],"toc":[],"html":"

Explore the TaskNotes app using a disposable collection of sample tasks. You\ncan complete and edit tasks, use Scratchpad, search, and move between views\nwithout signing in or connecting a collection.

\n

The demo keeps changes only for the current session. Reloading or resetting it\nstarts again with the original sample data.

\n","text":"Explore the TaskNotes app using a disposable collection of sample tasks. You can complete and edit tasks, use Scratchpad, search, and move between views without signing in or connecting a collection. The demo keeps changes only for the current session. Reloading or resetting it starts again with the original sample data."},{"route":"/app/getting-started/","title":"Get started with the TaskNotes app","description":"Open TaskNotes, connect an mdbase collection, create a task, and find your way around the app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/getting-started.md","namespace":"app","relativePath":"getting-started.md","raw":"---\ntitle: Get started with the TaskNotes app\ndescription: Open TaskNotes, connect an mdbase collection, create a task, and find your way around the app.\nroute: /app/getting-started/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Get started with the TaskNotes app\n\nTaskNotes app is currently in beta. Features, availability, and setup steps may\nchange before the stable release.\n\nThe app supports TaskNotes v5 collections based on the mdbase 0.3.0\nspecification.\n\n## 1. Open TaskNotes\n\nUse [app.tasknotes.dev](https://app.tasknotes.dev/) in a supported browser or\ninstall the Android or iOS application when it is available through its store.\nThe web and native applications use the same task interface.\n\n## 2. Choose a collection\n\nTaskNotes opens every collection through mdbase. Choose **Hosted mdbase** for a\ncollection available anywhere with a network connection, or **Connect to a\ncomputer** to use a Markdown collection kept on your own computer through the\nencrypted relay. Read [What is mdbase?](/app/mdbase/) if this is new to you,\nthen [Choose a collection](/app/collections/) to compare the two options.\n\n## 3. Create a task\n\nUse **Add task**, enter a title, and save. Capture understands the collection's\nconfigured status, priority, project, context, and tag values.\n\n## 4. Review the starter views\n\nOpen **Today** for current work, **Upcoming** for scheduled tasks, and **Views**\nfor the complete collection of lists, boards, calendars, and project views.\nNavigation belongs to the current collection and can be reordered from Views.\n\n## 5. Check collection status\n\nOpen **More** to see the collection location, connection state, last refresh,\nnotification access, task model settings, and appearance preference.\n","aliases":[],"toc":[{"level":2,"id":"1-open-tasknotes","text":"1. Open TaskNotes"},{"level":2,"id":"2-choose-a-collection","text":"2. Choose a collection"},{"level":2,"id":"3-create-a-task","text":"3. Create a task"},{"level":2,"id":"4-review-the-starter-views","text":"4. Review the starter views"},{"level":2,"id":"5-check-collection-status","text":"5. Check collection status"}],"html":"

TaskNotes app is currently in beta. Features, availability, and setup steps may\nchange before the stable release.

\n

The app supports TaskNotes v5 collections based on the mdbase 0.3.0\nspecification.

\n

1. Open TaskNotes#

\n

Use app.tasknotes.dev in a supported browser or\ninstall the Android or iOS application when it is available through its store.\nThe web and native applications use the same task interface.

\n

2. Choose a collection#

\n

TaskNotes opens every collection through mdbase. Choose Hosted mdbase for a\ncollection available anywhere with a network connection, or Connect to a\ncomputer to use a Markdown collection kept on your own computer through the\nencrypted relay. Read What is mdbase? if this is new to you,\nthen Choose a collection to compare the two options.

\n

3. Create a task#

\n

Use Add task, enter a title, and save. Capture understands the collection's\nconfigured status, priority, project, context, and tag values.

\n

4. Review the starter views#

\n

Open Today for current work, Upcoming for scheduled tasks, and Views\nfor the complete collection of lists, boards, calendars, and project views.\nNavigation belongs to the current collection and can be reordered from Views.

\n

5. Check collection status#

\n

Open More to see the collection location, connection state, last refresh,\nnotification access, task model settings, and appearance preference.

\n","text":"TaskNotes app is currently in beta. Features, availability, and setup steps may change before the stable release. The app supports TaskNotes v5 collections based on the mdbase 0.3.0 specification. 1. Open TaskNotes# Use app.tasknotes.dev in a supported browser or install the Android or iOS application when it is available through its store. The web and native applications use the same task interface. 2. Choose a collection# TaskNotes opens every collection through mdbase. Choose Hosted mdbase for a collection available anywhere with a network connection, or Connect to a computer to use a Markdown collection kept on your own computer through the encrypted relay. Read What is mdbase? if this is new to you, then Choose a collection to compare the two options. 3. Create a task# Use Add task, enter a title, and save. Capture understands the collection's configured status, priority, project, context, and tag values. 4. Review the starter views# Open Today for current work, Upcoming for scheduled tasks, and Views for the complete collection of lists, boards, calendars, and project views. Navigation belongs to the current collection and can be reordered from Views. 5. Check collection status# Open More to see the collection location, connection state, last refresh, notification access, task model settings, and appearance preference."},{"route":"/app/mdbase/","title":"mdbase and TaskNotes","description":"Understand how TaskNotes uses hosted mdbase or the encrypted relay to reach a collection on your computer.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/mdbase.md","namespace":"app","relativePath":"mdbase.md","raw":"---\ntitle: mdbase and TaskNotes\ndescription: Understand how TaskNotes uses hosted mdbase or the encrypted relay to reach a collection on your computer.\nroute: /app/mdbase/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# mdbase and TaskNotes\n\nmdbase lets TaskNotes work with a portable Markdown collection instead of\nhiding your tasks in a TaskNotes-only database. Every TaskNotes session opens\none mdbase collection: either a collection hosted online or one kept on your\ncomputer and reached through the encrypted relay.\n\n## What is mdbase?\n\nTwo related names appear in TaskNotes:\n\n- **mdbase** is the open collection format and specification. A collection is\n a folder of Markdown files plus a small description of what those files mean.\n- **mdbase Connect** is the access service TaskNotes uses to ask for permission\n and connect to a hosted collection or a collection on your computer.\n\nRead the [mdbase introduction](https://mdbase.dev/) for a visual explanation of\nthe wider ecosystem.\n\n## What it gives TaskNotes\n\nTaskNotes understands what a task looks like inside an mdbase collection. That\ncompatibility is defined by the TaskNotes v5 collection format and its mdbase\n0.3.0 binding. That means TaskNotes can:\n\n- use the same task fields, projects, tags, saved views, and settings on the\n web, Android, and iOS;\n- ask for access to one collection without seeing your other folders; and\n- keep reminders running while TaskNotes is closed when your collection\n supports them.\n\nBehind the scenes, mdbase checks that each change is valid and writes it to the\nmain collection. You still own readable Markdown files rather than a database\nthat only TaskNotes can open.\n\n## How the connection works\n\nThe mdbase collection is the source of truth. TaskNotes reads and writes it\ndirectly and does not keep a separate offline collection, so opening tasks and\nsaving changes require a connection.\n\n| Choice | Where the Markdown lives | What must be available |\n| --- | --- | --- |\n| Hosted mdbase | With the hosted provider | Your device must have a network connection |\n| Connect to your computer | In a folder on your computer | Both devices must be online, and your computer must be running mdbase Connect |\n\n[Choose a collection](/app/collections/) compares the TaskNotes behavior of\nthese options in more detail.\n\n## Use a collection on your computer\n\nInstall the Electron-based mdbase Connect desktop app to make a folder on your\ncomputer available to TaskNotes. It runs a small background service that keeps\nTaskNotes connected to the Markdown folder. The download also includes command\nline tools. The mdbase editor is online and is not part of the desktop app.\n\n1. Open the [mdbase Connect download page](https://mdbase.dev/downloads/) and\n choose the package for macOS, Windows, or Linux.\n2. Install and open mdbase Connect. Follow any platform-specific beta\n installation notes shown on the download page.\n3. Add an existing mdbase folder on the computer, or create a collection.\n4. In TaskNotes, choose **Connect to a computer** and select that collection.\n5. Review the requested actions and approve the connection.\n\nTaskNotes requests and responses travel through an end-to-end encrypted relay.\nThe relay passes the encrypted data along but cannot read your task contents.\nYou do not need to open an inbound port on your router.\n\nThe background service on your computer checks that TaskNotes has permission,\nthen reads or changes the Markdown files. It does not create another hosted or\noffline copy of the collection.\n\n## Do I need to leave my computer on?\n\nYes. Your computer holds the main copy, so it is part of the connection:\n\n- It must be awake, connected to the internet, and running the mdbase Connect\n background service whenever TaskNotes needs remote access.\n- Sleep, shutdown, a network outage, or a stopped connector makes the\n collection unavailable until the computer returns.\n- Reminder delivery also depends on the computer remaining available.\n- You are responsible for the computer's security, disk health, and backups.\n\nThis works well for an always-on desktop or home server. It is less convenient\nfor a laptop that sleeps or travels regularly. Hosted mdbase removes the\nalways-on-computer requirement, but it moves the main copy to a provider you\nmust trust. Both choices require a network connection while you use TaskNotes.\n\nFor more detail about how Connect protects and routes your data, read\n[How mdbase Connect works](https://mdbase.dev/connect/).\n\n## A practical recommendation\n\nChoose **Hosted mdbase** if dependable access across several devices and\nreminder delivery matter most. Choose **Connect to a computer** if keeping the\nmain Markdown folder on your own machine matters more and that machine can\nremain available.\n","aliases":[],"toc":[{"level":2,"id":"what-is-mdbase","text":"What is mdbase?"},{"level":2,"id":"what-it-gives-tasknotes","text":"What it gives TaskNotes"},{"level":2,"id":"how-the-connection-works","text":"How the connection works"},{"level":2,"id":"use-a-collection-on-your-computer","text":"Use a collection on your computer"},{"level":2,"id":"do-i-need-to-leave-my-computer-on","text":"Do I need to leave my computer on?"},{"level":2,"id":"a-practical-recommendation","text":"A practical recommendation"}],"html":"

mdbase lets TaskNotes work with a portable Markdown collection instead of\nhiding your tasks in a TaskNotes-only database. Every TaskNotes session opens\none mdbase collection: either a collection hosted online or one kept on your\ncomputer and reached through the encrypted relay.

\n

What is mdbase?#

\n

Two related names appear in TaskNotes:

\n
    \n
  • mdbase is the open collection format and specification. A collection is\na folder of Markdown files plus a small description of what those files mean.
  • \n
  • mdbase Connect is the access service TaskNotes uses to ask for permission\nand connect to a hosted collection or a collection on your computer.
  • \n
\n

Read the mdbase introduction for a visual explanation of\nthe wider ecosystem.

\n

What it gives TaskNotes#

\n

TaskNotes understands what a task looks like inside an mdbase collection. That\ncompatibility is defined by the TaskNotes v5 collection format and its mdbase\n0.3.0 binding. That means TaskNotes can:

\n
    \n
  • use the same task fields, projects, tags, saved views, and settings on the\nweb, Android, and iOS;
  • \n
  • ask for access to one collection without seeing your other folders; and
  • \n
  • keep reminders running while TaskNotes is closed when your collection\nsupports them.
  • \n
\n

Behind the scenes, mdbase checks that each change is valid and writes it to the\nmain collection. You still own readable Markdown files rather than a database\nthat only TaskNotes can open.

\n

How the connection works#

\n

The mdbase collection is the source of truth. TaskNotes reads and writes it\ndirectly and does not keep a separate offline collection, so opening tasks and\nsaving changes require a connection.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ChoiceWhere the Markdown livesWhat must be available
Hosted mdbaseWith the hosted providerYour device must have a network connection
Connect to your computerIn a folder on your computerBoth devices must be online, and your computer must be running mdbase Connect
\n

Choose a collection compares the TaskNotes behavior of\nthese options in more detail.

\n

Use a collection on your computer#

\n

Install the Electron-based mdbase Connect desktop app to make a folder on your\ncomputer available to TaskNotes. It runs a small background service that keeps\nTaskNotes connected to the Markdown folder. The download also includes command\nline tools. The mdbase editor is online and is not part of the desktop app.

\n
    \n
  1. Open the mdbase Connect download page and\nchoose the package for macOS, Windows, or Linux.
  2. \n
  3. Install and open mdbase Connect. Follow any platform-specific beta\ninstallation notes shown on the download page.
  4. \n
  5. Add an existing mdbase folder on the computer, or create a collection.
  6. \n
  7. In TaskNotes, choose Connect to a computer and select that collection.
  8. \n
  9. Review the requested actions and approve the connection.
  10. \n
\n

TaskNotes requests and responses travel through an end-to-end encrypted relay.\nThe relay passes the encrypted data along but cannot read your task contents.\nYou do not need to open an inbound port on your router.

\n

The background service on your computer checks that TaskNotes has permission,\nthen reads or changes the Markdown files. It does not create another hosted or\noffline copy of the collection.

\n

Do I need to leave my computer on?#

\n

Yes. Your computer holds the main copy, so it is part of the connection:

\n
    \n
  • It must be awake, connected to the internet, and running the mdbase Connect\nbackground service whenever TaskNotes needs remote access.
  • \n
  • Sleep, shutdown, a network outage, or a stopped connector makes the\ncollection unavailable until the computer returns.
  • \n
  • Reminder delivery also depends on the computer remaining available.
  • \n
  • You are responsible for the computer's security, disk health, and backups.
  • \n
\n

This works well for an always-on desktop or home server. It is less convenient\nfor a laptop that sleeps or travels regularly. Hosted mdbase removes the\nalways-on-computer requirement, but it moves the main copy to a provider you\nmust trust. Both choices require a network connection while you use TaskNotes.

\n

For more detail about how Connect protects and routes your data, read\nHow mdbase Connect works.

\n

A practical recommendation#

\n

Choose Hosted mdbase if dependable access across several devices and\nreminder delivery matter most. Choose Connect to a computer if keeping the\nmain Markdown folder on your own machine matters more and that machine can\nremain available.

\n","text":"mdbase lets TaskNotes work with a portable Markdown collection instead of hiding your tasks in a TaskNotes-only database. Every TaskNotes session opens one mdbase collection: either a collection hosted online or one kept on your computer and reached through the encrypted relay. What is mdbase?# Two related names appear in TaskNotes: mdbase is the open collection format and specification. A collection is a folder of Markdown files plus a small description of what those files mean. mdbase Connect is the access service TaskNotes uses to ask for permission and connect to a hosted collection or a collection on your computer. Read the mdbase introduction for a visual explanation of the wider ecosystem. What it gives TaskNotes# TaskNotes understands what a task looks like inside an mdbase collection. That compatibility is defined by the TaskNotes v5 collection format and its mdbase 0.3.0 binding. That means TaskNotes can: use the same task fields, projects, tags, saved views, and settings on the web, Android, and iOS; ask for access to one collection without seeing your other folders; and keep reminders running while TaskNotes is closed when your collection supports them. Behind the scenes, mdbase checks that each change is valid and writes it to the main collection. You still own readable Markdown files rather than a database that only TaskNotes can open. How the connection works# The mdbase collection is the source of truth. TaskNotes reads and writes it directly and does not keep a separate offline collection, so opening tasks and saving changes require a connection. Choice Where the Markdown lives What must be available Hosted mdbase With the hosted provider Your device must have a network connection Connect to your computer In a folder on your computer Both devices must be online, and your computer must be running mdbase Connect Choose a collection compares the TaskNotes behavior of these options in more detail. Use a collection on your computer# Install the Electron-based mdbase Connect desktop app to make a folder on your computer available to TaskNotes. It runs a small background service that keeps TaskNotes connected to the Markdown folder. The download also includes command line tools. The mdbase editor is online and is not part of the desktop app. Open the mdbase Connect download page and choose the package for macOS, Windows, or Linux. Install and open mdbase Connect. Follow any platform-specific beta installation notes shown on the download page. Add an existing mdbase folder on the computer, or create a collection. In TaskNotes, choose Connect to a computer and select that collection. Review the requested actions and approve the connection. TaskNotes requests and responses travel through an end-to-end encrypted relay. The relay passes the encrypted data along but cannot read your task contents. You do not need to open an inbound port on your router. The background service on your computer checks that TaskNotes has permission, then reads or changes the Markdown files. It does not create another hosted or offline copy of the collection. Do I need to leave my computer on?# Yes. Your computer holds the main copy, so it is part of the connection: It must be awake, connected to the internet, and running the mdbase Connect background service whenever TaskNotes needs remote access. Sleep, shutdown, a network outage, or a stopped connector makes the collection unavailable until the computer returns. Reminder delivery also depends on the computer remaining available. You are responsible for the computer's security, disk health, and backups. This works well for an always-on desktop or home server. It is less convenient for a laptop that sleeps or travels regularly. Hosted mdbase removes the always-on-computer requirement, but it moves the main copy to a provider you must trust. Both choices require a network connection while you use TaskNotes. For more detail about how Connect protects and routes your data, read How mdbase Connect works. A practical recommendation# Choose Hosted mdbase if dependable access across several devices and reminder delivery matter most. Choose Connect to a computer if keeping the main Markdown folder on your own machine matters more and that machine can remain available."},{"route":"/app/reference/manifest/","title":"App integration manifest","description":"Generated reference for the TaskNotes app's mdbase integration requirements and capabilities.","product":"app","platforms":[],"version":"0.1.0","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes-app:src/generated/mdbase-app.json","namespace":"app","relativePath":"reference/manifest.md","raw":"---\ntitle: App integration manifest\ndescription: Generated reference for the TaskNotes app's mdbase integration requirements and capabilities.\n---\n\n# App integration manifest\n\nThis page is generated from the integration manifest shipped by TaskNotes app 0.1.0.\n\n| Field | Value |\n| --- | --- |\n| Application ID | `dev.tasknotes.app` |\n| Manifest version | `1` |\n| Homepage | [https://app.tasknotes.dev/](https://app.tasknotes.dev/) |\n| Collection access | `full_collection` |\n\n## Required contracts\n\n- `tasknotes.task` version `0.3.0-rc.3`\n\n## File capabilities\n\n- `list`\n- `read`\n- `add`\n- `replace`\n- `move`\n- `delete`\n\n## Notification criteria\n\n- `task.reminder` listens for `mdbase.runtime.timer.fired` version `1.0.0`.\n","aliases":[],"toc":[{"level":2,"id":"required-contracts","text":"Required contracts"},{"level":2,"id":"file-capabilities","text":"File capabilities"},{"level":2,"id":"notification-criteria","text":"Notification criteria"}],"html":"

This page is generated from the integration manifest shipped by TaskNotes app 0.1.0.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldValue
Application IDdev.tasknotes.app
Manifest version1
Homepagehttps://app.tasknotes.dev/
Collection accessfull_collection
\n

Required contracts#

\n
    \n
  • tasknotes.task version 0.3.0-rc.3
  • \n
\n

File capabilities#

\n
    \n
  • list
  • \n
  • read
  • \n
  • add
  • \n
  • replace
  • \n
  • move
  • \n
  • delete
  • \n
\n

Notification criteria#

\n
    \n
  • task.reminder listens for mdbase.runtime.timer.fired version 1.0.0.
  • \n
\n","text":"This page is generated from the integration manifest shipped by TaskNotes app 0.1.0. Field Value Application ID dev.tasknotes.app Manifest version 1 Homepage https://app.tasknotes.dev/ Collection access full_collection Required contracts# tasknotes.task version 0.3.0-rc.3 File capabilities# list read add replace move delete Notification criteria# task.reminder listens for mdbase.runtime.timer.fired version 1.0.0."},{"route":"/app/reminders/","title":"Reminders in the TaskNotes app","description":"Understand reminder data, notification delivery, permissions, and collection requirements.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/reminders.md","namespace":"app","relativePath":"reminders.md","raw":"---\ntitle: Reminders in the TaskNotes app\ndescription: Understand reminder data, notification delivery, permissions, and collection requirements.\nroute: /app/reminders/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Reminders in the TaskNotes app\n\nTask records can contain relative reminders anchored to scheduled or due dates,\nor absolute reminders fixed to a particular time. Saving reminder data does not\nby itself guarantee notification delivery.\n\n## Delivery by collection\n\n| Collection | Reminder data | Notification delivery |\n| --- | --- | --- |\n| Hosted mdbase | Saved in the collection | Available after opt-in |\n| Computer through the relay | Saved in the collection | Available while the computer and connector remain available |\n\nFor mdbase collections, the authority schedules reminder events so delivery\ndoes not depend on one TaskNotes screen remaining open. Notification payloads\nare content-free; selecting one refreshes authorized collection state in the\napp.\n\n## Turn on reminders\n\nOpen **More**, select **Turn on reminders**, and approve the browser or operating\nsystem permission. Some existing mdbase grants require **Review notification\naccess** before the channel can be enabled.\n\nAn unsupported or insecure browser reports that notification delivery is not\navailable. The reminder definitions remain in the task record.\n","aliases":[],"toc":[{"level":2,"id":"delivery-by-collection","text":"Delivery by collection"},{"level":2,"id":"turn-on-reminders","text":"Turn on reminders"}],"html":"

Task records can contain relative reminders anchored to scheduled or due dates,\nor absolute reminders fixed to a particular time. Saving reminder data does not\nby itself guarantee notification delivery.

\n

Delivery by collection#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CollectionReminder dataNotification delivery
Hosted mdbaseSaved in the collectionAvailable after opt-in
Computer through the relaySaved in the collectionAvailable while the computer and connector remain available
\n

For mdbase collections, the authority schedules reminder events so delivery\ndoes not depend on one TaskNotes screen remaining open. Notification payloads\nare content-free; selecting one refreshes authorized collection state in the\napp.

\n

Turn on reminders#

\n

Open More, select Turn on reminders, and approve the browser or operating\nsystem permission. Some existing mdbase grants require Review notification\naccess before the channel can be enabled.

\n

An unsupported or insecure browser reports that notification delivery is not\navailable. The reminder definitions remain in the task record.

\n","text":"Task records can contain relative reminders anchored to scheduled or due dates, or absolute reminders fixed to a particular time. Saving reminder data does not by itself guarantee notification delivery. Delivery by collection# Collection Reminder data Notification delivery Hosted mdbase Saved in the collection Available after opt-in Computer through the relay Saved in the collection Available while the computer and connector remain available For mdbase collections, the authority schedules reminder events so delivery does not depend on one TaskNotes screen remaining open. Notification payloads are content-free; selecting one refreshes authorized collection state in the app. Turn on reminders# Open More, select Turn on reminders, and approve the browser or operating system permission. Some existing mdbase grants require Review notification access before the channel can be enabled. An unsupported or insecure browser reports that notification delivery is not available. The reminder definitions remain in the task record."},{"route":"/app/tasks/","title":"Work with tasks","description":"Capture, edit, organize, complete, archive, and search tasks in the TaskNotes app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/tasks.md","namespace":"app","relativePath":"tasks.md","raw":"---\ntitle: Work with tasks\ndescription: Capture, edit, organize, complete, archive, and search tasks in the TaskNotes app.\nroute: /app/tasks/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Work with tasks\n\n
\n \"TaskNotes\n
A task opens beside its source view on wider screens.
\n
\n\n## Capture\n\nUse **Add task** from navigation or from a saved view. When a view has safe\ncreation defaults, TaskNotes applies them automatically so the new task remains\nin that view.\n\n## Edit\n\nA task can contain:\n\n- Status and priority\n- Scheduled and due dates\n- Markdown notes\n- Projects, contexts, and tags\n- Dependencies and subtasks\n- Collection-defined custom properties\n- Time estimates and tracked sessions\n- Recurrence and occurrence-note policies\n- Relative and absolute reminder definitions\n\nBackground saves remain ordered if you navigate away while a write is still in\nprogress.\n\n## Complete, archive, and delete\n\nComplete a task from its row or detail screen. Archive retains the record and\nmay move its Markdown file according to collection settings. Delete offers a\nshort undo period before committing the removal.\n\n## Search\n\nSearch runs across the current collection and matches titles, notes, projects,\ncontexts, and tags. Use **Refresh now** under **More** if a change made by\nanother tool does not appear yet.\n","aliases":[],"toc":[{"level":2,"id":"capture","text":"Capture"},{"level":2,"id":"edit","text":"Edit"},{"level":2,"id":"complete-archive-and-delete","text":"Complete, archive, and delete"},{"level":2,"id":"search","text":"Search"}],"html":"
\n \"TaskNotes\n
A task opens beside its source view on wider screens.
\n
\n\n

Capture#

\n

Use Add task from navigation or from a saved view. When a view has safe\ncreation defaults, TaskNotes applies them automatically so the new task remains\nin that view.

\n

Edit#

\n

A task can contain:

\n
    \n
  • Status and priority
  • \n
  • Scheduled and due dates
  • \n
  • Markdown notes
  • \n
  • Projects, contexts, and tags
  • \n
  • Dependencies and subtasks
  • \n
  • Collection-defined custom properties
  • \n
  • Time estimates and tracked sessions
  • \n
  • Recurrence and occurrence-note policies
  • \n
  • Relative and absolute reminder definitions
  • \n
\n

Background saves remain ordered if you navigate away while a write is still in\nprogress.

\n

Complete, archive, and delete#

\n

Complete a task from its row or detail screen. Archive retains the record and\nmay move its Markdown file according to collection settings. Delete offers a\nshort undo period before committing the removal.

\n

Search#

\n

Search runs across the current collection and matches titles, notes, projects,\ncontexts, and tags. Use Refresh now under More if a change made by\nanother tool does not appear yet.

\n","text":"A task opens beside its source view on wider screens. Capture# Use Add task from navigation or from a saved view. When a view has safe creation defaults, TaskNotes applies them automatically so the new task remains in that view. Edit# A task can contain: Status and priority Scheduled and due dates Markdown notes Projects, contexts, and tags Dependencies and subtasks Collection-defined custom properties Time estimates and tracked sessions Recurrence and occurrence-note policies Relative and absolute reminder definitions Background saves remain ordered if you navigate away while a write is still in progress. Complete, archive, and delete# Complete a task from its row or detail screen. Archive retains the record and may move its Markdown file according to collection settings. Delete offers a short undo period before committing the removal. Search# Search runs across the current collection and matches titles, notes, projects, contexts, and tags. Use Refresh now under More if a change made by another tool does not appear yet."},{"route":"/app/troubleshooting/","title":"Troubleshoot the TaskNotes app","description":"Diagnose mdbase connection, authorization, refresh, and notification problems in the app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/troubleshooting.md","namespace":"app","relativePath":"troubleshooting.md","raw":"---\ntitle: Troubleshoot the TaskNotes app\ndescription: Diagnose mdbase connection, authorization, refresh, and notification problems in the app.\nroute: /app/troubleshooting/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Troubleshoot the TaskNotes app\n\nStart by recording the app version, platform, collection type, collection\nstatus shown under **More**, and the smallest sequence that reproduces the\nproblem.\n\n## The collection is unavailable\n\nFor a hosted collection, confirm that the device is online and try **Reconnect\nthis collection**. For a computer collection, also confirm that the computer\nholding the Markdown is awake, online, and running mdbase Connect.\n\n## An authorization error appears\n\nUse the reconnect action for the current collection and review the access that\nmdbase requests. If you no longer want to use that collection, open **More** and\nchoose **Change collection**.\n\n## A change did not save\n\nTaskNotes writes directly to mdbase and does not queue failed changes for later.\nRestore the connection, then retry the action. Capture and editing screens keep\nrecoverable input visible when they can do so safely.\n\n## A change from another tool is missing\n\nOpen **More** and choose **Refresh now**. If the record still does not appear,\nconfirm that the other tool wrote to the same mdbase collection and that the\nrecord uses a compatible TaskNotes task definition.\n\n## Notifications do not arrive\n\nConfirm that the current collection is an mdbase collection, reminders are\nenabled in **More**, the browser or operating system permission is granted, and\nthe task contains a valid future reminder. For a computer collection, the\ncomputer and mdbase Connect must remain available.\n","aliases":[],"toc":[{"level":2,"id":"the-collection-is-unavailable","text":"The collection is unavailable"},{"level":2,"id":"an-authorization-error-appears","text":"An authorization error appears"},{"level":2,"id":"a-change-did-not-save","text":"A change did not save"},{"level":2,"id":"a-change-from-another-tool-is-missing","text":"A change from another tool is missing"},{"level":2,"id":"notifications-do-not-arrive","text":"Notifications do not arrive"}],"html":"

Start by recording the app version, platform, collection type, collection\nstatus shown under More, and the smallest sequence that reproduces the\nproblem.

\n

The collection is unavailable#

\n

For a hosted collection, confirm that the device is online and try Reconnect\nthis collection. For a computer collection, also confirm that the computer\nholding the Markdown is awake, online, and running mdbase Connect.

\n

An authorization error appears#

\n

Use the reconnect action for the current collection and review the access that\nmdbase requests. If you no longer want to use that collection, open More and\nchoose Change collection.

\n

A change did not save#

\n

TaskNotes writes directly to mdbase and does not queue failed changes for later.\nRestore the connection, then retry the action. Capture and editing screens keep\nrecoverable input visible when they can do so safely.

\n

A change from another tool is missing#

\n

Open More and choose Refresh now. If the record still does not appear,\nconfirm that the other tool wrote to the same mdbase collection and that the\nrecord uses a compatible TaskNotes task definition.

\n

Notifications do not arrive#

\n

Confirm that the current collection is an mdbase collection, reminders are\nenabled in More, the browser or operating system permission is granted, and\nthe task contains a valid future reminder. For a computer collection, the\ncomputer and mdbase Connect must remain available.

\n","text":"Start by recording the app version, platform, collection type, collection status shown under More, and the smallest sequence that reproduces the problem. The collection is unavailable# For a hosted collection, confirm that the device is online and try Reconnect this collection. For a computer collection, also confirm that the computer holding the Markdown is awake, online, and running mdbase Connect. An authorization error appears# Use the reconnect action for the current collection and review the access that mdbase requests. If you no longer want to use that collection, open More and choose Change collection. A change did not save# TaskNotes writes directly to mdbase and does not queue failed changes for later. Restore the connection, then retry the action. Capture and editing screens keep recoverable input visible when they can do so safely. A change from another tool is missing# Open More and choose Refresh now. If the record still does not appear, confirm that the other tool wrote to the same mdbase collection and that the record uses a compatible TaskNotes task definition. Notifications do not arrive# Confirm that the current collection is an mdbase collection, reminders are enabled in More, the browser or operating system permission is granted, and the task contains a valid future reminder. For a computer collection, the computer and mdbase Connect must remain available."},{"route":"/app/views/","title":"Views and navigation","description":"Use and arrange lists, boards, calendars, projects, and saved views in the TaskNotes app.","product":"app","platforms":["web","android","ios"],"version":"0.1.0","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/app/views.md","namespace":"app","relativePath":"views.md","raw":"---\ntitle: Views and navigation\ndescription: Use and arrange lists, boards, calendars, projects, and saved views in the TaskNotes app.\nroute: /app/views/\nproduct: app\nplatforms: [web, android, ios]\n---\n\n# Views and navigation\n\nViews are saved ways of selecting, sorting, grouping, and presenting records in\na collection. They travel with the collection; the set pinned to navigation is\na preference on each device.\n\n
\n \"TaskNotes\n
The Views manager controls navigation order and saved view definitions.
\n
\n\n## Starter views\n\nTaskNotes creates managed starter views such as Today, Upcoming, Calendar, and\nProjects. They use the same saved-view catalog as user-created views while\nproviding focused presentations for common work.\n\n## Presentations\n\n- **Task list** supports grouping, visible properties, section moves, and manual ordering.\n- **Kanban** groups tasks into columns and can update the grouped property when a task moves.\n- **Calendar** shows task dates in month, week, day, and list layouts.\n- **Mini calendar** combines a month picker with tasks for the selected day.\n- **Projects** finds project records referenced by active tasks.\n\n## Navigation\n\nOpen **Views** to add or remove a view from navigation and to change its order.\nThe first navigation item is the collection's home. Mobile displays the first\nthree views directly and keeps the rest in the Views destination.\n\n## Create and edit views\n\nThe view editor controls the name, presentation, query, grouping, sort order,\nvisible properties, and safe defaults for tasks created from the view. View\ndocuments remain ordinary collection resources rather than being stored only\ninside the TaskNotes app.\n","aliases":[],"toc":[{"level":2,"id":"starter-views","text":"Starter views"},{"level":2,"id":"presentations","text":"Presentations"},{"level":2,"id":"navigation","text":"Navigation"},{"level":2,"id":"create-and-edit-views","text":"Create and edit views"}],"html":"

Views are saved ways of selecting, sorting, grouping, and presenting records in\na collection. They travel with the collection; the set pinned to navigation is\na preference on each device.

\n
\n \"TaskNotes\n
The Views manager controls navigation order and saved view definitions.
\n
\n\n

Starter views#

\n

TaskNotes creates managed starter views such as Today, Upcoming, Calendar, and\nProjects. They use the same saved-view catalog as user-created views while\nproviding focused presentations for common work.

\n

Presentations#

\n
    \n
  • Task list supports grouping, visible properties, section moves, and manual ordering.
  • \n
  • Kanban groups tasks into columns and can update the grouped property when a task moves.
  • \n
  • Calendar shows task dates in month, week, day, and list layouts.
  • \n
  • Mini calendar combines a month picker with tasks for the selected day.
  • \n
  • Projects finds project records referenced by active tasks.
  • \n
\n

Navigation#

\n

Open Views to add or remove a view from navigation and to change its order.\nThe first navigation item is the collection's home. Mobile displays the first\nthree views directly and keeps the rest in the Views destination.

\n

Create and edit views#

\n

The view editor controls the name, presentation, query, grouping, sort order,\nvisible properties, and safe defaults for tasks created from the view. View\ndocuments remain ordinary collection resources rather than being stored only\ninside the TaskNotes app.

\n","text":"Views are saved ways of selecting, sorting, grouping, and presenting records in a collection. They travel with the collection; the set pinned to navigation is a preference on each device. The Views manager controls navigation order and saved view definitions. Starter views# TaskNotes creates managed starter views such as Today, Upcoming, Calendar, and Projects. They use the same saved-view catalog as user-created views while providing focused presentations for common work. Presentations# Task list supports grouping, visible properties, section moves, and manual ordering. Kanban groups tasks into columns and can update the grouped property when a task moves. Calendar shows task dates in month, week, day, and list layouts. Mini calendar combines a month picker with tasks for the selected day. Projects finds project records referenced by active tasks. Navigation# Open Views to add or remove a view from navigation and to change its order. The first navigation item is the collection's home. Mobile displays the first three views directly and keeps the rest in the Views destination. Create and edit views# The view editor controls the name, presentation, query, grouping, sort order, visible properties, and safe defaults for tasks created from the view. View documents remain ordinary collection resources rather than being stored only inside the TaskNotes app."},{"route":"/concepts/task-records/","title":"Portable task records","description":"The Markdown records, collection configuration, and task concepts shared by TaskNotes clients.","product":"shared","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/shared/task-records.md","namespace":"shared","relativePath":"task-records.md","raw":"---\ntitle: Portable task records\ndescription: The Markdown records, collection configuration, and task concepts shared by TaskNotes clients.\nroute: /concepts/task-records/\nproduct: shared\n---\n\n# Portable task records\n\nA TaskNotes task is an ordinary Markdown record with structured properties.\nThose properties describe the task; the Markdown body remains available for\nnotes, checklists, links, and supporting detail.\n\n## Collections\n\nA collection is a group of records plus the configuration that explains how to\ninterpret them. The configuration defines field names, statuses, priorities,\ncustom properties, record locations, and saved views.\n\nThe TaskNotes app uses **collection** throughout. The Obsidian plugin usually\ndescribes the containing folder as a **vault** and presents saved views through\nObsidian Bases.\n\n## Source of truth\n\nWhere the authoritative copy lives depends on the client and connection:\n\n| Client and collection | Source of truth | Availability |\n| --- | --- | --- |\n| TaskNotes app · hosted mdbase | Hosted collection | Requires a network connection |\n| TaskNotes app · computer through relay | Collection on that computer | Requires the network, computer, and connector |\n| Obsidian vault | Markdown files in the vault | Controlled by Obsidian and your sync choice |\n\n## Portability and compatibility\n\nPortable does not mean every client exposes every feature. Inline task widgets,\nObsidian commands, external calendar integrations, and companion plugins belong\nto the Obsidian client. mdbase collection access and background reminder\ndelivery belong to the TaskNotes app.\n\nUse the client-specific guide for interface instructions and the\n[specification](/developers/specification/) for normative data semantics.\n","aliases":[],"toc":[{"level":2,"id":"collections","text":"Collections"},{"level":2,"id":"source-of-truth","text":"Source of truth"},{"level":2,"id":"portability-and-compatibility","text":"Portability and compatibility"}],"html":"

A TaskNotes task is an ordinary Markdown record with structured properties.\nThose properties describe the task; the Markdown body remains available for\nnotes, checklists, links, and supporting detail.

\n

Collections#

\n

A collection is a group of records plus the configuration that explains how to\ninterpret them. The configuration defines field names, statuses, priorities,\ncustom properties, record locations, and saved views.

\n

The TaskNotes app uses collection throughout. The Obsidian plugin usually\ndescribes the containing folder as a vault and presents saved views through\nObsidian Bases.

\n

Source of truth#

\n

Where the authoritative copy lives depends on the client and connection:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Client and collectionSource of truthAvailability
TaskNotes app · hosted mdbaseHosted collectionRequires a network connection
TaskNotes app · computer through relayCollection on that computerRequires the network, computer, and connector
Obsidian vaultMarkdown files in the vaultControlled by Obsidian and your sync choice
\n

Portability and compatibility#

\n

Portable does not mean every client exposes every feature. Inline task widgets,\nObsidian commands, external calendar integrations, and companion plugins belong\nto the Obsidian client. mdbase collection access and background reminder\ndelivery belong to the TaskNotes app.

\n

Use the client-specific guide for interface instructions and the\nspecification for normative data semantics.

\n","text":"A TaskNotes task is an ordinary Markdown record with structured properties. Those properties describe the task; the Markdown body remains available for notes, checklists, links, and supporting detail. Collections# A collection is a group of records plus the configuration that explains how to interpret them. The configuration defines field names, statuses, priorities, custom properties, record locations, and saved views. The TaskNotes app uses collection throughout. The Obsidian plugin usually describes the containing folder as a vault and presents saved views through Obsidian Bases. Source of truth# Where the authoritative copy lives depends on the client and connection: Client and collection Source of truth Availability TaskNotes app · hosted mdbase Hosted collection Requires a network connection TaskNotes app · computer through relay Collection on that computer Requires the network, computer, and connector Obsidian vault Markdown files in the vault Controlled by Obsidian and your sync choice Portability and compatibility# Portable does not mean every client exposes every feature. Inline task widgets, Obsidian commands, external calendar integrations, and companion plugins belong to the Obsidian client. mdbase collection access and background reminder delivery belong to the TaskNotes app. Use the client-specific guide for interface instructions and the specification for normative data semantics."},{"route":"/developers/specification/","title":"0. Overview","description":"TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editabl...","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:00-overview.md","namespace":"specification","relativePath":"00-overview.md","raw":"# 0. Overview\n\n## 0.0 About tasknotes\n\n**TaskNotes** is an [Obsidian](https://obsidian.md) plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling.\n\nA minimal task file looks like this:\n\n```markdown\n---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n```\n\nTasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. `#task` in body or frontmatter). The plugin stores its configuration in `.obsidian/plugins/tasknotes/data.json` within the vault root.\n\n**This specification** was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for:\n\n- CLI tools and scripts that process task files outside Obsidian,\n- any application that wants to interoperate with a tasknotes vault.\n\nThe spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in `conformance/`) can be driven by an adapter written in any language.\n\nThe tasknotes plugin is the primary reference for how this spec was derived, but **the specification is normative** — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5).\n\n## 0.1 Status and authority\n\nThis document is part of `tasknotes-spec` version `0.3.0-rc.3`.\n\nThis specification is normative for implementations that claim conformance.\nNo single implementation is normative; implementations are expected to conform to the specification.\n\n## 0.2 Motivation\n\nTaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages:\n\n- Task records are plain files that can be inspected and edited without proprietary tooling.\n- Data remains portable across environments.\n- Files are suitable for version control and collaboration workflows.\n\nAs soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas:\n\n1. Field semantics and naming drift.\n2. Date and timezone interpretation differences.\n3. Recurring-task state transitions that are handled differently by different clients.\n\nWhen these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned.\n\n## 0.3 Objectives\n\nThis specification defines a stable contract for:\n\n- Representing task records in markdown frontmatter.\n- Mapping storage keys to canonical semantic roles.\n- Defining effective collection configuration via provider model (for example `tasknotes.yaml` and/or TaskNotes `data.json`).\n- Interpreting date and datetime values consistently.\n- Applying recurrence, per-instance completion/skip behavior, and optional materialized occurrence notes.\n- Managing time tracking sessions and `time_entries` lifecycle behavior.\n- Parsing and resolving links consistently across task fields.\n- Defining dependency and reminder behavior.\n- Optionally applying deterministic create-time templating behavior.\n- Executing write operations with predictable side-effects.\n- Validating task records and reporting issues.\n\n## 0.4 Non-objectives\n\nThis specification does not standardize:\n\n- UI layout, styling, command palettes, or interaction design.\n- Internal caching architecture or rendering pipelines.\n- Transport protocols (HTTP, IPC, etc.) except where they affect persisted task semantics.\n- Rich template-language features beyond the portable create-time templating contract in §5/§7/§9.\n\n## 0.5 Scope\n\nThis specification is standalone. It does not require conformance to any other specification.\n\nImplementations MAY internally reuse other libraries or specifications, but conformance claims under `tasknotes-spec` are evaluated only against this document.\nTemplating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support.\nReferences to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative.\n\n## 0.6 Design principles\n\n### 0.6.1 File-first persistence\n\nTask state is represented in user-visible files. Derived indexes and caches are non-canonical.\n\n### 0.6.2 Deterministic semantics\n\nEquivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone.\n\n### 0.6.3 Explicit mapping\n\nSemantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly.\n\n### 0.6.4 Backward evolution\n\nThe specification supports migration from legacy keys and historical behaviors through explicit compatibility rules.\n\n## 0.7 Conformance\n\nConformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations.\n\n## 0.8 Normative language\n\nThe key words **MUST**, **MUST NOT**, **SHOULD**, **SHOULD NOT**, and **MAY** are to be interpreted as described in RFC 2119.\n\n## 0.9 Example collection\n\nA default tasknotes vault looks like this:\n\n```text\nMyVault/\n├── TaskNotes/\n│ ├── Tasks/\n│ │ ├── buy-groceries.md ← task file (title-derived filename by default)\n│ │ └── weekly-review.md\n│ └── Archive/ ← archive folder (if moveArchivedTasks=true)\n├── .obsidian/\n│ └── plugins/\n│ └── tasknotes/\n│ └── data.json ← plugin settings (primary config provider)\n└── tasknotes.yaml ← optional spec-level config (secondary provider)\n```\n\nTask files are identified by the `#task` tag by default (configurable). The full default collection state is described in §9.21.\n\nConfiguration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy.\n\nA task file example (using default field mapping):\n\n```markdown\n---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task, errands]\ncontexts: [\"town\"]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n```\n\n## 0.10 Versioning policy\n\nThis specification uses semantic versioning.\n\n- A **major** version introduces breaking semantic changes.\n- A **minor** version introduces additive behavior or optional features.\n- A **patch** version clarifies wording or fixes non-breaking defects.\n\nImplementations MUST reject unsupported major versions when strict mode is enabled.\n\n## 0.11 Change governance\n\nSpecification changes SHOULD be accompanied by:\n\n- a motivation statement,\n- precise normative edits,\n- migration notes when behavior changes,\n- updated examples.\n","aliases":["/spec/00-overview/"],"toc":[{"level":2,"id":"00-about-tasknotes","text":"0.0 About tasknotes"},{"level":2,"id":"01-status-and-authority","text":"0.1 Status and authority"},{"level":2,"id":"02-motivation","text":"0.2 Motivation"},{"level":2,"id":"03-objectives","text":"0.3 Objectives"},{"level":2,"id":"04-non-objectives","text":"0.4 Non-objectives"},{"level":2,"id":"05-scope","text":"0.5 Scope"},{"level":2,"id":"06-design-principles","text":"0.6 Design principles"},{"level":3,"id":"061-file-first-persistence","text":"0.6.1 File-first persistence"},{"level":3,"id":"062-deterministic-semantics","text":"0.6.2 Deterministic semantics"},{"level":3,"id":"063-explicit-mapping","text":"0.6.3 Explicit mapping"},{"level":3,"id":"064-backward-evolution","text":"0.6.4 Backward evolution"},{"level":2,"id":"07-conformance","text":"0.7 Conformance"},{"level":2,"id":"08-normative-language","text":"0.8 Normative language"},{"level":2,"id":"09-example-collection","text":"0.9 Example collection"},{"level":2,"id":"010-versioning-policy","text":"0.10 Versioning policy"},{"level":2,"id":"011-change-governance","text":"0.11 Change governance"}],"html":"

0.0 About tasknotes#

\n

TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling.

\n

A minimal task file looks like this:

\n
---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n

Tasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. #task in body or frontmatter). The plugin stores its configuration in .obsidian/plugins/tasknotes/data.json within the vault root.

\n

This specification was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for:

\n
    \n
  • CLI tools and scripts that process task files outside Obsidian,
  • \n
  • any application that wants to interoperate with a tasknotes vault.
  • \n
\n

The spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in conformance/) can be driven by an adapter written in any language.

\n

The tasknotes plugin is the primary reference for how this spec was derived, but the specification is normative — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5).

\n

0.1 Status and authority#

\n

This document is part of tasknotes-spec version 0.3.0-rc.3.

\n

This specification is normative for implementations that claim conformance.\nNo single implementation is normative; implementations are expected to conform to the specification.

\n

0.2 Motivation#

\n

TaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages:

\n
    \n
  • Task records are plain files that can be inspected and edited without proprietary tooling.
  • \n
  • Data remains portable across environments.
  • \n
  • Files are suitable for version control and collaboration workflows.
  • \n
\n

As soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas:

\n
    \n
  1. Field semantics and naming drift.
  2. \n
  3. Date and timezone interpretation differences.
  4. \n
  5. Recurring-task state transitions that are handled differently by different clients.
  6. \n
\n

When these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned.

\n

0.3 Objectives#

\n

This specification defines a stable contract for:

\n
    \n
  • Representing task records in markdown frontmatter.
  • \n
  • Mapping storage keys to canonical semantic roles.
  • \n
  • Defining effective collection configuration via provider model (for example tasknotes.yaml and/or TaskNotes data.json).
  • \n
  • Interpreting date and datetime values consistently.
  • \n
  • Applying recurrence, per-instance completion/skip behavior, and optional materialized occurrence notes.
  • \n
  • Managing time tracking sessions and time_entries lifecycle behavior.
  • \n
  • Parsing and resolving links consistently across task fields.
  • \n
  • Defining dependency and reminder behavior.
  • \n
  • Optionally applying deterministic create-time templating behavior.
  • \n
  • Executing write operations with predictable side-effects.
  • \n
  • Validating task records and reporting issues.
  • \n
\n

0.4 Non-objectives#

\n

This specification does not standardize:

\n
    \n
  • UI layout, styling, command palettes, or interaction design.
  • \n
  • Internal caching architecture or rendering pipelines.
  • \n
  • Transport protocols (HTTP, IPC, etc.) except where they affect persisted task semantics.
  • \n
  • Rich template-language features beyond the portable create-time templating contract in §5/§7/§9.
  • \n
\n

0.5 Scope#

\n

This specification is standalone. It does not require conformance to any other specification.

\n

Implementations MAY internally reuse other libraries or specifications, but conformance claims under tasknotes-spec are evaluated only against this document.\nTemplating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support.\nReferences to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative.

\n

0.6 Design principles#

\n

0.6.1 File-first persistence#

\n

Task state is represented in user-visible files. Derived indexes and caches are non-canonical.

\n

0.6.2 Deterministic semantics#

\n

Equivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone.

\n

0.6.3 Explicit mapping#

\n

Semantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly.

\n

0.6.4 Backward evolution#

\n

The specification supports migration from legacy keys and historical behaviors through explicit compatibility rules.

\n

0.7 Conformance#

\n

Conformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations.

\n

0.8 Normative language#

\n

The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are to be interpreted as described in RFC 2119.

\n

0.9 Example collection#

\n

A default tasknotes vault looks like this:

\n
MyVault/\n├── TaskNotes/\n│   ├── Tasks/\n│   │   ├── buy-groceries.md    ← task file (title-derived filename by default)\n│   │   └── weekly-review.md\n│   └── Archive/                ← archive folder (if moveArchivedTasks=true)\n├── .obsidian/\n│   └── plugins/\n│       └── tasknotes/\n│           └── data.json       ← plugin settings (primary config provider)\n└── tasknotes.yaml              ← optional spec-level config (secondary provider)\n

Task files are identified by the #task tag by default (configurable). The full default collection state is described in §9.21.

\n

Configuration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy.

\n

A task file example (using default field mapping):

\n
---\ntitle: Buy groceries\nstatus: open\npriority: normal\ndue: 2026-02-21\ntags: [task, errands]\ncontexts: ["town"]\ndateCreated: 2026-02-20T11:15:00Z\ndateModified: 2026-02-20T11:15:00Z\n---\n\nBuy fruit and cleaning supplies.\n

0.10 Versioning policy#

\n

This specification uses semantic versioning.

\n
    \n
  • A major version introduces breaking semantic changes.
  • \n
  • A minor version introduces additive behavior or optional features.
  • \n
  • A patch version clarifies wording or fixes non-breaking defects.
  • \n
\n

Implementations MUST reject unsupported major versions when strict mode is enabled.

\n

0.11 Change governance#

\n

Specification changes SHOULD be accompanied by:

\n
    \n
  • a motivation statement,
  • \n
  • precise normative edits,
  • \n
  • migration notes when behavior changes,
  • \n
  • updated examples.
  • \n
\n","text":"0.0 About tasknotes# TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling. A minimal task file looks like this: --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. Tasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. #task in body or frontmatter). The plugin stores its configuration in .obsidian/plugins/tasknotes/data.json within the vault root. This specification was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for: CLI tools and scripts that process task files outside Obsidian, any application that wants to interoperate with a tasknotes vault. The spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in conformance/) can be driven by an adapter written in any language. The tasknotes plugin is the primary reference for how this spec was derived, but the specification is normative — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5). 0.1 Status and authority# This document is part of tasknotes-spec version 0.3.0-rc.3. This specification is normative for implementations that claim conformance. No single implementation is normative; implementations are expected to conform to the specification. 0.2 Motivation# TaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages: Task records are plain files that can be inspected and edited without proprietary tooling. Data remains portable across environments. Files are suitable for version control and collaboration workflows. As soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas: Field semantics and naming drift. Date and timezone interpretation differences. Recurring-task state transitions that are handled differently by different clients. When these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned. 0.3 Objectives# This specification defines a stable contract for: Representing task records in markdown frontmatter. Mapping storage keys to canonical semantic roles. Defining effective collection configuration via provider model (for example tasknotes.yaml and/or TaskNotes data.json). Interpreting date and datetime values consistently. Applying recurrence, per-instance completion/skip behavior, and optional materialized occurrence notes. Managing time tracking sessions and time_entries lifecycle behavior. Parsing and resolving links consistently across task fields. Defining dependency and reminder behavior. Optionally applying deterministic create-time templating behavior. Executing write operations with predictable side-effects. Validating task records and reporting issues. 0.4 Non-objectives# This specification does not standardize: UI layout, styling, command palettes, or interaction design. Internal caching architecture or rendering pipelines. Transport protocols (HTTP, IPC, etc.) except where they affect persisted task semantics. Rich template-language features beyond the portable create-time templating contract in §5/§7/§9. 0.5 Scope# This specification is standalone. It does not require conformance to any other specification. Implementations MAY internally reuse other libraries or specifications, but conformance claims under tasknotes-spec are evaluated only against this document. Templating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support. References to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative. 0.6 Design principles# 0.6.1 File-first persistence# Task state is represented in user-visible files. Derived indexes and caches are non-canonical. 0.6.2 Deterministic semantics# Equivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone. 0.6.3 Explicit mapping# Semantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly. 0.6.4 Backward evolution# The specification supports migration from legacy keys and historical behaviors through explicit compatibility rules. 0.7 Conformance# Conformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations. 0.8 Normative language# The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are to be interpreted as described in RFC 2119. 0.9 Example collection# A default tasknotes vault looks like this: MyVault/ ├── TaskNotes/ │ ├── Tasks/ │ │ ├── buy-groceries.md ← task file (title-derived filename by default) │ │ └── weekly-review.md │ └── Archive/ ← archive folder (if moveArchivedTasks=true) ├── .obsidian/ │ └── plugins/ │ └── tasknotes/ │ └── data.json ← plugin settings (primary config provider) └── tasknotes.yaml ← optional spec-level config (secondary provider) Task files are identified by the #task tag by default (configurable). The full default collection state is described in §9.21. Configuration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy. A task file example (using default field mapping): --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task, errands] contexts: [\"town\"] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. 0.10 Versioning policy# This specification uses semantic versioning. A major version introduces breaking semantic changes. A minor version introduces additive behavior or optional features. A patch version clarifies wording or fixes non-breaking defects. Implementations MUST reject unsupported major versions when strict mode is enabled. 0.11 Change governance# Specification changes SHOULD be accompanied by: a motivation statement, precise normative edits, migration notes when behavior changes, updated examples."},{"route":"/developers/specification/01-terminology/","title":"1. Terminology","description":"This section defines terms used normatively in this specification.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:01-terminology.md","namespace":"specification","relativePath":"01-terminology.md","raw":"# 1. Terminology\n\nThis section defines terms used normatively in this specification.\n\n## 1.1 Collection\n\nA **collection** is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration.\n\n## 1.2 Task file\n\nA **task file** is a markdown file identified as a task record by collection rules.\n\n## 1.3 Frontmatter\n\n**Frontmatter** is the YAML block at the start of a markdown file delimited by `---` markers.\n\n## 1.4 Task record\n\nA **task record** is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata).\n\n## 1.5 Semantic role\n\nA **semantic role** is a canonical meaning defined by this specification, independent of storage key names.\n\nExamples: `title`, `status`, `date_created`, `complete_instances`.\n\n## 1.6 Storage key\n\nA **storage key** is the YAML property name used in frontmatter.\n\nExamples: `dateCreated`, `date_created`, `completedDate`.\n\n## 1.7 Field mapping\n\n**Field mapping** is the configuration that maps semantic roles to storage keys for reads and writes.\n\n## 1.8 Alias\n\nAn **alias** is a non-canonical storage key accepted for compatibility during reads.\n\n## 1.9 Canonical write key\n\nThe **canonical write key** is the configured storage key that conforming writers use for persisted output.\n\n## 1.10 Date value\n\nA **date value** represents a calendar day with no time-of-day and no timezone.\n\nCanonical form: `YYYY-MM-DD`.\n\n## 1.11 Datetime value\n\nA **datetime value** represents an instant in time.\n\nCanonical form: ISO 8601 UTC with trailing `Z`.\n\n## 1.12 Target date\n\nA **target date** is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20).\n\n## 1.13 Recurrence rule\n\nA **recurrence rule** is a tasknotes recurrence string stored in the recurrence semantic role.\nIt uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline `DTSTART` prefix segment as defined in §4.3.\n\n## 1.14 Recurrence anchor\n\n**Recurrence anchor** defines how next-instance progression is computed. Allowed values:\n\n- `scheduled`\n- `completion`\n\n## 1.15 Complete instances\n\n**Complete instances** is the set/list of target dates marked completed for a recurring task.\n\n## 1.16 Skipped instances\n\n**Skipped instances** is the set/list of target dates marked skipped for a recurring task.\n\n## 1.17 Materialized occurrence note\n\nA **materialized occurrence note** is a task file created for one target date of a recurring parent task.\nIt stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date.\n\n## 1.18 Recurrence parent\n\nA **recurrence parent** is the recurring task record referenced by a materialized occurrence note.\nThe reference is stored in semantic role `recurrence_parent` and resolved as a link according to §11.\n\n## 1.19 Occurrence materialization\n\n**Occurrence materialization** is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20.\n\n## 1.20 Effective status\n\n**Effective status** is the status presented for a given date context after applying recurrence instance state.\n\n## 1.21 Completed-status list\n\nThe **completed-status list** is the configured ordered list of status values treated as completed for non-recurring completion semantics.\nWhen a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it.\n\n## 1.22 Idempotent operation\n\nAn operation is **idempotent** if applying it multiple times with the same input produces the same persisted state as applying it once.\n\n## 1.23 Unknown field\n\nAn **unknown field** is a frontmatter property not mapped to a semantic role in current configuration.\n\n## 1.24 Validation issue\n\nA **validation issue** is a structured report containing at least:\n\n- machine-readable code,\n- severity,\n- optional path/field context,\n- human-readable message.\n\n## 1.25 Strict validation mode\n\n**Strict validation mode** is a mode where invalid required semantics are treated as hard errors and write operations fail.\n\n## 1.26 Legacy compatibility mode\n\n**Legacy compatibility mode** is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes.\n\n## 1.27 Configuration provider\n\nA **configuration provider** is an adapter that loads configuration from a source (for example `tasknotes.yaml` or `.obsidian/plugins/tasknotes/data.json`) and normalizes it to the schema in §9.\n\n## 1.28 Effective configuration\n\nThe **effective configuration** is the final resolved configuration after applying provider precedence and fallback rules.\n\n## 1.29 Template file\n\nA **template file** is a markdown document used at create time to generate frontmatter and/or body content through variable expansion.\nWhen templating is enabled, template behavior is defined by §5.3.5 and §9.14.\n\n## 1.30 Template expansion\n\n**Template expansion** is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules.\n\n## 1.31 Time entry\n\nA **time entry** is a structured record in `time_entries` containing `startTime`, optional `endTime`, and optional `description`.\n\n## 1.32 Active time entry\n\nAn **active time entry** is a time entry with `startTime` present and `endTime` absent.\n\n## 1.33 Time tracking management\n\n**Time tracking management** is the set of operations that start, stop, edit, and remove `time_entries`, including completion-triggered auto-stop behavior when configured.\n","aliases":["/spec/01-terminology/"],"toc":[{"level":2,"id":"11-collection","text":"1.1 Collection"},{"level":2,"id":"12-task-file","text":"1.2 Task file"},{"level":2,"id":"13-frontmatter","text":"1.3 Frontmatter"},{"level":2,"id":"14-task-record","text":"1.4 Task record"},{"level":2,"id":"15-semantic-role","text":"1.5 Semantic role"},{"level":2,"id":"16-storage-key","text":"1.6 Storage key"},{"level":2,"id":"17-field-mapping","text":"1.7 Field mapping"},{"level":2,"id":"18-alias","text":"1.8 Alias"},{"level":2,"id":"19-canonical-write-key","text":"1.9 Canonical write key"},{"level":2,"id":"110-date-value","text":"1.10 Date value"},{"level":2,"id":"111-datetime-value","text":"1.11 Datetime value"},{"level":2,"id":"112-target-date","text":"1.12 Target date"},{"level":2,"id":"113-recurrence-rule","text":"1.13 Recurrence rule"},{"level":2,"id":"114-recurrence-anchor","text":"1.14 Recurrence anchor"},{"level":2,"id":"115-complete-instances","text":"1.15 Complete instances"},{"level":2,"id":"116-skipped-instances","text":"1.16 Skipped instances"},{"level":2,"id":"117-materialized-occurrence-note","text":"1.17 Materialized occurrence note"},{"level":2,"id":"118-recurrence-parent","text":"1.18 Recurrence parent"},{"level":2,"id":"119-occurrence-materialization","text":"1.19 Occurrence materialization"},{"level":2,"id":"120-effective-status","text":"1.20 Effective status"},{"level":2,"id":"121-completed-status-list","text":"1.21 Completed-status list"},{"level":2,"id":"122-idempotent-operation","text":"1.22 Idempotent operation"},{"level":2,"id":"123-unknown-field","text":"1.23 Unknown field"},{"level":2,"id":"124-validation-issue","text":"1.24 Validation issue"},{"level":2,"id":"125-strict-validation-mode","text":"1.25 Strict validation mode"},{"level":2,"id":"126-legacy-compatibility-mode","text":"1.26 Legacy compatibility mode"},{"level":2,"id":"127-configuration-provider","text":"1.27 Configuration provider"},{"level":2,"id":"128-effective-configuration","text":"1.28 Effective configuration"},{"level":2,"id":"129-template-file","text":"1.29 Template file"},{"level":2,"id":"130-template-expansion","text":"1.30 Template expansion"},{"level":2,"id":"131-time-entry","text":"1.31 Time entry"},{"level":2,"id":"132-active-time-entry","text":"1.32 Active time entry"},{"level":2,"id":"133-time-tracking-management","text":"1.33 Time tracking management"}],"html":"

This section defines terms used normatively in this specification.

\n

1.1 Collection#

\n

A collection is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration.

\n

1.2 Task file#

\n

A task file is a markdown file identified as a task record by collection rules.

\n

1.3 Frontmatter#

\n

Frontmatter is the YAML block at the start of a markdown file delimited by --- markers.

\n

1.4 Task record#

\n

A task record is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata).

\n

1.5 Semantic role#

\n

A semantic role is a canonical meaning defined by this specification, independent of storage key names.

\n

Examples: title, status, date_created, complete_instances.

\n

1.6 Storage key#

\n

A storage key is the YAML property name used in frontmatter.

\n

Examples: dateCreated, date_created, completedDate.

\n

1.7 Field mapping#

\n

Field mapping is the configuration that maps semantic roles to storage keys for reads and writes.

\n

1.8 Alias#

\n

An alias is a non-canonical storage key accepted for compatibility during reads.

\n

1.9 Canonical write key#

\n

The canonical write key is the configured storage key that conforming writers use for persisted output.

\n

1.10 Date value#

\n

A date value represents a calendar day with no time-of-day and no timezone.

\n

Canonical form: YYYY-MM-DD.

\n

1.11 Datetime value#

\n

A datetime value represents an instant in time.

\n

Canonical form: ISO 8601 UTC with trailing Z.

\n

1.12 Target date#

\n

A target date is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20).

\n

1.13 Recurrence rule#

\n

A recurrence rule is a tasknotes recurrence string stored in the recurrence semantic role.\nIt uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline DTSTART prefix segment as defined in §4.3.

\n

1.14 Recurrence anchor#

\n

Recurrence anchor defines how next-instance progression is computed. Allowed values:

\n
    \n
  • scheduled
  • \n
  • completion
  • \n
\n

1.15 Complete instances#

\n

Complete instances is the set/list of target dates marked completed for a recurring task.

\n

1.16 Skipped instances#

\n

Skipped instances is the set/list of target dates marked skipped for a recurring task.

\n

1.17 Materialized occurrence note#

\n

A materialized occurrence note is a task file created for one target date of a recurring parent task.\nIt stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date.

\n

1.18 Recurrence parent#

\n

A recurrence parent is the recurring task record referenced by a materialized occurrence note.\nThe reference is stored in semantic role recurrence_parent and resolved as a link according to §11.

\n

1.19 Occurrence materialization#

\n

Occurrence materialization is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20.

\n

1.20 Effective status#

\n

Effective status is the status presented for a given date context after applying recurrence instance state.

\n

1.21 Completed-status list#

\n

The completed-status list is the configured ordered list of status values treated as completed for non-recurring completion semantics.\nWhen a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it.

\n

1.22 Idempotent operation#

\n

An operation is idempotent if applying it multiple times with the same input produces the same persisted state as applying it once.

\n

1.23 Unknown field#

\n

An unknown field is a frontmatter property not mapped to a semantic role in current configuration.

\n

1.24 Validation issue#

\n

A validation issue is a structured report containing at least:

\n
    \n
  • machine-readable code,
  • \n
  • severity,
  • \n
  • optional path/field context,
  • \n
  • human-readable message.
  • \n
\n

1.25 Strict validation mode#

\n

Strict validation mode is a mode where invalid required semantics are treated as hard errors and write operations fail.

\n

1.26 Legacy compatibility mode#

\n

Legacy compatibility mode is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes.

\n

1.27 Configuration provider#

\n

A configuration provider is an adapter that loads configuration from a source (for example tasknotes.yaml or .obsidian/plugins/tasknotes/data.json) and normalizes it to the schema in §9.

\n

1.28 Effective configuration#

\n

The effective configuration is the final resolved configuration after applying provider precedence and fallback rules.

\n

1.29 Template file#

\n

A template file is a markdown document used at create time to generate frontmatter and/or body content through variable expansion.\nWhen templating is enabled, template behavior is defined by §5.3.5 and §9.14.

\n

1.30 Template expansion#

\n

Template expansion is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules.

\n

1.31 Time entry#

\n

A time entry is a structured record in time_entries containing startTime, optional endTime, and optional description.

\n

1.32 Active time entry#

\n

An active time entry is a time entry with startTime present and endTime absent.

\n

1.33 Time tracking management#

\n

Time tracking management is the set of operations that start, stop, edit, and remove time_entries, including completion-triggered auto-stop behavior when configured.

\n","text":"This section defines terms used normatively in this specification. 1.1 Collection# A collection is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration. 1.2 Task file# A task file is a markdown file identified as a task record by collection rules. 1.3 Frontmatter# Frontmatter is the YAML block at the start of a markdown file delimited by --- markers. 1.4 Task record# A task record is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata). 1.5 Semantic role# A semantic role is a canonical meaning defined by this specification, independent of storage key names. Examples: title, status, date_created, complete_instances. 1.6 Storage key# A storage key is the YAML property name used in frontmatter. Examples: dateCreated, date_created, completedDate. 1.7 Field mapping# Field mapping is the configuration that maps semantic roles to storage keys for reads and writes. 1.8 Alias# An alias is a non-canonical storage key accepted for compatibility during reads. 1.9 Canonical write key# The canonical write key is the configured storage key that conforming writers use for persisted output. 1.10 Date value# A date value represents a calendar day with no time-of-day and no timezone. Canonical form: YYYY-MM-DD. 1.11 Datetime value# A datetime value represents an instant in time. Canonical form: ISO 8601 UTC with trailing Z. 1.12 Target date# A target date is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20). 1.13 Recurrence rule# A recurrence rule is a tasknotes recurrence string stored in the recurrence semantic role. It uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline DTSTART prefix segment as defined in §4.3. 1.14 Recurrence anchor# Recurrence anchor defines how next-instance progression is computed. Allowed values: scheduled completion 1.15 Complete instances# Complete instances is the set/list of target dates marked completed for a recurring task. 1.16 Skipped instances# Skipped instances is the set/list of target dates marked skipped for a recurring task. 1.17 Materialized occurrence note# A materialized occurrence note is a task file created for one target date of a recurring parent task. It stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date. 1.18 Recurrence parent# A recurrence parent is the recurring task record referenced by a materialized occurrence note. The reference is stored in semantic role recurrence_parent and resolved as a link according to §11. 1.19 Occurrence materialization# Occurrence materialization is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20. 1.20 Effective status# Effective status is the status presented for a given date context after applying recurrence instance state. 1.21 Completed-status list# The completed-status list is the configured ordered list of status values treated as completed for non-recurring completion semantics. When a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it. 1.22 Idempotent operation# An operation is idempotent if applying it multiple times with the same input produces the same persisted state as applying it once. 1.23 Unknown field# An unknown field is a frontmatter property not mapped to a semantic role in current configuration. 1.24 Validation issue# A validation issue is a structured report containing at least: machine-readable code, severity, optional path/field context, human-readable message. 1.25 Strict validation mode# Strict validation mode is a mode where invalid required semantics are treated as hard errors and write operations fail. 1.26 Legacy compatibility mode# Legacy compatibility mode is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes. 1.27 Configuration provider# A configuration provider is an adapter that loads configuration from a source (for example tasknotes.yaml or .obsidian/plugins/tasknotes/data.json) and normalizes it to the schema in §9. 1.28 Effective configuration# The effective configuration is the final resolved configuration after applying provider precedence and fallback rules. 1.29 Template file# A template file is a markdown document used at create time to generate frontmatter and/or body content through variable expansion. When templating is enabled, template behavior is defined by §5.3.5 and §9.14. 1.30 Template expansion# Template expansion is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules. 1.31 Time entry# A time entry is a structured record in time_entries containing startTime, optional endTime, and optional description. 1.32 Active time entry# An active time entry is a time entry with startTime present and endTime absent. 1.33 Time tracking management# Time tracking management is the set of operations that start, stop, edit, and remove time_entries, including completion-triggered auto-stop behavior when configured."},{"route":"/developers/specification/02-model-and-mapping/","title":"2. Model and Field Mapping","description":"A task record consists of:","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:02-model-and-mapping.md","namespace":"specification","relativePath":"02-model-and-mapping.md","raw":"# 2. Model and Field Mapping\n\n## 2.1 Task record model\n\nA task record consists of:\n\n- frontmatter object (structured fields),\n- markdown body (freeform text),\n- file metadata (path, created/modified time) where available.\n\nFrontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features.\n\n## 2.2 Required semantic roles\n\nConforming implementations MUST support these semantic roles:\n\n| Semantic role | Type | Required |\n|---|---|---|\n| `title` | string | support required (value required via configured title source, see §2.2.2) |\n| `status` | string/enum | yes |\n| `completed_date` | date | support required (conditionally required, see §2.2.1) |\n| `date_created` | datetime | yes |\n| `date_modified` | datetime | yes |\n\nIf storage omits a role marked `yes`, validation MUST report an error (see §6).\nFor operation-required roles, validation and operation rules in §5 and §6 apply.\n\n### 2.2.1 Conditional requiredness (`completed_date`)\n\n`completed_date` support is mandatory, but presence is conditional:\n\n- For non-recurring tasks with `status` in configured `status.completed_values`, `completed_date` MUST be present.\n- For non-recurring tasks with non-completed status, `completed_date` MAY be absent.\n- For recurring tasks, `completed_date` is not required by recurrence completion semantics and MAY be absent.\n\nValidators MUST apply this conditional rule and MUST NOT treat `completed_date` as unconditionally required.\n\n### 2.2.2 Conditional requiredness (`title`)\n\nSemantic `title` is always required, with deterministic read resolution and storage-mode-dependent read/write behavior:\n\n- Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13):\n 1. when `title.storage=frontmatter`: mapped `title` key when present and non-empty, then file basename fallback;\n 2. when `title.storage=filename`: file basename first, then mapped `title` fallback when basename is unavailable.\n- If mapped title and filename-derived title both exist and differ, the source authoritative for active `title.storage` MUST win and implementations SHOULD emit `title_source_conflict`.\n- When `title.storage=filename`, implementations MAY keep mapped `title` as a synchronized compatibility mirror, but filename-derived title remains authoritative.\n- Title storage mode controls canonical writes (§9.13): `frontmatter` favors mapped-key writes; `filename` favors filename-derived title with rename-on-title-change behavior.\n\nValidators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone.\n\n## 2.3 Common semantic roles\n\nImplementations conforming beyond minimal scope SHOULD support:\n\n| Semantic role | Type | Notes |\n|---|---|---|\n| `id` | string | stable task identity token; see §2.6.5 |\n| `priority` | string/enum | configurable values |\n| `due` | date or datetime | see §3 |\n| `scheduled` | date or datetime | see §3 |\n| `tags` | list | free tags |\n| `contexts` | list | commonly prefixed with `@` |\n| `projects` | list | project references, see §11 |\n| `attachments` | list | ordered file references owned by the task, see §2.6.7 and §11.8.3 |\n| `time_estimate` | integer >= 0 | minutes |\n| `time_entries` | list | see §2.6 |\n| `recurrence` | string | tasknotes recurrence string; see §4 |\n| `recurrence_anchor` | enum | `scheduled` or `completion` |\n| `complete_instances` | list | recurring completion state |\n| `skipped_instances` | list | recurring skip state |\n| `recurrence_parent` | link-or-string | parent recurring task reference for materialized occurrence notes; see §4.18 |\n| `occurrence_date` | date | target date represented by a materialized occurrence note |\n| `occurrence_materialization` | enum | parent task materialization mode: `manual`, `on_completion`, or `rolling` |\n| `occurrence_next_trigger` | enum | parent task next-note trigger: `completion` or `completion_or_skip` |\n| `occurrence_template` | link-or-string | optional template used when creating materialized occurrence notes |\n| `occurrence_past_horizon` | duration | optional rolling materialization lookbehind bound |\n| `occurrence_future_horizon` | duration | optional rolling materialization lookahead bound |\n| `blocked_by` | list | dependency records, see §10 and §11 |\n| `reminders` | list | reminder records, see §10 |\n\nOptional extended roles are defined in §7 profiles.\n\n## 2.4 Field mapping requirements\n\n### 2.4.1 Mapping presence\n\nAn implementation MUST have an effective mapping from each supported semantic role to a canonical write key.\nMapping configuration is defined in §9.\nIf semantic role `id` is supported, it MUST also have a canonical write key.\n\n### 2.4.2 Read behavior\n\nReaders MUST:\n\n1. Read the canonical mapped key if present.\n2. Support configured aliases where enabled.\n3. Resolve conflicts deterministically when canonical and alias keys coexist.\n4. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win.\n5. When canonical key wins over alias, validator/loader SHOULD emit warning `alias_conflict_ignored`.\n\n### 2.4.3 Write behavior\n\nWriters MUST:\n\n- write only canonical keys,\n- avoid introducing alias keys in new writes,\n- preserve unknown fields unless the operation explicitly opts into normalization.\n\n## 2.5 Legacy alias compatibility\n\nImplementations SHOULD accept these aliases on read for interoperability:\n\n| Semantic role | Canonical example | Alias examples |\n|---|---|---|\n| `recurrence_anchor` | `recurrence_anchor` | `recurrenceAnchor` |\n| `complete_instances` | `complete_instances` | `completeInstances` |\n| `skipped_instances` | `skipped_instances` | `skippedInstances` |\n| `recurrence_parent` | `recurrence_parent` | `recurrenceParent` |\n| `occurrence_date` | `occurrence_date` | `occurrenceDate` |\n| `occurrence_materialization` | `occurrence_materialization` | `occurrenceMaterialization` |\n| `occurrence_next_trigger` | `occurrence_next_trigger` | `occurrenceNextTrigger` |\n| `occurrence_template` | `occurrence_template` | `occurrenceTemplate` |\n| `occurrence_past_horizon` | `occurrence_past_horizon` | `occurrencePastHorizon` |\n| `occurrence_future_horizon` | `occurrence_future_horizon` | `occurrenceFutureHorizon` |\n| `date_created` | `dateCreated` | `date_created` |\n| `date_modified` | `dateModified` | `date_modified` |\n| `completed_date` | `completedDate` | `completed_date` |\n| `time_entries` | `timeEntries` | `time_entries` |\n| `time_estimate` | `timeEstimate` | `time_estimate` |\n| `blocked_by` | `blockedBy` | `blocked_by` |\n| `attachments` | `attachments` | — |\n\nThis table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical.\n\n## 2.6 Structured role schemas\n\n### 2.6.1 time_entries\n\n`time_entries` items MUST be objects with:\n\n- `startTime` datetime (required)\n- `endTime` datetime (optional)\n- `description` string (optional)\n\nAdditional constraints:\n\n- a task MUST NOT contain more than one active time entry (entry with `startTime` and no `endTime`) at commit time.\n- an entry with missing `endTime` is interpreted as an active/running session.\n- an implementation MAY accept `duration` on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes.\n\nNested key names in `time_entries` are fixed by this specification and are not independently configurable in `mapping`.\n\n### 2.6.2 projects\n\n`projects` SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted.\nWhen interpreted as links, parsing and resolution MUST follow §11.\n\n### 2.6.3 blocked_by\n\n`blocked_by` items MUST be objects with:\n\n- `uid` link-or-string task reference (required)\n- `reltype` enum (required; default allowed by §10 when omitted)\n- `gap` ISO 8601 duration string (optional)\n\nDetailed semantics are defined in §10. `uid` parsing and resolution MUST follow §11.\n\n### 2.6.4 reminders\n\n`reminders` items MUST be objects with:\n\n- `id` string (required)\n- `type` enum `absolute|relative` (required)\n- relative-only fields: `relatedTo`, `offset`\n- absolute-only fields: `absoluteTime`\n- `description` string (optional)\n\nDetailed semantics are defined in §10.\n\n### 2.6.5 id (stable task identity)\n\nWhen semantic role `id` is present:\n\n- value MUST be a non-empty string.\n- value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations.\n- readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3).\n- implementations SHOULD keep `id` unique within a collection; duplicate IDs SHOULD produce a validation issue.\n\n### 2.6.6 Materialized occurrence roles\n\nThe roles in this subsection are required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\nParent recurring task roles:\n\n- `occurrence_materialization`: enum `manual|on_completion|rolling`; controls when occurrence notes are created (§4.18.5).\n- `occurrence_next_trigger`: enum `completion|completion_or_skip`; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6).\n- `occurrence_template`: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported.\n- `occurrence_past_horizon` and `occurrence_future_horizon`: ISO 8601 durations used by rolling materialization (§4.18.7).\n\nMaterialized occurrence note roles:\n\n- `recurrence_parent`: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections.\n- `occurrence_date`: date value identifying the target date this occurrence note represents.\n\nImplementations claiming `materialized-occurrences` MUST treat `recurrence_parent` and `occurrence_date` together as the occurrence identity key.\nWithin a resolved parent task, at most one materialized occurrence note SHOULD exist for each `occurrence_date`; duplicate notes MUST be reported when detected (§6.4).\n\nMaterialized occurrence notes MAY also use normal task roles such as `status`, `completed_date`, `scheduled`, `due`, `time_entries`, `reminders`, `contexts`, `projects`, and body content.\nFor dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3.\n\n### 2.6.7 attachments\n\n`attachments` is the authoritative task-membership list for files associated\nwith a task. It MUST be represented as an ordered list of non-empty\nlink-or-string values. Each value MUST identify one collection file and MUST\nfollow the parsing, resolution, and canonical-write rules in §11.8.3.\n\nThe list itself intentionally contains references only. MIME type, byte size,\ncontent digest, storage revision, timestamps, and other binary metadata belong\nto the collection's file descriptor or filesystem metadata and MUST NOT be\nduplicated into canonical task frontmatter.\n\nThe Markdown body MAY embed or link an attached file for inline presentation,\nbut body links and embeds do not add or remove task membership. A file is a task\nattachment if and only if it appears in the mapped `attachments` list.\n\nReaders MAY accept a single scalar reference as compatibility input and\nnormalize it to a one-item list. Canonical writes MUST use a list, preserve its\norder, and MUST NOT contain empty or duplicate normalized targets.\n\n## 2.7 Unknown fields\n\nUnknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations.\n\nUnknown fields MAY be removed only when:\n\n- explicit normalization/migration is requested, or\n- strict schema replacement is explicitly requested.\n\n## 2.8 Example mapping\n\nExample effective mapping:\n\n```yaml\nmapping:\n id: id\n title: title\n status: status\n date_created: dateCreated\n date_modified: dateModified\n completed_date: completedDate\n recurrence: recurrence\n recurrence_anchor: recurrence_anchor\n complete_instances: complete_instances\n skipped_instances: skipped_instances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_estimate: timeEstimate\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\n```\n\n## 2.9 Example task record\n\n```markdown\n---\nid: task-2026-01-10-weekly-review\ntitle: Weekly review\nstatus: open\npriority: high\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrence_anchor: scheduled\ncomplete_instances: [2026-02-13]\nskipped_instances: []\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n gap: P1D\nreminders:\n - id: rem_day_before\n type: relative\n relatedTo: due\n offset: -P1D\n - id: rem_start\n type: absolute\n absoluteTime: 2026-02-20T09:00:00Z\ndateCreated: 2026-01-10T09:30:00Z\ndateModified: 2026-02-20T08:02:11Z\n---\n\nReview completed work and plan next week.\n```\n\n## 2.10 Deterministic load example\n\nGiven frontmatter:\n\n```yaml\nrecurrence_anchor: scheduled\nrecurrenceAnchor: completion\n```\n\nIf canonical key is `recurrence_anchor`, a conforming loader using canonical-precedence policy MUST resolve semantic `recurrence_anchor` as `scheduled` and SHOULD emit a compatibility warning.\n","aliases":["/spec/02-model-and-mapping/"],"toc":[{"level":2,"id":"21-task-record-model","text":"2.1 Task record model"},{"level":2,"id":"22-required-semantic-roles","text":"2.2 Required semantic roles"},{"level":3,"id":"221-conditional-requiredness-completeddate","text":"2.2.1 Conditional requiredness (completed_date)"},{"level":3,"id":"222-conditional-requiredness-title","text":"2.2.2 Conditional requiredness (title)"},{"level":2,"id":"23-common-semantic-roles","text":"2.3 Common semantic roles"},{"level":2,"id":"24-field-mapping-requirements","text":"2.4 Field mapping requirements"},{"level":3,"id":"241-mapping-presence","text":"2.4.1 Mapping presence"},{"level":3,"id":"242-read-behavior","text":"2.4.2 Read behavior"},{"level":3,"id":"243-write-behavior","text":"2.4.3 Write behavior"},{"level":2,"id":"25-legacy-alias-compatibility","text":"2.5 Legacy alias compatibility"},{"level":2,"id":"26-structured-role-schemas","text":"2.6 Structured role schemas"},{"level":3,"id":"261-timeentries","text":"2.6.1 time_entries"},{"level":3,"id":"262-projects","text":"2.6.2 projects"},{"level":3,"id":"263-blockedby","text":"2.6.3 blocked_by"},{"level":3,"id":"264-reminders","text":"2.6.4 reminders"},{"level":3,"id":"265-id-stable-task-identity","text":"2.6.5 id (stable task identity)"},{"level":3,"id":"266-materialized-occurrence-roles","text":"2.6.6 Materialized occurrence roles"},{"level":3,"id":"267-attachments","text":"2.6.7 attachments"},{"level":2,"id":"27-unknown-fields","text":"2.7 Unknown fields"},{"level":2,"id":"28-example-mapping","text":"2.8 Example mapping"},{"level":2,"id":"29-example-task-record","text":"2.9 Example task record"},{"level":2,"id":"210-deterministic-load-example","text":"2.10 Deterministic load example"}],"html":"

2.1 Task record model#

\n

A task record consists of:

\n
    \n
  • frontmatter object (structured fields),
  • \n
  • markdown body (freeform text),
  • \n
  • file metadata (path, created/modified time) where available.
  • \n
\n

Frontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features.

\n

2.2 Required semantic roles#

\n

Conforming implementations MUST support these semantic roles:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleTypeRequired
titlestringsupport required (value required via configured title source, see §2.2.2)
statusstring/enumyes
completed_datedatesupport required (conditionally required, see §2.2.1)
date_createddatetimeyes
date_modifieddatetimeyes
\n

If storage omits a role marked yes, validation MUST report an error (see §6).\nFor operation-required roles, validation and operation rules in §5 and §6 apply.

\n

2.2.1 Conditional requiredness (completed_date)#

\n

completed_date support is mandatory, but presence is conditional:

\n
    \n
  • For non-recurring tasks with status in configured status.completed_values, completed_date MUST be present.
  • \n
  • For non-recurring tasks with non-completed status, completed_date MAY be absent.
  • \n
  • For recurring tasks, completed_date is not required by recurrence completion semantics and MAY be absent.
  • \n
\n

Validators MUST apply this conditional rule and MUST NOT treat completed_date as unconditionally required.

\n

2.2.2 Conditional requiredness (title)#

\n

Semantic title is always required, with deterministic read resolution and storage-mode-dependent read/write behavior:

\n
    \n
  • Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13):
      \n
    1. when title.storage=frontmatter: mapped title key when present and non-empty, then file basename fallback;
    2. \n
    3. when title.storage=filename: file basename first, then mapped title fallback when basename is unavailable.
    4. \n
    \n
  • \n
  • If mapped title and filename-derived title both exist and differ, the source authoritative for active title.storage MUST win and implementations SHOULD emit title_source_conflict.
  • \n
  • When title.storage=filename, implementations MAY keep mapped title as a synchronized compatibility mirror, but filename-derived title remains authoritative.
  • \n
  • Title storage mode controls canonical writes (§9.13): frontmatter favors mapped-key writes; filename favors filename-derived title with rename-on-title-change behavior.
  • \n
\n

Validators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone.

\n

2.3 Common semantic roles#

\n

Implementations conforming beyond minimal scope SHOULD support:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleTypeNotes
idstringstable task identity token; see §2.6.5
prioritystring/enumconfigurable values
duedate or datetimesee §3
scheduleddate or datetimesee §3
tagslistfree tags
contextslistcommonly prefixed with @
projectslistproject references, see §11
attachmentslistordered file references owned by the task, see §2.6.7 and §11.8.3
time_estimateinteger >= 0minutes
time_entrieslistsee §2.6
recurrencestringtasknotes recurrence string; see §4
recurrence_anchorenumscheduled or completion
complete_instanceslistrecurring completion state
skipped_instanceslistrecurring skip state
recurrence_parentlink-or-stringparent recurring task reference for materialized occurrence notes; see §4.18
occurrence_datedatetarget date represented by a materialized occurrence note
occurrence_materializationenumparent task materialization mode: manual, on_completion, or rolling
occurrence_next_triggerenumparent task next-note trigger: completion or completion_or_skip
occurrence_templatelink-or-stringoptional template used when creating materialized occurrence notes
occurrence_past_horizondurationoptional rolling materialization lookbehind bound
occurrence_future_horizondurationoptional rolling materialization lookahead bound
blocked_bylistdependency records, see §10 and §11
reminderslistreminder records, see §10
\n

Optional extended roles are defined in §7 profiles.

\n

2.4 Field mapping requirements#

\n

2.4.1 Mapping presence#

\n

An implementation MUST have an effective mapping from each supported semantic role to a canonical write key.\nMapping configuration is defined in §9.\nIf semantic role id is supported, it MUST also have a canonical write key.

\n

2.4.2 Read behavior#

\n

Readers MUST:

\n
    \n
  1. Read the canonical mapped key if present.
  2. \n
  3. Support configured aliases where enabled.
  4. \n
  5. Resolve conflicts deterministically when canonical and alias keys coexist.
  6. \n
  7. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win.
  8. \n
  9. When canonical key wins over alias, validator/loader SHOULD emit warning alias_conflict_ignored.
  10. \n
\n

2.4.3 Write behavior#

\n

Writers MUST:

\n
    \n
  • write only canonical keys,
  • \n
  • avoid introducing alias keys in new writes,
  • \n
  • preserve unknown fields unless the operation explicitly opts into normalization.
  • \n
\n

2.5 Legacy alias compatibility#

\n

Implementations SHOULD accept these aliases on read for interoperability:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleCanonical exampleAlias examples
recurrence_anchorrecurrence_anchorrecurrenceAnchor
complete_instancescomplete_instancescompleteInstances
skipped_instancesskipped_instancesskippedInstances
recurrence_parentrecurrence_parentrecurrenceParent
occurrence_dateoccurrence_dateoccurrenceDate
occurrence_materializationoccurrence_materializationoccurrenceMaterialization
occurrence_next_triggeroccurrence_next_triggeroccurrenceNextTrigger
occurrence_templateoccurrence_templateoccurrenceTemplate
occurrence_past_horizonoccurrence_past_horizonoccurrencePastHorizon
occurrence_future_horizonoccurrence_future_horizonoccurrenceFutureHorizon
date_createddateCreateddate_created
date_modifieddateModifieddate_modified
completed_datecompletedDatecompleted_date
time_entriestimeEntriestime_entries
time_estimatetimeEstimatetime_estimate
blocked_byblockedByblocked_by
attachmentsattachments—
\n

This table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical.

\n

2.6 Structured role schemas#

\n

2.6.1 time_entries#

\n

time_entries items MUST be objects with:

\n
    \n
  • startTime datetime (required)
  • \n
  • endTime datetime (optional)
  • \n
  • description string (optional)
  • \n
\n

Additional constraints:

\n
    \n
  • a task MUST NOT contain more than one active time entry (entry with startTime and no endTime) at commit time.
  • \n
  • an entry with missing endTime is interpreted as an active/running session.
  • \n
  • an implementation MAY accept duration on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes.
  • \n
\n

Nested key names in time_entries are fixed by this specification and are not independently configurable in mapping.

\n

2.6.2 projects#

\n

projects SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted.\nWhen interpreted as links, parsing and resolution MUST follow §11.

\n

2.6.3 blocked_by#

\n

blocked_by items MUST be objects with:

\n
    \n
  • uid link-or-string task reference (required)
  • \n
  • reltype enum (required; default allowed by §10 when omitted)
  • \n
  • gap ISO 8601 duration string (optional)
  • \n
\n

Detailed semantics are defined in §10. uid parsing and resolution MUST follow §11.

\n

2.6.4 reminders#

\n

reminders items MUST be objects with:

\n
    \n
  • id string (required)
  • \n
  • type enum absolute|relative (required)
  • \n
  • relative-only fields: relatedTo, offset
  • \n
  • absolute-only fields: absoluteTime
  • \n
  • description string (optional)
  • \n
\n

Detailed semantics are defined in §10.

\n

2.6.5 id (stable task identity)#

\n

When semantic role id is present:

\n
    \n
  • value MUST be a non-empty string.
  • \n
  • value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations.
  • \n
  • readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3).
  • \n
  • implementations SHOULD keep id unique within a collection; duplicate IDs SHOULD produce a validation issue.
  • \n
\n

2.6.6 Materialized occurrence roles#

\n

The roles in this subsection are required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

Parent recurring task roles:

\n
    \n
  • occurrence_materialization: enum manual|on_completion|rolling; controls when occurrence notes are created (§4.18.5).
  • \n
  • occurrence_next_trigger: enum completion|completion_or_skip; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6).
  • \n
  • occurrence_template: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported.
  • \n
  • occurrence_past_horizon and occurrence_future_horizon: ISO 8601 durations used by rolling materialization (§4.18.7).
  • \n
\n

Materialized occurrence note roles:

\n
    \n
  • recurrence_parent: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections.
  • \n
  • occurrence_date: date value identifying the target date this occurrence note represents.
  • \n
\n

Implementations claiming materialized-occurrences MUST treat recurrence_parent and occurrence_date together as the occurrence identity key.\nWithin a resolved parent task, at most one materialized occurrence note SHOULD exist for each occurrence_date; duplicate notes MUST be reported when detected (§6.4).

\n

Materialized occurrence notes MAY also use normal task roles such as status, completed_date, scheduled, due, time_entries, reminders, contexts, projects, and body content.\nFor dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3.

\n

2.6.7 attachments#

\n

attachments is the authoritative task-membership list for files associated\nwith a task. It MUST be represented as an ordered list of non-empty\nlink-or-string values. Each value MUST identify one collection file and MUST\nfollow the parsing, resolution, and canonical-write rules in §11.8.3.

\n

The list itself intentionally contains references only. MIME type, byte size,\ncontent digest, storage revision, timestamps, and other binary metadata belong\nto the collection's file descriptor or filesystem metadata and MUST NOT be\nduplicated into canonical task frontmatter.

\n

The Markdown body MAY embed or link an attached file for inline presentation,\nbut body links and embeds do not add or remove task membership. A file is a task\nattachment if and only if it appears in the mapped attachments list.

\n

Readers MAY accept a single scalar reference as compatibility input and\nnormalize it to a one-item list. Canonical writes MUST use a list, preserve its\norder, and MUST NOT contain empty or duplicate normalized targets.

\n

2.7 Unknown fields#

\n

Unknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations.

\n

Unknown fields MAY be removed only when:

\n
    \n
  • explicit normalization/migration is requested, or
  • \n
  • strict schema replacement is explicitly requested.
  • \n
\n

2.8 Example mapping#

\n

Example effective mapping:

\n
mapping:\n  id: id\n  title: title\n  status: status\n  date_created: dateCreated\n  date_modified: dateModified\n  completed_date: completedDate\n  recurrence: recurrence\n  recurrence_anchor: recurrence_anchor\n  complete_instances: complete_instances\n  skipped_instances: skipped_instances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_estimate: timeEstimate\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\n

2.9 Example task record#

\n
---\nid: task-2026-01-10-weekly-review\ntitle: Weekly review\nstatus: open\npriority: high\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrence_anchor: scheduled\ncomplete_instances: [2026-02-13]\nskipped_instances: []\nblockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n    gap: P1D\nreminders:\n  - id: rem_day_before\n    type: relative\n    relatedTo: due\n    offset: -P1D\n  - id: rem_start\n    type: absolute\n    absoluteTime: 2026-02-20T09:00:00Z\ndateCreated: 2026-01-10T09:30:00Z\ndateModified: 2026-02-20T08:02:11Z\n---\n\nReview completed work and plan next week.\n

2.10 Deterministic load example#

\n

Given frontmatter:

\n
recurrence_anchor: scheduled\nrecurrenceAnchor: completion\n

If canonical key is recurrence_anchor, a conforming loader using canonical-precedence policy MUST resolve semantic recurrence_anchor as scheduled and SHOULD emit a compatibility warning.

\n","text":"2.1 Task record model# A task record consists of: frontmatter object (structured fields), markdown body (freeform text), file metadata (path, created/modified time) where available. Frontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features. 2.2 Required semantic roles# Conforming implementations MUST support these semantic roles: Semantic role Type Required title string support required (value required via configured title source, see §2.2.2) status string/enum yes completed_date date support required (conditionally required, see §2.2.1) date_created datetime yes date_modified datetime yes If storage omits a role marked yes, validation MUST report an error (see §6). For operation-required roles, validation and operation rules in §5 and §6 apply. 2.2.1 Conditional requiredness (completed_date)# completed_date support is mandatory, but presence is conditional: For non-recurring tasks with status in configured status.completed_values, completed_date MUST be present. For non-recurring tasks with non-completed status, completed_date MAY be absent. For recurring tasks, completed_date is not required by recurrence completion semantics and MAY be absent. Validators MUST apply this conditional rule and MUST NOT treat completed_date as unconditionally required. 2.2.2 Conditional requiredness (title)# Semantic title is always required, with deterministic read resolution and storage-mode-dependent read/write behavior: Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13): when title.storage=frontmatter: mapped title key when present and non-empty, then file basename fallback; when title.storage=filename: file basename first, then mapped title fallback when basename is unavailable. If mapped title and filename-derived title both exist and differ, the source authoritative for active title.storage MUST win and implementations SHOULD emit title_source_conflict. When title.storage=filename, implementations MAY keep mapped title as a synchronized compatibility mirror, but filename-derived title remains authoritative. Title storage mode controls canonical writes (§9.13): frontmatter favors mapped-key writes; filename favors filename-derived title with rename-on-title-change behavior. Validators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone. 2.3 Common semantic roles# Implementations conforming beyond minimal scope SHOULD support: Semantic role Type Notes id string stable task identity token; see §2.6.5 priority string/enum configurable values due date or datetime see §3 scheduled date or datetime see §3 tags list free tags contexts list commonly prefixed with @ projects list project references, see §11 attachments list ordered file references owned by the task, see §2.6.7 and §11.8.3 time_estimate integer >= 0 minutes time_entries list see §2.6 recurrence string tasknotes recurrence string; see §4 recurrence_anchor enum scheduled or completion complete_instances list recurring completion state skipped_instances list recurring skip state recurrence_parent link-or-string parent recurring task reference for materialized occurrence notes; see §4.18 occurrence_date date target date represented by a materialized occurrence note occurrence_materialization enum parent task materialization mode: manual, on_completion, or rolling occurrence_next_trigger enum parent task next-note trigger: completion or completion_or_skip occurrence_template link-or-string optional template used when creating materialized occurrence notes occurrence_past_horizon duration optional rolling materialization lookbehind bound occurrence_future_horizon duration optional rolling materialization lookahead bound blocked_by list dependency records, see §10 and §11 reminders list reminder records, see §10 Optional extended roles are defined in §7 profiles. 2.4 Field mapping requirements# 2.4.1 Mapping presence# An implementation MUST have an effective mapping from each supported semantic role to a canonical write key. Mapping configuration is defined in §9. If semantic role id is supported, it MUST also have a canonical write key. 2.4.2 Read behavior# Readers MUST: Read the canonical mapped key if present. Support configured aliases where enabled. Resolve conflicts deterministically when canonical and alias keys coexist. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win. When canonical key wins over alias, validator/loader SHOULD emit warning alias_conflict_ignored. 2.4.3 Write behavior# Writers MUST: write only canonical keys, avoid introducing alias keys in new writes, preserve unknown fields unless the operation explicitly opts into normalization. 2.5 Legacy alias compatibility# Implementations SHOULD accept these aliases on read for interoperability: Semantic role Canonical example Alias examples recurrence_anchor recurrence_anchor recurrenceAnchor complete_instances complete_instances completeInstances skipped_instances skipped_instances skippedInstances recurrence_parent recurrence_parent recurrenceParent occurrence_date occurrence_date occurrenceDate occurrence_materialization occurrence_materialization occurrenceMaterialization occurrence_next_trigger occurrence_next_trigger occurrenceNextTrigger occurrence_template occurrence_template occurrenceTemplate occurrence_past_horizon occurrence_past_horizon occurrencePastHorizon occurrence_future_horizon occurrence_future_horizon occurrenceFutureHorizon date_created dateCreated date_created date_modified dateModified date_modified completed_date completedDate completed_date time_entries timeEntries time_entries time_estimate timeEstimate time_estimate blocked_by blockedBy blocked_by attachments attachments — This table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical. 2.6 Structured role schemas# 2.6.1 time_entries# time_entries items MUST be objects with: startTime datetime (required) endTime datetime (optional) description string (optional) Additional constraints: a task MUST NOT contain more than one active time entry (entry with startTime and no endTime) at commit time. an entry with missing endTime is interpreted as an active/running session. an implementation MAY accept duration on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes. Nested key names in time_entries are fixed by this specification and are not independently configurable in mapping. 2.6.2 projects# projects SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted. When interpreted as links, parsing and resolution MUST follow §11. 2.6.3 blocked_by# blocked_by items MUST be objects with: uid link-or-string task reference (required) reltype enum (required; default allowed by §10 when omitted) gap ISO 8601 duration string (optional) Detailed semantics are defined in §10. uid parsing and resolution MUST follow §11. 2.6.4 reminders# reminders items MUST be objects with: id string (required) type enum absolute|relative (required) relative-only fields: relatedTo, offset absolute-only fields: absoluteTime description string (optional) Detailed semantics are defined in §10. 2.6.5 id (stable task identity)# When semantic role id is present: value MUST be a non-empty string. value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations. readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3). implementations SHOULD keep id unique within a collection; duplicate IDs SHOULD produce a validation issue. 2.6.6 Materialized occurrence roles# The roles in this subsection are required only for implementations claiming profile materialized-occurrences (§7.3.4). Parent recurring task roles: occurrence_materialization: enum manual|on_completion|rolling; controls when occurrence notes are created (§4.18.5). occurrence_next_trigger: enum completion|completion_or_skip; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6). occurrence_template: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported. occurrence_past_horizon and occurrence_future_horizon: ISO 8601 durations used by rolling materialization (§4.18.7). Materialized occurrence note roles: recurrence_parent: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections. occurrence_date: date value identifying the target date this occurrence note represents. Implementations claiming materialized-occurrences MUST treat recurrence_parent and occurrence_date together as the occurrence identity key. Within a resolved parent task, at most one materialized occurrence note SHOULD exist for each occurrence_date; duplicate notes MUST be reported when detected (§6.4). Materialized occurrence notes MAY also use normal task roles such as status, completed_date, scheduled, due, time_entries, reminders, contexts, projects, and body content. For dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3. 2.6.7 attachments# attachments is the authoritative task-membership list for files associated with a task. It MUST be represented as an ordered list of non-empty link-or-string values. Each value MUST identify one collection file and MUST follow the parsing, resolution, and canonical-write rules in §11.8.3. The list itself intentionally contains references only. MIME type, byte size, content digest, storage revision, timestamps, and other binary metadata belong to the collection's file descriptor or filesystem metadata and MUST NOT be duplicated into canonical task frontmatter. The Markdown body MAY embed or link an attached file for inline presentation, but body links and embeds do not add or remove task membership. A file is a task attachment if and only if it appears in the mapped attachments list. Readers MAY accept a single scalar reference as compatibility input and normalize it to a one-item list. Canonical writes MUST use a list, preserve its order, and MUST NOT contain empty or duplicate normalized targets. 2.7 Unknown fields# Unknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations. Unknown fields MAY be removed only when: explicit normalization/migration is requested, or strict schema replacement is explicitly requested. 2.8 Example mapping# Example effective mapping: mapping: id: id title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrence_anchor complete_instances: complete_instances skipped_instances: skipped_instances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_estimate: timeEstimate time_entries: timeEntries blocked_by: blockedBy reminders: reminders 2.9 Example task record# --- id: task-2026-01-10-weekly-review title: Weekly review status: open priority: high scheduled: 2026-02-20 recurrence: FREQ=WEEKLY;BYDAY=FR recurrence_anchor: scheduled complete_instances: [2026-02-13] skipped_instances: [] blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: P1D reminders: - id: rem_day_before type: relative relatedTo: due offset: -P1D - id: rem_start type: absolute absoluteTime: 2026-02-20T09:00:00Z dateCreated: 2026-01-10T09:30:00Z dateModified: 2026-02-20T08:02:11Z --- Review completed work and plan next week. 2.10 Deterministic load example# Given frontmatter: recurrence_anchor: scheduled recurrenceAnchor: completion If canonical key is recurrence_anchor, a conforming loader using canonical-precedence policy MUST resolve semantic recurrence_anchor as scheduled and SHOULD emit a compatibility warning."},{"route":"/developers/specification/03-temporal-semantics/","title":"3. Temporal Semantics","description":"This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:03-temporal-semantics.md","namespace":"specification","relativePath":"03-temporal-semantics.md","raw":"# 3. Temporal Semantics\n\n## 3.1 Purpose\n\nThis section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.\n\n## 3.2 Supported temporal value classes\n\nImplementations MUST support:\n\n1. **Date values**: calendar day without time or timezone.\n2. **Datetime values**: instant in time.\n\n## 3.3 Canonical serialization\n\n### 3.3.1 Date\n\nCanonical date serialization is:\n\n```text\nYYYY-MM-DD\n```\n\n### 3.3.2 Datetime\n\nCanonical datetime serialization is UTC ISO 8601 with `Z`, for example:\n\n```text\n2026-02-20T13:45:00Z\n```\n\nCanonical datetime writes MUST use second precision (`YYYY-MM-DDTHH:MM:SSZ`) and MUST NOT include fractional seconds.\nImplementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes.\nIf an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds.\n\n## 3.4 Parsing requirements\n\n### 3.4.1 Date parsing\n\nDate parsing MUST reject invalid calendar dates.\n\n- valid: `2026-02-28`\n- invalid: `2026-02-30`\n\n### 3.4.2 Datetime parsing\n\nDatetime parsing MUST reject malformed values.\nIn strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example `2026-02-20T09:00:00` with no timezone offset).\nIn permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning.\n\n### 3.4.3 Mixed input tolerance\n\nImplementations MAY accept both date and datetime values for roles like `due` and `scheduled` if configured to do so. The accepted form MUST be documented.\n\n### 3.4.4 Inbound acceptance matrix\n\nTo avoid ambiguity, conforming parsers MUST follow this matrix.\n\nDate forms:\n\n| Form | Example | Strict | Permissive |\n|---|---|---|---|\n| Canonical date | `2026-02-20` | accept | accept |\n| Basic date (no separators) | `20260220` | reject (`invalid_date_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n\nDatetime forms:\n\n| Form | Example | Strict | Permissive |\n|---|---|---|---|\n| Canonical UTC | `2026-02-20T09:00:00Z` | accept | accept |\n| ISO with explicit offset | `2026-02-20T09:00:00+10:00` | accept | accept |\n| ISO with fractional seconds | `2026-02-20T09:00:00.250Z` | accept (normalize to second precision on write) | accept (normalize to second precision on write) |\n| Offset-less local datetime | `2026-02-20T09:00:00` | reject (`invalid_datetime_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n| Space-separated datetime | `2026-02-20 09:00:00` | reject (`invalid_datetime_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n| Basic datetime (no separators) | `20260220T090000Z` | reject (`invalid_datetime_value`) | MAY accept only under documented compatibility policy; SHOULD emit warning |\n\nWhen permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3.\n\n## 3.5 Day semantics vs instant semantics\n\n### 3.5.1 Date roles\n\nDate roles represent days, not instants, and MUST NOT be timezone-shifted.\n\n### 3.5.2 Datetime roles\n\nDatetime roles represent instants and MUST preserve instant equality through normalization.\n\nExample:\n\n- input `2026-02-20T08:00:00-05:00`\n- canonical write `2026-02-20T13:00:00Z`\n\n### 3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)\n\nBecause date-only fields are human-readable (`YYYY-MM-DD`) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals.\n\nRecommended approach:\n\n1. Parse date-only values to a UTC-midnight anchor instant for internal computations.\n2. Format date-only values from UTC calendar components when writing `YYYY-MM-DD`.\n3. Keep date-only roles as date-only on write unless an explicit conversion operation is requested.\n4. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6.\n\nImplementations MAY use different internal representations as long as all normative requirements in this section are preserved.\n\n## 3.6 Local calendar-day evaluation\n\n### 3.6.1 Active runtime timezone\n\nFor day-level semantics, the active runtime timezone is:\n\n1. the caller-provided temporal execution context, when present\n2. the collection authority's configured timezone\n3. the process/system local timezone.\n\nThe timezone is runtime context, not TaskNotes type-binding configuration. A\nremote caller SHOULD send its current IANA timezone for interactive operations;\na headless authority SHOULD use its durable collection timezone. Every\noperation MUST resolve this precedence once and use one effective timezone for\nall day-level semantics in that operation.\n\nImplementations MUST make the effective timezone discoverable.\n\n### 3.6.2 Local calendar-day rules\n\nWhen calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone.\n\nThis requirement prevents off-by-one day drift in positive and negative UTC offsets.\n\n## 3.7 Comparison rules\n\n### 3.7.1 Date-to-date\n\nCompare by calendar day ordering.\n\n### 3.7.2 Datetime-to-datetime\n\nCompare by instant ordering.\n\n### 3.7.3 Date-to-datetime\n\nIf compared, implementations MUST document coercion policy. Recommended policy:\n\n- convert date to local start-of-day for day-level comparisons,\n- avoid implicit coercion for instant-level comparisons.\n\n## 3.8 due and scheduled semantics\n\n`due` and `scheduled` MAY be either date or datetime by configuration.\n\nImplementations MUST:\n\n- preserve stored granularity unless explicit conversion is requested,\n- avoid silently converting date to datetime during unrelated writes,\n- require documented explicit policy for date-to-datetime conversion operations,\n- apply consistent coercion policy in filters and status calculations.\n\n## 3.9 Completion date semantics\n\n`completed_date` is a date role.\n\nFor non-recurring completion, writers MUST set `completed_date` using §5 semantics:\n\n- explicit completion-day input when provided,\n- otherwise current local day in active runtime timezone.\n\n## 3.10 Created/modified timestamps\n\n`date_created` and `date_modified` are datetime roles.\n\nWriters MUST:\n\n- set both on create,\n- update `date_modified` on successful mutating operations that change persisted state,\n- preserve `date_created` unless explicit migration/edit operation changes it.\n\n## 3.11 time_entries semantics\n\n### 3.11.1 Timestamp format\n\n`time_entries.startTime` and `time_entries.endTime` MUST be datetime instants in canonical form on write.\n\n### 3.11.2 Range validity\n\nIf both times exist, `endTime` MUST be greater than or equal to `startTime`.\n\n### 3.11.3 Duration handling\n\nIf duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization.\n\n### 3.11.4 Active session semantics\n\nAn entry with `startTime` and no `endTime` represents an active/running session.\n\nImplementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time.\n\n### 3.11.5 Derived time calculations\n\nFor interoperability, implementations SHOULD expose both derived views when reporting tracked time:\n\n- `closed_minutes`: sum of entries where both `startTime` and `endTime` exist.\n- `live_minutes`: `closed_minutes` plus elapsed minutes of active entries (if any).\n\nImplementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs).\n\n## 3.12 reminder temporal semantics\n\nReminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section.\n\nRules:\n\n- `reminders[].absoluteTime` MUST be a canonical datetime on write.\n- `reminders[].offset` MUST be a valid ISO 8601 duration string.\n- relative reminder base conversion for date-only values MUST use `reminders.date_only_anchor_time` from §9, or `00:00` local time if unset.\n\n## 3.13 Example: local-day overdue evaluation\n\nAssume local timezone `America/Los_Angeles` and local date `2026-02-20`.\n\nTask A:\n\n```yaml\ndue: 2026-02-19\nstatus: open\n```\n\nTask A is overdue.\n\nTask B:\n\n```yaml\ndue: 2026-02-20\nstatus: open\n```\n\nTask B is not overdue at start of day; it becomes overdue on `2026-02-21` local day.\n\n## 3.14 Example: preserving granularity\n\nBefore update:\n\n```yaml\ndue: 2026-02-20\npriority: normal\n```\n\nOperation: update priority only.\n\nAfter update (conforming):\n\n```yaml\ndue: 2026-02-20\npriority: high\n```\n\nNon-conforming behavior would silently rewrite `due` to a datetime.\n\n## 3.15 Example: canonical datetime write\n\nInput:\n\n```yaml\ntimeEntries:\n - startTime: 2026-02-20T09:30:00+01:00\n endTime: 2026-02-20T10:00:00+01:00\n```\n\nCanonical write:\n\n```yaml\ntimeEntries:\n - startTime: 2026-02-20T08:30:00Z\n endTime: 2026-02-20T09:00:00Z\n```\n\n## 3.16 Example: UTC-anchor roundtrip for date-only field\n\nInput:\n\n```yaml\ndue: 2026-02-20\n```\n\nInternal computation anchor:\n\n```text\n2026-02-20T00:00:00Z\n```\n\nAfter unrelated update, conforming write:\n\n```yaml\ndue: 2026-02-20\n```\n\nNon-conforming behavior would rewrite `due` as a datetime or shift it to another day based on local offset.\n","aliases":["/spec/03-temporal-semantics/"],"toc":[{"level":2,"id":"31-purpose","text":"3.1 Purpose"},{"level":2,"id":"32-supported-temporal-value-classes","text":"3.2 Supported temporal value classes"},{"level":2,"id":"33-canonical-serialization","text":"3.3 Canonical serialization"},{"level":3,"id":"331-date","text":"3.3.1 Date"},{"level":3,"id":"332-datetime","text":"3.3.2 Datetime"},{"level":2,"id":"34-parsing-requirements","text":"3.4 Parsing requirements"},{"level":3,"id":"341-date-parsing","text":"3.4.1 Date parsing"},{"level":3,"id":"342-datetime-parsing","text":"3.4.2 Datetime parsing"},{"level":3,"id":"343-mixed-input-tolerance","text":"3.4.3 Mixed input tolerance"},{"level":3,"id":"344-inbound-acceptance-matrix","text":"3.4.4 Inbound acceptance matrix"},{"level":2,"id":"35-day-semantics-vs-instant-semantics","text":"3.5 Day semantics vs instant semantics"},{"level":3,"id":"351-date-roles","text":"3.5.1 Date roles"},{"level":3,"id":"352-datetime-roles","text":"3.5.2 Datetime roles"},{"level":3,"id":"353-implementation-guidance-utc-anchor-strategy-non-normative","text":"3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)"},{"level":2,"id":"36-local-calendar-day-evaluation","text":"3.6 Local calendar-day evaluation"},{"level":3,"id":"361-active-runtime-timezone","text":"3.6.1 Active runtime timezone"},{"level":3,"id":"362-local-calendar-day-rules","text":"3.6.2 Local calendar-day rules"},{"level":2,"id":"37-comparison-rules","text":"3.7 Comparison rules"},{"level":3,"id":"371-date-to-date","text":"3.7.1 Date-to-date"},{"level":3,"id":"372-datetime-to-datetime","text":"3.7.2 Datetime-to-datetime"},{"level":3,"id":"373-date-to-datetime","text":"3.7.3 Date-to-datetime"},{"level":2,"id":"38-due-and-scheduled-semantics","text":"3.8 due and scheduled semantics"},{"level":2,"id":"39-completion-date-semantics","text":"3.9 Completion date semantics"},{"level":2,"id":"310-createdmodified-timestamps","text":"3.10 Created/modified timestamps"},{"level":2,"id":"311-timeentries-semantics","text":"3.11 time_entries semantics"},{"level":3,"id":"3111-timestamp-format","text":"3.11.1 Timestamp format"},{"level":3,"id":"3112-range-validity","text":"3.11.2 Range validity"},{"level":3,"id":"3113-duration-handling","text":"3.11.3 Duration handling"},{"level":3,"id":"3114-active-session-semantics","text":"3.11.4 Active session semantics"},{"level":3,"id":"3115-derived-time-calculations","text":"3.11.5 Derived time calculations"},{"level":2,"id":"312-reminder-temporal-semantics","text":"3.12 reminder temporal semantics"},{"level":2,"id":"313-example-local-day-overdue-evaluation","text":"3.13 Example: local-day overdue evaluation"},{"level":2,"id":"314-example-preserving-granularity","text":"3.14 Example: preserving granularity"},{"level":2,"id":"315-example-canonical-datetime-write","text":"3.15 Example: canonical datetime write"},{"level":2,"id":"316-example-utc-anchor-roundtrip-for-date-only-field","text":"3.16 Example: UTC-anchor roundtrip for date-only field"}],"html":"

3.1 Purpose#

\n

This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.

\n

3.2 Supported temporal value classes#

\n

Implementations MUST support:

\n
    \n
  1. Date values: calendar day without time or timezone.
  2. \n
  3. Datetime values: instant in time.
  4. \n
\n

3.3 Canonical serialization#

\n

3.3.1 Date#

\n

Canonical date serialization is:

\n
YYYY-MM-DD\n

3.3.2 Datetime#

\n

Canonical datetime serialization is UTC ISO 8601 with Z, for example:

\n
2026-02-20T13:45:00Z\n

Canonical datetime writes MUST use second precision (YYYY-MM-DDTHH:MM:SSZ) and MUST NOT include fractional seconds.\nImplementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes.\nIf an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds.

\n

3.4 Parsing requirements#

\n

3.4.1 Date parsing#

\n

Date parsing MUST reject invalid calendar dates.

\n
    \n
  • valid: 2026-02-28
  • \n
  • invalid: 2026-02-30
  • \n
\n

3.4.2 Datetime parsing#

\n

Datetime parsing MUST reject malformed values.\nIn strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example 2026-02-20T09:00:00 with no timezone offset).\nIn permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning.

\n

3.4.3 Mixed input tolerance#

\n

Implementations MAY accept both date and datetime values for roles like due and scheduled if configured to do so. The accepted form MUST be documented.

\n

3.4.4 Inbound acceptance matrix#

\n

To avoid ambiguity, conforming parsers MUST follow this matrix.

\n

Date forms:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FormExampleStrictPermissive
Canonical date2026-02-20acceptaccept
Basic date (no separators)20260220reject (invalid_date_value)MAY accept only under documented compatibility policy; SHOULD emit warning
\n

Datetime forms:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FormExampleStrictPermissive
Canonical UTC2026-02-20T09:00:00Zacceptaccept
ISO with explicit offset2026-02-20T09:00:00+10:00acceptaccept
ISO with fractional seconds2026-02-20T09:00:00.250Zaccept (normalize to second precision on write)accept (normalize to second precision on write)
Offset-less local datetime2026-02-20T09:00:00reject (invalid_datetime_value)MAY accept only under documented compatibility policy; SHOULD emit warning
Space-separated datetime2026-02-20 09:00:00reject (invalid_datetime_value)MAY accept only under documented compatibility policy; SHOULD emit warning
Basic datetime (no separators)20260220T090000Zreject (invalid_datetime_value)MAY accept only under documented compatibility policy; SHOULD emit warning
\n

When permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3.

\n

3.5 Day semantics vs instant semantics#

\n

3.5.1 Date roles#

\n

Date roles represent days, not instants, and MUST NOT be timezone-shifted.

\n

3.5.2 Datetime roles#

\n

Datetime roles represent instants and MUST preserve instant equality through normalization.

\n

Example:

\n
    \n
  • input 2026-02-20T08:00:00-05:00
  • \n
  • canonical write 2026-02-20T13:00:00Z
  • \n
\n

3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)#

\n

Because date-only fields are human-readable (YYYY-MM-DD) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals.

\n

Recommended approach:

\n
    \n
  1. Parse date-only values to a UTC-midnight anchor instant for internal computations.
  2. \n
  3. Format date-only values from UTC calendar components when writing YYYY-MM-DD.
  4. \n
  5. Keep date-only roles as date-only on write unless an explicit conversion operation is requested.
  6. \n
  7. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6.
  8. \n
\n

Implementations MAY use different internal representations as long as all normative requirements in this section are preserved.

\n

3.6 Local calendar-day evaluation#

\n

3.6.1 Active runtime timezone#

\n

For day-level semantics, the active runtime timezone is:

\n
    \n
  1. the caller-provided temporal execution context, when present
  2. \n
  3. the collection authority's configured timezone
  4. \n
  5. the process/system local timezone.
  6. \n
\n

The timezone is runtime context, not TaskNotes type-binding configuration. A\nremote caller SHOULD send its current IANA timezone for interactive operations;\na headless authority SHOULD use its durable collection timezone. Every\noperation MUST resolve this precedence once and use one effective timezone for\nall day-level semantics in that operation.

\n

Implementations MUST make the effective timezone discoverable.

\n

3.6.2 Local calendar-day rules#

\n

When calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone.

\n

This requirement prevents off-by-one day drift in positive and negative UTC offsets.

\n

3.7 Comparison rules#

\n

3.7.1 Date-to-date#

\n

Compare by calendar day ordering.

\n

3.7.2 Datetime-to-datetime#

\n

Compare by instant ordering.

\n

3.7.3 Date-to-datetime#

\n

If compared, implementations MUST document coercion policy. Recommended policy:

\n
    \n
  • convert date to local start-of-day for day-level comparisons,
  • \n
  • avoid implicit coercion for instant-level comparisons.
  • \n
\n

3.8 due and scheduled semantics#

\n

due and scheduled MAY be either date or datetime by configuration.

\n

Implementations MUST:

\n
    \n
  • preserve stored granularity unless explicit conversion is requested,
  • \n
  • avoid silently converting date to datetime during unrelated writes,
  • \n
  • require documented explicit policy for date-to-datetime conversion operations,
  • \n
  • apply consistent coercion policy in filters and status calculations.
  • \n
\n

3.9 Completion date semantics#

\n

completed_date is a date role.

\n

For non-recurring completion, writers MUST set completed_date using §5 semantics:

\n
    \n
  • explicit completion-day input when provided,
  • \n
  • otherwise current local day in active runtime timezone.
  • \n
\n

3.10 Created/modified timestamps#

\n

date_created and date_modified are datetime roles.

\n

Writers MUST:

\n
    \n
  • set both on create,
  • \n
  • update date_modified on successful mutating operations that change persisted state,
  • \n
  • preserve date_created unless explicit migration/edit operation changes it.
  • \n
\n

3.11 time_entries semantics#

\n

3.11.1 Timestamp format#

\n

time_entries.startTime and time_entries.endTime MUST be datetime instants in canonical form on write.

\n

3.11.2 Range validity#

\n

If both times exist, endTime MUST be greater than or equal to startTime.

\n

3.11.3 Duration handling#

\n

If duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization.

\n

3.11.4 Active session semantics#

\n

An entry with startTime and no endTime represents an active/running session.

\n

Implementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time.

\n

3.11.5 Derived time calculations#

\n

For interoperability, implementations SHOULD expose both derived views when reporting tracked time:

\n
    \n
  • closed_minutes: sum of entries where both startTime and endTime exist.
  • \n
  • live_minutes: closed_minutes plus elapsed minutes of active entries (if any).
  • \n
\n

Implementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs).

\n

3.12 reminder temporal semantics#

\n

Reminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section.

\n

Rules:

\n
    \n
  • reminders[].absoluteTime MUST be a canonical datetime on write.
  • \n
  • reminders[].offset MUST be a valid ISO 8601 duration string.
  • \n
  • relative reminder base conversion for date-only values MUST use reminders.date_only_anchor_time from §9, or 00:00 local time if unset.
  • \n
\n

3.13 Example: local-day overdue evaluation#

\n

Assume local timezone America/Los_Angeles and local date 2026-02-20.

\n

Task A:

\n
due: 2026-02-19\nstatus: open\n

Task A is overdue.

\n

Task B:

\n
due: 2026-02-20\nstatus: open\n

Task B is not overdue at start of day; it becomes overdue on 2026-02-21 local day.

\n

3.14 Example: preserving granularity#

\n

Before update:

\n
due: 2026-02-20\npriority: normal\n

Operation: update priority only.

\n

After update (conforming):

\n
due: 2026-02-20\npriority: high\n

Non-conforming behavior would silently rewrite due to a datetime.

\n

3.15 Example: canonical datetime write#

\n

Input:

\n
timeEntries:\n  - startTime: 2026-02-20T09:30:00+01:00\n    endTime: 2026-02-20T10:00:00+01:00\n

Canonical write:

\n
timeEntries:\n  - startTime: 2026-02-20T08:30:00Z\n    endTime: 2026-02-20T09:00:00Z\n

3.16 Example: UTC-anchor roundtrip for date-only field#

\n

Input:

\n
due: 2026-02-20\n

Internal computation anchor:

\n
2026-02-20T00:00:00Z\n

After unrelated update, conforming write:

\n
due: 2026-02-20\n

Non-conforming behavior would rewrite due as a datetime or shift it to another day based on local offset.

\n","text":"3.1 Purpose# This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values. 3.2 Supported temporal value classes# Implementations MUST support: Date values: calendar day without time or timezone. Datetime values: instant in time. 3.3 Canonical serialization# 3.3.1 Date# Canonical date serialization is: YYYY-MM-DD 3.3.2 Datetime# Canonical datetime serialization is UTC ISO 8601 with Z, for example: 2026-02-20T13:45:00Z Canonical datetime writes MUST use second precision (YYYY-MM-DDTHH:MM:SSZ) and MUST NOT include fractional seconds. Implementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes. If an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds. 3.4 Parsing requirements# 3.4.1 Date parsing# Date parsing MUST reject invalid calendar dates. valid: 2026-02-28 invalid: 2026-02-30 3.4.2 Datetime parsing# Datetime parsing MUST reject malformed values. In strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example 2026-02-20T09:00:00 with no timezone offset). In permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning. 3.4.3 Mixed input tolerance# Implementations MAY accept both date and datetime values for roles like due and scheduled if configured to do so. The accepted form MUST be documented. 3.4.4 Inbound acceptance matrix# To avoid ambiguity, conforming parsers MUST follow this matrix. Date forms: Form Example Strict Permissive Canonical date 2026-02-20 accept accept Basic date (no separators) 20260220 reject (invalid_date_value) MAY accept only under documented compatibility policy; SHOULD emit warning Datetime forms: Form Example Strict Permissive Canonical UTC 2026-02-20T09:00:00Z accept accept ISO with explicit offset 2026-02-20T09:00:00+10:00 accept accept ISO with fractional seconds 2026-02-20T09:00:00.250Z accept (normalize to second precision on write) accept (normalize to second precision on write) Offset-less local datetime 2026-02-20T09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Space-separated datetime 2026-02-20 09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Basic datetime (no separators) 20260220T090000Z reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning When permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3. 3.5 Day semantics vs instant semantics# 3.5.1 Date roles# Date roles represent days, not instants, and MUST NOT be timezone-shifted. 3.5.2 Datetime roles# Datetime roles represent instants and MUST preserve instant equality through normalization. Example: input 2026-02-20T08:00:00-05:00 canonical write 2026-02-20T13:00:00Z 3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)# Because date-only fields are human-readable (YYYY-MM-DD) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals. Recommended approach: Parse date-only values to a UTC-midnight anchor instant for internal computations. Format date-only values from UTC calendar components when writing YYYY-MM-DD. Keep date-only roles as date-only on write unless an explicit conversion operation is requested. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6. Implementations MAY use different internal representations as long as all normative requirements in this section are preserved. 3.6 Local calendar-day evaluation# 3.6.1 Active runtime timezone# For day-level semantics, the active runtime timezone is: the caller-provided temporal execution context, when present the collection authority's configured timezone the process/system local timezone. The timezone is runtime context, not TaskNotes type-binding configuration. A remote caller SHOULD send its current IANA timezone for interactive operations; a headless authority SHOULD use its durable collection timezone. Every operation MUST resolve this precedence once and use one effective timezone for all day-level semantics in that operation. Implementations MUST make the effective timezone discoverable. 3.6.2 Local calendar-day rules# When calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone. This requirement prevents off-by-one day drift in positive and negative UTC offsets. 3.7 Comparison rules# 3.7.1 Date-to-date# Compare by calendar day ordering. 3.7.2 Datetime-to-datetime# Compare by instant ordering. 3.7.3 Date-to-datetime# If compared, implementations MUST document coercion policy. Recommended policy: convert date to local start-of-day for day-level comparisons, avoid implicit coercion for instant-level comparisons. 3.8 due and scheduled semantics# due and scheduled MAY be either date or datetime by configuration. Implementations MUST: preserve stored granularity unless explicit conversion is requested, avoid silently converting date to datetime during unrelated writes, require documented explicit policy for date-to-datetime conversion operations, apply consistent coercion policy in filters and status calculations. 3.9 Completion date semantics# completed_date is a date role. For non-recurring completion, writers MUST set completed_date using §5 semantics: explicit completion-day input when provided, otherwise current local day in active runtime timezone. 3.10 Created/modified timestamps# date_created and date_modified are datetime roles. Writers MUST: set both on create, update date_modified on successful mutating operations that change persisted state, preserve date_created unless explicit migration/edit operation changes it. 3.11 time_entries semantics# 3.11.1 Timestamp format# time_entries.startTime and time_entries.endTime MUST be datetime instants in canonical form on write. 3.11.2 Range validity# If both times exist, endTime MUST be greater than or equal to startTime. 3.11.3 Duration handling# If duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization. 3.11.4 Active session semantics# An entry with startTime and no endTime represents an active/running session. Implementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time. 3.11.5 Derived time calculations# For interoperability, implementations SHOULD expose both derived views when reporting tracked time: closed_minutes: sum of entries where both startTime and endTime exist. live_minutes: closed_minutes plus elapsed minutes of active entries (if any). Implementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs). 3.12 reminder temporal semantics# Reminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section. Rules: reminders[].absoluteTime MUST be a canonical datetime on write. reminders[].offset MUST be a valid ISO 8601 duration string. relative reminder base conversion for date-only values MUST use reminders.date_only_anchor_time from §9, or 00:00 local time if unset. 3.13 Example: local-day overdue evaluation# Assume local timezone America/Los_Angeles and local date 2026-02-20. Task A: due: 2026-02-19 status: open Task A is overdue. Task B: due: 2026-02-20 status: open Task B is not overdue at start of day; it becomes overdue on 2026-02-21 local day. 3.14 Example: preserving granularity# Before update: due: 2026-02-20 priority: normal Operation: update priority only. After update (conforming): due: 2026-02-20 priority: high Non-conforming behavior would silently rewrite due to a datetime. 3.15 Example: canonical datetime write# Input: timeEntries: - startTime: 2026-02-20T09:30:00+01:00 endTime: 2026-02-20T10:00:00+01:00 Canonical write: timeEntries: - startTime: 2026-02-20T08:30:00Z endTime: 2026-02-20T09:00:00Z 3.16 Example: UTC-anchor roundtrip for date-only field# Input: due: 2026-02-20 Internal computation anchor: 2026-02-20T00:00:00Z After unrelated update, conforming write: due: 2026-02-20 Non-conforming behavior would rewrite due as a datetime or shift it to another day based on local offset."},{"route":"/developers/specification/04-recurrence/","title":"4. Recurrence","description":"This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:04-recurrence.md","namespace":"specification","relativePath":"04-recurrence.md","raw":"# 4. Recurrence\n\n## 4.1 Purpose\n\nThis section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.\n\n## 4.2 Recurrence applicability\n\nA task is recurring when semantic role `recurrence` contains a valid tasknotes recurrence string.\n\nIf `recurrence` is absent or empty, the task is non-recurring.\n\n## 4.3 Rule format\n\n### 4.3.1 Required format\n\n`recurrence` MUST be a tasknotes recurrence string.\nThis syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment.\nThe RRULE parameter portion MUST use RFC 5545 RRULE property syntax.\nIt MAY include a leading inline `DTSTART` segment.\n\nIf `DTSTART` is present, it MUST use one of:\n\n- `DTSTART:YYYYMMDD` (date-only)\n- `DTSTART:YYYYMMDDTHHMMSSZ` (UTC datetime)\n\nCanonical combined form is:\n\n- `DTSTART:...;FREQ=...`\n\nImplementations MAY accept inbound `RRULE:` prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above.\n\nExamples:\n\n- `FREQ=DAILY`\n- `FREQ=WEEKLY;BYDAY=MO,WE,FR`\n- `FREQ=MONTHLY;BYMONTHDAY=1`\n- `DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR`\n\n### 4.3.2 Invalid rule handling\n\nInvalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode.\n\n## 4.4 Recurrence anchor\n\n`recurrence_anchor` controls progression semantics and MUST be one of:\n\n- `scheduled`\n- `completion`\n\nIf missing, implementations SHOULD default to `scheduled` unless collection configuration defines another default.\n\n### 4.4.1 Recurrence seed precedence\n\nWhen recurrence generation requires a seed/start date, implementations MUST resolve it in this order:\n\n1. `DTSTART` embedded in `recurrence`,\n2. semantic `scheduled`,\n3. semantic `date_created`.\n\nIf no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error.\n\n### 4.4.2 Anchor progression behavior\n\nFor `recurrence_anchor=scheduled`, progression is based on the scheduled chain and `DTSTART` MUST remain fixed after it is set.\n\nFor `recurrence_anchor=completion`, complete-instance operations MUST advance progression by updating `DTSTART` to the completion target (date or datetime per §4.4.3).\n\n### 4.4.3 `DTSTART` update semantics\n\nWhen `recurrence_anchor=completion` and instance completion succeeds for resolved target day `D`:\n\n1. Instance-list state (`complete_instances`, `skipped_instances`) MUST always use day `D`.\n2. If the caller provided an explicit datetime target, `DTSTART` MUST be rewritten as `DTSTART:YYYYMMDDTHHMMSSZ` using that target instant normalized to UTC.\n3. Otherwise, `DTSTART` MUST be rewritten as `DTSTART:YYYYMMDD` for day `D`.\n4. RRULE components other than `DTSTART` MUST be preserved unless an explicit recurrence-edit operation changes them.\n5. If `DTSTART` is absent, completion-anchor progression MUST insert it before RRULE parameters.\n\n### 4.4.4 Recalculation semantics for `recurrence_anchor=completion`\n\nWhen calculating the next candidate occurrence for `recurrence_anchor=completion`:\n\n1. Implementations MUST treat `DTSTART` progression as the consumed-history mechanism.\n2. `complete_instances` MUST NOT be used as an exclusion set for future occurrence selection in this mode.\n3. `skipped_instances` MUST still exclude matching candidate dates.\n4. Candidate selection MUST choose the first RRULE occurrence strictly after the current `DTSTART` anchor (or resolved seed if `DTSTART` is absent).\n\nThis matches the completion-anchor progression model where each completion advances the chain by rewriting `DTSTART`.\nThis model is intentionally not fully reversible via ordinary `uncomplete instance`; progression history lives in `DTSTART`, not only in `complete_instances`.\n\n### 4.4.5 `DTSTART` canonicalization on recurring writes\n\nTo ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure `DTSTART` is present after create or successful recurring-instance completion.\n\nRules:\n\n1. If persisted `recurrence` already contains `DTSTART`, keep it unless an explicit operation updates it per §4.4.3.\n2. If persisted `recurrence` omits `DTSTART`, writers MUST resolve a seed using §4.4.1 and insert `DTSTART` before RRULE parameters.\n3. For `recurrence_anchor=scheduled`, inserted `DTSTART` becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions.\n4. If seed resolution fails, operation MUST fail deterministically and emit `missing_recurrence_seed`.\n\n## 4.5 Instance state fields\n\nPer-instance state is represented by:\n\n- `complete_instances`: list of date values\n- `skipped_instances`: list of date values\n\nThese lists represent day-level instance outcomes.\n\n## 4.6 Invariants\n\nImplementations MUST enforce:\n\n1. Items in instance lists are valid date values.\n2. No date appears in both lists simultaneously.\n3. Duplicate dates are normalized (set semantics) or rejected deterministically.\n4. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence.\n\n## 4.7 Instance completion semantics\n\nOperation: `complete instance` for target date `D`.\n\nConforming behavior:\n\n1. Add `D` to `complete_instances`.\n2. Remove `D` from `skipped_instances` if present.\n3. Leave base task status unchanged unless explicit policy states otherwise.\n4. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.8 Instance uncompletion semantics\n\nOperation: `uncomplete instance` for target date `D`.\n\nConforming behavior:\n\n1. Remove `D` from `complete_instances` if present.\n2. Do not add `D` to `skipped_instances` implicitly.\n3. For `recurrence_anchor=completion`, uncomplete MUST NOT rewrite or roll back `DTSTART`; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation.\n4. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.9 Instance skip semantics\n\nOperation: `skip instance` for target date `D`.\n\nConforming behavior:\n\n1. Add `D` to `skipped_instances`.\n2. Remove `D` from `complete_instances` if present.\n3. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.10 Instance unskip semantics\n\nOperation: `unskip instance` for target date `D`.\n\nConforming behavior:\n\n1. Remove `D` from `skipped_instances` if present.\n2. Do not add to `complete_instances` implicitly.\n3. Update `date_modified` when state changes.\n\nOperation MUST be idempotent.\n\n## 4.11 Effective instance state\n\nFor target date `D`, effective state MUST be resolved in this order:\n\n1. If `D` in `complete_instances`: state is `completed`.\n2. Else if `D` in `skipped_instances`: state is `skipped`.\n3. Else: state is unresolved/default for that instance.\n\nBecause overlap is invalid, this ordering is deterministic.\n\n## 4.12 Interaction with base status\n\nFor recurring tasks:\n\n- Base `status` is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured.\n- Instance state determines completion for recurrence-aware views and operations.\n- Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy.\n\nFor non-recurring tasks, completion uses base status semantics (§5).\n\n## 4.13 Completed-status configuration\n\nImplementations MUST define which status values are treated as complete for non-recurring tasks.\n\nThe completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal.\n\n## 4.14 Example: complete then skip same day\n\nInitial:\n\n```yaml\nrecurrence: FREQ=DAILY\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n```\n\nSkip target date `2026-02-20`:\n\n```yaml\nrecurrence: FREQ=DAILY\ncompleteInstances: []\nskippedInstances: [2026-02-20]\n```\n\n## 4.15 Example: idempotent complete\n\nInitial:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n```\n\nComplete `2026-02-20` again:\n\n- persisted instance lists remain unchanged,\n- operation succeeds without duplicate entries.\n\n## 4.16 Example: anchor semantics\n\nTask:\n\n```yaml\nrecurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrenceAnchor: completion\n```\n\nIf implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is `completion`, not solely by scheduled chain.\nImplementations using `DTSTART` progression MUST update `DTSTART` to the completion date for this mode.\n\nWorked example (`recurrence_anchor=completion`):\n\n```yaml\nrecurrence: DTSTART:20260220;FREQ=DAILY\nrecurrence_anchor: completion\ncomplete_instances: [2026-02-20, 2026-02-21]\nskipped_instances: [2026-02-23]\n```\n\nConforming recalculation:\n\n- does **not** exclude `2026-02-22` because it is absent from `skipped_instances`,\n- does exclude `2026-02-23` because it is skipped,\n- ignores `complete_instances` for future exclusion in this mode (§4.4.4).\n\n## 4.17 Validation examples\n\nInvalid overlap:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n```\n\nResult: validation error `instance_state_overlap`.\n\nInvalid date in list:\n\n```yaml\ncompleteInstances: [2026-02-30]\n```\n\nResult: validation error `invalid_date_value`.\n\n## 4.18 Recurrence materialization\n\nThis subsection is required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\nRecurrence materialization creates ordinary task files for specific target dates of a recurring parent task.\nIt is additive behavior: implementations that do not claim `materialized-occurrences` continue to use the instance-list model in §4.5-§4.12.\nMaterialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7).\n\n### 4.18.1 Parent and occurrence ownership\n\nThe parent recurring task owns series-level semantics:\n\n- `recurrence`\n- `recurrence_anchor`\n- recurrence generation and `DTSTART` progression\n- parent instance-list compatibility state (`complete_instances`, `skipped_instances`)\n- materialization policy fields (`occurrence_materialization`, `occurrence_next_trigger`, `occurrence_template`, `occurrence_past_horizon`, `occurrence_future_horizon`)\n\nA materialized occurrence note owns per-date task semantics for its `occurrence_date`, including:\n\n- `status`\n- `completed_date`\n- body content and checklists\n- `time_entries`\n- per-occurrence `due`, `scheduled`, `reminders`, `contexts`, `projects`, and unknown fields\n\n### 4.18.2 Occurrence identity and parent reference\n\nA materialized occurrence note MUST store:\n\n- `recurrence_parent`: a link-or-string reference to the parent recurring task\n- `occurrence_date`: the target date represented by the occurrence note\n\nThe preferred Obsidian-compatible representation for `recurrence_parent` is a wikilink, for example:\n\n```yaml\nrecurrence_parent: \"[[Weekly Review]]\"\noccurrence_date: 2026-02-27\n```\n\nImplementations claiming `materialized-occurrences` MUST resolve `recurrence_parent` using §11 link semantics for this role, even if they do not claim full `extended`.\nIf the parent cannot be resolved, validation SHOULD report `invalid_recurrence_parent`.\n\nFor one resolved parent, there SHOULD be at most one materialized occurrence note per `occurrence_date`.\nDuplicate detected occurrence notes SHOULD report `duplicate_occurrence_note` and MUST NOT be chosen nondeterministically for writes.\n\n### 4.18.3 Effective state precedence\n\nFor target date `D`, recurrence-aware effective state MUST be resolved in this order:\n\n1. If a materialized occurrence note exists for `(parent, D)`, derive state from that note's own task state:\n - `completed` when its `status` is in `status.completed_values`;\n - `skipped` when its `status` is in `status.skipped_values`;\n - otherwise unresolved/default for that instance.\n2. Else if `D` is in parent `complete_instances`: state is `completed`.\n3. Else if `D` is in parent `skipped_instances`: state is `skipped`.\n4. Else: state is unresolved/default for that instance.\n\nIf a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for `D`.\nValidators SHOULD report `occurrence_state_conflict`, and repair/normalization operations MAY update parent lists to match occurrence notes.\n\n### 4.18.4 Parent instance lists as compatibility state\n\nWhen materialized occurrence notes are supported, parent `complete_instances` and `skipped_instances` remain part of canonical persisted state.\nThey serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes.\n\nConforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip:\n\n- completed child state: add `D` to `complete_instances`, remove `D` from `skipped_instances`;\n- skipped child state: add `D` to `skipped_instances`, remove `D` from `complete_instances`;\n- active/unresolved child state after uncompletion/unskip: remove `D` from the relevant parent list.\n\nReconciliation failure MUST NOT silently change the occurrence note state.\nImplementations SHOULD surface a recoverable error or warning.\n\n### 4.18.5 Materialization modes\n\n`occurrence_materialization` controls when materialized occurrence notes are created.\nAllowed values:\n\n- `manual`: occurrence notes are created only by explicit user or API action.\n- `on_completion`: completing a materialized occurrence note creates the next occurrence note.\n- `rolling`: the implementation maintains a bounded materialized window, such as today through the next 14 days.\n\nIf absent, `occurrence_materialization` MUST default to `manual`.\n\n`on_completion` does not by itself create the first occurrence note in a series.\nThe first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option.\n\nConforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing.\n\n### 4.18.6 Next-occurrence trigger\n\n`occurrence_next_trigger` controls whether skip/cancel transitions also create the next occurrence note when `occurrence_materialization=on_completion`.\nAllowed values:\n\n- `completion`: only completion creates the next occurrence note.\n- `completion_or_skip`: completion and skip/cancel create the next occurrence note.\n\nIf absent, `occurrence_next_trigger` MUST default to `completion`.\n\nThe next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics.\nMaterializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate.\n\n### 4.18.7 Rolling materialization bounds\n\nFor `occurrence_materialization=rolling`, implementations MUST enforce finite bounds.\nUnbounded future materialization is non-conformant.\n\nBounds SHOULD be expressed with ISO 8601 durations such as:\n\n```yaml\noccurrence_past_horizon: P0D\noccurrence_future_horizon: P14D\n```\n\nIf bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults.\n\n### 4.18.8 Recurrence edits and historical notes\n\nMaterialized occurrence notes are durable task files.\nEditing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes.\n\nIf an existing occurrence note's `occurrence_date` is no longer generated by the current parent recurrence rule, validators MAY report `materialization_target_not_generated` as a warning.\nThis condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated.\n","aliases":["/spec/04-recurrence/"],"toc":[{"level":2,"id":"41-purpose","text":"4.1 Purpose"},{"level":2,"id":"42-recurrence-applicability","text":"4.2 Recurrence applicability"},{"level":2,"id":"43-rule-format","text":"4.3 Rule format"},{"level":3,"id":"431-required-format","text":"4.3.1 Required format"},{"level":3,"id":"432-invalid-rule-handling","text":"4.3.2 Invalid rule handling"},{"level":2,"id":"44-recurrence-anchor","text":"4.4 Recurrence anchor"},{"level":3,"id":"441-recurrence-seed-precedence","text":"4.4.1 Recurrence seed precedence"},{"level":3,"id":"442-anchor-progression-behavior","text":"4.4.2 Anchor progression behavior"},{"level":3,"id":"443-dtstart-update-semantics","text":"4.4.3 DTSTART update semantics"},{"level":3,"id":"444-recalculation-semantics-for-recurrenceanchorcompletion","text":"4.4.4 Recalculation semantics for recurrence_anchor=completion"},{"level":3,"id":"445-dtstart-canonicalization-on-recurring-writes","text":"4.4.5 DTSTART canonicalization on recurring writes"},{"level":2,"id":"45-instance-state-fields","text":"4.5 Instance state fields"},{"level":2,"id":"46-invariants","text":"4.6 Invariants"},{"level":2,"id":"47-instance-completion-semantics","text":"4.7 Instance completion semantics"},{"level":2,"id":"48-instance-uncompletion-semantics","text":"4.8 Instance uncompletion semantics"},{"level":2,"id":"49-instance-skip-semantics","text":"4.9 Instance skip semantics"},{"level":2,"id":"410-instance-unskip-semantics","text":"4.10 Instance unskip semantics"},{"level":2,"id":"411-effective-instance-state","text":"4.11 Effective instance state"},{"level":2,"id":"412-interaction-with-base-status","text":"4.12 Interaction with base status"},{"level":2,"id":"413-completed-status-configuration","text":"4.13 Completed-status configuration"},{"level":2,"id":"414-example-complete-then-skip-same-day","text":"4.14 Example: complete then skip same day"},{"level":2,"id":"415-example-idempotent-complete","text":"4.15 Example: idempotent complete"},{"level":2,"id":"416-example-anchor-semantics","text":"4.16 Example: anchor semantics"},{"level":2,"id":"417-validation-examples","text":"4.17 Validation examples"},{"level":2,"id":"418-recurrence-materialization","text":"4.18 Recurrence materialization"},{"level":3,"id":"4181-parent-and-occurrence-ownership","text":"4.18.1 Parent and occurrence ownership"},{"level":3,"id":"4182-occurrence-identity-and-parent-reference","text":"4.18.2 Occurrence identity and parent reference"},{"level":3,"id":"4183-effective-state-precedence","text":"4.18.3 Effective state precedence"},{"level":3,"id":"4184-parent-instance-lists-as-compatibility-state","text":"4.18.4 Parent instance lists as compatibility state"},{"level":3,"id":"4185-materialization-modes","text":"4.18.5 Materialization modes"},{"level":3,"id":"4186-next-occurrence-trigger","text":"4.18.6 Next-occurrence trigger"},{"level":3,"id":"4187-rolling-materialization-bounds","text":"4.18.7 Rolling materialization bounds"},{"level":3,"id":"4188-recurrence-edits-and-historical-notes","text":"4.18.8 Recurrence edits and historical notes"}],"html":"

4.1 Purpose#

\n

This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.

\n

4.2 Recurrence applicability#

\n

A task is recurring when semantic role recurrence contains a valid tasknotes recurrence string.

\n

If recurrence is absent or empty, the task is non-recurring.

\n

4.3 Rule format#

\n

4.3.1 Required format#

\n

recurrence MUST be a tasknotes recurrence string.\nThis syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment.\nThe RRULE parameter portion MUST use RFC 5545 RRULE property syntax.\nIt MAY include a leading inline DTSTART segment.

\n

If DTSTART is present, it MUST use one of:

\n
    \n
  • DTSTART:YYYYMMDD (date-only)
  • \n
  • DTSTART:YYYYMMDDTHHMMSSZ (UTC datetime)
  • \n
\n

Canonical combined form is:

\n
    \n
  • DTSTART:...;FREQ=...
  • \n
\n

Implementations MAY accept inbound RRULE: prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above.

\n

Examples:

\n
    \n
  • FREQ=DAILY
  • \n
  • FREQ=WEEKLY;BYDAY=MO,WE,FR
  • \n
  • FREQ=MONTHLY;BYMONTHDAY=1
  • \n
  • DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR
  • \n
\n

4.3.2 Invalid rule handling#

\n

Invalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode.

\n

4.4 Recurrence anchor#

\n

recurrence_anchor controls progression semantics and MUST be one of:

\n
    \n
  • scheduled
  • \n
  • completion
  • \n
\n

If missing, implementations SHOULD default to scheduled unless collection configuration defines another default.

\n

4.4.1 Recurrence seed precedence#

\n

When recurrence generation requires a seed/start date, implementations MUST resolve it in this order:

\n
    \n
  1. DTSTART embedded in recurrence,
  2. \n
  3. semantic scheduled,
  4. \n
  5. semantic date_created.
  6. \n
\n

If no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error.

\n

4.4.2 Anchor progression behavior#

\n

For recurrence_anchor=scheduled, progression is based on the scheduled chain and DTSTART MUST remain fixed after it is set.

\n

For recurrence_anchor=completion, complete-instance operations MUST advance progression by updating DTSTART to the completion target (date or datetime per §4.4.3).

\n

4.4.3 DTSTART update semantics#

\n

When recurrence_anchor=completion and instance completion succeeds for resolved target day D:

\n
    \n
  1. Instance-list state (complete_instances, skipped_instances) MUST always use day D.
  2. \n
  3. If the caller provided an explicit datetime target, DTSTART MUST be rewritten as DTSTART:YYYYMMDDTHHMMSSZ using that target instant normalized to UTC.
  4. \n
  5. Otherwise, DTSTART MUST be rewritten as DTSTART:YYYYMMDD for day D.
  6. \n
  7. RRULE components other than DTSTART MUST be preserved unless an explicit recurrence-edit operation changes them.
  8. \n
  9. If DTSTART is absent, completion-anchor progression MUST insert it before RRULE parameters.
  10. \n
\n

4.4.4 Recalculation semantics for recurrence_anchor=completion#

\n

When calculating the next candidate occurrence for recurrence_anchor=completion:

\n
    \n
  1. Implementations MUST treat DTSTART progression as the consumed-history mechanism.
  2. \n
  3. complete_instances MUST NOT be used as an exclusion set for future occurrence selection in this mode.
  4. \n
  5. skipped_instances MUST still exclude matching candidate dates.
  6. \n
  7. Candidate selection MUST choose the first RRULE occurrence strictly after the current DTSTART anchor (or resolved seed if DTSTART is absent).
  8. \n
\n

This matches the completion-anchor progression model where each completion advances the chain by rewriting DTSTART.\nThis model is intentionally not fully reversible via ordinary uncomplete instance; progression history lives in DTSTART, not only in complete_instances.

\n

4.4.5 DTSTART canonicalization on recurring writes#

\n

To ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure DTSTART is present after create or successful recurring-instance completion.

\n

Rules:

\n
    \n
  1. If persisted recurrence already contains DTSTART, keep it unless an explicit operation updates it per §4.4.3.
  2. \n
  3. If persisted recurrence omits DTSTART, writers MUST resolve a seed using §4.4.1 and insert DTSTART before RRULE parameters.
  4. \n
  5. For recurrence_anchor=scheduled, inserted DTSTART becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions.
  6. \n
  7. If seed resolution fails, operation MUST fail deterministically and emit missing_recurrence_seed.
  8. \n
\n

4.5 Instance state fields#

\n

Per-instance state is represented by:

\n
    \n
  • complete_instances: list of date values
  • \n
  • skipped_instances: list of date values
  • \n
\n

These lists represent day-level instance outcomes.

\n

4.6 Invariants#

\n

Implementations MUST enforce:

\n
    \n
  1. Items in instance lists are valid date values.
  2. \n
  3. No date appears in both lists simultaneously.
  4. \n
  5. Duplicate dates are normalized (set semantics) or rejected deterministically.
  6. \n
  7. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence.
  8. \n
\n

4.7 Instance completion semantics#

\n

Operation: complete instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Add D to complete_instances.
  2. \n
  3. Remove D from skipped_instances if present.
  4. \n
  5. Leave base task status unchanged unless explicit policy states otherwise.
  6. \n
  7. Update date_modified when state changes.
  8. \n
\n

Operation MUST be idempotent.

\n

4.8 Instance uncompletion semantics#

\n

Operation: uncomplete instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Remove D from complete_instances if present.
  2. \n
  3. Do not add D to skipped_instances implicitly.
  4. \n
  5. For recurrence_anchor=completion, uncomplete MUST NOT rewrite or roll back DTSTART; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation.
  6. \n
  7. Update date_modified when state changes.
  8. \n
\n

Operation MUST be idempotent.

\n

4.9 Instance skip semantics#

\n

Operation: skip instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Add D to skipped_instances.
  2. \n
  3. Remove D from complete_instances if present.
  4. \n
  5. Update date_modified when state changes.
  6. \n
\n

Operation MUST be idempotent.

\n

4.10 Instance unskip semantics#

\n

Operation: unskip instance for target date D.

\n

Conforming behavior:

\n
    \n
  1. Remove D from skipped_instances if present.
  2. \n
  3. Do not add to complete_instances implicitly.
  4. \n
  5. Update date_modified when state changes.
  6. \n
\n

Operation MUST be idempotent.

\n

4.11 Effective instance state#

\n

For target date D, effective state MUST be resolved in this order:

\n
    \n
  1. If D in complete_instances: state is completed.
  2. \n
  3. Else if D in skipped_instances: state is skipped.
  4. \n
  5. Else: state is unresolved/default for that instance.
  6. \n
\n

Because overlap is invalid, this ordering is deterministic.

\n

4.12 Interaction with base status#

\n

For recurring tasks:

\n
    \n
  • Base status is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured.
  • \n
  • Instance state determines completion for recurrence-aware views and operations.
  • \n
  • Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy.
  • \n
\n

For non-recurring tasks, completion uses base status semantics (§5).

\n

4.13 Completed-status configuration#

\n

Implementations MUST define which status values are treated as complete for non-recurring tasks.

\n

The completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal.

\n

4.14 Example: complete then skip same day#

\n

Initial:

\n
recurrence: FREQ=DAILY\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n

Skip target date 2026-02-20:

\n
recurrence: FREQ=DAILY\ncompleteInstances: []\nskippedInstances: [2026-02-20]\n

4.15 Example: idempotent complete#

\n

Initial:

\n
completeInstances: [2026-02-20]\nskippedInstances: []\n

Complete 2026-02-20 again:

\n
    \n
  • persisted instance lists remain unchanged,
  • \n
  • operation succeeds without duplicate entries.
  • \n
\n

4.16 Example: anchor semantics#

\n

Task:

\n
recurrence: FREQ=WEEKLY;BYDAY=FR\nrecurrenceAnchor: completion\n

If implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is completion, not solely by scheduled chain.\nImplementations using DTSTART progression MUST update DTSTART to the completion date for this mode.

\n

Worked example (recurrence_anchor=completion):

\n
recurrence: DTSTART:20260220;FREQ=DAILY\nrecurrence_anchor: completion\ncomplete_instances: [2026-02-20, 2026-02-21]\nskipped_instances: [2026-02-23]\n

Conforming recalculation:

\n
    \n
  • does not exclude 2026-02-22 because it is absent from skipped_instances,
  • \n
  • does exclude 2026-02-23 because it is skipped,
  • \n
  • ignores complete_instances for future exclusion in this mode (§4.4.4).
  • \n
\n

4.17 Validation examples#

\n

Invalid overlap:

\n
completeInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n

Result: validation error instance_state_overlap.

\n

Invalid date in list:

\n
completeInstances: [2026-02-30]\n

Result: validation error invalid_date_value.

\n

4.18 Recurrence materialization#

\n

This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

Recurrence materialization creates ordinary task files for specific target dates of a recurring parent task.\nIt is additive behavior: implementations that do not claim materialized-occurrences continue to use the instance-list model in §4.5-§4.12.\nMaterialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7).

\n

4.18.1 Parent and occurrence ownership#

\n

The parent recurring task owns series-level semantics:

\n
    \n
  • recurrence
  • \n
  • recurrence_anchor
  • \n
  • recurrence generation and DTSTART progression
  • \n
  • parent instance-list compatibility state (complete_instances, skipped_instances)
  • \n
  • materialization policy fields (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon)
  • \n
\n

A materialized occurrence note owns per-date task semantics for its occurrence_date, including:

\n
    \n
  • status
  • \n
  • completed_date
  • \n
  • body content and checklists
  • \n
  • time_entries
  • \n
  • per-occurrence due, scheduled, reminders, contexts, projects, and unknown fields
  • \n
\n

4.18.2 Occurrence identity and parent reference#

\n

A materialized occurrence note MUST store:

\n
    \n
  • recurrence_parent: a link-or-string reference to the parent recurring task
  • \n
  • occurrence_date: the target date represented by the occurrence note
  • \n
\n

The preferred Obsidian-compatible representation for recurrence_parent is a wikilink, for example:

\n
recurrence_parent: "[[Weekly Review]]"\noccurrence_date: 2026-02-27\n

Implementations claiming materialized-occurrences MUST resolve recurrence_parent using §11 link semantics for this role, even if they do not claim full extended.\nIf the parent cannot be resolved, validation SHOULD report invalid_recurrence_parent.

\n

For one resolved parent, there SHOULD be at most one materialized occurrence note per occurrence_date.\nDuplicate detected occurrence notes SHOULD report duplicate_occurrence_note and MUST NOT be chosen nondeterministically for writes.

\n

4.18.3 Effective state precedence#

\n

For target date D, recurrence-aware effective state MUST be resolved in this order:

\n
    \n
  1. If a materialized occurrence note exists for (parent, D), derive state from that note's own task state:
      \n
    • completed when its status is in status.completed_values;
    • \n
    • skipped when its status is in status.skipped_values;
    • \n
    • otherwise unresolved/default for that instance.
    • \n
    \n
  2. \n
  3. Else if D is in parent complete_instances: state is completed.
  4. \n
  5. Else if D is in parent skipped_instances: state is skipped.
  6. \n
  7. Else: state is unresolved/default for that instance.
  8. \n
\n

If a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for D.\nValidators SHOULD report occurrence_state_conflict, and repair/normalization operations MAY update parent lists to match occurrence notes.

\n

4.18.4 Parent instance lists as compatibility state#

\n

When materialized occurrence notes are supported, parent complete_instances and skipped_instances remain part of canonical persisted state.\nThey serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes.

\n

Conforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip:

\n
    \n
  • completed child state: add D to complete_instances, remove D from skipped_instances;
  • \n
  • skipped child state: add D to skipped_instances, remove D from complete_instances;
  • \n
  • active/unresolved child state after uncompletion/unskip: remove D from the relevant parent list.
  • \n
\n

Reconciliation failure MUST NOT silently change the occurrence note state.\nImplementations SHOULD surface a recoverable error or warning.

\n

4.18.5 Materialization modes#

\n

occurrence_materialization controls when materialized occurrence notes are created.\nAllowed values:

\n
    \n
  • manual: occurrence notes are created only by explicit user or API action.
  • \n
  • on_completion: completing a materialized occurrence note creates the next occurrence note.
  • \n
  • rolling: the implementation maintains a bounded materialized window, such as today through the next 14 days.
  • \n
\n

If absent, occurrence_materialization MUST default to manual.

\n

on_completion does not by itself create the first occurrence note in a series.\nThe first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option.

\n

Conforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing.

\n

4.18.6 Next-occurrence trigger#

\n

occurrence_next_trigger controls whether skip/cancel transitions also create the next occurrence note when occurrence_materialization=on_completion.\nAllowed values:

\n
    \n
  • completion: only completion creates the next occurrence note.
  • \n
  • completion_or_skip: completion and skip/cancel create the next occurrence note.
  • \n
\n

If absent, occurrence_next_trigger MUST default to completion.

\n

The next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics.\nMaterializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate.

\n

4.18.7 Rolling materialization bounds#

\n

For occurrence_materialization=rolling, implementations MUST enforce finite bounds.\nUnbounded future materialization is non-conformant.

\n

Bounds SHOULD be expressed with ISO 8601 durations such as:

\n
occurrence_past_horizon: P0D\noccurrence_future_horizon: P14D\n

If bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults.

\n

4.18.8 Recurrence edits and historical notes#

\n

Materialized occurrence notes are durable task files.\nEditing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes.

\n

If an existing occurrence note's occurrence_date is no longer generated by the current parent recurrence rule, validators MAY report materialization_target_not_generated as a warning.\nThis condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated.

\n","text":"4.1 Purpose# This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state. 4.2 Recurrence applicability# A task is recurring when semantic role recurrence contains a valid tasknotes recurrence string. If recurrence is absent or empty, the task is non-recurring. 4.3 Rule format# 4.3.1 Required format# recurrence MUST be a tasknotes recurrence string. This syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment. The RRULE parameter portion MUST use RFC 5545 RRULE property syntax. It MAY include a leading inline DTSTART segment. If DTSTART is present, it MUST use one of: DTSTART:YYYYMMDD (date-only) DTSTART:YYYYMMDDTHHMMSSZ (UTC datetime) Canonical combined form is: DTSTART:...;FREQ=... Implementations MAY accept inbound RRULE: prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above. Examples: FREQ=DAILY FREQ=WEEKLY;BYDAY=MO,WE,FR FREQ=MONTHLY;BYMONTHDAY=1 DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR 4.3.2 Invalid rule handling# Invalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode. 4.4 Recurrence anchor# recurrence_anchor controls progression semantics and MUST be one of: scheduled completion If missing, implementations SHOULD default to scheduled unless collection configuration defines another default. 4.4.1 Recurrence seed precedence# When recurrence generation requires a seed/start date, implementations MUST resolve it in this order: DTSTART embedded in recurrence, semantic scheduled, semantic date_created. If no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error. 4.4.2 Anchor progression behavior# For recurrence_anchor=scheduled, progression is based on the scheduled chain and DTSTART MUST remain fixed after it is set. For recurrence_anchor=completion, complete-instance operations MUST advance progression by updating DTSTART to the completion target (date or datetime per §4.4.3). 4.4.3 DTSTART update semantics# When recurrence_anchor=completion and instance completion succeeds for resolved target day D: Instance-list state (complete_instances, skipped_instances) MUST always use day D. If the caller provided an explicit datetime target, DTSTART MUST be rewritten as DTSTART:YYYYMMDDTHHMMSSZ using that target instant normalized to UTC. Otherwise, DTSTART MUST be rewritten as DTSTART:YYYYMMDD for day D. RRULE components other than DTSTART MUST be preserved unless an explicit recurrence-edit operation changes them. If DTSTART is absent, completion-anchor progression MUST insert it before RRULE parameters. 4.4.4 Recalculation semantics for recurrence_anchor=completion# When calculating the next candidate occurrence for recurrence_anchor=completion: Implementations MUST treat DTSTART progression as the consumed-history mechanism. complete_instances MUST NOT be used as an exclusion set for future occurrence selection in this mode. skipped_instances MUST still exclude matching candidate dates. Candidate selection MUST choose the first RRULE occurrence strictly after the current DTSTART anchor (or resolved seed if DTSTART is absent). This matches the completion-anchor progression model where each completion advances the chain by rewriting DTSTART. This model is intentionally not fully reversible via ordinary uncomplete instance; progression history lives in DTSTART, not only in complete_instances. 4.4.5 DTSTART canonicalization on recurring writes# To ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure DTSTART is present after create or successful recurring-instance completion. Rules: If persisted recurrence already contains DTSTART, keep it unless an explicit operation updates it per §4.4.3. If persisted recurrence omits DTSTART, writers MUST resolve a seed using §4.4.1 and insert DTSTART before RRULE parameters. For recurrence_anchor=scheduled, inserted DTSTART becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions. If seed resolution fails, operation MUST fail deterministically and emit missing_recurrence_seed. 4.5 Instance state fields# Per-instance state is represented by: complete_instances: list of date values skipped_instances: list of date values These lists represent day-level instance outcomes. 4.6 Invariants# Implementations MUST enforce: Items in instance lists are valid date values. No date appears in both lists simultaneously. Duplicate dates are normalized (set semantics) or rejected deterministically. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence. 4.7 Instance completion semantics# Operation: complete instance for target date D. Conforming behavior: Add D to complete_instances. Remove D from skipped_instances if present. Leave base task status unchanged unless explicit policy states otherwise. Update date_modified when state changes. Operation MUST be idempotent. 4.8 Instance uncompletion semantics# Operation: uncomplete instance for target date D. Conforming behavior: Remove D from complete_instances if present. Do not add D to skipped_instances implicitly. For recurrence_anchor=completion, uncomplete MUST NOT rewrite or roll back DTSTART; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation. Update date_modified when state changes. Operation MUST be idempotent. 4.9 Instance skip semantics# Operation: skip instance for target date D. Conforming behavior: Add D to skipped_instances. Remove D from complete_instances if present. Update date_modified when state changes. Operation MUST be idempotent. 4.10 Instance unskip semantics# Operation: unskip instance for target date D. Conforming behavior: Remove D from skipped_instances if present. Do not add to complete_instances implicitly. Update date_modified when state changes. Operation MUST be idempotent. 4.11 Effective instance state# For target date D, effective state MUST be resolved in this order: If D in complete_instances: state is completed. Else if D in skipped_instances: state is skipped. Else: state is unresolved/default for that instance. Because overlap is invalid, this ordering is deterministic. 4.12 Interaction with base status# For recurring tasks: Base status is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured. Instance state determines completion for recurrence-aware views and operations. Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy. For non-recurring tasks, completion uses base status semantics (§5). 4.13 Completed-status configuration# Implementations MUST define which status values are treated as complete for non-recurring tasks. The completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal. 4.14 Example: complete then skip same day# Initial: recurrence: FREQ=DAILY completeInstances: [2026-02-20] skippedInstances: [] Skip target date 2026-02-20: recurrence: FREQ=DAILY completeInstances: [] skippedInstances: [2026-02-20] 4.15 Example: idempotent complete# Initial: completeInstances: [2026-02-20] skippedInstances: [] Complete 2026-02-20 again: persisted instance lists remain unchanged, operation succeeds without duplicate entries. 4.16 Example: anchor semantics# Task: recurrence: FREQ=WEEKLY;BYDAY=FR recurrenceAnchor: completion If implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is completion, not solely by scheduled chain. Implementations using DTSTART progression MUST update DTSTART to the completion date for this mode. Worked example (recurrence_anchor=completion): recurrence: DTSTART:20260220;FREQ=DAILY recurrence_anchor: completion complete_instances: [2026-02-20, 2026-02-21] skipped_instances: [2026-02-23] Conforming recalculation: does not exclude 2026-02-22 because it is absent from skipped_instances, does exclude 2026-02-23 because it is skipped, ignores complete_instances for future exclusion in this mode (§4.4.4). 4.17 Validation examples# Invalid overlap: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Result: validation error instance_state_overlap. Invalid date in list: completeInstances: [2026-02-30] Result: validation error invalid_date_value. 4.18 Recurrence materialization# This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4). Recurrence materialization creates ordinary task files for specific target dates of a recurring parent task. It is additive behavior: implementations that do not claim materialized-occurrences continue to use the instance-list model in §4.5-§4.12. Materialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7). 4.18.1 Parent and occurrence ownership# The parent recurring task owns series-level semantics: recurrence recurrence_anchor recurrence generation and DTSTART progression parent instance-list compatibility state (complete_instances, skipped_instances) materialization policy fields (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon) A materialized occurrence note owns per-date task semantics for its occurrence_date, including: status completed_date body content and checklists time_entries per-occurrence due, scheduled, reminders, contexts, projects, and unknown fields 4.18.2 Occurrence identity and parent reference# A materialized occurrence note MUST store: recurrence_parent: a link-or-string reference to the parent recurring task occurrence_date: the target date represented by the occurrence note The preferred Obsidian-compatible representation for recurrence_parent is a wikilink, for example: recurrence_parent: \"[[Weekly Review]]\" occurrence_date: 2026-02-27 Implementations claiming materialized-occurrences MUST resolve recurrence_parent using §11 link semantics for this role, even if they do not claim full extended. If the parent cannot be resolved, validation SHOULD report invalid_recurrence_parent. For one resolved parent, there SHOULD be at most one materialized occurrence note per occurrence_date. Duplicate detected occurrence notes SHOULD report duplicate_occurrence_note and MUST NOT be chosen nondeterministically for writes. 4.18.3 Effective state precedence# For target date D, recurrence-aware effective state MUST be resolved in this order: If a materialized occurrence note exists for (parent, D), derive state from that note's own task state: completed when its status is in status.completed_values; skipped when its status is in status.skipped_values; otherwise unresolved/default for that instance. Else if D is in parent complete_instances: state is completed. Else if D is in parent skipped_instances: state is skipped. Else: state is unresolved/default for that instance. If a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for D. Validators SHOULD report occurrence_state_conflict, and repair/normalization operations MAY update parent lists to match occurrence notes. 4.18.4 Parent instance lists as compatibility state# When materialized occurrence notes are supported, parent complete_instances and skipped_instances remain part of canonical persisted state. They serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes. Conforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip: completed child state: add D to complete_instances, remove D from skipped_instances; skipped child state: add D to skipped_instances, remove D from complete_instances; active/unresolved child state after uncompletion/unskip: remove D from the relevant parent list. Reconciliation failure MUST NOT silently change the occurrence note state. Implementations SHOULD surface a recoverable error or warning. 4.18.5 Materialization modes# occurrence_materialization controls when materialized occurrence notes are created. Allowed values: manual: occurrence notes are created only by explicit user or API action. on_completion: completing a materialized occurrence note creates the next occurrence note. rolling: the implementation maintains a bounded materialized window, such as today through the next 14 days. If absent, occurrence_materialization MUST default to manual. on_completion does not by itself create the first occurrence note in a series. The first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option. Conforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing. 4.18.6 Next-occurrence trigger# occurrence_next_trigger controls whether skip/cancel transitions also create the next occurrence note when occurrence_materialization=on_completion. Allowed values: completion: only completion creates the next occurrence note. completion_or_skip: completion and skip/cancel create the next occurrence note. If absent, occurrence_next_trigger MUST default to completion. The next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics. Materializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate. 4.18.7 Rolling materialization bounds# For occurrence_materialization=rolling, implementations MUST enforce finite bounds. Unbounded future materialization is non-conformant. Bounds SHOULD be expressed with ISO 8601 durations such as: occurrence_past_horizon: P0D occurrence_future_horizon: P14D If bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults. 4.18.8 Recurrence edits and historical notes# Materialized occurrence notes are durable task files. Editing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes. If an existing occurrence note's occurrence_date is no longer generated by the current parent recurrence rule, validators MAY report materialization_target_not_generated as a warning. This condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated."},{"route":"/developers/specification/05-operations/","title":"5. Operations","description":"This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:05-operations.md","namespace":"specification","relativePath":"05-operations.md","raw":"# 5. Operations\n\n## 5.1 Purpose\n\nThis section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.\n\n## 5.2 General operation rules\n\nFor all mutating operations:\n\n1. Validation MUST run before commit in strict mode.\n2. Writes MUST be atomic at file level (all-or-nothing per file).\n3. `date_modified` MUST be updated on successful state change.\n4. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations.\n5. Operations identified as idempotent MUST remain safe under repetition.\n\n### 5.2.1 Target day/date resolution\n\nRecurring instance operations act on a target day/date (`complete instance`, `uncomplete instance`, `skip`, `unskip`).\nNon-recurring `complete` uses completion-day semantics for `completed_date`.\n\nResolution MUST be deterministic:\n\n1. If caller provides an explicit target date/datetime, that value is authoritative.\n2. If caller omits target for recurring instance operations, implementations MUST resolve in this order:\n - task `scheduled`, if present and target-day-resolvable,\n - else task `due`, if present and target-day-resolvable,\n - else current local day in active runtime timezone (§3.6).\n3. Target-day resolution for fallback task fields (`scheduled` / `due`) MUST use this extraction policy:\n - if stored value is canonical date (`YYYY-MM-DD`), use it as-is;\n - if stored value is datetime, use the literal date token before `T` (`YYYY-MM-DD`) without timezone shifting;\n - if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning;\n - if a candidate value is unusable, continue to the next fallback source.\n4. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone.\n\nWhen an explicit target is datetime:\n\n- operations that require day semantics MUST use its calendar date part in active runtime timezone,\n- for recurring `complete instance` with `recurrence_anchor=completion`, the same explicit datetime target MUST also drive `DTSTART` rewrite semantics in §4.4.3.\n\nThis explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above.\n\n### 5.2.2 Idempotency and `date_modified`\n\nFor operations marked idempotent:\n\n- first application MAY change state and `date_modified`,\n- repeated application with semantically equivalent input MUST leave persisted state unchanged.\n\nWhen a repeated idempotent operation is a no-op, `date_modified` MUST remain unchanged.\n\n## 5.3 Create\n\n### 5.3.1 Input requirements\n\nCreate MUST provide at minimum semantic roles required by §2, directly or via defaults.\n\n### 5.3.2 Required behavior\n\nCreate MUST:\n\n- apply default values,\n- generate `date_created` and `date_modified` when absent,\n- resolve semantic `title` and filename/path behavior according to §9.13,\n- apply create-time templating when enabled and supported (§5.3.5, §9.14, §7),\n- serialize canonical keys and canonical temporal formats,\n- when `recurrence` is present, canonicalize `DTSTART` per §4.4.5,\n- preserve caller-provided semantic `id` when present,\n- fail with validation errors if required constraints are unmet,\n- apply default reminders according to §10.3.9 when configured.\n\n### 5.3.3 Title and filename resolution on create\n\nCreate MUST produce a deterministic initial filename/path.\n\nRules:\n\n- Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames.\n- If `title.storage=filename`:\n - basename MUST derive from semantic title,\n - title changes after create are handled by update semantics (§5.4.4),\n - implementations MAY also persist mapped `title` as a synchronized compatibility mirror,\n - `title.filename_format` and `title.custom_filename_template` MUST be ignored.\n- If `title.storage=frontmatter`, create-time basename MUST follow `title.filename_format`:\n - `title`: sanitized semantic title,\n - `zettel`: implementation-defined zettel pattern (MUST be documented),\n - `timestamp`: implementation-defined timestamp pattern (MUST be documented),\n - `custom`: `title.custom_filename_template` expansion.\n- If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing).\n\n### 5.3.4 Example\n\nInput intent:\n\n```yaml\ntitle: \"Pay electricity bill\"\n```\n\nAssume defaults:\n\n- status default `open`\n- priority default `normal`\n\nPersisted frontmatter (example):\n\n```yaml\ntitle: Pay electricity bill\nstatus: open\npriority: normal\ndateCreated: 2026-02-20T14:00:00Z\ndateModified: 2026-02-20T14:00:00Z\n```\n\n### 5.3.5 Optional create-time templating\n\nThis subsection is required only for implementations claiming profile `templating` (§7.3.3).\n\nCreate-time templating pipeline MUST be deterministic:\n\n1. Compute base create payload from explicit input, defaults (§9.8), and generated/system values (`date_created`, `date_modified`, resolved title policy).\n2. Expand template variables using that base payload and active runtime date/time context.\n3. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict).\n4. Resolve body output:\n - if expanded template body is non-empty, use it;\n - otherwise use caller-provided body/details (if any).\n\nTemplate parse rules:\n\n- If template content begins with `---`, implementations MUST treat the first `--- ... ---` block as template frontmatter and the remainder as template body.\n- Frontmatter variable expansion MUST run before YAML parsing of template frontmatter.\n\nPortable variable support:\n\nImplementations claiming `templating` MUST support all variables in the **Required** column of the table below. Implementations MAY support any variable in the **Extended** column.\n\n**Required task-data variables:**\n\n| Variable | Value | Format / separator |\n|---|---|---|\n| `{{title}}` | Semantic title | string; YAML-quoted if needed |\n| `{{status}}` | Task status value | string |\n| `{{priority}}` | Task priority value | string |\n| `{{dueDate}}` | Due date if set | `YYYY-MM-DD` or empty |\n| `{{scheduledDate}}` | Scheduled date if set | `YYYY-MM-DD` or empty |\n| `{{details}}` | Caller-provided body/description | string |\n| `{{contexts}}` | Contexts list | comma-separated, e.g. `\"work, home\"` |\n| `{{tags}}` | Tags list | comma-separated, e.g. `\"task, errands\"` |\n| `{{hashtags}}` | Tags list as hashtags | space-separated, e.g. `\"#task #errands\"` |\n| `{{timeEstimate}}` | Time estimate in minutes | integer string or empty |\n| `{{parentNote}}` | Parent note name/path | string; YAML-quoted if needed |\n\n**Required date/time variables (expansion time):**\n\n| Variable | Value | Format |\n|---|---|---|\n| `{{date}}` | Current date | `yyyy-MM-dd` |\n| `{{time}}` | Current time (24h) | `HH:mm` |\n| `{{year}}` | Full year | `yyyy` |\n| `{{month}}` | Month number | `MM` |\n| `{{day}}` | Day of month | `dd` |\n\n**Extended variables (optional):**\n\n| Variable | Value | Format |\n|---|---|---|\n| `{{dateTime}}` | Date + time | `yyyy-MM-dd-HHmm` |\n| `{{timestamp}}` | Full timestamp | `yyyy-MM-dd-HHmmss` |\n| `{{shortDate}}` | Short date | `yyMMdd` |\n| `{{shortYear}}` | Two-digit year | `yy` |\n| `{{monthName}}` | Month full name | e.g. `February` |\n| `{{monthNameShort}}` | Month short name | e.g. `Feb` |\n| `{{dayName}}` | Weekday full name | e.g. `Monday` |\n| `{{dayNameShort}}` | Weekday short name | e.g. `Mon` |\n| `{{week}}` | ISO week number | `ww` |\n| `{{quarter}}` | Quarter number | `1`–`4` |\n| `{{hour}}` | Hour (24h) | `HH` |\n| `{{minute}}` | Minute | `mm` |\n| `{{second}}` | Second | `ss` |\n| `{{time12}}` | Time with AM/PM | `hh:mm a` |\n| `{{time24}}` | Time (24h) | `HH:mm` |\n| `{{timezone}}` | UTC offset long | e.g. `+05:30` |\n| `{{utcOffset}}` | UTC offset long | e.g. `+05:30` |\n| `{{unix}}` | Unix timestamp (seconds) | integer string |\n| `{{unixMs}}` | Unix timestamp (ms) | integer string |\n| `{{zettel}}` | Zettelkasten ID | date + seconds-since-midnight base-36 |\n| `{{titleLower}}` | Title lowercase | string |\n| `{{titleUpper}}` | Title uppercase | string |\n| `{{titleSnake}}` | Title snake_case | string |\n| `{{titleKebab}}` | Title kebab-case | string |\n| `{{titleCamel}}` | Title camelCase | string |\n| `{{titlePascal}}` | Title PascalCase | string |\n| `{{priorityShort}}` | First letter of priority | uppercase char |\n| `{{statusShort}}` | First letter of status | uppercase char |\n\nUnknown variables (not in the above lists) MUST be handled per `templating.unknown_variable_policy` (§9.14):\n- `preserve`: leave the `{{...}}` placeholder as-is.\n- `empty`: replace with an empty string.\n\nDeterministic expansion context:\n\n- date/time variable expansion MUST use the active runtime timezone from §3.6.\n- locale-sensitive variables (`monthName`, `monthNameShort`, `dayName`, `dayNameShort`, `time12`) MUST use English locale outputs for portability (`January`, `Jan`, `Monday`, `Mon`, `AM`/`PM`).\n- template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2).\n\nFailure behavior:\n\n- `templating.failure_mode=error`: template read/parse failures MUST abort create.\n- `templating.failure_mode=warning_fallback`: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (`template_missing` or `template_parse_failed`).\n\n### 5.3.6 Identity handling on create\n\nIf semantic `id` is provided on create, writers MUST preserve it.\nIf implementation supports auto-generation of semantic `id`, generation policy MUST be documented and resulting `id` MUST remain stable after create.\n\n## 5.4 Update\n\n### 5.4.1 Patch semantics\n\nUpdate MUST be patch-by-default: only targeted semantic roles are changed.\n\n### 5.4.2 Preservation rules\n\nUpdate MUST preserve:\n\n- unrelated known roles,\n- unknown fields,\n- original date/datetime granularity for untouched fields.\n\n### 5.4.3 Example\n\nBefore:\n\n```yaml\ntitle: Weekly review\nscheduled: 2026-02-20\npriority: normal\ncustomClient: ACME\n```\n\nOperation: set priority to `high`.\n\nAfter:\n\n```yaml\ntitle: Weekly review\nscheduled: 2026-02-20\npriority: high\ncustomClient: ACME\n```\n\n### 5.4.4 Title updates and filename updates\n\nIf an update changes semantic `title`, behavior MUST follow `title.storage`:\n\n- `title.storage=filename`: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move.\n- `title.storage=frontmatter`: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested.\n\nIf implementation keeps frontmatter title for compatibility while `title.storage=filename`, it MUST keep stored title synchronized with effective filename-derived title.\n\n## 5.5 Complete (non-recurring)\n\nFor non-recurring tasks, complete MUST:\n\n1. Set `status` to a configured completed value, unless already completed.\n If multiple completed values are configured, implementation MUST choose deterministically (default: first entry in `status.completed_values`).\n2. Set `completed_date` to completion day:\n - explicit completion-day input when provided,\n - otherwise current local day in active runtime timezone (§5.2.1).\n3. Apply overwrite policy deterministically (`overwrite` or `preserve_if_present`).\n4. Update `date_modified` on state change.\n\nImplementations MUST document completion-day input handling and `completed_date` overwrite policy.\n\nOperation MUST be idempotent.\n\n## 5.6 Uncomplete (non-recurring)\n\nFor non-recurring tasks, uncomplete MUST:\n\n1. Set `status` to configured active/default status according to policy (default: `status.default`).\n2. Clear or retain `completed_date` according to policy.\n3. Update `date_modified` on state change.\n\nPolicy MUST be documented and deterministic.\n\nOperation MUST be idempotent.\n\n## 5.7 Complete instance (recurring)\n\nFor recurring tasks, complete with resolved target date `D` (§5.2.1) MUST follow §4.7.\n\nWriters MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it.\nWhen `recurrence_anchor=completion` and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime `DTSTART` rewrite behavior.\nWhen `recurrence_anchor=scheduled` and `DTSTART` is absent, implementations MUST insert `DTSTART` deterministically per §4.4.5.\nNext-occurrence recalculation in this mode MUST follow §4.4.4.\n\n## 5.8 Uncomplete instance (recurring)\n\nFor recurring tasks, uncomplete with resolved target date `D` (§5.2.1) MUST follow §4.8.\nFor `recurrence_anchor=completion`, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back `DTSTART`.\n\n## 5.9 Skip and unskip instance\n\nSkip/unskip for recurring tasks with resolved target date `D` (§5.2.1) MUST follow §4.9 and §4.10.\n\n## 5.10 Dependency operations\n\nDependency operations MUST follow §10.2.\n\n### 5.10.1 Add dependency\n\nAdd dependency MUST:\n\n- validate dependency entry schema,\n- parse and resolve `uid` per §11,\n- enforce duplicate and self-reference rules,\n- preserve existing non-target dependency entries,\n- update `date_modified` on change.\n\n### 5.10.2 Remove dependency\n\nRemove dependency by `uid` MUST be idempotent.\n\n### 5.10.3 Replace dependency list\n\nReplace dependency list MUST be explicit (not default patch behavior).\n\n## 5.11 Reminder operations\n\nReminder operations MUST follow §10.3.\n\n### 5.11.1 Add reminder\n\nAdd reminder MUST:\n\n- validate reminder schema,\n- enforce unique `id` within task,\n- update `date_modified` on change.\n\n### 5.11.2 Update reminder\n\nUpdate reminder MUST target a reminder by `id` and be patch-by-default.\n\n### 5.11.3 Remove reminder\n\nRemove reminder by `id` MUST be idempotent.\n\n## 5.12 Archive\n\nImplementations MAY support archive semantics through:\n\n- archive tag,\n- archive status,\n- dedicated boolean/archive field.\n\nArchive behavior MUST be documented.\n\nArchive MUST NOT implicitly delete the task.\n\n## 5.13 Delete\n\nDelete MUST remove the task file.\n\nDelete MUST NOT implicitly delete files referenced by `attachments`. An\nimplementation MAY offer a separate, explicit cleanup action subject to\n§5.21.4.\n\nOptional safety behavior:\n\n- Implementations MAY perform backlink/dependency checks.\n- If checks are enabled, implementation MUST provide a bypass option for explicit force delete.\n\n## 5.14 Rename\n\nRename operation changes file path/filename while preserving semantic record identity.\n\n### 5.14.1 Rename interaction with title storage mode\n\n- If `title.storage=filename`, basename changes from rename MUST update effective semantic title.\n- If `title.storage=frontmatter`, rename MUST NOT implicitly rewrite mapped `title` unless explicitly requested.\n- Implementations that persist frontmatter title in `title.storage=filename` mode MUST either update that field on rename or remove it to prevent divergence.\n- If semantic `id` is present, rename/move MUST preserve its value unchanged.\n\nIf implementation supports link/reference updating, it MUST:\n\n- update resolvable references deterministically,\n- report unresolved or ambiguous updates,\n- update dependency `uid` and `projects` references consistently with normal links.\n\nIf implementation does not support reference updates, this limitation MUST be disclosed in conformance claim.\n\n## 5.15 Batch operations\n\nBatch operations MAY be supported.\n\nIf supported, implementation MUST report per-item outcomes and summary counts:\n\n- total\n- succeeded\n- failed\n\nPartial success behavior MUST be documented.\n\n## 5.16 Concurrency\n\nImplementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash).\n\nWhen conflict is detected, operation MUST fail safely unless explicit overwrite is requested.\n\n## 5.17 Dry run\n\nIf dry run mode is supported, operation MUST:\n\n- execute validation and transformation logic,\n- report intended changes,\n- perform no file write.\n\n## 5.18 Error model\n\nImplementation-native operation failures MUST provide structured error information with:\n\n- operation name,\n- error code,\n- message,\n- optional field/path context.\n\nFor conformance adapter envelopes (§5.23), failures MAY be represented as a compact `error` string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via `error_details`).\n\n## 5.19 Time tracking management\n\nThis subsection applies to implementations that support `time_entries`.\n\n### 5.19.1 Start time tracking\n\nStart on task `T` MUST:\n\n- fail when `T` already has an active time entry,\n- append a new entry with canonical `startTime` and no `endTime`,\n- MAY set a default `description`,\n- update `date_modified`,\n- persist canonical `time_entries` shape (including removal of legacy/stale `duration` fields when normalizing).\n\nRecommended error code when already active: `time_tracking_already_active`.\n\n### 5.19.2 Stop time tracking\n\nStop on task `T` MUST:\n\n- fail when `T` has no active time entry,\n- set `endTime` on the active entry to canonical current datetime,\n- update `date_modified`,\n- preserve non-target entries and unknown frontmatter fields.\n\nRecommended error code when no active session exists: `no_active_time_entry`.\n\n### 5.19.3 Edit or replace time entries\n\nWhen replacing/editing `time_entries` explicitly, implementations MUST:\n\n- validate each entry per §2.6.1 and §3.11,\n- persist canonical datetime formats,\n- treat `duration` as derived compatibility input and SHOULD remove it from canonical writes,\n- update `date_modified` when persisted state changes.\n\n### 5.19.4 Remove a time entry\n\nRemove MUST target one deterministic entry (for example by index or stable selector) and update `date_modified` on change.\nSelector semantics MUST be documented.\n\n### 5.19.5 Completion-triggered auto-stop\n\nIf `time_tracking.auto_stop_on_complete=true` (§9.16), completion transitions MUST trigger stop behavior for the same task only.\n\nRules:\n\n- non-recurring tasks: trigger when status transitions from non-completed to completed status.\n- recurring tasks: trigger when `complete_instances` grows.\n- materialized occurrence notes: trigger on the occurrence note's own status transition to completed; parent reconciliation SHOULD NOT trigger a second stop on the parent unless the parent itself has an active time entry and the implementation documents that policy.\n- implementations MUST NOT stop active sessions on unrelated tasks.\n- if `time_tracking.auto_stop_notification=true`, implementations MAY emit a user-visible notice.\n\n### 5.19.6 Reporting tracked time\n\nFor reporting surfaces (for example task summaries or stats), implementations MUST document whether totals use `closed_minutes` or `live_minutes` semantics from §3.11.5.\n\n## 5.20 Recurrence materialization operations\n\nThis subsection is required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\n### 5.20.1 Materialize occurrence\n\nOperation: `materialize occurrence` for parent recurring task `P` and target date `D`.\n\nConforming behavior:\n\n1. Resolve `P` and confirm it is recurring.\n2. If an occurrence note for `(P, D)` already exists, return that note without creating a duplicate.\n3. Create a task note using `occurrence_template` when configured, otherwise using normal create behavior.\n4. Persist `recurrence_parent` as a link to `P` and `occurrence_date` as `D`.\n5. Set `scheduled` to `D` unless caller input or template output explicitly supplies another per-occurrence scheduled value.\n6. Set initial `status` using normal create defaults unless caller input or template output explicitly supplies a status.\n7. Preserve template/body output as occurrence-owned content after creation.\n8. Update `date_created` and `date_modified` according to create semantics.\n\nThe operation MUST be idempotent for `(P, D)`.\n\nIf `D` is not generated by the current recurrence rule, implementations MAY allow materialization as an explicit user action but SHOULD report `materialization_target_not_generated`.\n\n### 5.20.2 Complete materialized occurrence\n\nCompleting a materialized occurrence note MUST:\n\n1. Complete the occurrence note using normal non-recurring completion semantics (§5.5).\n2. Reconcile the parent by adding `D` to `complete_instances` and removing `D` from `skipped_instances`.\n3. If the parent has `recurrence_anchor=completion`, advance parent progression according to §4.4.3 and §4.4.4.\n4. If `occurrence_materialization=on_completion`, compute the next occurrence from the parent after the completion transition and materialize that next occurrence note idempotently.\n\nThe occurrence note's successful completion MUST NOT be rolled back solely because next-occurrence materialization fails.\nWhen the next note cannot be created, implementations SHOULD report `next_occurrence_materialization_failed`.\n\n### 5.20.3 Skip materialized occurrence\n\nSkipping a materialized occurrence note MUST preserve the note.\nSkip is a state transition, not deletion.\n\nConforming behavior:\n\n1. Set the occurrence note to the configured skipped status (`status.default_skipped`, or the first `status.skipped_values` entry when `default_skipped` is absent).\n2. Clear or retain `completed_date` according to the same documented policy used for uncompletion unless the implementation documents a skip-specific policy.\n3. Reconcile the parent by adding `D` to `skipped_instances` and removing `D` from `complete_instances`.\n4. If `occurrence_materialization=on_completion` and `occurrence_next_trigger=completion_or_skip`, compute and materialize the next occurrence note idempotently.\n\nIf no skipped status is configured, skip of a materialized occurrence MUST fail deterministically in strict mode and SHOULD report `missing_skipped_status`.\n\n### 5.20.4 Uncomplete and unskip materialized occurrence\n\nUncomplete of a materialized occurrence note MUST:\n\n1. Reopen the occurrence note using normal uncomplete semantics (§5.6).\n2. Remove `D` from parent `complete_instances`.\n3. For `recurrence_anchor=completion`, MUST NOT roll back parent `DTSTART`, matching §4.8.\n4. MUST NOT delete any later materialized occurrence note.\n\nUnskip of a materialized occurrence note MUST:\n\n1. Reopen the occurrence note to configured active/default status.\n2. Remove `D` from parent `skipped_instances`.\n3. MUST NOT add `D` to parent `complete_instances` implicitly.\n4. MUST NOT delete any later materialized occurrence note.\n\n### 5.20.5 Delete and unmaterialize occurrence\n\nDeleting a materialized occurrence note removes the task file and MUST NOT be interpreted as skip.\n\nImplementations MAY provide an explicit `unmaterialize occurrence` operation.\nIf supported, it MUST document whether parent state is preserved, cleared, or reconciled.\nIn all cases, deleting or unmaterializing an occurrence MUST NOT silently delete the parent recurring task.\n\nIf parent instance lists still refer to a deleted occurrence note's date, validators MAY report an orphan/cache warning such as `orphan_occurrence_note`.\n\n## 5.21 Attachment operations\n\nThese rules apply to implementations that support the `attachments`\ncapability.\n\n### 5.21.1 Attach a file\n\nAttach MUST:\n\n1. durably write the binary to a collection path before publishing its task\n reference;\n2. add one canonical reference to the mapped `attachments` list;\n3. preserve the existing list order and append new references by default;\n4. avoid duplicate normalized targets; and\n5. update `date_modified` only when membership changes.\n\nBinary write and task-frontmatter update are not assumed to be one atomic\nstorage transaction. Implementations MUST make interrupted operations\nrecoverable or idempotently retryable. If the binary write succeeds but the\ntask update does not, the implementation MUST retain enough durable intent to\nretry or identify the unreferenced file for explicit cleanup.\n\n### 5.21.2 Detach a file\n\nDetach removes the matching reference from `attachments` and is idempotent.\nDetach MUST NOT delete the underlying file. It MUST preserve the relative order\nof all other references.\n\n### 5.21.3 Insert an attached file inline\n\nAn implementation MAY offer an inline-insert operation. It MUST first satisfy\nattach semantics, then insert a Markdown link or embed into the task body.\nRemoving that body markup MUST NOT detach the file; detaching MUST NOT silently\nrewrite body content unless the user explicitly requests both changes.\n\n### 5.21.4 Delete an attachment file\n\nPhysical deletion MUST be a distinct, explicit action. Before deleting, an\nimplementation MUST check authoritative, current task `attachments` lists and\nSHOULD check body links/embeds and other collection backlinks. A stale or\noffline replica is not sufficient evidence that a file is unreferenced. If the\nbinary authority and record authority can change independently, the check and\ndelete MUST use an authority-provided transaction or equivalent precondition\nthat closes the race. An implementation MUST NOT offer physical deletion when\nit cannot establish that guarantee; detach remains available and leaves a safe\norphan. If another reference exists, deletion MUST be rejected unless the\ncaller explicitly chooses a force action whose affected references are\ndisclosed.\n\nAfter a successful non-forced deletion, implementations MUST remove the\ncurrent task's matching attachment reference. Failed deletion MUST leave\nfrontmatter unchanged. An accepted local outbox entry is not a successful\nphysical deletion until the binary authority acknowledges it.\n\n### 5.21.5 Materialized occurrences\n\nWhen an occurrence note is materialized, it SHOULD inherit the parent task's\nattachment references in the same order. This copies references, not file\nbytes. Subsequent edits to either task's membership list are independent, and\nphysical deletion remains governed by §5.21.4.\n\n## 5.22 Operation examples\n\n### 5.22.1 Non-recurring complete\n\nBefore:\n\n```yaml\ntitle: Buy groceries\nstatus: open\ncompletedDate:\ndateModified: 2026-02-20T09:00:00Z\n```\n\nAfter complete on `2026-02-20`:\n\n```yaml\ntitle: Buy groceries\nstatus: done\ncompletedDate: 2026-02-20\ndateModified: 2026-02-20T09:05:00Z\n```\n\n### 5.22.2 Recurring complete instance\n\nBefore:\n\n```yaml\ntitle: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: []\nskippedInstances: []\ndateModified: 2026-02-20T08:00:00Z\n```\n\nAfter complete instance on `2026-02-20`:\n\n```yaml\ntitle: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: [2026-02-20]\nskippedInstances: []\ndateModified: 2026-02-20T08:10:00Z\n```\n\n### 5.22.3 Recurring skip instance overriding completion\n\nBefore:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: []\n```\n\nAfter skip `2026-02-20`:\n\n```yaml\ncompleteInstances: []\nskippedInstances: [2026-02-20]\n```\n\n### 5.22.4 Preserve unknown fields on update\n\nBefore:\n\n```yaml\ntitle: Plan Q2\nstatus: open\nvendorTicket: ZX-42\n```\n\nUpdate status to `in-progress`.\n\nAfter:\n\n```yaml\ntitle: Plan Q2\nstatus: in-progress\nvendorTicket: ZX-42\n```\n\n### 5.22.5 Add dependency\n\nBefore:\n\n```yaml\nblockedBy: []\n```\n\nAdd dependency:\n\n```yaml\nuid: \"[[prepare-metrics]]\"\nreltype: FINISHTOSTART\n```\n\nAfter:\n\n```yaml\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n```\n\n### 5.22.6 Add reminder\n\nBefore:\n\n```yaml\nreminders: []\n```\n\nAdd reminder:\n\n```yaml\nid: due_minus_1h\ntype: relative\nrelatedTo: due\noffset: -PT1H\n```\n\nAfter:\n\n```yaml\nreminders:\n - id: due_minus_1h\n type: relative\n relatedTo: due\n offset: -PT1H\n```\n\n## 5.23 Conformance operation interface\n\nThe conformance suite exercises operations via the `execute(operation, input) → envelope` interface defined in the adapter contract. This section specifies the input/output contracts for each conformance-testable operation name.\n\nUnless otherwise noted, all operations return `{ ok: true, result: {...} }` on success and `{ ok: false, error: \"...\" }` on failure. Adapters MAY additionally return `error_details` with structured fields from §5.18.\n\n### General operations\n\n#### `op.mutate_with_validation`\n\nTests §5.2 rule 1: validation runs before commit.\n\nInput:\n```json\n{ \"strict\": true, \"frontmatter\": { ... } }\n```\n\nBehavior: validate `frontmatter` as a task record. In strict mode (`strict=true`), any validation error MUST produce `ok=false`.\n\nOutput on validation error:\n```json\n{ \"ok\": false, \"error\": \"validation|invalid_type|...\" }\n```\n\n---\n\n#### `op.atomic_write`\n\nTests §5.2 rule 2: writes are all-or-nothing.\n\nInput:\n```json\n{\n \"original\": { ... },\n \"patch\": { ... },\n \"simulateFailureAfterWrite\": true\n}\n```\n\nBehavior: apply `patch` to `original`, then simulate a post-write failure. The adapter MUST report whether the write was committed and what state the record is in after recovery.\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"committed\": false,\n \"persisted\": { ... }\n }\n}\n```\n\n`committed=false` means the write was rolled back. `persisted` reflects the actual frontmatter after recovery — it MUST match `original` (not the patched version) when `simulateFailureAfterWrite=true`.\n\n---\n\n#### `op.idempotency_check`\n\nTests §5.2 rule 5: operations are safe under repetition.\n\nInput:\n```json\n{\n \"operation\": \"complete_nonrecurring\",\n \"first\": { \"status\": \"open\", \"completedDate\": null },\n \"second\": { \"status\": \"done\", \"completedDate\": \"2026-02-20\" }\n}\n```\n\nBehavior: applying the named operation to `first` state and then again to `second` state MUST produce identical persisted results (including unchanged `dateModified` on the second no-op application). The adapter checks whether this holds.\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"idempotent\": true } }\n```\n\n---\n\n#### `op.update_patch`\n\nTests §5.4 patch semantics and unknown-field preservation.\n\nInput:\n```json\n{\n \"original\": { \"title\": \"...\", \"vendorTicket\": \"ZX-42\", ... },\n \"patch\": { \"priority\": \"high\" },\n \"changed\": true\n}\n```\n\nBehavior: apply `patch` to `original`. Return the merged frontmatter.\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"changed\": true,\n \"frontmatter\": { \"title\": \"...\", \"priority\": \"high\", \"vendorTicket\": \"ZX-42\", ... }\n }\n}\n```\n\n- `changed` indicates whether any field actually changed value.\n- `frontmatter` MUST include all unknown fields from `original` unchanged.\n\n---\n\n#### `op.complete_nonrecurring`\n\nTests §5.5 non-recurring completion.\n\nInput:\n```json\n{\n \"frontmatter\": { \"title\": \"...\", \"status\": \"open\" },\n \"completedValues\": [\"done\", \"cancelled\"],\n \"explicitDate\": \"2026-02-20\"\n}\n```\n\nBehavior: apply a complete operation to `frontmatter` using `completedValues` (ordered list) and `explicitDate` as the completion day (omit to use current local day).\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"status\": \"done\", \"completedDate\": \"2026-02-20\" } }\n```\n\n- `status` MUST be the first entry in `completedValues`.\n- `completedDate` MUST be `explicitDate` if provided; otherwise a valid `YYYY-MM-DD` date.\n- If `frontmatter.status` is already a completed value, the operation MUST still succeed (idempotent).\n\n---\n\n#### `op.uncomplete_nonrecurring`\n\nTests §5.6 non-recurring uncompletion.\n\nInput:\n```json\n{\n \"frontmatter\": { \"title\": \"...\", \"status\": \"done\", \"completedDate\": \"2026-02-20\" },\n \"defaultStatus\": \"open\",\n \"clearCompletedDate\": true\n}\n```\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"status\": \"open\", \"completedDate\": null } }\n```\n\n- `status` MUST be `defaultStatus`.\n- If `clearCompletedDate=true`, `completedDate` MUST be `null` in the result.\n- If `clearCompletedDate=false`, `completedDate` MUST be preserved.\n\n---\n\n#### `op.error_shape`\n\nTests §5.18 error model.\n\nInput:\n```json\n{ \"operation\": \"update\", \"code\": \"invalid_type\", \"message\": \"bad value\", \"field\": \"status\" }\n```\n\nBehavior: construct and return a structured error object.\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"operation\": \"update\",\n \"code\": \"invalid_type\",\n \"message\": \"...\"\n }\n}\n```\n\nThe `message` field MUST be a non-empty string. The `operation` and `code` fields MUST match the input.\n\n---\n\n#### `op.detect_conflict`\n\nTests §5.16 write-conflict detection.\n\nInput:\n```json\n{ \"expectedVersion\": \"a\", \"actualVersion\": \"b\", \"overwrite\": false }\n```\n\nBehavior: when `expectedVersion != actualVersion` and `overwrite=false`, the operation MUST fail.\n\nOutput on conflict:\n```json\n{ \"ok\": false, \"error\": \"conflict|write_conflict|...\" }\n```\n\n---\n\n#### `op.dry_run`\n\nTests §5.17 dry-run mode.\n\nInput:\n```json\n{ \"operation\": \"update\", \"patch\": { \"status\": \"done\" } }\n```\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"wrote\": false,\n \"plannedChanges\": [\"status\", ...]\n }\n}\n```\n\n`wrote` MUST be `false`. `plannedChanges` MUST list the field names that would have changed.\n\n---\n\n### Recurrence operations\n\nFor `recurrence.complete`, `recurrence.uncomplete_instance`, `recurrence.skip_instance`, `recurrence.unskip_instance`, and `recurrence.effective_state`, the input and output contracts are defined by the respective sections of §4 and §5.7–5.9.\n\nCommon input fields for recurrence operations:\n- `targetDate` or `completionDate`: `YYYY-MM-DD` target day\n- `completeInstances`: current list of completed dates\n- `skippedInstances`: current list of skipped dates\n\n`recurrence.effective_state` output:\n```json\n{ \"ok\": true, \"result\": { \"value\": \"completed|skipped|open\" } }\n```\n\n---\n\n### Materialized occurrence operations\n\nFor `occurrence.materialize`, `occurrence.complete`, `occurrence.skip`, `occurrence.uncomplete`, `occurrence.unskip`, and `occurrence.unmaterialize`, input and output contracts are defined by §4.18 and §5.20.\n\nCommon input fields for materialized occurrence operations:\n- `parent`: frontmatter/path/link object for the recurring parent task\n- `occurrence`: frontmatter/path/link object for an existing occurrence note when applicable\n- `targetDate`: `YYYY-MM-DD` target day\n- `config`: effective occurrence/status configuration needed by the operation\n\n`occurrence.materialize` output:\n```json\n{ \"ok\": true, \"result\": { \"created\": true, \"occurrence\": { \"...\": \"...\" } } }\n```\n\n`created` MUST be `false` when the operation returns an already-existing occurrence note for the same parent/date.\n\n---\n\n### Time-tracking operations\n\nFor `time.start`, `time.stop`, `time.replace_entries`, `time.remove_entry`, `time.auto_stop_on_complete`, and `time.report_totals`, the contracts are defined by §5.19.\n\nCommon input patterns:\n- `entries`: current `time_entries` array\n- `now`: ISO 8601 datetime representing current instant\n- `dateModified`: current `date_modified` value\n\n`time.report_totals` output:\n```json\n{ \"ok\": true, \"result\": { \"closed_minutes\": N, \"live_minutes\": M } }\n```\n\n`live_minutes` is only present when an active (no `endTime`) entry exists.\n","aliases":["/spec/05-operations/"],"toc":[{"level":2,"id":"51-purpose","text":"5.1 Purpose"},{"level":2,"id":"52-general-operation-rules","text":"5.2 General operation rules"},{"level":3,"id":"521-target-daydate-resolution","text":"5.2.1 Target day/date resolution"},{"level":3,"id":"522-idempotency-and-datemodified","text":"5.2.2 Idempotency and date_modified"},{"level":2,"id":"53-create","text":"5.3 Create"},{"level":3,"id":"531-input-requirements","text":"5.3.1 Input requirements"},{"level":3,"id":"532-required-behavior","text":"5.3.2 Required behavior"},{"level":3,"id":"533-title-and-filename-resolution-on-create","text":"5.3.3 Title and filename resolution on create"},{"level":3,"id":"534-example","text":"5.3.4 Example"},{"level":3,"id":"535-optional-create-time-templating","text":"5.3.5 Optional create-time templating"},{"level":3,"id":"536-identity-handling-on-create","text":"5.3.6 Identity handling on create"},{"level":2,"id":"54-update","text":"5.4 Update"},{"level":3,"id":"541-patch-semantics","text":"5.4.1 Patch semantics"},{"level":3,"id":"542-preservation-rules","text":"5.4.2 Preservation rules"},{"level":3,"id":"543-example","text":"5.4.3 Example"},{"level":3,"id":"544-title-updates-and-filename-updates","text":"5.4.4 Title updates and filename updates"},{"level":2,"id":"55-complete-non-recurring","text":"5.5 Complete (non-recurring)"},{"level":2,"id":"56-uncomplete-non-recurring","text":"5.6 Uncomplete (non-recurring)"},{"level":2,"id":"57-complete-instance-recurring","text":"5.7 Complete instance (recurring)"},{"level":2,"id":"58-uncomplete-instance-recurring","text":"5.8 Uncomplete instance (recurring)"},{"level":2,"id":"59-skip-and-unskip-instance","text":"5.9 Skip and unskip instance"},{"level":2,"id":"510-dependency-operations","text":"5.10 Dependency operations"},{"level":3,"id":"5101-add-dependency","text":"5.10.1 Add dependency"},{"level":3,"id":"5102-remove-dependency","text":"5.10.2 Remove dependency"},{"level":3,"id":"5103-replace-dependency-list","text":"5.10.3 Replace dependency list"},{"level":2,"id":"511-reminder-operations","text":"5.11 Reminder operations"},{"level":3,"id":"5111-add-reminder","text":"5.11.1 Add reminder"},{"level":3,"id":"5112-update-reminder","text":"5.11.2 Update reminder"},{"level":3,"id":"5113-remove-reminder","text":"5.11.3 Remove reminder"},{"level":2,"id":"512-archive","text":"5.12 Archive"},{"level":2,"id":"513-delete","text":"5.13 Delete"},{"level":2,"id":"514-rename","text":"5.14 Rename"},{"level":3,"id":"5141-rename-interaction-with-title-storage-mode","text":"5.14.1 Rename interaction with title storage mode"},{"level":2,"id":"515-batch-operations","text":"5.15 Batch operations"},{"level":2,"id":"516-concurrency","text":"5.16 Concurrency"},{"level":2,"id":"517-dry-run","text":"5.17 Dry run"},{"level":2,"id":"518-error-model","text":"5.18 Error model"},{"level":2,"id":"519-time-tracking-management","text":"5.19 Time tracking management"},{"level":3,"id":"5191-start-time-tracking","text":"5.19.1 Start time tracking"},{"level":3,"id":"5192-stop-time-tracking","text":"5.19.2 Stop time tracking"},{"level":3,"id":"5193-edit-or-replace-time-entries","text":"5.19.3 Edit or replace time entries"},{"level":3,"id":"5194-remove-a-time-entry","text":"5.19.4 Remove a time entry"},{"level":3,"id":"5195-completion-triggered-auto-stop","text":"5.19.5 Completion-triggered auto-stop"},{"level":3,"id":"5196-reporting-tracked-time","text":"5.19.6 Reporting tracked time"},{"level":2,"id":"520-recurrence-materialization-operations","text":"5.20 Recurrence materialization operations"},{"level":3,"id":"5201-materialize-occurrence","text":"5.20.1 Materialize occurrence"},{"level":3,"id":"5202-complete-materialized-occurrence","text":"5.20.2 Complete materialized occurrence"},{"level":3,"id":"5203-skip-materialized-occurrence","text":"5.20.3 Skip materialized occurrence"},{"level":3,"id":"5204-uncomplete-and-unskip-materialized-occurrence","text":"5.20.4 Uncomplete and unskip materialized occurrence"},{"level":3,"id":"5205-delete-and-unmaterialize-occurrence","text":"5.20.5 Delete and unmaterialize occurrence"},{"level":2,"id":"521-attachment-operations","text":"5.21 Attachment operations"},{"level":3,"id":"5211-attach-a-file","text":"5.21.1 Attach a file"},{"level":3,"id":"5212-detach-a-file","text":"5.21.2 Detach a file"},{"level":3,"id":"5213-insert-an-attached-file-inline","text":"5.21.3 Insert an attached file inline"},{"level":3,"id":"5214-delete-an-attachment-file","text":"5.21.4 Delete an attachment file"},{"level":3,"id":"5215-materialized-occurrences","text":"5.21.5 Materialized occurrences"},{"level":2,"id":"522-operation-examples","text":"5.22 Operation examples"},{"level":3,"id":"5221-non-recurring-complete","text":"5.22.1 Non-recurring complete"},{"level":3,"id":"5222-recurring-complete-instance","text":"5.22.2 Recurring complete instance"},{"level":3,"id":"5223-recurring-skip-instance-overriding-completion","text":"5.22.3 Recurring skip instance overriding completion"},{"level":3,"id":"5224-preserve-unknown-fields-on-update","text":"5.22.4 Preserve unknown fields on update"},{"level":3,"id":"5225-add-dependency","text":"5.22.5 Add dependency"},{"level":3,"id":"5226-add-reminder","text":"5.22.6 Add reminder"},{"level":2,"id":"523-conformance-operation-interface","text":"5.23 Conformance operation interface"},{"level":3,"id":"general-operations","text":"General operations"},{"level":3,"id":"recurrence-operations","text":"Recurrence operations"},{"level":3,"id":"materialized-occurrence-operations","text":"Materialized occurrence operations"},{"level":3,"id":"time-tracking-operations","text":"Time-tracking operations"}],"html":"

5.1 Purpose#

\n

This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.

\n

5.2 General operation rules#

\n

For all mutating operations:

\n
    \n
  1. Validation MUST run before commit in strict mode.
  2. \n
  3. Writes MUST be atomic at file level (all-or-nothing per file).
  4. \n
  5. date_modified MUST be updated on successful state change.
  6. \n
  7. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations.
  8. \n
  9. Operations identified as idempotent MUST remain safe under repetition.
  10. \n
\n

5.2.1 Target day/date resolution#

\n

Recurring instance operations act on a target day/date (complete instance, uncomplete instance, skip, unskip).\nNon-recurring complete uses completion-day semantics for completed_date.

\n

Resolution MUST be deterministic:

\n
    \n
  1. If caller provides an explicit target date/datetime, that value is authoritative.
  2. \n
  3. If caller omits target for recurring instance operations, implementations MUST resolve in this order:
      \n
    • task scheduled, if present and target-day-resolvable,
    • \n
    • else task due, if present and target-day-resolvable,
    • \n
    • else current local day in active runtime timezone (§3.6).
    • \n
    \n
  4. \n
  5. Target-day resolution for fallback task fields (scheduled / due) MUST use this extraction policy:
      \n
    • if stored value is canonical date (YYYY-MM-DD), use it as-is;
    • \n
    • if stored value is datetime, use the literal date token before T (YYYY-MM-DD) without timezone shifting;
    • \n
    • if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning;
    • \n
    • if a candidate value is unusable, continue to the next fallback source.
    • \n
    \n
  6. \n
  7. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone.
  8. \n
\n

When an explicit target is datetime:

\n
    \n
  • operations that require day semantics MUST use its calendar date part in active runtime timezone,
  • \n
  • for recurring complete instance with recurrence_anchor=completion, the same explicit datetime target MUST also drive DTSTART rewrite semantics in §4.4.3.
  • \n
\n

This explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above.

\n

5.2.2 Idempotency and date_modified#

\n

For operations marked idempotent:

\n
    \n
  • first application MAY change state and date_modified,
  • \n
  • repeated application with semantically equivalent input MUST leave persisted state unchanged.
  • \n
\n

When a repeated idempotent operation is a no-op, date_modified MUST remain unchanged.

\n

5.3 Create#

\n

5.3.1 Input requirements#

\n

Create MUST provide at minimum semantic roles required by §2, directly or via defaults.

\n

5.3.2 Required behavior#

\n

Create MUST:

\n
    \n
  • apply default values,
  • \n
  • generate date_created and date_modified when absent,
  • \n
  • resolve semantic title and filename/path behavior according to §9.13,
  • \n
  • apply create-time templating when enabled and supported (§5.3.5, §9.14, §7),
  • \n
  • serialize canonical keys and canonical temporal formats,
  • \n
  • when recurrence is present, canonicalize DTSTART per §4.4.5,
  • \n
  • preserve caller-provided semantic id when present,
  • \n
  • fail with validation errors if required constraints are unmet,
  • \n
  • apply default reminders according to §10.3.9 when configured.
  • \n
\n

5.3.3 Title and filename resolution on create#

\n

Create MUST produce a deterministic initial filename/path.

\n

Rules:

\n
    \n
  • Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames.
  • \n
  • If title.storage=filename:
      \n
    • basename MUST derive from semantic title,
    • \n
    • title changes after create are handled by update semantics (§5.4.4),
    • \n
    • implementations MAY also persist mapped title as a synchronized compatibility mirror,
    • \n
    • title.filename_format and title.custom_filename_template MUST be ignored.
    • \n
    \n
  • \n
  • If title.storage=frontmatter, create-time basename MUST follow title.filename_format:
      \n
    • title: sanitized semantic title,
    • \n
    • zettel: implementation-defined zettel pattern (MUST be documented),
    • \n
    • timestamp: implementation-defined timestamp pattern (MUST be documented),
    • \n
    • custom: title.custom_filename_template expansion.
    • \n
    \n
  • \n
  • If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing).
  • \n
\n

5.3.4 Example#

\n

Input intent:

\n
title: "Pay electricity bill"\n

Assume defaults:

\n
    \n
  • status default open
  • \n
  • priority default normal
  • \n
\n

Persisted frontmatter (example):

\n
title: Pay electricity bill\nstatus: open\npriority: normal\ndateCreated: 2026-02-20T14:00:00Z\ndateModified: 2026-02-20T14:00:00Z\n

5.3.5 Optional create-time templating#

\n

This subsection is required only for implementations claiming profile templating (§7.3.3).

\n

Create-time templating pipeline MUST be deterministic:

\n
    \n
  1. Compute base create payload from explicit input, defaults (§9.8), and generated/system values (date_created, date_modified, resolved title policy).
  2. \n
  3. Expand template variables using that base payload and active runtime date/time context.
  4. \n
  5. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict).
  6. \n
  7. Resolve body output:
      \n
    • if expanded template body is non-empty, use it;
    • \n
    • otherwise use caller-provided body/details (if any).
    • \n
    \n
  8. \n
\n

Template parse rules:

\n
    \n
  • If template content begins with ---, implementations MUST treat the first --- ... --- block as template frontmatter and the remainder as template body.
  • \n
  • Frontmatter variable expansion MUST run before YAML parsing of template frontmatter.
  • \n
\n

Portable variable support:

\n

Implementations claiming templating MUST support all variables in the Required column of the table below. Implementations MAY support any variable in the Extended column.

\n

Required task-data variables:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableValueFormat / separator
{{title}}Semantic titlestring; YAML-quoted if needed
{{status}}Task status valuestring
{{priority}}Task priority valuestring
{{dueDate}}Due date if setYYYY-MM-DD or empty
{{scheduledDate}}Scheduled date if setYYYY-MM-DD or empty
{{details}}Caller-provided body/descriptionstring
{{contexts}}Contexts listcomma-separated, e.g. "work, home"
{{tags}}Tags listcomma-separated, e.g. "task, errands"
{{hashtags}}Tags list as hashtagsspace-separated, e.g. "#task #errands"
{{timeEstimate}}Time estimate in minutesinteger string or empty
{{parentNote}}Parent note name/pathstring; YAML-quoted if needed
\n

Required date/time variables (expansion time):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableValueFormat
{{date}}Current dateyyyy-MM-dd
{{time}}Current time (24h)HH:mm
{{year}}Full yearyyyy
{{month}}Month numberMM
{{day}}Day of monthdd
\n

Extended variables (optional):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableValueFormat
{{dateTime}}Date + timeyyyy-MM-dd-HHmm
{{timestamp}}Full timestampyyyy-MM-dd-HHmmss
{{shortDate}}Short dateyyMMdd
{{shortYear}}Two-digit yearyy
{{monthName}}Month full namee.g. February
{{monthNameShort}}Month short namee.g. Feb
{{dayName}}Weekday full namee.g. Monday
{{dayNameShort}}Weekday short namee.g. Mon
{{week}}ISO week numberww
{{quarter}}Quarter number1–4
{{hour}}Hour (24h)HH
{{minute}}Minutemm
{{second}}Secondss
{{time12}}Time with AM/PMhh:mm a
{{time24}}Time (24h)HH:mm
{{timezone}}UTC offset longe.g. +05:30
{{utcOffset}}UTC offset longe.g. +05:30
{{unix}}Unix timestamp (seconds)integer string
{{unixMs}}Unix timestamp (ms)integer string
{{zettel}}Zettelkasten IDdate + seconds-since-midnight base-36
{{titleLower}}Title lowercasestring
{{titleUpper}}Title uppercasestring
{{titleSnake}}Title snake_casestring
{{titleKebab}}Title kebab-casestring
{{titleCamel}}Title camelCasestring
{{titlePascal}}Title PascalCasestring
{{priorityShort}}First letter of priorityuppercase char
{{statusShort}}First letter of statusuppercase char
\n

Unknown variables (not in the above lists) MUST be handled per templating.unknown_variable_policy (§9.14):

\n
    \n
  • preserve: leave the {{...}} placeholder as-is.
  • \n
  • empty: replace with an empty string.
  • \n
\n

Deterministic expansion context:

\n
    \n
  • date/time variable expansion MUST use the active runtime timezone from §3.6.
  • \n
  • locale-sensitive variables (monthName, monthNameShort, dayName, dayNameShort, time12) MUST use English locale outputs for portability (January, Jan, Monday, Mon, AM/PM).
  • \n
  • template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2).
  • \n
\n

Failure behavior:

\n
    \n
  • templating.failure_mode=error: template read/parse failures MUST abort create.
  • \n
  • templating.failure_mode=warning_fallback: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (template_missing or template_parse_failed).
  • \n
\n

5.3.6 Identity handling on create#

\n

If semantic id is provided on create, writers MUST preserve it.\nIf implementation supports auto-generation of semantic id, generation policy MUST be documented and resulting id MUST remain stable after create.

\n

5.4 Update#

\n

5.4.1 Patch semantics#

\n

Update MUST be patch-by-default: only targeted semantic roles are changed.

\n

5.4.2 Preservation rules#

\n

Update MUST preserve:

\n
    \n
  • unrelated known roles,
  • \n
  • unknown fields,
  • \n
  • original date/datetime granularity for untouched fields.
  • \n
\n

5.4.3 Example#

\n

Before:

\n
title: Weekly review\nscheduled: 2026-02-20\npriority: normal\ncustomClient: ACME\n

Operation: set priority to high.

\n

After:

\n
title: Weekly review\nscheduled: 2026-02-20\npriority: high\ncustomClient: ACME\n

5.4.4 Title updates and filename updates#

\n

If an update changes semantic title, behavior MUST follow title.storage:

\n
    \n
  • title.storage=filename: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move.
  • \n
  • title.storage=frontmatter: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested.
  • \n
\n

If implementation keeps frontmatter title for compatibility while title.storage=filename, it MUST keep stored title synchronized with effective filename-derived title.

\n

5.5 Complete (non-recurring)#

\n

For non-recurring tasks, complete MUST:

\n
    \n
  1. Set status to a configured completed value, unless already completed.\nIf multiple completed values are configured, implementation MUST choose deterministically (default: first entry in status.completed_values).
  2. \n
  3. Set completed_date to completion day:
      \n
    • explicit completion-day input when provided,
    • \n
    • otherwise current local day in active runtime timezone (§5.2.1).
    • \n
    \n
  4. \n
  5. Apply overwrite policy deterministically (overwrite or preserve_if_present).
  6. \n
  7. Update date_modified on state change.
  8. \n
\n

Implementations MUST document completion-day input handling and completed_date overwrite policy.

\n

Operation MUST be idempotent.

\n

5.6 Uncomplete (non-recurring)#

\n

For non-recurring tasks, uncomplete MUST:

\n
    \n
  1. Set status to configured active/default status according to policy (default: status.default).
  2. \n
  3. Clear or retain completed_date according to policy.
  4. \n
  5. Update date_modified on state change.
  6. \n
\n

Policy MUST be documented and deterministic.

\n

Operation MUST be idempotent.

\n

5.7 Complete instance (recurring)#

\n

For recurring tasks, complete with resolved target date D (§5.2.1) MUST follow §4.7.

\n

Writers MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it.\nWhen recurrence_anchor=completion and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime DTSTART rewrite behavior.\nWhen recurrence_anchor=scheduled and DTSTART is absent, implementations MUST insert DTSTART deterministically per §4.4.5.\nNext-occurrence recalculation in this mode MUST follow §4.4.4.

\n

5.8 Uncomplete instance (recurring)#

\n

For recurring tasks, uncomplete with resolved target date D (§5.2.1) MUST follow §4.8.\nFor recurrence_anchor=completion, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back DTSTART.

\n

5.9 Skip and unskip instance#

\n

Skip/unskip for recurring tasks with resolved target date D (§5.2.1) MUST follow §4.9 and §4.10.

\n

5.10 Dependency operations#

\n

Dependency operations MUST follow §10.2.

\n

5.10.1 Add dependency#

\n

Add dependency MUST:

\n
    \n
  • validate dependency entry schema,
  • \n
  • parse and resolve uid per §11,
  • \n
  • enforce duplicate and self-reference rules,
  • \n
  • preserve existing non-target dependency entries,
  • \n
  • update date_modified on change.
  • \n
\n

5.10.2 Remove dependency#

\n

Remove dependency by uid MUST be idempotent.

\n

5.10.3 Replace dependency list#

\n

Replace dependency list MUST be explicit (not default patch behavior).

\n

5.11 Reminder operations#

\n

Reminder operations MUST follow §10.3.

\n

5.11.1 Add reminder#

\n

Add reminder MUST:

\n
    \n
  • validate reminder schema,
  • \n
  • enforce unique id within task,
  • \n
  • update date_modified on change.
  • \n
\n

5.11.2 Update reminder#

\n

Update reminder MUST target a reminder by id and be patch-by-default.

\n

5.11.3 Remove reminder#

\n

Remove reminder by id MUST be idempotent.

\n

5.12 Archive#

\n

Implementations MAY support archive semantics through:

\n
    \n
  • archive tag,
  • \n
  • archive status,
  • \n
  • dedicated boolean/archive field.
  • \n
\n

Archive behavior MUST be documented.

\n

Archive MUST NOT implicitly delete the task.

\n

5.13 Delete#

\n

Delete MUST remove the task file.

\n

Delete MUST NOT implicitly delete files referenced by attachments. An\nimplementation MAY offer a separate, explicit cleanup action subject to\n§5.21.4.

\n

Optional safety behavior:

\n
    \n
  • Implementations MAY perform backlink/dependency checks.
  • \n
  • If checks are enabled, implementation MUST provide a bypass option for explicit force delete.
  • \n
\n

5.14 Rename#

\n

Rename operation changes file path/filename while preserving semantic record identity.

\n

5.14.1 Rename interaction with title storage mode#

\n
    \n
  • If title.storage=filename, basename changes from rename MUST update effective semantic title.
  • \n
  • If title.storage=frontmatter, rename MUST NOT implicitly rewrite mapped title unless explicitly requested.
  • \n
  • Implementations that persist frontmatter title in title.storage=filename mode MUST either update that field on rename or remove it to prevent divergence.
  • \n
  • If semantic id is present, rename/move MUST preserve its value unchanged.
  • \n
\n

If implementation supports link/reference updating, it MUST:

\n
    \n
  • update resolvable references deterministically,
  • \n
  • report unresolved or ambiguous updates,
  • \n
  • update dependency uid and projects references consistently with normal links.
  • \n
\n

If implementation does not support reference updates, this limitation MUST be disclosed in conformance claim.

\n

5.15 Batch operations#

\n

Batch operations MAY be supported.

\n

If supported, implementation MUST report per-item outcomes and summary counts:

\n
    \n
  • total
  • \n
  • succeeded
  • \n
  • failed
  • \n
\n

Partial success behavior MUST be documented.

\n

5.16 Concurrency#

\n

Implementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash).

\n

When conflict is detected, operation MUST fail safely unless explicit overwrite is requested.

\n

5.17 Dry run#

\n

If dry run mode is supported, operation MUST:

\n
    \n
  • execute validation and transformation logic,
  • \n
  • report intended changes,
  • \n
  • perform no file write.
  • \n
\n

5.18 Error model#

\n

Implementation-native operation failures MUST provide structured error information with:

\n
    \n
  • operation name,
  • \n
  • error code,
  • \n
  • message,
  • \n
  • optional field/path context.
  • \n
\n

For conformance adapter envelopes (§5.23), failures MAY be represented as a compact error string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via error_details).

\n

5.19 Time tracking management#

\n

This subsection applies to implementations that support time_entries.

\n

5.19.1 Start time tracking#

\n

Start on task T MUST:

\n
    \n
  • fail when T already has an active time entry,
  • \n
  • append a new entry with canonical startTime and no endTime,
  • \n
  • MAY set a default description,
  • \n
  • update date_modified,
  • \n
  • persist canonical time_entries shape (including removal of legacy/stale duration fields when normalizing).
  • \n
\n

Recommended error code when already active: time_tracking_already_active.

\n

5.19.2 Stop time tracking#

\n

Stop on task T MUST:

\n
    \n
  • fail when T has no active time entry,
  • \n
  • set endTime on the active entry to canonical current datetime,
  • \n
  • update date_modified,
  • \n
  • preserve non-target entries and unknown frontmatter fields.
  • \n
\n

Recommended error code when no active session exists: no_active_time_entry.

\n

5.19.3 Edit or replace time entries#

\n

When replacing/editing time_entries explicitly, implementations MUST:

\n
    \n
  • validate each entry per §2.6.1 and §3.11,
  • \n
  • persist canonical datetime formats,
  • \n
  • treat duration as derived compatibility input and SHOULD remove it from canonical writes,
  • \n
  • update date_modified when persisted state changes.
  • \n
\n

5.19.4 Remove a time entry#

\n

Remove MUST target one deterministic entry (for example by index or stable selector) and update date_modified on change.\nSelector semantics MUST be documented.

\n

5.19.5 Completion-triggered auto-stop#

\n

If time_tracking.auto_stop_on_complete=true (§9.16), completion transitions MUST trigger stop behavior for the same task only.

\n

Rules:

\n
    \n
  • non-recurring tasks: trigger when status transitions from non-completed to completed status.
  • \n
  • recurring tasks: trigger when complete_instances grows.
  • \n
  • materialized occurrence notes: trigger on the occurrence note's own status transition to completed; parent reconciliation SHOULD NOT trigger a second stop on the parent unless the parent itself has an active time entry and the implementation documents that policy.
  • \n
  • implementations MUST NOT stop active sessions on unrelated tasks.
  • \n
  • if time_tracking.auto_stop_notification=true, implementations MAY emit a user-visible notice.
  • \n
\n

5.19.6 Reporting tracked time#

\n

For reporting surfaces (for example task summaries or stats), implementations MUST document whether totals use closed_minutes or live_minutes semantics from §3.11.5.

\n

5.20 Recurrence materialization operations#

\n

This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

5.20.1 Materialize occurrence#

\n

Operation: materialize occurrence for parent recurring task P and target date D.

\n

Conforming behavior:

\n
    \n
  1. Resolve P and confirm it is recurring.
  2. \n
  3. If an occurrence note for (P, D) already exists, return that note without creating a duplicate.
  4. \n
  5. Create a task note using occurrence_template when configured, otherwise using normal create behavior.
  6. \n
  7. Persist recurrence_parent as a link to P and occurrence_date as D.
  8. \n
  9. Set scheduled to D unless caller input or template output explicitly supplies another per-occurrence scheduled value.
  10. \n
  11. Set initial status using normal create defaults unless caller input or template output explicitly supplies a status.
  12. \n
  13. Preserve template/body output as occurrence-owned content after creation.
  14. \n
  15. Update date_created and date_modified according to create semantics.
  16. \n
\n

The operation MUST be idempotent for (P, D).

\n

If D is not generated by the current recurrence rule, implementations MAY allow materialization as an explicit user action but SHOULD report materialization_target_not_generated.

\n

5.20.2 Complete materialized occurrence#

\n

Completing a materialized occurrence note MUST:

\n
    \n
  1. Complete the occurrence note using normal non-recurring completion semantics (§5.5).
  2. \n
  3. Reconcile the parent by adding D to complete_instances and removing D from skipped_instances.
  4. \n
  5. If the parent has recurrence_anchor=completion, advance parent progression according to §4.4.3 and §4.4.4.
  6. \n
  7. If occurrence_materialization=on_completion, compute the next occurrence from the parent after the completion transition and materialize that next occurrence note idempotently.
  8. \n
\n

The occurrence note's successful completion MUST NOT be rolled back solely because next-occurrence materialization fails.\nWhen the next note cannot be created, implementations SHOULD report next_occurrence_materialization_failed.

\n

5.20.3 Skip materialized occurrence#

\n

Skipping a materialized occurrence note MUST preserve the note.\nSkip is a state transition, not deletion.

\n

Conforming behavior:

\n
    \n
  1. Set the occurrence note to the configured skipped status (status.default_skipped, or the first status.skipped_values entry when default_skipped is absent).
  2. \n
  3. Clear or retain completed_date according to the same documented policy used for uncompletion unless the implementation documents a skip-specific policy.
  4. \n
  5. Reconcile the parent by adding D to skipped_instances and removing D from complete_instances.
  6. \n
  7. If occurrence_materialization=on_completion and occurrence_next_trigger=completion_or_skip, compute and materialize the next occurrence note idempotently.
  8. \n
\n

If no skipped status is configured, skip of a materialized occurrence MUST fail deterministically in strict mode and SHOULD report missing_skipped_status.

\n

5.20.4 Uncomplete and unskip materialized occurrence#

\n

Uncomplete of a materialized occurrence note MUST:

\n
    \n
  1. Reopen the occurrence note using normal uncomplete semantics (§5.6).
  2. \n
  3. Remove D from parent complete_instances.
  4. \n
  5. For recurrence_anchor=completion, MUST NOT roll back parent DTSTART, matching §4.8.
  6. \n
  7. MUST NOT delete any later materialized occurrence note.
  8. \n
\n

Unskip of a materialized occurrence note MUST:

\n
    \n
  1. Reopen the occurrence note to configured active/default status.
  2. \n
  3. Remove D from parent skipped_instances.
  4. \n
  5. MUST NOT add D to parent complete_instances implicitly.
  6. \n
  7. MUST NOT delete any later materialized occurrence note.
  8. \n
\n

5.20.5 Delete and unmaterialize occurrence#

\n

Deleting a materialized occurrence note removes the task file and MUST NOT be interpreted as skip.

\n

Implementations MAY provide an explicit unmaterialize occurrence operation.\nIf supported, it MUST document whether parent state is preserved, cleared, or reconciled.\nIn all cases, deleting or unmaterializing an occurrence MUST NOT silently delete the parent recurring task.

\n

If parent instance lists still refer to a deleted occurrence note's date, validators MAY report an orphan/cache warning such as orphan_occurrence_note.

\n

5.21 Attachment operations#

\n

These rules apply to implementations that support the attachments\ncapability.

\n

5.21.1 Attach a file#

\n

Attach MUST:

\n
    \n
  1. durably write the binary to a collection path before publishing its task\nreference;
  2. \n
  3. add one canonical reference to the mapped attachments list;
  4. \n
  5. preserve the existing list order and append new references by default;
  6. \n
  7. avoid duplicate normalized targets; and
  8. \n
  9. update date_modified only when membership changes.
  10. \n
\n

Binary write and task-frontmatter update are not assumed to be one atomic\nstorage transaction. Implementations MUST make interrupted operations\nrecoverable or idempotently retryable. If the binary write succeeds but the\ntask update does not, the implementation MUST retain enough durable intent to\nretry or identify the unreferenced file for explicit cleanup.

\n

5.21.2 Detach a file#

\n

Detach removes the matching reference from attachments and is idempotent.\nDetach MUST NOT delete the underlying file. It MUST preserve the relative order\nof all other references.

\n

5.21.3 Insert an attached file inline#

\n

An implementation MAY offer an inline-insert operation. It MUST first satisfy\nattach semantics, then insert a Markdown link or embed into the task body.\nRemoving that body markup MUST NOT detach the file; detaching MUST NOT silently\nrewrite body content unless the user explicitly requests both changes.

\n

5.21.4 Delete an attachment file#

\n

Physical deletion MUST be a distinct, explicit action. Before deleting, an\nimplementation MUST check authoritative, current task attachments lists and\nSHOULD check body links/embeds and other collection backlinks. A stale or\noffline replica is not sufficient evidence that a file is unreferenced. If the\nbinary authority and record authority can change independently, the check and\ndelete MUST use an authority-provided transaction or equivalent precondition\nthat closes the race. An implementation MUST NOT offer physical deletion when\nit cannot establish that guarantee; detach remains available and leaves a safe\norphan. If another reference exists, deletion MUST be rejected unless the\ncaller explicitly chooses a force action whose affected references are\ndisclosed.

\n

After a successful non-forced deletion, implementations MUST remove the\ncurrent task's matching attachment reference. Failed deletion MUST leave\nfrontmatter unchanged. An accepted local outbox entry is not a successful\nphysical deletion until the binary authority acknowledges it.

\n

5.21.5 Materialized occurrences#

\n

When an occurrence note is materialized, it SHOULD inherit the parent task's\nattachment references in the same order. This copies references, not file\nbytes. Subsequent edits to either task's membership list are independent, and\nphysical deletion remains governed by §5.21.4.

\n

5.22 Operation examples#

\n

5.22.1 Non-recurring complete#

\n

Before:

\n
title: Buy groceries\nstatus: open\ncompletedDate:\ndateModified: 2026-02-20T09:00:00Z\n

After complete on 2026-02-20:

\n
title: Buy groceries\nstatus: done\ncompletedDate: 2026-02-20\ndateModified: 2026-02-20T09:05:00Z\n

5.22.2 Recurring complete instance#

\n

Before:

\n
title: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: []\nskippedInstances: []\ndateModified: 2026-02-20T08:00:00Z\n

After complete instance on 2026-02-20:

\n
title: Weekly review\nstatus: open\nscheduled: 2026-02-20\nrecurrence: DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR\ncompleteInstances: [2026-02-20]\nskippedInstances: []\ndateModified: 2026-02-20T08:10:00Z\n

5.22.3 Recurring skip instance overriding completion#

\n

Before:

\n
completeInstances: [2026-02-20]\nskippedInstances: []\n

After skip 2026-02-20:

\n
completeInstances: []\nskippedInstances: [2026-02-20]\n

5.22.4 Preserve unknown fields on update#

\n

Before:

\n
title: Plan Q2\nstatus: open\nvendorTicket: ZX-42\n

Update status to in-progress.

\n

After:

\n
title: Plan Q2\nstatus: in-progress\nvendorTicket: ZX-42\n

5.22.5 Add dependency#

\n

Before:

\n
blockedBy: []\n

Add dependency:

\n
uid: "[[prepare-metrics]]"\nreltype: FINISHTOSTART\n

After:

\n
blockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n

5.22.6 Add reminder#

\n

Before:

\n
reminders: []\n

Add reminder:

\n
id: due_minus_1h\ntype: relative\nrelatedTo: due\noffset: -PT1H\n

After:

\n
reminders:\n  - id: due_minus_1h\n    type: relative\n    relatedTo: due\n    offset: -PT1H\n

5.23 Conformance operation interface#

\n

The conformance suite exercises operations via the execute(operation, input) → envelope interface defined in the adapter contract. This section specifies the input/output contracts for each conformance-testable operation name.

\n

Unless otherwise noted, all operations return { ok: true, result: {...} } on success and { ok: false, error: "..." } on failure. Adapters MAY additionally return error_details with structured fields from §5.18.

\n

General operations#

\n

op.mutate_with_validation#

\n

Tests §5.2 rule 1: validation runs before commit.

\n

Input:

\n
{ "strict": true, "frontmatter": { ... } }\n

Behavior: validate frontmatter as a task record. In strict mode (strict=true), any validation error MUST produce ok=false.

\n

Output on validation error:

\n
{ "ok": false, "error": "validation|invalid_type|..." }\n

\n

op.atomic_write#

\n

Tests §5.2 rule 2: writes are all-or-nothing.

\n

Input:

\n
{\n  "original": { ... },\n  "patch": { ... },\n  "simulateFailureAfterWrite": true\n}\n

Behavior: apply patch to original, then simulate a post-write failure. The adapter MUST report whether the write was committed and what state the record is in after recovery.

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "committed": false,\n    "persisted": { ... }\n  }\n}\n

committed=false means the write was rolled back. persisted reflects the actual frontmatter after recovery — it MUST match original (not the patched version) when simulateFailureAfterWrite=true.

\n
\n

op.idempotency_check#

\n

Tests §5.2 rule 5: operations are safe under repetition.

\n

Input:

\n
{\n  "operation": "complete_nonrecurring",\n  "first": { "status": "open", "completedDate": null },\n  "second": { "status": "done", "completedDate": "2026-02-20" }\n}\n

Behavior: applying the named operation to first state and then again to second state MUST produce identical persisted results (including unchanged dateModified on the second no-op application). The adapter checks whether this holds.

\n

Output:

\n
{ "ok": true, "result": { "idempotent": true } }\n

\n

op.update_patch#

\n

Tests §5.4 patch semantics and unknown-field preservation.

\n

Input:

\n
{\n  "original": { "title": "...", "vendorTicket": "ZX-42", ... },\n  "patch": { "priority": "high" },\n  "changed": true\n}\n

Behavior: apply patch to original. Return the merged frontmatter.

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "changed": true,\n    "frontmatter": { "title": "...", "priority": "high", "vendorTicket": "ZX-42", ... }\n  }\n}\n
    \n
  • changed indicates whether any field actually changed value.
  • \n
  • frontmatter MUST include all unknown fields from original unchanged.
  • \n
\n
\n

op.complete_nonrecurring#

\n

Tests §5.5 non-recurring completion.

\n

Input:

\n
{\n  "frontmatter": { "title": "...", "status": "open" },\n  "completedValues": ["done", "cancelled"],\n  "explicitDate": "2026-02-20"\n}\n

Behavior: apply a complete operation to frontmatter using completedValues (ordered list) and explicitDate as the completion day (omit to use current local day).

\n

Output:

\n
{ "ok": true, "result": { "status": "done", "completedDate": "2026-02-20" } }\n
    \n
  • status MUST be the first entry in completedValues.
  • \n
  • completedDate MUST be explicitDate if provided; otherwise a valid YYYY-MM-DD date.
  • \n
  • If frontmatter.status is already a completed value, the operation MUST still succeed (idempotent).
  • \n
\n
\n

op.uncomplete_nonrecurring#

\n

Tests §5.6 non-recurring uncompletion.

\n

Input:

\n
{\n  "frontmatter": { "title": "...", "status": "done", "completedDate": "2026-02-20" },\n  "defaultStatus": "open",\n  "clearCompletedDate": true\n}\n

Output:

\n
{ "ok": true, "result": { "status": "open", "completedDate": null } }\n
    \n
  • status MUST be defaultStatus.
  • \n
  • If clearCompletedDate=true, completedDate MUST be null in the result.
  • \n
  • If clearCompletedDate=false, completedDate MUST be preserved.
  • \n
\n
\n

op.error_shape#

\n

Tests §5.18 error model.

\n

Input:

\n
{ "operation": "update", "code": "invalid_type", "message": "bad value", "field": "status" }\n

Behavior: construct and return a structured error object.

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "operation": "update",\n    "code": "invalid_type",\n    "message": "..."\n  }\n}\n

The message field MUST be a non-empty string. The operation and code fields MUST match the input.

\n
\n

op.detect_conflict#

\n

Tests §5.16 write-conflict detection.

\n

Input:

\n
{ "expectedVersion": "a", "actualVersion": "b", "overwrite": false }\n

Behavior: when expectedVersion != actualVersion and overwrite=false, the operation MUST fail.

\n

Output on conflict:

\n
{ "ok": false, "error": "conflict|write_conflict|..." }\n

\n

op.dry_run#

\n

Tests §5.17 dry-run mode.

\n

Input:

\n
{ "operation": "update", "patch": { "status": "done" } }\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "wrote": false,\n    "plannedChanges": ["status", ...]\n  }\n}\n

wrote MUST be false. plannedChanges MUST list the field names that would have changed.

\n
\n

Recurrence operations#

\n

For recurrence.complete, recurrence.uncomplete_instance, recurrence.skip_instance, recurrence.unskip_instance, and recurrence.effective_state, the input and output contracts are defined by the respective sections of §4 and §5.7–5.9.

\n

Common input fields for recurrence operations:

\n
    \n
  • targetDate or completionDate: YYYY-MM-DD target day
  • \n
  • completeInstances: current list of completed dates
  • \n
  • skippedInstances: current list of skipped dates
  • \n
\n

recurrence.effective_state output:

\n
{ "ok": true, "result": { "value": "completed|skipped|open" } }\n

\n

Materialized occurrence operations#

\n

For occurrence.materialize, occurrence.complete, occurrence.skip, occurrence.uncomplete, occurrence.unskip, and occurrence.unmaterialize, input and output contracts are defined by §4.18 and §5.20.

\n

Common input fields for materialized occurrence operations:

\n
    \n
  • parent: frontmatter/path/link object for the recurring parent task
  • \n
  • occurrence: frontmatter/path/link object for an existing occurrence note when applicable
  • \n
  • targetDate: YYYY-MM-DD target day
  • \n
  • config: effective occurrence/status configuration needed by the operation
  • \n
\n

occurrence.materialize output:

\n
{ "ok": true, "result": { "created": true, "occurrence": { "...": "..." } } }\n

created MUST be false when the operation returns an already-existing occurrence note for the same parent/date.

\n
\n

Time-tracking operations#

\n

For time.start, time.stop, time.replace_entries, time.remove_entry, time.auto_stop_on_complete, and time.report_totals, the contracts are defined by §5.19.

\n

Common input patterns:

\n
    \n
  • entries: current time_entries array
  • \n
  • now: ISO 8601 datetime representing current instant
  • \n
  • dateModified: current date_modified value
  • \n
\n

time.report_totals output:

\n
{ "ok": true, "result": { "closed_minutes": N, "live_minutes": M } }\n

live_minutes is only present when an active (no endTime) entry exists.

\n","text":"5.1 Purpose# This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state. 5.2 General operation rules# For all mutating operations: Validation MUST run before commit in strict mode. Writes MUST be atomic at file level (all-or-nothing per file). date_modified MUST be updated on successful state change. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations. Operations identified as idempotent MUST remain safe under repetition. 5.2.1 Target day/date resolution# Recurring instance operations act on a target day/date (complete instance, uncomplete instance, skip, unskip). Non-recurring complete uses completion-day semantics for completed_date. Resolution MUST be deterministic: If caller provides an explicit target date/datetime, that value is authoritative. If caller omits target for recurring instance operations, implementations MUST resolve in this order: task scheduled, if present and target-day-resolvable, else task due, if present and target-day-resolvable, else current local day in active runtime timezone (§3.6). Target-day resolution for fallback task fields (scheduled / due) MUST use this extraction policy: if stored value is canonical date (YYYY-MM-DD), use it as-is; if stored value is datetime, use the literal date token before T (YYYY-MM-DD) without timezone shifting; if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning; if a candidate value is unusable, continue to the next fallback source. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone. When an explicit target is datetime: operations that require day semantics MUST use its calendar date part in active runtime timezone, for recurring complete instance with recurrence_anchor=completion, the same explicit datetime target MUST also drive DTSTART rewrite semantics in §4.4.3. This explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above. 5.2.2 Idempotency and date_modified# For operations marked idempotent: first application MAY change state and date_modified, repeated application with semantically equivalent input MUST leave persisted state unchanged. When a repeated idempotent operation is a no-op, date_modified MUST remain unchanged. 5.3 Create# 5.3.1 Input requirements# Create MUST provide at minimum semantic roles required by §2, directly or via defaults. 5.3.2 Required behavior# Create MUST: apply default values, generate date_created and date_modified when absent, resolve semantic title and filename/path behavior according to §9.13, apply create-time templating when enabled and supported (§5.3.5, §9.14, §7), serialize canonical keys and canonical temporal formats, when recurrence is present, canonicalize DTSTART per §4.4.5, preserve caller-provided semantic id when present, fail with validation errors if required constraints are unmet, apply default reminders according to §10.3.9 when configured. 5.3.3 Title and filename resolution on create# Create MUST produce a deterministic initial filename/path. Rules: Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames. If title.storage=filename: basename MUST derive from semantic title, title changes after create are handled by update semantics (§5.4.4), implementations MAY also persist mapped title as a synchronized compatibility mirror, title.filename_format and title.custom_filename_template MUST be ignored. If title.storage=frontmatter, create-time basename MUST follow title.filename_format: title: sanitized semantic title, zettel: implementation-defined zettel pattern (MUST be documented), timestamp: implementation-defined timestamp pattern (MUST be documented), custom: title.custom_filename_template expansion. If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing). 5.3.4 Example# Input intent: title: \"Pay electricity bill\" Assume defaults: status default open priority default normal Persisted frontmatter (example): title: Pay electricity bill status: open priority: normal dateCreated: 2026-02-20T14:00:00Z dateModified: 2026-02-20T14:00:00Z 5.3.5 Optional create-time templating# This subsection is required only for implementations claiming profile templating (§7.3.3). Create-time templating pipeline MUST be deterministic: Compute base create payload from explicit input, defaults (§9.8), and generated/system values (date_created, date_modified, resolved title policy). Expand template variables using that base payload and active runtime date/time context. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict). Resolve body output: if expanded template body is non-empty, use it; otherwise use caller-provided body/details (if any). Template parse rules: If template content begins with ---, implementations MUST treat the first --- ... --- block as template frontmatter and the remainder as template body. Frontmatter variable expansion MUST run before YAML parsing of template frontmatter. Portable variable support: Implementations claiming templating MUST support all variables in the Required column of the table below. Implementations MAY support any variable in the Extended column. Required task-data variables: Variable Value Format / separator {{title}} Semantic title string; YAML-quoted if needed {{status}} Task status value string {{priority}} Task priority value string {{dueDate}} Due date if set YYYY-MM-DD or empty {{scheduledDate}} Scheduled date if set YYYY-MM-DD or empty {{details}} Caller-provided body/description string {{contexts}} Contexts list comma-separated, e.g. \"work, home\" {{tags}} Tags list comma-separated, e.g. \"task, errands\" {{hashtags}} Tags list as hashtags space-separated, e.g. \"#task #errands\" {{timeEstimate}} Time estimate in minutes integer string or empty {{parentNote}} Parent note name/path string; YAML-quoted if needed Required date/time variables (expansion time): Variable Value Format {{date}} Current date yyyy-MM-dd {{time}} Current time (24h) HH:mm {{year}} Full year yyyy {{month}} Month number MM {{day}} Day of month dd Extended variables (optional): Variable Value Format {{dateTime}} Date + time yyyy-MM-dd-HHmm {{timestamp}} Full timestamp yyyy-MM-dd-HHmmss {{shortDate}} Short date yyMMdd {{shortYear}} Two-digit year yy {{monthName}} Month full name e.g. February {{monthNameShort}} Month short name e.g. Feb {{dayName}} Weekday full name e.g. Monday {{dayNameShort}} Weekday short name e.g. Mon {{week}} ISO week number ww {{quarter}} Quarter number 1–4 {{hour}} Hour (24h) HH {{minute}} Minute mm {{second}} Second ss {{time12}} Time with AM/PM hh:mm a {{time24}} Time (24h) HH:mm {{timezone}} UTC offset long e.g. +05:30 {{utcOffset}} UTC offset long e.g. +05:30 {{unix}} Unix timestamp (seconds) integer string {{unixMs}} Unix timestamp (ms) integer string {{zettel}} Zettelkasten ID date + seconds-since-midnight base-36 {{titleLower}} Title lowercase string {{titleUpper}} Title uppercase string {{titleSnake}} Title snake_case string {{titleKebab}} Title kebab-case string {{titleCamel}} Title camelCase string {{titlePascal}} Title PascalCase string {{priorityShort}} First letter of priority uppercase char {{statusShort}} First letter of status uppercase char Unknown variables (not in the above lists) MUST be handled per templating.unknown_variable_policy (§9.14): preserve: leave the {{...}} placeholder as-is. empty: replace with an empty string. Deterministic expansion context: date/time variable expansion MUST use the active runtime timezone from §3.6. locale-sensitive variables (monthName, monthNameShort, dayName, dayNameShort, time12) MUST use English locale outputs for portability (January, Jan, Monday, Mon, AM/PM). template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2). Failure behavior: templating.failure_mode=error: template read/parse failures MUST abort create. templating.failure_mode=warning_fallback: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (template_missing or template_parse_failed). 5.3.6 Identity handling on create# If semantic id is provided on create, writers MUST preserve it. If implementation supports auto-generation of semantic id, generation policy MUST be documented and resulting id MUST remain stable after create. 5.4 Update# 5.4.1 Patch semantics# Update MUST be patch-by-default: only targeted semantic roles are changed. 5.4.2 Preservation rules# Update MUST preserve: unrelated known roles, unknown fields, original date/datetime granularity for untouched fields. 5.4.3 Example# Before: title: Weekly review scheduled: 2026-02-20 priority: normal customClient: ACME Operation: set priority to high. After: title: Weekly review scheduled: 2026-02-20 priority: high customClient: ACME 5.4.4 Title updates and filename updates# If an update changes semantic title, behavior MUST follow title.storage: title.storage=filename: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move. title.storage=frontmatter: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested. If implementation keeps frontmatter title for compatibility while title.storage=filename, it MUST keep stored title synchronized with effective filename-derived title. 5.5 Complete (non-recurring)# For non-recurring tasks, complete MUST: Set status to a configured completed value, unless already completed. If multiple completed values are configured, implementation MUST choose deterministically (default: first entry in status.completed_values). Set completed_date to completion day: explicit completion-day input when provided, otherwise current local day in active runtime timezone (§5.2.1). Apply overwrite policy deterministically (overwrite or preserve_if_present). Update date_modified on state change. Implementations MUST document completion-day input handling and completed_date overwrite policy. Operation MUST be idempotent. 5.6 Uncomplete (non-recurring)# For non-recurring tasks, uncomplete MUST: Set status to configured active/default status according to policy (default: status.default). Clear or retain completed_date according to policy. Update date_modified on state change. Policy MUST be documented and deterministic. Operation MUST be idempotent. 5.7 Complete instance (recurring)# For recurring tasks, complete with resolved target date D (§5.2.1) MUST follow §4.7. Writers MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it. When recurrence_anchor=completion and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime DTSTART rewrite behavior. When recurrence_anchor=scheduled and DTSTART is absent, implementations MUST insert DTSTART deterministically per §4.4.5. Next-occurrence recalculation in this mode MUST follow §4.4.4. 5.8 Uncomplete instance (recurring)# For recurring tasks, uncomplete with resolved target date D (§5.2.1) MUST follow §4.8. For recurrence_anchor=completion, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back DTSTART. 5.9 Skip and unskip instance# Skip/unskip for recurring tasks with resolved target date D (§5.2.1) MUST follow §4.9 and §4.10. 5.10 Dependency operations# Dependency operations MUST follow §10.2. 5.10.1 Add dependency# Add dependency MUST: validate dependency entry schema, parse and resolve uid per §11, enforce duplicate and self-reference rules, preserve existing non-target dependency entries, update date_modified on change. 5.10.2 Remove dependency# Remove dependency by uid MUST be idempotent. 5.10.3 Replace dependency list# Replace dependency list MUST be explicit (not default patch behavior). 5.11 Reminder operations# Reminder operations MUST follow §10.3. 5.11.1 Add reminder# Add reminder MUST: validate reminder schema, enforce unique id within task, update date_modified on change. 5.11.2 Update reminder# Update reminder MUST target a reminder by id and be patch-by-default. 5.11.3 Remove reminder# Remove reminder by id MUST be idempotent. 5.12 Archive# Implementations MAY support archive semantics through: archive tag, archive status, dedicated boolean/archive field. Archive behavior MUST be documented. Archive MUST NOT implicitly delete the task. 5.13 Delete# Delete MUST remove the task file. Delete MUST NOT implicitly delete files referenced by attachments. An implementation MAY offer a separate, explicit cleanup action subject to §5.21.4. Optional safety behavior: Implementations MAY perform backlink/dependency checks. If checks are enabled, implementation MUST provide a bypass option for explicit force delete. 5.14 Rename# Rename operation changes file path/filename while preserving semantic record identity. 5.14.1 Rename interaction with title storage mode# If title.storage=filename, basename changes from rename MUST update effective semantic title. If title.storage=frontmatter, rename MUST NOT implicitly rewrite mapped title unless explicitly requested. Implementations that persist frontmatter title in title.storage=filename mode MUST either update that field on rename or remove it to prevent divergence. If semantic id is present, rename/move MUST preserve its value unchanged. If implementation supports link/reference updating, it MUST: update resolvable references deterministically, report unresolved or ambiguous updates, update dependency uid and projects references consistently with normal links. If implementation does not support reference updates, this limitation MUST be disclosed in conformance claim. 5.15 Batch operations# Batch operations MAY be supported. If supported, implementation MUST report per-item outcomes and summary counts: total succeeded failed Partial success behavior MUST be documented. 5.16 Concurrency# Implementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash). When conflict is detected, operation MUST fail safely unless explicit overwrite is requested. 5.17 Dry run# If dry run mode is supported, operation MUST: execute validation and transformation logic, report intended changes, perform no file write. 5.18 Error model# Implementation-native operation failures MUST provide structured error information with: operation name, error code, message, optional field/path context. For conformance adapter envelopes (§5.23), failures MAY be represented as a compact error string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via error_details). 5.19 Time tracking management# This subsection applies to implementations that support time_entries. 5.19.1 Start time tracking# Start on task T MUST: fail when T already has an active time entry, append a new entry with canonical startTime and no endTime, MAY set a default description, update date_modified, persist canonical time_entries shape (including removal of legacy/stale duration fields when normalizing). Recommended error code when already active: time_tracking_already_active. 5.19.2 Stop time tracking# Stop on task T MUST: fail when T has no active time entry, set endTime on the active entry to canonical current datetime, update date_modified, preserve non-target entries and unknown frontmatter fields. Recommended error code when no active"},{"route":"/developers/specification/06-validation/","title":"6. Validation","description":"Validation ensures persisted task records conform to this specification and collection configuration.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:06-validation.md","namespace":"specification","relativePath":"06-validation.md","raw":"# 6. Validation\n\n## 6.1 Purpose\n\nValidation ensures persisted task records conform to this specification and collection configuration.\n\n## 6.2 Validation phases\n\nImplementations SHOULD validate in these phases:\n\n1. Parse validation (YAML/frontmatter structure)\n2. Schema validation (types and role constraints)\n3. Semantic validation (cross-field invariants)\n\n## 6.3 Validation modes\n\nConforming implementations MUST support:\n\n- `strict`: errors block writes.\n\nImplementations MAY additionally support:\n\n- `permissive`: writes may continue with warnings.\n\nCurrent mode MUST be discoverable.\n\n## 6.4 Required checks\n\nA conforming validator MUST implement checks required by the claimed profile(s):\n\n| Check ID | Requirement | Required for |\n|---|---|---|\n| 1 | Unconditionally required semantic roles are present (`status`, `date_created`, `date_modified`). | `core-lite` and above |\n| 1a | `completed_date` conditional requiredness is enforced per §2.2.1. | `core-lite` and above |\n| 1b | `title` resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback. | `core-lite` and above |\n| 2 | Field values match role type requirements. | `core-lite` and above |\n| 3 | Temporal values conform to §3. | `core-lite` and above |\n| 4 | Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules). | `recurrence` and above |\n| 5 | Per-instance lists contain valid dates with no overlap. | `recurrence` and above |\n| 6 | `date_modified` is not earlier than `date_created` when both exist. | `core-lite` and above |\n| 7 | `time_estimate` is non-negative when present. | any profile that supports `time_estimate` |\n| 8 | `time_entries` entries include required `startTime`, ranges are valid when `endTime` exists, and at most one active entry exists per task. | any profile that supports `time_entries` |\n| 9 | `blocked_by` entries conform to §10.2 (shape, enum, duplicates, self-reference). | `extended` |\n| 10 | `reminders` entries conform to §10.3 (shape, type-specific fields, unique ids). | `extended` |\n| 11 | relative reminders have resolvable base fields or produce configured error/warning behavior. | `extended` |\n| 12 | link-bearing fields (`projects`, `blocked_by.uid`, and supported `attachments`) conform to §11 parsing/resolution and traversal safety. | `extended`, or any implementation supporting `attachments` |\n| 13 | templating configuration is valid when provided (`templating` schema and enums). | `templating` |\n| 14 | create-time template failures obey configured failure mode (`error` vs fallback). | `templating` |\n| 15 | semantic `id` (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable. | any profile that supports semantic `id` |\n| 16 | materialized occurrence notes contain valid `recurrence_parent` and `occurrence_date` roles. | `materialized-occurrences` |\n| 17 | no duplicate materialized occurrence notes exist for the same resolved `(recurrence_parent, occurrence_date)` pair. | `materialized-occurrences` |\n| 18 | materialization policy values and rolling horizons conform to §4.18 and §9.17. | `materialized-occurrences` |\n| 19 | `attachments` is a list of non-empty, unique normalized file references with explicit extensions. | any implementation supporting `attachments` |\n\n## 6.5 Unknown field policy\n\nUnknown fields:\n\n- MUST NOT fail validation by default unless collection is configured for strict schema closure.\n- SHOULD generate informational warnings when strict schema closure is desired but not enabled.\n\n## 6.6 Issue structure\n\nValidation issues MUST include:\n\n- `code` (machine-readable)\n- `severity` (`error`, `warning`, or `info`)\n- `message` (human-readable)\n\nIssues SHOULD include:\n\n- `field` or path\n- `expected` and `actual` details where useful\n\n## 6.7 Recommended issue codes\n\n| Code | Severity (default) | Meaning |\n|---|---|---|\n| `missing_required` | error | required role missing |\n| `invalid_type` | error | value type mismatch |\n| `invalid_enum_value` | error | value not in configured set |\n| `invalid_date_value` | error | malformed or impossible date |\n| `invalid_datetime_value` | error | malformed datetime |\n| `invalid_recurrence_rule` | error | recurrence not valid tasknotes recurrence syntax |\n| `missing_recurrence_seed` | error | recurrence has no resolvable seed/start date |\n| `invalid_recurrence_anchor` | error | anchor not allowed |\n| `instance_state_overlap` | error | same date in complete and skipped lists |\n| `invalid_time_range` | error | end before start in time entry |\n| `missing_time_entry_start` | error | time entry is missing required startTime |\n| `multiple_active_time_entries` | error | more than one active time entry exists in one task |\n| `invalid_dependency_entry` | error | dependency object missing required fields |\n| `invalid_dependency_reltype` | error | dependency reltype not allowed |\n| `invalid_dependency_gap` | error | dependency gap not valid ISO 8601 duration |\n| `duplicate_dependency_uid` | error in strict mode when `dependencies.enforce_unique_uid=true`; warning otherwise by policy | repeated dependency uid in task |\n| `self_dependency` | error | task depends on itself |\n| `unresolved_dependency_target` | warning | dependency target not resolvable |\n| `invalid_reminder_entry` | error | reminder object missing required fields |\n| `duplicate_reminder_id` | error | repeated reminder id in task |\n| `invalid_reminder_type` | error | reminder type not allowed |\n| `invalid_reminder_offset` | error | relative reminder offset not valid duration |\n| `invalid_reminder_related_to` | error | relatedTo must be due or scheduled |\n| `invalid_reminder_absolute_time` | error | absoluteTime invalid datetime |\n| `unresolvable_reminder_base` | error | relative reminder base field missing/unusable |\n| `invalid_link_format` | error | link value cannot be parsed as supported format |\n| `ambiguous_link` | warning | link resolves to multiple candidates |\n| `path_traversal` | error | resolved path escapes collection root |\n| `unresolved_link_target` | warning | link target cannot be resolved |\n| `invalid_attachment_reference` | error | attachment reference is empty, lacks an explicit extension, or targets a directory |\n| `duplicate_attachment_reference` | error | attachment list repeats the same normalized target |\n| `invalid_task_id` | error | semantic `id` is empty or invalid type |\n| `duplicate_task_id` | warning | duplicate semantic `id` detected in collection scope |\n| `alias_conflict_ignored` | warning | alias key ignored due to canonical conflict |\n| `unresolvable_title` | error | title cannot be resolved from title resolution policy |\n| `title_source_conflict` | warning | mapped title and filename title differ; active title-storage policy selected authoritative source |\n| `template_missing` | warning | configured template file cannot be read/found |\n| `template_parse_failed` | warning | template frontmatter/body parsing or expansion failed |\n| `missing_recurrence_parent` | error | materialized occurrence note omits recurrence_parent |\n| `invalid_recurrence_parent` | warning | occurrence note parent reference cannot be resolved or does not reference a recurring task |\n| `missing_occurrence_date` | error | materialized occurrence note omits occurrence_date |\n| `duplicate_occurrence_note` | warning | more than one materialized occurrence note exists for the same parent/date |\n| `occurrence_state_conflict` | warning | materialized occurrence state disagrees with parent instance lists |\n| `materialization_target_not_generated` | warning | occurrence date is not generated by current parent recurrence rule |\n| `missing_skipped_status` | error | skip of materialized occurrence requires configured skipped status |\n| `next_occurrence_materialization_failed` | warning | triggering operation succeeded but next occurrence note could not be created |\n| `orphan_occurrence_note` | warning | materialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note |\n| `unknown_field` | info | unmapped field encountered |\n\nImplementations MAY extend this code set but SHOULD preserve existing meanings.\n\n## 6.8 Write-time validation behavior\n\nIn strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes.\n\nWarnings SHOULD NOT block writes unless explicitly configured.\n\nDatetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4.\n\n## 6.9 Validation examples\n\n### 6.9.1 Missing required role\n\nInput:\n\n```yaml\ntitle: Plan workshop\nstatus: open\ndateCreated: 2026-02-20T09:00:00Z\n```\n\nIssue:\n\n```yaml\ncode: missing_required\nseverity: error\nfield: dateModified\nmessage: Required field 'dateModified' is missing.\n```\n\n### 6.9.2 Invalid recurrence anchor\n\nInput:\n\n```yaml\nrecurrence: FREQ=DAILY\nrecurrenceAnchor: due\n```\n\nIssue:\n\n```yaml\ncode: invalid_recurrence_anchor\nseverity: error\nfield: recurrenceAnchor\nmessage: recurrence anchor must be 'scheduled' or 'completion'.\n```\n\n### 6.9.3 Overlap in instance state\n\nInput:\n\n```yaml\ncompleteInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n```\n\nIssue:\n\n```yaml\ncode: instance_state_overlap\nseverity: error\nmessage: same date exists in complete and skipped instance lists.\n```\n\n### 6.9.4 Invalid dependency reltype\n\nInput:\n\n```yaml\nblockedBy:\n - uid: \"[[task-a]]\"\n reltype: BLOCKS\n```\n\nIssue:\n\n```yaml\ncode: invalid_dependency_reltype\nseverity: error\nfield: blockedBy[0].reltype\nmessage: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH.\n```\n\n### 6.9.5 Unresolvable reminder base\n\nInput:\n\n```yaml\nreminders:\n - id: due_minus_1d\n type: relative\n relatedTo: due\n offset: -P1D\n```\n\nIssue when `due` missing:\n\n```yaml\ncode: unresolvable_reminder_base\nseverity: error\nfield: reminders[0]\nmessage: relative reminder references due but no due value exists.\n```\n\n### 6.9.6 Unknown field in permissive mode\n\nInput:\n\n```yaml\ntitle: Plan workshop\nstatus: open\nvendorPriority: p1\n```\n\nIssue example:\n\n```yaml\ncode: unknown_field\nseverity: info\nfield: vendorPriority\nmessage: field is not mapped to a known semantic role.\n```\n\n### 6.9.7 Multiple active time entries\n\nInput:\n\n```yaml\ntimeEntries:\n - startTime: 2026-02-20T10:00:00Z\n - startTime: 2026-02-20T11:00:00Z\n```\n\nIssue:\n\n```yaml\ncode: multiple_active_time_entries\nseverity: error\nfield: timeEntries\nmessage: task contains more than one active time entry.\n```\n","aliases":["/spec/06-validation/"],"toc":[{"level":2,"id":"61-purpose","text":"6.1 Purpose"},{"level":2,"id":"62-validation-phases","text":"6.2 Validation phases"},{"level":2,"id":"63-validation-modes","text":"6.3 Validation modes"},{"level":2,"id":"64-required-checks","text":"6.4 Required checks"},{"level":2,"id":"65-unknown-field-policy","text":"6.5 Unknown field policy"},{"level":2,"id":"66-issue-structure","text":"6.6 Issue structure"},{"level":2,"id":"67-recommended-issue-codes","text":"6.7 Recommended issue codes"},{"level":2,"id":"68-write-time-validation-behavior","text":"6.8 Write-time validation behavior"},{"level":2,"id":"69-validation-examples","text":"6.9 Validation examples"},{"level":3,"id":"691-missing-required-role","text":"6.9.1 Missing required role"},{"level":3,"id":"692-invalid-recurrence-anchor","text":"6.9.2 Invalid recurrence anchor"},{"level":3,"id":"693-overlap-in-instance-state","text":"6.9.3 Overlap in instance state"},{"level":3,"id":"694-invalid-dependency-reltype","text":"6.9.4 Invalid dependency reltype"},{"level":3,"id":"695-unresolvable-reminder-base","text":"6.9.5 Unresolvable reminder base"},{"level":3,"id":"696-unknown-field-in-permissive-mode","text":"6.9.6 Unknown field in permissive mode"},{"level":3,"id":"697-multiple-active-time-entries","text":"6.9.7 Multiple active time entries"}],"html":"

6.1 Purpose#

\n

Validation ensures persisted task records conform to this specification and collection configuration.

\n

6.2 Validation phases#

\n

Implementations SHOULD validate in these phases:

\n
    \n
  1. Parse validation (YAML/frontmatter structure)
  2. \n
  3. Schema validation (types and role constraints)
  4. \n
  5. Semantic validation (cross-field invariants)
  6. \n
\n

6.3 Validation modes#

\n

Conforming implementations MUST support:

\n
    \n
  • strict: errors block writes.
  • \n
\n

Implementations MAY additionally support:

\n
    \n
  • permissive: writes may continue with warnings.
  • \n
\n

Current mode MUST be discoverable.

\n

6.4 Required checks#

\n

A conforming validator MUST implement checks required by the claimed profile(s):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Check IDRequirementRequired for
1Unconditionally required semantic roles are present (status, date_created, date_modified).core-lite and above
1acompleted_date conditional requiredness is enforced per §2.2.1.core-lite and above
1btitle resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback.core-lite and above
2Field values match role type requirements.core-lite and above
3Temporal values conform to §3.core-lite and above
4Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules).recurrence and above
5Per-instance lists contain valid dates with no overlap.recurrence and above
6date_modified is not earlier than date_created when both exist.core-lite and above
7time_estimate is non-negative when present.any profile that supports time_estimate
8time_entries entries include required startTime, ranges are valid when endTime exists, and at most one active entry exists per task.any profile that supports time_entries
9blocked_by entries conform to §10.2 (shape, enum, duplicates, self-reference).extended
10reminders entries conform to §10.3 (shape, type-specific fields, unique ids).extended
11relative reminders have resolvable base fields or produce configured error/warning behavior.extended
12link-bearing fields (projects, blocked_by.uid, and supported attachments) conform to §11 parsing/resolution and traversal safety.extended, or any implementation supporting attachments
13templating configuration is valid when provided (templating schema and enums).templating
14create-time template failures obey configured failure mode (error vs fallback).templating
15semantic id (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable.any profile that supports semantic id
16materialized occurrence notes contain valid recurrence_parent and occurrence_date roles.materialized-occurrences
17no duplicate materialized occurrence notes exist for the same resolved (recurrence_parent, occurrence_date) pair.materialized-occurrences
18materialization policy values and rolling horizons conform to §4.18 and §9.17.materialized-occurrences
19attachments is a list of non-empty, unique normalized file references with explicit extensions.any implementation supporting attachments
\n

6.5 Unknown field policy#

\n

Unknown fields:

\n
    \n
  • MUST NOT fail validation by default unless collection is configured for strict schema closure.
  • \n
  • SHOULD generate informational warnings when strict schema closure is desired but not enabled.
  • \n
\n

6.6 Issue structure#

\n

Validation issues MUST include:

\n
    \n
  • code (machine-readable)
  • \n
  • severity (error, warning, or info)
  • \n
  • message (human-readable)
  • \n
\n

Issues SHOULD include:

\n
    \n
  • field or path
  • \n
  • expected and actual details where useful
  • \n
\n\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CodeSeverity (default)Meaning
missing_requirederrorrequired role missing
invalid_typeerrorvalue type mismatch
invalid_enum_valueerrorvalue not in configured set
invalid_date_valueerrormalformed or impossible date
invalid_datetime_valueerrormalformed datetime
invalid_recurrence_ruleerrorrecurrence not valid tasknotes recurrence syntax
missing_recurrence_seederrorrecurrence has no resolvable seed/start date
invalid_recurrence_anchorerroranchor not allowed
instance_state_overlaperrorsame date in complete and skipped lists
invalid_time_rangeerrorend before start in time entry
missing_time_entry_starterrortime entry is missing required startTime
multiple_active_time_entrieserrormore than one active time entry exists in one task
invalid_dependency_entryerrordependency object missing required fields
invalid_dependency_reltypeerrordependency reltype not allowed
invalid_dependency_gaperrordependency gap not valid ISO 8601 duration
duplicate_dependency_uiderror in strict mode when dependencies.enforce_unique_uid=true; warning otherwise by policyrepeated dependency uid in task
self_dependencyerrortask depends on itself
unresolved_dependency_targetwarningdependency target not resolvable
invalid_reminder_entryerrorreminder object missing required fields
duplicate_reminder_iderrorrepeated reminder id in task
invalid_reminder_typeerrorreminder type not allowed
invalid_reminder_offseterrorrelative reminder offset not valid duration
invalid_reminder_related_toerrorrelatedTo must be due or scheduled
invalid_reminder_absolute_timeerrorabsoluteTime invalid datetime
unresolvable_reminder_baseerrorrelative reminder base field missing/unusable
invalid_link_formaterrorlink value cannot be parsed as supported format
ambiguous_linkwarninglink resolves to multiple candidates
path_traversalerrorresolved path escapes collection root
unresolved_link_targetwarninglink target cannot be resolved
invalid_attachment_referenceerrorattachment reference is empty, lacks an explicit extension, or targets a directory
duplicate_attachment_referenceerrorattachment list repeats the same normalized target
invalid_task_iderrorsemantic id is empty or invalid type
duplicate_task_idwarningduplicate semantic id detected in collection scope
alias_conflict_ignoredwarningalias key ignored due to canonical conflict
unresolvable_titleerrortitle cannot be resolved from title resolution policy
title_source_conflictwarningmapped title and filename title differ; active title-storage policy selected authoritative source
template_missingwarningconfigured template file cannot be read/found
template_parse_failedwarningtemplate frontmatter/body parsing or expansion failed
missing_recurrence_parenterrormaterialized occurrence note omits recurrence_parent
invalid_recurrence_parentwarningoccurrence note parent reference cannot be resolved or does not reference a recurring task
missing_occurrence_dateerrormaterialized occurrence note omits occurrence_date
duplicate_occurrence_notewarningmore than one materialized occurrence note exists for the same parent/date
occurrence_state_conflictwarningmaterialized occurrence state disagrees with parent instance lists
materialization_target_not_generatedwarningoccurrence date is not generated by current parent recurrence rule
missing_skipped_statuserrorskip of materialized occurrence requires configured skipped status
next_occurrence_materialization_failedwarningtriggering operation succeeded but next occurrence note could not be created
orphan_occurrence_notewarningmaterialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note
unknown_fieldinfounmapped field encountered
\n

Implementations MAY extend this code set but SHOULD preserve existing meanings.

\n

6.8 Write-time validation behavior#

\n

In strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes.

\n

Warnings SHOULD NOT block writes unless explicitly configured.

\n

Datetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4.

\n

6.9 Validation examples#

\n

6.9.1 Missing required role#

\n

Input:

\n
title: Plan workshop\nstatus: open\ndateCreated: 2026-02-20T09:00:00Z\n

Issue:

\n
code: missing_required\nseverity: error\nfield: dateModified\nmessage: Required field 'dateModified' is missing.\n

6.9.2 Invalid recurrence anchor#

\n

Input:

\n
recurrence: FREQ=DAILY\nrecurrenceAnchor: due\n

Issue:

\n
code: invalid_recurrence_anchor\nseverity: error\nfield: recurrenceAnchor\nmessage: recurrence anchor must be 'scheduled' or 'completion'.\n

6.9.3 Overlap in instance state#

\n

Input:

\n
completeInstances: [2026-02-20]\nskippedInstances: [2026-02-20]\n

Issue:

\n
code: instance_state_overlap\nseverity: error\nmessage: same date exists in complete and skipped instance lists.\n

6.9.4 Invalid dependency reltype#

\n

Input:

\n
blockedBy:\n  - uid: "[[task-a]]"\n    reltype: BLOCKS\n

Issue:

\n
code: invalid_dependency_reltype\nseverity: error\nfield: blockedBy[0].reltype\nmessage: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH.\n

6.9.5 Unresolvable reminder base#

\n

Input:

\n
reminders:\n  - id: due_minus_1d\n    type: relative\n    relatedTo: due\n    offset: -P1D\n

Issue when due missing:

\n
code: unresolvable_reminder_base\nseverity: error\nfield: reminders[0]\nmessage: relative reminder references due but no due value exists.\n

6.9.6 Unknown field in permissive mode#

\n

Input:

\n
title: Plan workshop\nstatus: open\nvendorPriority: p1\n

Issue example:

\n
code: unknown_field\nseverity: info\nfield: vendorPriority\nmessage: field is not mapped to a known semantic role.\n

6.9.7 Multiple active time entries#

\n

Input:

\n
timeEntries:\n  - startTime: 2026-02-20T10:00:00Z\n  - startTime: 2026-02-20T11:00:00Z\n

Issue:

\n
code: multiple_active_time_entries\nseverity: error\nfield: timeEntries\nmessage: task contains more than one active time entry.\n
","text":"6.1 Purpose# Validation ensures persisted task records conform to this specification and collection configuration. 6.2 Validation phases# Implementations SHOULD validate in these phases: Parse validation (YAML/frontmatter structure) Schema validation (types and role constraints) Semantic validation (cross-field invariants) 6.3 Validation modes# Conforming implementations MUST support: strict: errors block writes. Implementations MAY additionally support: permissive: writes may continue with warnings. Current mode MUST be discoverable. 6.4 Required checks# A conforming validator MUST implement checks required by the claimed profile(s): Check ID Requirement Required for 1 Unconditionally required semantic roles are present (status, date_created, date_modified). core-lite and above 1a completed_date conditional requiredness is enforced per §2.2.1. core-lite and above 1b title resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback. core-lite and above 2 Field values match role type requirements. core-lite and above 3 Temporal values conform to §3. core-lite and above 4 Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules). recurrence and above 5 Per-instance lists contain valid dates with no overlap. recurrence and above 6 date_modified is not earlier than date_created when both exist. core-lite and above 7 time_estimate is non-negative when present. any profile that supports time_estimate 8 time_entries entries include required startTime, ranges are valid when endTime exists, and at most one active entry exists per task. any profile that supports time_entries 9 blocked_by entries conform to §10.2 (shape, enum, duplicates, self-reference). extended 10 reminders entries conform to §10.3 (shape, type-specific fields, unique ids). extended 11 relative reminders have resolvable base fields or produce configured error/warning behavior. extended 12 link-bearing fields (projects, blocked_by.uid, and supported attachments) conform to §11 parsing/resolution and traversal safety. extended, or any implementation supporting attachments 13 templating configuration is valid when provided (templating schema and enums). templating 14 create-time template failures obey configured failure mode (error vs fallback). templating 15 semantic id (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable. any profile that supports semantic id 16 materialized occurrence notes contain valid recurrence_parent and occurrence_date roles. materialized-occurrences 17 no duplicate materialized occurrence notes exist for the same resolved (recurrence_parent, occurrence_date) pair. materialized-occurrences 18 materialization policy values and rolling horizons conform to §4.18 and §9.17. materialized-occurrences 19 attachments is a list of non-empty, unique normalized file references with explicit extensions. any implementation supporting attachments 6.5 Unknown field policy# Unknown fields: MUST NOT fail validation by default unless collection is configured for strict schema closure. SHOULD generate informational warnings when strict schema closure is desired but not enabled. 6.6 Issue structure# Validation issues MUST include: code (machine-readable) severity (error, warning, or info) message (human-readable) Issues SHOULD include: field or path expected and actual details where useful 6.7 Recommended issue codes# Code Severity (default) Meaning missing_required error required role missing invalid_type error value type mismatch invalid_enum_value error value not in configured set invalid_date_value error malformed or impossible date invalid_datetime_value error malformed datetime invalid_recurrence_rule error recurrence not valid tasknotes recurrence syntax missing_recurrence_seed error recurrence has no resolvable seed/start date invalid_recurrence_anchor error anchor not allowed instance_state_overlap error same date in complete and skipped lists invalid_time_range error end before start in time entry missing_time_entry_start error time entry is missing required startTime multiple_active_time_entries error more than one active time entry exists in one task invalid_dependency_entry error dependency object missing required fields invalid_dependency_reltype error dependency reltype not allowed invalid_dependency_gap error dependency gap not valid ISO 8601 duration duplicate_dependency_uid error in strict mode when dependencies.enforce_unique_uid=true; warning otherwise by policy repeated dependency uid in task self_dependency error task depends on itself unresolved_dependency_target warning dependency target not resolvable invalid_reminder_entry error reminder object missing required fields duplicate_reminder_id error repeated reminder id in task invalid_reminder_type error reminder type not allowed invalid_reminder_offset error relative reminder offset not valid duration invalid_reminder_related_to error relatedTo must be due or scheduled invalid_reminder_absolute_time error absoluteTime invalid datetime unresolvable_reminder_base error relative reminder base field missing/unusable invalid_link_format error link value cannot be parsed as supported format ambiguous_link warning link resolves to multiple candidates path_traversal error resolved path escapes collection root unresolved_link_target warning link target cannot be resolved invalid_attachment_reference error attachment reference is empty, lacks an explicit extension, or targets a directory duplicate_attachment_reference error attachment list repeats the same normalized target invalid_task_id error semantic id is empty or invalid type duplicate_task_id warning duplicate semantic id detected in collection scope alias_conflict_ignored warning alias key ignored due to canonical conflict unresolvable_title error title cannot be resolved from title resolution policy title_source_conflict warning mapped title and filename title differ; active title-storage policy selected authoritative source template_missing warning configured template file cannot be read/found template_parse_failed warning template frontmatter/body parsing or expansion failed missing_recurrence_parent error materialized occurrence note omits recurrence_parent invalid_recurrence_parent warning occurrence note parent reference cannot be resolved or does not reference a recurring task missing_occurrence_date error materialized occurrence note omits occurrence_date duplicate_occurrence_note warning more than one materialized occurrence note exists for the same parent/date occurrence_state_conflict warning materialized occurrence state disagrees with parent instance lists materialization_target_not_generated warning occurrence date is not generated by current parent recurrence rule missing_skipped_status error skip of materialized occurrence requires configured skipped status next_occurrence_materialization_failed warning triggering operation succeeded but next occurrence note could not be created orphan_occurrence_note warning materialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note unknown_field info unmapped field encountered Implementations MAY extend this code set but SHOULD preserve existing meanings. 6.8 Write-time validation behavior# In strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes. Warnings SHOULD NOT block writes unless explicitly configured. Datetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4. 6.9 Validation examples# 6.9.1 Missing required role# Input: title: Plan workshop status: open dateCreated: 2026-02-20T09:00:00Z Issue: code: missing_required severity: error field: dateModified message: Required field 'dateModified' is missing. 6.9.2 Invalid recurrence anchor# Input: recurrence: FREQ=DAILY recurrenceAnchor: due Issue: code: invalid_recurrence_anchor severity: error field: recurrenceAnchor message: recurrence anchor must be 'scheduled' or 'completion'. 6.9.3 Overlap in instance state# Input: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Issue: code: instance_state_overlap severity: error message: same date exists in complete and skipped instance lists. 6.9.4 Invalid dependency reltype# Input: blockedBy: - uid: \"[[task-a]]\" reltype: BLOCKS Issue: code: invalid_dependency_reltype severity: error field: blockedBy[0].reltype message: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH. 6.9.5 Unresolvable reminder base# Input: reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D Issue when due missing: code: unresolvable_reminder_base severity: error field: reminders[0] message: relative reminder references due but no due value exists. 6.9.6 Unknown field in permissive mode# Input: title: Plan workshop status: open vendorPriority: p1 Issue example: code: unknown_field severity: info field: vendorPriority message: field is not mapped to a known semantic role. 6.9.7 Multiple active time entries# Input: timeEntries: - startTime: 2026-02-20T10:00:00Z - startTime: 2026-02-20T11:00:00Z Issue: code: multiple_active_time_entries severity: error field: timeEntries message: task contains more than one active time entry."},{"route":"/developers/specification/07-conformance/","title":"7. Conformance","description":"This section defines conformance profiles and claim requirements for implementations.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:07-conformance.md","namespace":"specification","relativePath":"07-conformance.md","raw":"# 7. Conformance\n\n## 7.1 Purpose\n\nThis section defines conformance profiles and claim requirements for implementations.\n\n## 7.2 Conformance principles\n\nAn implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented.\n\nImplementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements.\n\n## 7.3 Profile model\n\nProfiles are cumulative unless explicitly marked otherwise.\n\n### 7.3.1 Profile: `core-lite`\n\nRequired capabilities:\n\n- task identification and loading\n- semantic-role mapping and canonical writes (§2)\n- required role support (`title`, `status`, `completed_date`, `date_created`, `date_modified`)\n- create, update, delete operations (§5)\n- non-recurring complete/uncomplete (§5)\n- temporal parsing/canonical serialization basics (§3)\n- strict validation mode support (§6.3)\n- validation core checks (§6.4 items 1,1a,1b,2,3,6)\n\n### 7.3.2 Profile: `recurrence`\n\nAdditional required capabilities:\n\n- tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline `DTSTART` handling\n- recurrence anchor semantics, including seed precedence and completion-anchor progression\n- complete/uncomplete instance\n- skip/unskip instance\n- instance-list invariants and effective state resolution\n- validation checks for recurrence and instance overlap\n\n### 7.3.3 Profile: `templating` (non-cumulative extension)\n\nThis profile is not cumulative; it MAY be claimed alongside `core-lite`, `recurrence`, `materialized-occurrences`, and/or `extended`.\n`templating` MUST NOT be claimed alone.\n\nRequired capabilities:\n\n- create-time template processing semantics per §5.3.5\n- `templating` configuration support per §9.14\n- deterministic template/frontmatter/body merge behavior\n- deterministic failure-mode behavior for template read/parse failures\n- support for portable double-brace template variables defined in §5.3.5\n\n### 7.3.4 Profile: `materialized-occurrences` (non-cumulative extension)\n\nThis profile is not cumulative; it MUST be claimed alongside `recurrence`.\nIt MAY be claimed alongside `extended` and/or `templating`, but it does not require either.\n\nRequired capabilities:\n\n- materialized occurrence roles and identity semantics (§2.6.6)\n- recurrence materialization semantics (§4.18)\n- materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20)\n- `occurrences` configuration defaults (§9.17)\n- parent-reference link parsing/resolution for `recurrence_parent` (§11), without requiring full `extended`\n- validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18)\n\nClaiming `materialized-occurrences` also has required capability-token implications:\n\n- `meta.claim.capabilities` MUST include `materialized-occurrences`.\n- `meta.claim.profiles` MUST also include `recurrence`.\n- Omitting either token while claiming `materialized-occurrences` is a non-conformant claim.\n\n### 7.3.5 Profile: `extended`\n\nAdditional required capabilities:\n\n- dependency schema support (`blocked_by`)\n- reminder schema support (`reminders`)\n- link parsing/resolution semantics for link-bearing fields (§11)\n- time-tracking management semantics for `time_entries` (§5.19), including per-task active-session constraints\n- dependency operations and validation per §10.2\n- reminder operations and validation per §10.3\n\nIf `extended` is claimed, all of the above baseline capabilities MUST conform to documented semantics.\n\nClaiming `extended` also has required capability-token implications:\n\n- `meta.claim.capabilities` MUST include `dependencies`, `reminders`, `links`, and `time-tracking`.\n- Omitting any of these tokens while claiming `extended` is a non-conformant claim (even if capability-gated fixtures are skipped by a runner).\n\nOptional capability extensions within `extended`:\n\n- `rename` capability: reference-aware rename behavior (including dependency UID references)\n- `archive` capability: archive semantics (§5.12)\n- `batch` capability: batch operations with per-item outcomes (§5.15)\n- `concurrency` capability: write-conflict detection semantics (§5.16)\n- `dry-run` capability: dry-run semantics (§5.17)\n\nWhen an optional capability token is claimed, corresponding behavior MUST conform to documented semantics.\n\n## 7.4 Conformance claim format\n\nA conformance claim MUST include:\n\n- implementation name and version,\n- `tasknotes-spec` version,\n- claimed profile list,\n- validation mode support (`strict` required; `permissive` optional),\n- known deviations,\n- compatibility mode status (if any),\n- configuration provider status (active provider chain, precedence policy, and fallback state).\n\nExample:\n\n```text\nImplementation: example-task-cli v1.4.0\nSpec: tasknotes-spec 0.3.0-rc.3\nProfiles: core-lite, recurrence, templating\nValidation modes: strict, permissive\nKnown deviations: none\nCompatibility mode: disabled\nConfiguration providers: tasknotes_plugin_data_json > built_in_defaults\nConfiguration fallback: none\n```\n\n## 7.5 Deviation disclosure\n\nAny known deviation from normative text MUST be explicitly disclosed in conformance output/documentation.\n\nA deviation entry SHOULD include:\n\n- affected section,\n- deviation summary,\n- impact,\n- planned resolution version.\n\n## 7.6 Feature detection\n\nImplementations SHOULD expose machine-readable capability metadata, including:\n\n- profiles\n- effective runtime timezone\n- active configuration providers and precedence chain\n- enabled compatibility modes\n- configurable status sets\n- supported mapping aliases\n- templating support flags and effective templating failure mode\n- dependency and reminder support flags\n- attachment membership, reference normalization, and host-provided binary\n operation flags (including whether physical deletion is available)\n- time-tracking support flags, including active-session policy and auto-stop-on-complete behavior\n- materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds\n- configured natural-language capture triggers when the optional `nlp` block is\n present\n\n## 7.7 Strictness disclosure\n\nConformance requires `strict` validation mode support (§6.3).\n\nConformance claims MUST indicate whether `permissive` mode is also supported.\n\n## 7.8 Example profile matrix\n\n| Capability | core-lite | recurrence | templating | materialized-occurrences | extended |\n|---|---:|---:|---:|---:|---:|\n| create/update/delete | required | required | companion-profile required | companion-profile required | required |\n| non-recurring complete | required | required | companion-profile required | companion-profile required | required |\n| recurring instance complete/skip | - | required | optional | required via companion `recurrence` claim | required |\n| materialize occurrence notes (§4.18, §5.20) | - | - | optional | required | optional |\n| recurrence parent link resolution | - | - | optional | required for `recurrence_parent` only | required |\n| template expansion/merge (§5.3.5) | - | - | required | optional | optional |\n| double-brace portable variable support | - | - | required | optional | optional |\n| recurrence-string validation | - | required | optional | required via companion `recurrence` claim | required |\n| link parsing/resolution (§11) | - | - | optional | required for `recurrence_parent` only | required |\n| attachment membership and ops (§5.21) | optional via `attachments` capability | optional via `attachments` capability | optional via `attachments` capability | optional via `attachments` capability | optional via `attachments` capability |\n| dependency schema and ops | - | - | optional | optional | required |\n| reminder schema and ops | - | - | optional | optional | required |\n| time tracking start/stop/edit semantics (§5.19) | - | - | optional | optional | required |\n| rename updates dependency/project links | - | - | optional | optional | optional via `rename` capability |\n| archive semantics (§5.12) | - | - | optional | optional | optional via `archive` capability |\n| batch per-item outcomes (§5.15) | - | - | optional | optional | optional via `batch` capability |\n| write-conflict detection (§5.16) | - | - | optional | optional | optional via `concurrency` capability |\n| dry-run reporting (§5.17) | - | - | optional | optional | optional via `dry-run` capability |\n\n## 7.9 Executable fixture suite\n\nThis specification includes an executable fixture suite in `conformance/`.\n\n- language-neutral fixtures are stored in `conformance/fixtures/*.json`\n- section/profile/operation coverage is tracked in `conformance/manifest.json`\n- coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations.\n- adapters execute fixture operations per `conformance/docs/ADAPTER_CONTRACT.md`\n- runners MUST execute fixtures only when both conditions hold:\n - fixture `profile` is satisfied by claimed adapter profiles under cumulative profile rules (§7.3),\n - all fixture `requires` capability tokens are present.\n\nFixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own `profile`/`requires` gating guarantees.\nFixtures for optional extension capabilities (`rename`, `archive`, `batch`, `concurrency`, `dry-run`) MUST be capability-gated via `requires` and MUST NOT rely on `extended` profile membership alone.\n\nConformance claims SHOULD report fixture pass/fail results against the claimed profiles.\n\n## 7.10 Meta operations\n\nThe following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token.\n\n### `meta.claim`\n\nReturns the adapter's self-reported metadata.\n\nInput: `{}` (empty object)\n\nOutput:\n```json\n{\n \"ok\": true,\n \"result\": {\n \"implementation\": \"my-tool\",\n \"version\": \"1.0.0\",\n \"spec_version\": \"0.3.0-rc.3\",\n \"validation_modes\": [\"strict\"],\n \"profiles\": [\"core-lite\", \"recurrence\"],\n \"capabilities\": [\"dependencies\", \"links\"]\n }\n}\n```\n\nFields:\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `implementation` | string | yes | Human-readable implementation name |\n| `version` | string | yes | Implementation version string |\n| `spec_version` | string | yes | `tasknotes-spec` version targeted by this adapter |\n| `validation_modes` | string[] | yes | Supported validation modes; MUST include `strict` |\n| `profiles` | string[] | yes | Claimed conformance profiles; valid values: `core-lite`, `recurrence`, `extended`, `templating`, `materialized-occurrences` |\n| `capabilities` | string[] | yes | Optional capability tokens; known tokens listed in §7.11 |\n\n`profiles` lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of `meta.has_profile`.\n\nProfile-token consistency rules:\n\n- If `profiles` contains `extended`, `capabilities` MUST include `dependencies`, `reminders`, `links`, and `time-tracking`.\n- If `profiles` contains `templating`, `capabilities` MUST include `templating`.\n- If `profiles` contains `materialized-occurrences`, `profiles` MUST also contain `recurrence` and `capabilities` MUST include `materialized-occurrences`.\n- Runners and fixture suites SHOULD validate these claim-consistency rules directly from `meta.claim`, not only by capability-gating feature fixtures.\n\n### `meta.has_capability`\n\nTests whether the adapter claims a specific capability.\n\nInput:\n```json\n{ \"capability\": \"dependencies\" }\n```\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"value\": true } }\n```\n\n`result.value` MUST be `true` if the capability is in the `capabilities` array returned by `meta.claim`, and `false` otherwise.\n\n### `meta.has_profile`\n\nTests whether the adapter claims a specific conformance profile.\n\nInput:\n```json\n{ \"profile\": \"recurrence\" }\n```\n\nOutput:\n```json\n{ \"ok\": true, \"result\": { \"value\": true } }\n```\n\n`result.value` MUST be `true` if the profile is in the `profiles` array returned by `meta.claim`, and `false` otherwise.\n\n## 7.11 Known capability tokens\n\nThe following capability tokens are defined by this specification. Implementations MAY define additional tokens.\n\n| Token | Required by profile | Meaning |\n|---|---|---|\n| `dependencies` | `extended` | Supports `blocked_by`, dependency operations, and dependency validation |\n| `reminders` | `extended` | Supports `reminders`, reminder operations, and reminder validation |\n| `attachments` | optional extension under any profile | Treats the mapped `attachments` list as authoritative membership; validates and normalizes its collection-file references; and implements §5.21 attachment operations using host-owned binary storage. A claim MUST separately disclose which host file actions are available; it does not by itself promise physical deletion where the host cannot perform an authoritative reference check. |\n| `links` | `extended` | Supports link parsing and resolution (§11) |\n| `time-tracking` | `extended` | Supports time-tracking management operations (§5.19) |\n| `materialized-occurrences` | `materialized-occurrences` | Supports recurrence materialization and materialized occurrence operations (§4.18, §5.20) |\n| `rename` | optional extension under `extended` | Supports file rename with reference updates |\n| `archive` | optional extension under `extended` | Supports archive semantics (§5.12) |\n| `batch` | optional extension under `extended` | Supports batch operations with per-item outcomes (§5.15) |\n| `concurrency` | optional extension under `extended` | Supports write-conflict detection (§5.16) |\n| `dry-run` | optional extension under `extended` | Supports dry-run mode (§5.17) |\n| `migration` | — | Supports migration operations (§8) |\n| `templating` | `templating` | Supports create-time templating (§5.3.5) |\n","aliases":["/spec/07-conformance/"],"toc":[{"level":2,"id":"71-purpose","text":"7.1 Purpose"},{"level":2,"id":"72-conformance-principles","text":"7.2 Conformance principles"},{"level":2,"id":"73-profile-model","text":"7.3 Profile model"},{"level":3,"id":"731-profile-core-lite","text":"7.3.1 Profile: core-lite"},{"level":3,"id":"732-profile-recurrence","text":"7.3.2 Profile: recurrence"},{"level":3,"id":"733-profile-templating-non-cumulative-extension","text":"7.3.3 Profile: templating (non-cumulative extension)"},{"level":3,"id":"734-profile-materialized-occurrences-non-cumulative-extension","text":"7.3.4 Profile: materialized-occurrences (non-cumulative extension)"},{"level":3,"id":"735-profile-extended","text":"7.3.5 Profile: extended"},{"level":2,"id":"74-conformance-claim-format","text":"7.4 Conformance claim format"},{"level":2,"id":"75-deviation-disclosure","text":"7.5 Deviation disclosure"},{"level":2,"id":"76-feature-detection","text":"7.6 Feature detection"},{"level":2,"id":"77-strictness-disclosure","text":"7.7 Strictness disclosure"},{"level":2,"id":"78-example-profile-matrix","text":"7.8 Example profile matrix"},{"level":2,"id":"79-executable-fixture-suite","text":"7.9 Executable fixture suite"},{"level":2,"id":"710-meta-operations","text":"7.10 Meta operations"},{"level":3,"id":"metaclaim","text":"meta.claim"},{"level":3,"id":"metahascapability","text":"meta.has_capability"},{"level":3,"id":"metahasprofile","text":"meta.has_profile"},{"level":2,"id":"711-known-capability-tokens","text":"7.11 Known capability tokens"}],"html":"

7.1 Purpose#

\n

This section defines conformance profiles and claim requirements for implementations.

\n

7.2 Conformance principles#

\n

An implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented.

\n

Implementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements.

\n

7.3 Profile model#

\n

Profiles are cumulative unless explicitly marked otherwise.

\n

7.3.1 Profile: core-lite#

\n

Required capabilities:

\n
    \n
  • task identification and loading
  • \n
  • semantic-role mapping and canonical writes (§2)
  • \n
  • required role support (title, status, completed_date, date_created, date_modified)
  • \n
  • create, update, delete operations (§5)
  • \n
  • non-recurring complete/uncomplete (§5)
  • \n
  • temporal parsing/canonical serialization basics (§3)
  • \n
  • strict validation mode support (§6.3)
  • \n
  • validation core checks (§6.4 items 1,1a,1b,2,3,6)
  • \n
\n

7.3.2 Profile: recurrence#

\n

Additional required capabilities:

\n
    \n
  • tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline DTSTART handling
  • \n
  • recurrence anchor semantics, including seed precedence and completion-anchor progression
  • \n
  • complete/uncomplete instance
  • \n
  • skip/unskip instance
  • \n
  • instance-list invariants and effective state resolution
  • \n
  • validation checks for recurrence and instance overlap
  • \n
\n

7.3.3 Profile: templating (non-cumulative extension)#

\n

This profile is not cumulative; it MAY be claimed alongside core-lite, recurrence, materialized-occurrences, and/or extended.\ntemplating MUST NOT be claimed alone.

\n

Required capabilities:

\n
    \n
  • create-time template processing semantics per §5.3.5
  • \n
  • templating configuration support per §9.14
  • \n
  • deterministic template/frontmatter/body merge behavior
  • \n
  • deterministic failure-mode behavior for template read/parse failures
  • \n
  • support for portable double-brace template variables defined in §5.3.5
  • \n
\n

7.3.4 Profile: materialized-occurrences (non-cumulative extension)#

\n

This profile is not cumulative; it MUST be claimed alongside recurrence.\nIt MAY be claimed alongside extended and/or templating, but it does not require either.

\n

Required capabilities:

\n
    \n
  • materialized occurrence roles and identity semantics (§2.6.6)
  • \n
  • recurrence materialization semantics (§4.18)
  • \n
  • materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20)
  • \n
  • occurrences configuration defaults (§9.17)
  • \n
  • parent-reference link parsing/resolution for recurrence_parent (§11), without requiring full extended
  • \n
  • validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18)
  • \n
\n

Claiming materialized-occurrences also has required capability-token implications:

\n
    \n
  • meta.claim.capabilities MUST include materialized-occurrences.
  • \n
  • meta.claim.profiles MUST also include recurrence.
  • \n
  • Omitting either token while claiming materialized-occurrences is a non-conformant claim.
  • \n
\n

7.3.5 Profile: extended#

\n

Additional required capabilities:

\n
    \n
  • dependency schema support (blocked_by)
  • \n
  • reminder schema support (reminders)
  • \n
  • link parsing/resolution semantics for link-bearing fields (§11)
  • \n
  • time-tracking management semantics for time_entries (§5.19), including per-task active-session constraints
  • \n
  • dependency operations and validation per §10.2
  • \n
  • reminder operations and validation per §10.3
  • \n
\n

If extended is claimed, all of the above baseline capabilities MUST conform to documented semantics.

\n

Claiming extended also has required capability-token implications:

\n
    \n
  • meta.claim.capabilities MUST include dependencies, reminders, links, and time-tracking.
  • \n
  • Omitting any of these tokens while claiming extended is a non-conformant claim (even if capability-gated fixtures are skipped by a runner).
  • \n
\n

Optional capability extensions within extended:

\n
    \n
  • rename capability: reference-aware rename behavior (including dependency UID references)
  • \n
  • archive capability: archive semantics (§5.12)
  • \n
  • batch capability: batch operations with per-item outcomes (§5.15)
  • \n
  • concurrency capability: write-conflict detection semantics (§5.16)
  • \n
  • dry-run capability: dry-run semantics (§5.17)
  • \n
\n

When an optional capability token is claimed, corresponding behavior MUST conform to documented semantics.

\n

7.4 Conformance claim format#

\n

A conformance claim MUST include:

\n
    \n
  • implementation name and version,
  • \n
  • tasknotes-spec version,
  • \n
  • claimed profile list,
  • \n
  • validation mode support (strict required; permissive optional),
  • \n
  • known deviations,
  • \n
  • compatibility mode status (if any),
  • \n
  • configuration provider status (active provider chain, precedence policy, and fallback state).
  • \n
\n

Example:

\n
Implementation: example-task-cli v1.4.0\nSpec: tasknotes-spec 0.3.0-rc.3\nProfiles: core-lite, recurrence, templating\nValidation modes: strict, permissive\nKnown deviations: none\nCompatibility mode: disabled\nConfiguration providers: tasknotes_plugin_data_json > built_in_defaults\nConfiguration fallback: none\n

7.5 Deviation disclosure#

\n

Any known deviation from normative text MUST be explicitly disclosed in conformance output/documentation.

\n

A deviation entry SHOULD include:

\n
    \n
  • affected section,
  • \n
  • deviation summary,
  • \n
  • impact,
  • \n
  • planned resolution version.
  • \n
\n

7.6 Feature detection#

\n

Implementations SHOULD expose machine-readable capability metadata, including:

\n
    \n
  • profiles
  • \n
  • effective runtime timezone
  • \n
  • active configuration providers and precedence chain
  • \n
  • enabled compatibility modes
  • \n
  • configurable status sets
  • \n
  • supported mapping aliases
  • \n
  • templating support flags and effective templating failure mode
  • \n
  • dependency and reminder support flags
  • \n
  • attachment membership, reference normalization, and host-provided binary\noperation flags (including whether physical deletion is available)
  • \n
  • time-tracking support flags, including active-session policy and auto-stop-on-complete behavior
  • \n
  • materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds
  • \n
  • configured natural-language capture triggers when the optional nlp block is\npresent
  • \n
\n

7.7 Strictness disclosure#

\n

Conformance requires strict validation mode support (§6.3).

\n

Conformance claims MUST indicate whether permissive mode is also supported.

\n

7.8 Example profile matrix#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Capabilitycore-literecurrencetemplatingmaterialized-occurrencesextended
create/update/deleterequiredrequiredcompanion-profile requiredcompanion-profile requiredrequired
non-recurring completerequiredrequiredcompanion-profile requiredcompanion-profile requiredrequired
recurring instance complete/skip-requiredoptionalrequired via companion recurrence claimrequired
materialize occurrence notes (§4.18, §5.20)--optionalrequiredoptional
recurrence parent link resolution--optionalrequired for recurrence_parent onlyrequired
template expansion/merge (§5.3.5)--requiredoptionaloptional
double-brace portable variable support--requiredoptionaloptional
recurrence-string validation-requiredoptionalrequired via companion recurrence claimrequired
link parsing/resolution (§11)--optionalrequired for recurrence_parent onlyrequired
attachment membership and ops (§5.21)optional via attachments capabilityoptional via attachments capabilityoptional via attachments capabilityoptional via attachments capabilityoptional via attachments capability
dependency schema and ops--optionaloptionalrequired
reminder schema and ops--optionaloptionalrequired
time tracking start/stop/edit semantics (§5.19)--optionaloptionalrequired
rename updates dependency/project links--optionaloptionaloptional via rename capability
archive semantics (§5.12)--optionaloptionaloptional via archive capability
batch per-item outcomes (§5.15)--optionaloptionaloptional via batch capability
write-conflict detection (§5.16)--optionaloptionaloptional via concurrency capability
dry-run reporting (§5.17)--optionaloptionaloptional via dry-run capability
\n

7.9 Executable fixture suite#

\n

This specification includes an executable fixture suite in conformance/.

\n
    \n
  • language-neutral fixtures are stored in conformance/fixtures/*.json
  • \n
  • section/profile/operation coverage is tracked in conformance/manifest.json
  • \n
  • coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations.
  • \n
  • adapters execute fixture operations per conformance/docs/ADAPTER_CONTRACT.md
  • \n
  • runners MUST execute fixtures only when both conditions hold:
      \n
    • fixture profile is satisfied by claimed adapter profiles under cumulative profile rules (§7.3),
    • \n
    • all fixture requires capability tokens are present.
    • \n
    \n
  • \n
\n

Fixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own profile/requires gating guarantees.\nFixtures for optional extension capabilities (rename, archive, batch, concurrency, dry-run) MUST be capability-gated via requires and MUST NOT rely on extended profile membership alone.

\n

Conformance claims SHOULD report fixture pass/fail results against the claimed profiles.

\n

7.10 Meta operations#

\n

The following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token.

\n

meta.claim#

\n

Returns the adapter's self-reported metadata.

\n

Input: {} (empty object)

\n

Output:

\n
{\n  "ok": true,\n  "result": {\n    "implementation": "my-tool",\n    "version": "1.0.0",\n    "spec_version": "0.3.0-rc.3",\n    "validation_modes": ["strict"],\n    "profiles": ["core-lite", "recurrence"],\n    "capabilities": ["dependencies", "links"]\n  }\n}\n

Fields:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldTypeRequiredDescription
implementationstringyesHuman-readable implementation name
versionstringyesImplementation version string
spec_versionstringyestasknotes-spec version targeted by this adapter
validation_modesstring[]yesSupported validation modes; MUST include strict
profilesstring[]yesClaimed conformance profiles; valid values: core-lite, recurrence, extended, templating, materialized-occurrences
capabilitiesstring[]yesOptional capability tokens; known tokens listed in §7.11
\n

profiles lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of meta.has_profile.

\n

Profile-token consistency rules:

\n
    \n
  • If profiles contains extended, capabilities MUST include dependencies, reminders, links, and time-tracking.
  • \n
  • If profiles contains templating, capabilities MUST include templating.
  • \n
  • If profiles contains materialized-occurrences, profiles MUST also contain recurrence and capabilities MUST include materialized-occurrences.
  • \n
  • Runners and fixture suites SHOULD validate these claim-consistency rules directly from meta.claim, not only by capability-gating feature fixtures.
  • \n
\n

meta.has_capability#

\n

Tests whether the adapter claims a specific capability.

\n

Input:

\n
{ "capability": "dependencies" }\n

Output:

\n
{ "ok": true, "result": { "value": true } }\n

result.value MUST be true if the capability is in the capabilities array returned by meta.claim, and false otherwise.

\n

meta.has_profile#

\n

Tests whether the adapter claims a specific conformance profile.

\n

Input:

\n
{ "profile": "recurrence" }\n

Output:

\n
{ "ok": true, "result": { "value": true } }\n

result.value MUST be true if the profile is in the profiles array returned by meta.claim, and false otherwise.

\n

7.11 Known capability tokens#

\n

The following capability tokens are defined by this specification. Implementations MAY define additional tokens.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TokenRequired by profileMeaning
dependenciesextendedSupports blocked_by, dependency operations, and dependency validation
remindersextendedSupports reminders, reminder operations, and reminder validation
attachmentsoptional extension under any profileTreats the mapped attachments list as authoritative membership; validates and normalizes its collection-file references; and implements §5.21 attachment operations using host-owned binary storage. A claim MUST separately disclose which host file actions are available; it does not by itself promise physical deletion where the host cannot perform an authoritative reference check.
linksextendedSupports link parsing and resolution (§11)
time-trackingextendedSupports time-tracking management operations (§5.19)
materialized-occurrencesmaterialized-occurrencesSupports recurrence materialization and materialized occurrence operations (§4.18, §5.20)
renameoptional extension under extendedSupports file rename with reference updates
archiveoptional extension under extendedSupports archive semantics (§5.12)
batchoptional extension under extendedSupports batch operations with per-item outcomes (§5.15)
concurrencyoptional extension under extendedSupports write-conflict detection (§5.16)
dry-runoptional extension under extendedSupports dry-run mode (§5.17)
migration—Supports migration operations (§8)
templatingtemplatingSupports create-time templating (§5.3.5)
\n","text":"7.1 Purpose# This section defines conformance profiles and claim requirements for implementations. 7.2 Conformance principles# An implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented. Implementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements. 7.3 Profile model# Profiles are cumulative unless explicitly marked otherwise. 7.3.1 Profile: core-lite# Required capabilities: task identification and loading semantic-role mapping and canonical writes (§2) required role support (title, status, completed_date, date_created, date_modified) create, update, delete operations (§5) non-recurring complete/uncomplete (§5) temporal parsing/canonical serialization basics (§3) strict validation mode support (§6.3) validation core checks (§6.4 items 1,1a,1b,2,3,6) 7.3.2 Profile: recurrence# Additional required capabilities: tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline DTSTART handling recurrence anchor semantics, including seed precedence and completion-anchor progression complete/uncomplete instance skip/unskip instance instance-list invariants and effective state resolution validation checks for recurrence and instance overlap 7.3.3 Profile: templating (non-cumulative extension)# This profile is not cumulative; it MAY be claimed alongside core-lite, recurrence, materialized-occurrences, and/or extended. templating MUST NOT be claimed alone. Required capabilities: create-time template processing semantics per §5.3.5 templating configuration support per §9.14 deterministic template/frontmatter/body merge behavior deterministic failure-mode behavior for template read/parse failures support for portable double-brace template variables defined in §5.3.5 7.3.4 Profile: materialized-occurrences (non-cumulative extension)# This profile is not cumulative; it MUST be claimed alongside recurrence. It MAY be claimed alongside extended and/or templating, but it does not require either. Required capabilities: materialized occurrence roles and identity semantics (§2.6.6) recurrence materialization semantics (§4.18) materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20) occurrences configuration defaults (§9.17) parent-reference link parsing/resolution for recurrence_parent (§11), without requiring full extended validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18) Claiming materialized-occurrences also has required capability-token implications: meta.claim.capabilities MUST include materialized-occurrences. meta.claim.profiles MUST also include recurrence. Omitting either token while claiming materialized-occurrences is a non-conformant claim. 7.3.5 Profile: extended# Additional required capabilities: dependency schema support (blocked_by) reminder schema support (reminders) link parsing/resolution semantics for link-bearing fields (§11) time-tracking management semantics for time_entries (§5.19), including per-task active-session constraints dependency operations and validation per §10.2 reminder operations and validation per §10.3 If extended is claimed, all of the above baseline capabilities MUST conform to documented semantics. Claiming extended also has required capability-token implications: meta.claim.capabilities MUST include dependencies, reminders, links, and time-tracking. Omitting any of these tokens while claiming extended is a non-conformant claim (even if capability-gated fixtures are skipped by a runner). Optional capability extensions within extended: rename capability: reference-aware rename behavior (including dependency UID references) archive capability: archive semantics (§5.12) batch capability: batch operations with per-item outcomes (§5.15) concurrency capability: write-conflict detection semantics (§5.16) dry-run capability: dry-run semantics (§5.17) When an optional capability token is claimed, corresponding behavior MUST conform to documented semantics. 7.4 Conformance claim format# A conformance claim MUST include: implementation name and version, tasknotes-spec version, claimed profile list, validation mode support (strict required; permissive optional), known deviations, compatibility mode status (if any), configuration provider status (active provider chain, precedence policy, and fallback state). Example: Implementation: example-task-cli v1.4.0 Spec: tasknotes-spec 0.3.0-rc.3 Profiles: core-lite, recurrence, templating Validation modes: strict, permissive Known deviations: none Compatibility mode: disabled Configuration providers: tasknotes_plugin_data_json > built_in_defaults Configuration fallback: none 7.5 Deviation disclosure# Any known deviation from normative text MUST be explicitly disclosed in conformance output/documentation. A deviation entry SHOULD include: affected section, deviation summary, impact, planned resolution version. 7.6 Feature detection# Implementations SHOULD expose machine-readable capability metadata, including: profiles effective runtime timezone active configuration providers and precedence chain enabled compatibility modes configurable status sets supported mapping aliases templating support flags and effective templating failure mode dependency and reminder support flags attachment membership, reference normalization, and host-provided binary operation flags (including whether physical deletion is available) time-tracking support flags, including active-session policy and auto-stop-on-complete behavior materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds configured natural-language capture triggers when the optional nlp block is present 7.7 Strictness disclosure# Conformance requires strict validation mode support (§6.3). Conformance claims MUST indicate whether permissive mode is also supported. 7.8 Example profile matrix# Capability core-lite recurrence templating materialized-occurrences extended create/update/delete required required companion-profile required companion-profile required required non-recurring complete required required companion-profile required companion-profile required required recurring instance complete/skip - required optional required via companion recurrence claim required materialize occurrence notes (§4.18, §5.20) - - optional required optional recurrence parent link resolution - - optional required for recurrence_parent only required template expansion/merge (§5.3.5) - - required optional optional double-brace portable variable support - - required optional optional recurrence-string validation - required optional required via companion recurrence claim required link parsing/resolution (§11) - - optional required for recurrence_parent only required attachment membership and ops (§5.21) optional via attachments capability optional via attachments capability optional via attachments capability optional via attachments capability optional via attachments capability dependency schema and ops - - optional optional required reminder schema and ops - - optional optional required time tracking start/stop/edit semantics (§5.19) - - optional optional required rename updates dependency/project links - - optional optional optional via rename capability archive semantics (§5.12) - - optional optional optional via archive capability batch per-item outcomes (§5.15) - - optional optional optional via batch capability write-conflict detection (§5.16) - - optional optional optional via concurrency capability dry-run reporting (§5.17) - - optional optional optional via dry-run capability 7.9 Executable fixture suite# This specification includes an executable fixture suite in conformance/. language-neutral fixtures are stored in conformance/fixtures/*.json section/profile/operation coverage is tracked in conformance/manifest.json coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations. adapters execute fixture operations per conformance/docs/ADAPTER_CONTRACT.md runners MUST execute fixtures only when both conditions hold: fixture profile is satisfied by claimed adapter profiles under cumulative profile rules (§7.3), all fixture requires capability tokens are present. Fixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own profile/requires gating guarantees. Fixtures for optional extension capabilities (rename, archive, batch, concurrency, dry-run) MUST be capability-gated via requires and MUST NOT rely on extended profile membership alone. Conformance claims SHOULD report fixture pass/fail results against the claimed profiles. 7.10 Meta operations# The following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token. meta.claim# Returns the adapter's self-reported metadata. Input: {} (empty object) Output: { \"ok\": true, \"result\": { \"implementation\": \"my-tool\", \"version\": \"1.0.0\", \"spec_version\": \"0.3.0-rc.3\", \"validation_modes\": [\"strict\"], \"profiles\": [\"core-lite\", \"recurrence\"], \"capabilities\": [\"dependencies\", \"links\"] } } Fields: Field Type Required Description implementation string yes Human-readable implementation name version string yes Implementation version string spec_version string yes tasknotes-spec version targeted by this adapter validation_modes string[] yes Supported validation modes; MUST include strict profiles string[] yes Claimed conformance profiles; valid values: core-lite, recurrence, extended, templating, materialized-occurrences capabilities string[] yes Optional capability tokens; known tokens listed in §7.11 profiles lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of meta.has_profile. Profile-token consistency rules: If profiles contains extended, capabilities MUST include dependencies, reminders, links, and time-tracking. If profiles contains templating, capabilities MUST include templating. If profiles contains materialized-occurrences, profiles MUST also contain recurrence and capabilities MUST include materialized-occurrences. Runners and fixture suites SHOULD validate these claim-consistency rules directly from meta.claim, not only by capability-gating feature fixtures. meta.has_capability# Tests whether the adapter claims a specific capability. Input: { \"capability\": \"dependencies\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the capability is in the capabilities array returned by meta.claim, and false otherwise. meta.has_profile# Tests whether the adapter claims a specific conformance profile. Input: { \"profile\": \"recurrence\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the profile is in the profiles array returned by meta.claim, and false otherwise. 7.11 Known capability tokens# The following capability tokens are defined by this specification. Implementations MAY define additional tokens. Token Required by profile Meaning dependencies extended Supports blocked_by, dependency operations, and dependency validation reminders extended Supports reminders, reminder operations, and reminder validation attachments optional extension under any profile Treats the mapped attachments list as authoritative membership; validates and normalizes its collection-file references; and implements §5.21 attachment operations using host-owned binary storage. A claim MUST separately disclose which host file actions are available; it does not by itself promise physical deletion where the host cannot perform an authoritative reference check. links extended Supports link parsing and resolution (§11) time-tracking extended Supports time-tracking management operations (§5.19) materialized-occurrences materialized-occurrences Supports recurrence materialization and materialized occurrence operations (§4.18, §5.20) rename optional extension under extended Supports file rename with reference updates archive optional extension under extended Supports archive semantics (§5.12) batch optional extension under extended Supports batch operations with per-item outcomes (§5.15) concurrency optional extension under extended Supports write-conflict detection (§5.16) dry-run optional extension under extended Supports dry-run mode (§5.17) migration — Supports migration operations (§8) templating templating Supports create-time templating (§5.3.5)"},{"route":"/developers/specification/08-compatibility-and-migrations/","title":"8. Compatibility and Migrations","description":"This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:08-compatibility-and-migrations.md","namespace":"specification","relativePath":"08-compatibility-and-migrations.md","raw":"# 8. Compatibility and Migrations\n\n## 8.1 Purpose\n\nThis section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.\n\n## 8.2 Compatibility modes\n\nImplementations MAY support compatibility modes for legacy behavior.\n\nIf supported, compatibility modes MUST:\n\n- be explicitly enabled or disabled,\n- be discoverable through configuration or capability metadata,\n- not be silently enabled by default in new collections.\n\n## 8.3 Migration expectations\n\nWhen canonical behavior differs from historical behavior, implementations SHOULD provide:\n\n1. deterministic migration rules,\n2. dry-run preview support,\n3. rollback-safe workflow guidance.\n\n## 8.4 Alias normalization migration\n\nFor legacy key aliases, a migration SHOULD:\n\n- read both canonical and alias keys,\n- choose canonical value deterministically (recommended: canonical key precedence),\n- rewrite persisted file using canonical keys,\n- preserve unrelated unknown fields.\n\n### 8.4.1 Example\n\nBefore:\n\n```yaml\nrecurrenceAnchor: scheduled\nrecurrence_anchor: completion\n```\n\nAfter normalization:\n\n```yaml\nrecurrenceAnchor: scheduled\n```\n\nWith warning:\n\n- `alias_conflict_ignored`: alias value ignored because canonical key present.\n\n## 8.5 Temporal normalization migration\n\nIf historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO `Z` for datetime roles while preserving date-only roles as dates.\n\nExample:\n\nBefore:\n\n```yaml\ndateCreated: 2026-02-20 10:00:00+00:00\n```\n\nAfter:\n\n```yaml\ndateCreated: 2026-02-20T10:00:00Z\n```\n\n## 8.6 Recurrence state migration\n\nIf historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically.\n\nRecommended resolution policy:\n\n- if overlap exists, prefer most recent user action where recoverable,\n- otherwise prefer `complete_instances` and remove overlapping skip entries,\n- emit migration report for affected dates.\n\nPolicy choice MUST be documented.\n\n## 8.7 Materialized occurrence migration\n\nWhen introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation.\nRecommended migration behavior:\n\n- do not materialize historical or future occurrence notes unless explicitly requested;\n- preserve existing parent `complete_instances` and `skipped_instances`;\n- when importing existing per-occurrence task files, require deterministic parent/date matching before adding `recurrence_parent` and `occurrence_date`;\n- when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report `occurrence_state_conflict`;\n- provide a dry-run report before converting existing task files into materialized occurrence notes.\n\nMigration tooling MUST NOT silently delete occurrence notes or parent recurring tasks.\n\n## 8.8 Dependency migration\n\nWhen migrating legacy dependency data, implementations SHOULD:\n\n- normalize dependency key names to mapped canonical key,\n- ensure each entry has `uid` and canonical `reltype`,\n- normalize legacy string/path references into configured canonical reference style,\n- remove duplicate dependency entries by policy.\n\nIf historical data omits `reltype`, migration MAY apply `dependencies.default_reltype` and SHOULD report count of inferred values.\n\n## 8.9 Reminder migration\n\nWhen migrating legacy reminder data, implementations SHOULD:\n\n- normalize reminder key names,\n- normalize `type` values to canonical enum (`absolute` or `relative`),\n- normalize `relatedTo` values to canonical enum (`due` or `scheduled`),\n- normalize `absoluteTime` to canonical UTC ISO `Z`,\n- validate and normalize offsets to ISO 8601 duration syntax.\n\nIf reminder `id` values are missing, migration MAY generate IDs and MUST report generated count.\n\n## 8.10 Link migration\n\nWhen migrating legacy link values, implementations SHOULD:\n\n- normalize supported link syntaxes according to §11 parsing rules,\n- preserve alias and anchor components where possible,\n- normalize resolved targets into canonical write format by policy,\n- detect and report ambiguous links instead of silently choosing non-deterministically.\n\n## 8.11 Divergence register\n\nImplementations SHOULD maintain a divergence register with columns:\n\n- section\n- current behavior\n- target canonical behavior\n- migration strategy\n- deprecation timeline\n\n## 8.12 Deprecation policy\n\nFor any behavior deprecated by the specification:\n\n1. announce deprecation in release notes,\n2. provide warning period,\n3. provide migration tooling where feasible,\n4. remove deprecated behavior only in a version aligned with compatibility commitments.\n\n## 8.13 Data safety requirements\n\nMigrations MUST NOT:\n\n- silently drop unknown fields,\n- silently convert valid date-only fields to datetime,\n- silently rewrite recurrence semantics without explicit policy,\n- silently materialize occurrence notes outside explicit user/configured materialization policy,\n- silently delete materialized occurrence notes during recurrence edits,\n- silently drop unresolved dependency entries,\n- silently rewrite link targets to different destinations without explicit policy,\n- silently delete reminders unless explicitly requested.\n\n## 8.14 Suggested migration report format\n\n```yaml\nspec_version_from: 0.1.0-draft\nspec_version_to: 0.3.0-rc.3\nfiles_scanned: 214\nfiles_changed: 67\nwarnings:\n alias_conflict_ignored: 3\n instance_state_overlap_resolved: 2\n occurrence_state_conflict: 1\n unresolved_dependency_target: 4\nchanges:\n normalized_datetime_fields: 41\n alias_keys_removed: 29\n instance_overlaps_fixed: 2\n occurrence_state_conflicts: 1\n inferred_dependency_reltype: 5\n generated_reminder_ids: 8\n normalized_link_targets: 14\n```\n\n## 8.15 Compatibility statement example\n\n```text\nCompatibility mode: legacy-aliases=true, legacy-timeentry-duration=true\nPlanned removal: v2.0.0\nMigration command: tasknotes migrate --normalize-frontmatter\n```\n","aliases":["/spec/08-compatibility-and-migrations/"],"toc":[{"level":2,"id":"81-purpose","text":"8.1 Purpose"},{"level":2,"id":"82-compatibility-modes","text":"8.2 Compatibility modes"},{"level":2,"id":"83-migration-expectations","text":"8.3 Migration expectations"},{"level":2,"id":"84-alias-normalization-migration","text":"8.4 Alias normalization migration"},{"level":3,"id":"841-example","text":"8.4.1 Example"},{"level":2,"id":"85-temporal-normalization-migration","text":"8.5 Temporal normalization migration"},{"level":2,"id":"86-recurrence-state-migration","text":"8.6 Recurrence state migration"},{"level":2,"id":"87-materialized-occurrence-migration","text":"8.7 Materialized occurrence migration"},{"level":2,"id":"88-dependency-migration","text":"8.8 Dependency migration"},{"level":2,"id":"89-reminder-migration","text":"8.9 Reminder migration"},{"level":2,"id":"810-link-migration","text":"8.10 Link migration"},{"level":2,"id":"811-divergence-register","text":"8.11 Divergence register"},{"level":2,"id":"812-deprecation-policy","text":"8.12 Deprecation policy"},{"level":2,"id":"813-data-safety-requirements","text":"8.13 Data safety requirements"},{"level":2,"id":"814-suggested-migration-report-format","text":"8.14 Suggested migration report format"},{"level":2,"id":"815-compatibility-statement-example","text":"8.15 Compatibility statement example"}],"html":"

8.1 Purpose#

\n

This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.

\n

8.2 Compatibility modes#

\n

Implementations MAY support compatibility modes for legacy behavior.

\n

If supported, compatibility modes MUST:

\n
    \n
  • be explicitly enabled or disabled,
  • \n
  • be discoverable through configuration or capability metadata,
  • \n
  • not be silently enabled by default in new collections.
  • \n
\n

8.3 Migration expectations#

\n

When canonical behavior differs from historical behavior, implementations SHOULD provide:

\n
    \n
  1. deterministic migration rules,
  2. \n
  3. dry-run preview support,
  4. \n
  5. rollback-safe workflow guidance.
  6. \n
\n

8.4 Alias normalization migration#

\n

For legacy key aliases, a migration SHOULD:

\n
    \n
  • read both canonical and alias keys,
  • \n
  • choose canonical value deterministically (recommended: canonical key precedence),
  • \n
  • rewrite persisted file using canonical keys,
  • \n
  • preserve unrelated unknown fields.
  • \n
\n

8.4.1 Example#

\n

Before:

\n
recurrenceAnchor: scheduled\nrecurrence_anchor: completion\n

After normalization:

\n
recurrenceAnchor: scheduled\n

With warning:

\n
    \n
  • alias_conflict_ignored: alias value ignored because canonical key present.
  • \n
\n

8.5 Temporal normalization migration#

\n

If historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO Z for datetime roles while preserving date-only roles as dates.

\n

Example:

\n

Before:

\n
dateCreated: 2026-02-20 10:00:00+00:00\n

After:

\n
dateCreated: 2026-02-20T10:00:00Z\n

8.6 Recurrence state migration#

\n

If historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically.

\n

Recommended resolution policy:

\n
    \n
  • if overlap exists, prefer most recent user action where recoverable,
  • \n
  • otherwise prefer complete_instances and remove overlapping skip entries,
  • \n
  • emit migration report for affected dates.
  • \n
\n

Policy choice MUST be documented.

\n

8.7 Materialized occurrence migration#

\n

When introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation.\nRecommended migration behavior:

\n
    \n
  • do not materialize historical or future occurrence notes unless explicitly requested;
  • \n
  • preserve existing parent complete_instances and skipped_instances;
  • \n
  • when importing existing per-occurrence task files, require deterministic parent/date matching before adding recurrence_parent and occurrence_date;
  • \n
  • when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report occurrence_state_conflict;
  • \n
  • provide a dry-run report before converting existing task files into materialized occurrence notes.
  • \n
\n

Migration tooling MUST NOT silently delete occurrence notes or parent recurring tasks.

\n

8.8 Dependency migration#

\n

When migrating legacy dependency data, implementations SHOULD:

\n
    \n
  • normalize dependency key names to mapped canonical key,
  • \n
  • ensure each entry has uid and canonical reltype,
  • \n
  • normalize legacy string/path references into configured canonical reference style,
  • \n
  • remove duplicate dependency entries by policy.
  • \n
\n

If historical data omits reltype, migration MAY apply dependencies.default_reltype and SHOULD report count of inferred values.

\n

8.9 Reminder migration#

\n

When migrating legacy reminder data, implementations SHOULD:

\n
    \n
  • normalize reminder key names,
  • \n
  • normalize type values to canonical enum (absolute or relative),
  • \n
  • normalize relatedTo values to canonical enum (due or scheduled),
  • \n
  • normalize absoluteTime to canonical UTC ISO Z,
  • \n
  • validate and normalize offsets to ISO 8601 duration syntax.
  • \n
\n

If reminder id values are missing, migration MAY generate IDs and MUST report generated count.

\n\n

When migrating legacy link values, implementations SHOULD:

\n
    \n
  • normalize supported link syntaxes according to §11 parsing rules,
  • \n
  • preserve alias and anchor components where possible,
  • \n
  • normalize resolved targets into canonical write format by policy,
  • \n
  • detect and report ambiguous links instead of silently choosing non-deterministically.
  • \n
\n

8.11 Divergence register#

\n

Implementations SHOULD maintain a divergence register with columns:

\n
    \n
  • section
  • \n
  • current behavior
  • \n
  • target canonical behavior
  • \n
  • migration strategy
  • \n
  • deprecation timeline
  • \n
\n

8.12 Deprecation policy#

\n

For any behavior deprecated by the specification:

\n
    \n
  1. announce deprecation in release notes,
  2. \n
  3. provide warning period,
  4. \n
  5. provide migration tooling where feasible,
  6. \n
  7. remove deprecated behavior only in a version aligned with compatibility commitments.
  8. \n
\n

8.13 Data safety requirements#

\n

Migrations MUST NOT:

\n
    \n
  • silently drop unknown fields,
  • \n
  • silently convert valid date-only fields to datetime,
  • \n
  • silently rewrite recurrence semantics without explicit policy,
  • \n
  • silently materialize occurrence notes outside explicit user/configured materialization policy,
  • \n
  • silently delete materialized occurrence notes during recurrence edits,
  • \n
  • silently drop unresolved dependency entries,
  • \n
  • silently rewrite link targets to different destinations without explicit policy,
  • \n
  • silently delete reminders unless explicitly requested.
  • \n
\n

8.14 Suggested migration report format#

\n
spec_version_from: 0.1.0-draft\nspec_version_to: 0.3.0-rc.3\nfiles_scanned: 214\nfiles_changed: 67\nwarnings:\n  alias_conflict_ignored: 3\n  instance_state_overlap_resolved: 2\n  occurrence_state_conflict: 1\n  unresolved_dependency_target: 4\nchanges:\n  normalized_datetime_fields: 41\n  alias_keys_removed: 29\n  instance_overlaps_fixed: 2\n  occurrence_state_conflicts: 1\n  inferred_dependency_reltype: 5\n  generated_reminder_ids: 8\n  normalized_link_targets: 14\n

8.15 Compatibility statement example#

\n
Compatibility mode: legacy-aliases=true, legacy-timeentry-duration=true\nPlanned removal: v2.0.0\nMigration command: tasknotes migrate --normalize-frontmatter\n
","text":"8.1 Purpose# This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage. 8.2 Compatibility modes# Implementations MAY support compatibility modes for legacy behavior. If supported, compatibility modes MUST: be explicitly enabled or disabled, be discoverable through configuration or capability metadata, not be silently enabled by default in new collections. 8.3 Migration expectations# When canonical behavior differs from historical behavior, implementations SHOULD provide: deterministic migration rules, dry-run preview support, rollback-safe workflow guidance. 8.4 Alias normalization migration# For legacy key aliases, a migration SHOULD: read both canonical and alias keys, choose canonical value deterministically (recommended: canonical key precedence), rewrite persisted file using canonical keys, preserve unrelated unknown fields. 8.4.1 Example# Before: recurrenceAnchor: scheduled recurrence_anchor: completion After normalization: recurrenceAnchor: scheduled With warning: alias_conflict_ignored: alias value ignored because canonical key present. 8.5 Temporal normalization migration# If historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO Z for datetime roles while preserving date-only roles as dates. Example: Before: dateCreated: 2026-02-20 10:00:00+00:00 After: dateCreated: 2026-02-20T10:00:00Z 8.6 Recurrence state migration# If historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically. Recommended resolution policy: if overlap exists, prefer most recent user action where recoverable, otherwise prefer complete_instances and remove overlapping skip entries, emit migration report for affected dates. Policy choice MUST be documented. 8.7 Materialized occurrence migration# When introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation. Recommended migration behavior: do not materialize historical or future occurrence notes unless explicitly requested; preserve existing parent complete_instances and skipped_instances; when importing existing per-occurrence task files, require deterministic parent/date matching before adding recurrence_parent and occurrence_date; when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report occurrence_state_conflict; provide a dry-run report before converting existing task files into materialized occurrence notes. Migration tooling MUST NOT silently delete occurrence notes or parent recurring tasks. 8.8 Dependency migration# When migrating legacy dependency data, implementations SHOULD: normalize dependency key names to mapped canonical key, ensure each entry has uid and canonical reltype, normalize legacy string/path references into configured canonical reference style, remove duplicate dependency entries by policy. If historical data omits reltype, migration MAY apply dependencies.default_reltype and SHOULD report count of inferred values. 8.9 Reminder migration# When migrating legacy reminder data, implementations SHOULD: normalize reminder key names, normalize type values to canonical enum (absolute or relative), normalize relatedTo values to canonical enum (due or scheduled), normalize absoluteTime to canonical UTC ISO Z, validate and normalize offsets to ISO 8601 duration syntax. If reminder id values are missing, migration MAY generate IDs and MUST report generated count. 8.10 Link migration# When migrating legacy link values, implementations SHOULD: normalize supported link syntaxes according to §11 parsing rules, preserve alias and anchor components where possible, normalize resolved targets into canonical write format by policy, detect and report ambiguous links instead of silently choosing non-deterministically. 8.11 Divergence register# Implementations SHOULD maintain a divergence register with columns: section current behavior target canonical behavior migration strategy deprecation timeline 8.12 Deprecation policy# For any behavior deprecated by the specification: announce deprecation in release notes, provide warning period, provide migration tooling where feasible, remove deprecated behavior only in a version aligned with compatibility commitments. 8.13 Data safety requirements# Migrations MUST NOT: silently drop unknown fields, silently convert valid date-only fields to datetime, silently rewrite recurrence semantics without explicit policy, silently materialize occurrence notes outside explicit user/configured materialization policy, silently delete materialized occurrence notes during recurrence edits, silently drop unresolved dependency entries, silently rewrite link targets to different destinations without explicit policy, silently delete reminders unless explicitly requested. 8.14 Suggested migration report format# spec_version_from: 0.1.0-draft spec_version_to: 0.3.0-rc.3 files_scanned: 214 files_changed: 67 warnings: alias_conflict_ignored: 3 instance_state_overlap_resolved: 2 occurrence_state_conflict: 1 unresolved_dependency_target: 4 changes: normalized_datetime_fields: 41 alias_keys_removed: 29 instance_overlaps_fixed: 2 occurrence_state_conflicts: 1 inferred_dependency_reltype: 5 generated_reminder_ids: 8 normalized_link_targets: 14 8.15 Compatibility statement example# Compatibility mode: legacy-aliases=true, legacy-timeentry-duration=true Planned removal: v2.0.0 Migration command: tasknotes migrate --normalize-frontmatter"},{"route":"/developers/specification/09-configuration/","title":"9. Configuration","description":"This section defines the normative configuration model for collections using tasknotes-spec.","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:09-configuration.md","namespace":"specification","relativePath":"09-configuration.md","raw":"# 9. Configuration\n\n## 9.1 Purpose\n\nThis section defines the normative configuration model for collections using `tasknotes-spec`.\n\n## 9.2 Configuration provider model\n\nImplementations MUST derive an **effective configuration** from one or more configuration providers.\n\nA provider is a source adapter that returns a partial configuration normalized to this section's schema.\n\nImplementations MUST:\n\n- support at least one provider,\n- document supported providers,\n- document provider precedence order,\n- disclose active providers and fallback behavior in conformance output (§7).\n\n### 9.2.1 Common provider types\n\nCommon providers include:\n\n- `yaml_file`: a `tasknotes.yaml` document at collection root,\n- `tasknotes_plugin_data_json`: `.obsidian/plugins/tasknotes/data.json`,\n- `built_in_defaults`: implementation defaults,\n- optional runtime/CLI/env overrides.\n\nThis list is not exhaustive.\n\n### 9.2.2 Deterministic precedence and merge\n\nProvider precedence MUST be deterministic.\n\nUnless explicitly documented otherwise, implementations MUST resolve configuration per top-level key:\n\n- for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins,\n- winning object values replace lower-precedence object values as whole objects (no implicit deep merge),\n- after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration.\n\nIf an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic.\n\n### 9.2.3 Strict vs permissive provider behavior\n\nIn strict mode:\n\n- failure to resolve required effective keys (`spec_version`, `mapping`) MUST be a configuration error.\n\nIf permissive mode is implemented, then in permissive mode:\n\n- implementations MAY continue with defaults when providers are missing/unreadable,\n- implementations MUST emit configuration warnings,\n- implementations MUST disclose that effective configuration is partial/default-derived.\n\n### 9.2.4 TaskNotes plugin provider (`data.json`)\n\nThe TaskNotes plugin stores settings in `.obsidian/plugins/tasknotes/data.json` within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below.\n\n**Key mapping table** (`data.json` key → spec effective config):\n\n| `data.json` key | Spec key | Notes |\n|---|---|---|\n| `fieldMapping` | `mapping` | Normalize role names: `dateCreated`→`date_created`, `completedDate`→`completed_date`, `recurrenceAnchor`→`recurrence_anchor`, `completeInstances`→`complete_instances`, `skippedInstances`→`skipped_instances`, `recurrenceParent`→`recurrence_parent`, `occurrenceDate`→`occurrence_date`, `occurrenceMaterialization`→`occurrence_materialization`, `occurrenceNextTrigger`→`occurrence_next_trigger`, `occurrenceTemplate`→`occurrence_template`, `occurrencePastHorizon`→`occurrence_past_horizon`, `occurrenceFutureHorizon`→`occurrence_future_horizon`, `blockedBy`→`blocked_by`, `timeEntries`→`time_entries`, `timeEstimate`→`time_estimate` |\n| `storeTitleInFilename` | `title.storage` | `true` → `\"filename\"`, `false` → `\"frontmatter\"` |\n| `taskFilenameFormat` | `title.filename_format` | Values: `\"title\"`, `\"zettel\"`, `\"timestamp\"`, `\"custom\"`; used only when `title.storage=frontmatter` for canonical writes, but preserved as compatibility input when present |\n| `customFilenameTemplate` | `title.custom_filename_template` | Template string, e.g. `\"{title}\"`; used only when `title.storage=frontmatter` and `filename_format=custom` |\n| `taskCreationDefaults.useBodyTemplate` | `templating.enabled` | boolean |\n| `taskCreationDefaults.bodyTemplate` | `templating.template_path` | Path to template file |\n| `customStatuses[*].value` | `status.values` | Ordered array of status value strings |\n| `defaultTaskStatus` | `status.default` | Default status string |\n| `customStatuses[isCompleted=true][*].value` | `status.completed_values` | Statuses where `isCompleted: true` |\n| `defaultTaskPriority` | `defaults.priority` | Default priority string |\n| `autoStopTimeTrackingOnComplete` | `time_tracking.auto_stop_on_complete` | boolean |\n| `autoStopTimeTrackingNotification` | `time_tracking.auto_stop_notification` | boolean |\n| `taskIdentificationMethod` | `task_detection.method` | `\"tag\"` or `\"property\"` |\n| `taskTag` | `task_detection.tag` | Tag string used when `method=\"tag\"` |\n| `taskPropertyName` | `task_detection.property_name` | Frontmatter key used when `method=\"property\"` |\n| `taskPropertyValue` | `task_detection.property_value` | Expected value; empty means key must exist |\n| `tasksFolder` | `task_detection.default_folder` | Default folder for new tasks |\n| `excludedFolders` | `task_detection.excluded_folders` | Comma-separated folder paths to exclude |\n| `moveArchivedTasks` | `archive.move_on_archive` | boolean |\n| `archiveFolder` | `archive.folder` | Archive destination folder |\n| `useFrontmatterMarkdownLinks` | `links.use_markdown_format` | boolean; see §11 |\n\n**Key `data.json` fields with defaults** (for cold-start reading of a vault with no `tasknotes.yaml`):\n\n| Field | Type | Default | Meaning |\n|---|---|---|---|\n| `tasksFolder` | string | `\"TaskNotes/Tasks\"` | Default folder for new task files |\n| `taskIdentificationMethod` | `\"tag\" \\| \"property\"` | `\"tag\"` | How task files are identified |\n| `taskTag` | string | `\"task\"` | Tag that identifies task files (when `method=\"tag\"`) |\n| `taskPropertyName` | string | `\"\"` | Frontmatter key for property-based identification |\n| `taskPropertyValue` | string | `\"\"` | Expected value for property-based identification (empty = key presence) |\n| `storeTitleInFilename` | boolean | `true` | Title storage mode |\n| `taskFilenameFormat` | `\"title\" \\| \"zettel\" \\| \"timestamp\" \\| \"custom\"` | `\"title\"` | Filename generation format |\n| `customFilenameTemplate` | string | `\"{title}\"` | Template for `\"custom\"` filename format |\n| `defaultTaskStatus` | string | `\"open\"` | Default status on create |\n| `defaultTaskPriority` | string | `\"normal\"` | Default priority on create |\n| `customStatuses` | StatusConfig[] | see object shape below | Ordered status definitions |\n| `autoStopTimeTrackingOnComplete` | boolean | `true` | Auto-stop active session on completion |\n| `autoStopTimeTrackingNotification` | boolean | `false` | Show notification when auto-stopping |\n| `useFrontmatterMarkdownLinks` | boolean | `false` | Use markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin) |\n| `moveArchivedTasks` | boolean | `false` | Move task file to archive folder on archive |\n| `archiveFolder` | string | `\"TaskNotes/Archive\"` | Archive destination folder |\n| `excludedFolders` | string | `\"\"` | Comma-separated folders to exclude from task indexing |\n\n**StatusConfig object shape:**\n\n```json\n{\n \"id\": \"done\",\n \"value\": \"done\",\n \"label\": \"Done\",\n \"color\": \"#00aa00\",\n \"isCompleted\": true,\n \"order\": 3,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n}\n```\n\n`spec_version` is not present in `data.json`. Implementations MUST synthesize an effective `spec_version` as described in §9.5.\n\nProvider keys not listed above MAY be ignored by `tasknotes-spec` consumers.\n\n## 9.3 Required top-level keys\n\nRequired keys apply to the effective configuration after provider resolution.\n\n| Key | Type | Required | Description |\n|---|---|---|---|\n| `spec_version` | string | yes | target spec version (provider-supplied or synthesized per §9.5) |\n| `mapping` | object | yes | semantic role to storage key mapping |\n\n## 9.4 Recommended top-level keys\n\n| Key | Type | Description |\n|---|---|---|\n| `task_detection` | object | task file identification rules |\n| `defaults` | object | role defaults used during create |\n| `status` | object | status set and completed-value semantics |\n| `validation` | object | validation behavior (`strict` required, `permissive` optional) |\n| `links` | object | link parsing/resolution behavior |\n| `title` | object | title source and filename behavior policy |\n| `templating` | object | optional create-time templating behavior policy |\n| `dependencies` | object | dependency behavior policy |\n| `reminders` | object | reminder behavior policy |\n| `time_tracking` | object | time-tracking management behavior policy |\n| `occurrences` | object | recurrence materialization defaults and bounds |\n| `compatibility` | object | legacy alias/behavior switches |\n\n## 9.5 spec_version behavior\n\n`spec_version` MUST be a semantic version string.\nPre-release identifiers are valid (for example `0.3.0-rc.3`).\n\nImplementations in strict mode MUST reject unsupported major versions.\n\nIf permissive mode is implemented, permissive mode MAY proceed with warning when major version differs.\n\nIf a provider does not supply `spec_version` (for example TaskNotes `data.json`), implementations MUST synthesize an effective `spec_version` matching their target `tasknotes-spec` version and SHOULD disclose that it was synthesized.\n\n## 9.6 mapping schema\n\n`mapping` MUST map semantic roles (from §2) to string storage keys.\n\nMinimum required roles in mapping:\n\n- `title`\n- `status`\n- `completed_date`\n- `date_created`\n- `date_modified`\n\nIf semantic role `id` is supported (§2.6.5), mapping SHOULD include `id`.\nIf profile `materialized-occurrences` is claimed, mapping MUST include `recurrence_parent` and `occurrence_date`, and SHOULD include parent policy roles (`occurrence_materialization`, `occurrence_next_trigger`, `occurrence_template`, `occurrence_past_horizon`, `occurrence_future_horizon`).\n\nExample:\n\n```yaml\nmapping:\n title: title\n status: status\n date_created: dateCreated\n date_modified: dateModified\n completed_date: completedDate\n recurrence: recurrence\n recurrence_anchor: recurrenceAnchor\n complete_instances: completeInstances\n skipped_instances: skippedInstances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\n attachments: attachments\n```\n\n## 9.7 task_detection schema\n\n`task_detection` controls how task files are identified within the vault.\n\n### Detection methods\n\nThe tasknotes plugin natively supports two identification methods, controlled by `taskIdentificationMethod` in `data.json` (mapped to `task_detection.method`):\n\n**`tag` (default)** — A markdown file is a task if it contains the configured tag (default `#task`) in its frontmatter `tags` array or inline in the body. Configured by `task_detection.tag`.\n\n**`property`** — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by `task_detection.property_name` and `task_detection.property_value`.\n\nSchema and selection rules:\n\n1. `task_detection` MAY specify either:\n - `method` (single-method form), or\n - `methods` (multi-method form; non-empty list).\n2. If both are present, `methods` MUST take precedence and implementations SHOULD emit a configuration warning.\n3. If neither is present, effective detection method MUST default to `tag`.\n4. `method` MUST be `tag` or `property`.\n5. `methods` entries MUST be unique and MUST be from:\n - `tag`\n - `property`\n - `field_presence`\n - `field_match`\n6. Method-specific required keys:\n - when `tag` is enabled, effective `task_detection.tag` MUST be non-empty (default `task` when absent);\n - when `property` is enabled, `task_detection.property_name` MUST be provided and non-empty; `task_detection.property_value` MAY be empty (empty means key-exists semantics).\n7. If `methods` has more than one entry, `task_detection.combine` controls combination semantics (§9.7.3). If omitted, it MUST default to `or`.\n\n### 9.7.1 Tag matching semantics\n\nWhen `task_detection.method=tag`, matching MUST follow these rules:\n\n1. Normalize configured `task_detection.tag` by stripping one leading `#` when present.\n2. Compare tag names case-insensitively after normalization.\n3. Frontmatter matching:\n - `tags` MAY be a list of strings or a single string.\n - each tag value is normalized by trimming surrounding whitespace and stripping one leading `#`.\n - match requires exact normalized equality (for example `task` matches `#task`; `task` does not match `tasking`).\n4. Body matching:\n - only markdown text outside fenced code blocks and inline code spans is considered,\n - a match requires a hashtag token with exact normalized name (for example `#task`),\n - partial-word matches MUST NOT count (for example `#tasking` does not match configured `task`).\n\nIf either frontmatter or body matches, the file is identified as a task.\n\n### 9.7.2 Property matching semantics\n\nWhen property detection is enabled (`method=property` or `methods` includes `property`):\n\n1. `task_detection.property_name` MUST name the frontmatter key to inspect.\n2. If `task_detection.property_value` is non-empty, match requires semantic equality with the configured value.\n3. If `task_detection.property_value` is empty or absent, match requires key presence only.\n\n### 9.7.3 Multi-method extension semantics\n\n`tasknotes.yaml`-level providers MAY additionally support:\n\n- `field_presence` (example: required key `status`)\n- `field_match` (example: `type == \"task\"`)\n\nExtension-key shape:\n\n- `field_presence`: string or list of required frontmatter keys.\n- `field_match`: object map of `key -> expected scalar value` for exact semantic equality checks.\n\nIf multiple methods are configured in `tasknotes.yaml`, `task_detection.combine` MUST define combinator semantics:\n\n- `or` (default): file is a task if any enabled method matches.\n- `and`: file is a task only if all enabled methods match.\n\nIf `task_detection.combine` is absent, implementations MUST default to `or`.\n\nImplementations MUST exclude folders listed in `task_detection.excluded_folders` from task indexing.\n\nExecutable conformance: adapters participating in the fixture suite SHOULD expose `config.detect_task_file` to evaluate these detection semantics against fixture inputs.\n\nExample (`tasknotes.yaml`, equivalent to tag-based default):\n\n```yaml\ntask_detection:\n method: tag\n tag: task\n default_folder: TaskNotes/Tasks\n```\n\nExample (property-based):\n\n```yaml\ntask_detection:\n method: property\n property_name: type\n property_value: task\n```\n\n## 9.8 defaults schema\n\n`defaults` defines values used at create time when caller input omits a role.\n\nDefaults MUST NOT override explicit user input.\n\nExample:\n\n```yaml\ndefaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n reminders:\n - id: due_minus_1d\n type: relative\n relatedTo: due\n offset: -P1D\n```\n\n`defaults.reminders` behavior is defined in §10.3.9.\n\n## 9.9 status schema\n\n`status` defines known status values and completion semantics.\n\nExample:\n\n```yaml\nstatus:\n values: [open, in-progress, done, cancelled]\n default: open\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n```\n\nRules:\n\n- `default` MUST be one of `values`.\n- `completed_values` MUST be a non-empty list.\n- Each `completed_values` entry MUST be in `values`.\n- `skipped_values`, when present, MUST be a list whose entries are in `values`.\n- `default_skipped`, when present, MUST be in `skipped_values`.\n- For implementations claiming `materialized-occurrences`, `skipped_values` MUST NOT overlap `completed_values`.\n- Implementations claiming `materialized-occurrences` MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3).\n- Non-recurring completion MUST use this list, not hardcoded literals.\n- When a complete operation does not provide an explicit target status, writers MUST use the first entry of `completed_values`.\n- When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use `default_skipped` when present, otherwise the first entry of `skipped_values`.\n\n## 9.10 validation schema\n\nExample:\n\n```yaml\nvalidation:\n mode: strict\n reject_unknown_fields: false\n```\n\nRules:\n\n- `mode` MUST be `strict` or `permissive` when present.\n- If `mode` is absent, effective mode MUST default to `strict`.\n- Conforming implementations MUST support `strict`.\n- Implementations MAY support `permissive`.\n- If `mode=permissive` is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode.\n- `reject_unknown_fields=true` enforces closed-schema behavior for mapped roles.\n\n## 9.11 dependencies schema\n\nExample:\n\n```yaml\ndependencies:\n default_reltype: FINISHTOSTART\n treat_missing_target_as_blocked: true\n enforce_unique_uid: true\n unresolved_target_severity: warning\n require_resolved_uid_on_write: false\n```\n\nRules:\n\n- `default_reltype` MUST be one of the allowed reltype values in §10.2.\n- `treat_missing_target_as_blocked` controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5).\n- If `treat_missing_target_as_blocked` is absent, effective value MUST default to `true`.\n- `enforce_unique_uid=true` enforces uniqueness at validation/write time.\n- If `enforce_unique_uid` is absent, effective value MUST default to `true`.\n- `unresolved_target_severity` MUST be `warning` or `error`.\n- `require_resolved_uid_on_write=true` requires dependency UID resolution success for add/update operations.\n\n## 9.12 links schema\n\nExample:\n\n```yaml\nlinks:\n extensions: [\".md\"]\n unresolved_default_severity: warning\n update_references_on_rename: true\n```\n\nRules:\n\n- `extensions` defines extension trial order for extensionless targets.\n- `unresolved_default_severity` MUST be `warning` or `error`.\n- `update_references_on_rename=true` enables rename-time link rewrite behavior when supported.\n\n## 9.13 title schema\n\nExample (`storage=frontmatter`):\n\n```yaml\ntitle:\n storage: frontmatter\n filename_format: custom\n custom_filename_template: \"{{date}} {{title}}\"\n```\n\nExample (`storage=filename`):\n\n```yaml\ntitle:\n storage: filename\n```\n\nRules:\n\n- `storage` MUST be `frontmatter` or `filename`.\n- when `storage=frontmatter`, `filename_format` MUST be `title`, `zettel`, `timestamp`, or `custom`.\n- when `storage=frontmatter` and `filename_format=custom`, `custom_filename_template` MUST be provided and non-empty.\n- when `storage=filename`, `filename_format` and `custom_filename_template` MAY be present for compatibility input but MUST be ignored for canonical write behavior.\n- Read precedence MUST be storage-mode-aware:\n 1. when `storage=frontmatter`, use mapped `title` key when present and non-empty, then file basename fallback;\n 2. when `storage=filename`, use file basename first, then mapped `title` fallback when basename is unavailable.\n- If frontmatter and basename titles both exist and differ, the source authoritative for active `storage` MUST win.\n- If `storage=filename`, canonical writes MUST treat filename as title source, MUST rename on title change, and MUST ignore `filename_format` and `custom_filename_template`.\n- If `storage=frontmatter`, canonical writes MUST persist mapped title key; `filename_format` and `custom_filename_template` govern create-time filename generation.\n\nInformative mapping to TaskNotes settings:\n\n- `title.storage=filename` corresponds to `storeTitleInFilename=true`.\n- `title.filename_format` corresponds to `taskFilenameFormat`.\n- `title.custom_filename_template` corresponds to `customFilenameTemplate`.\n\n## 9.14 templating schema\n\n`templating` defines optional create-time template behavior.\nThis schema is required only for implementations claiming profile `templating` (§7.3.3).\n\nExample:\n\n```yaml\ntemplating:\n enabled: true\n template_path: Templates/Task.md\n failure_mode: warning_fallback\n unknown_variable_policy: preserve\n```\n\nRules:\n\n- `enabled` MUST be boolean.\n- If `enabled=true`, `template_path` MUST be provided and non-empty.\n- `failure_mode` MUST be `error` or `warning_fallback` when present.\n- `unknown_variable_policy` MUST be `preserve` or `empty` when present.\n- If `failure_mode` is absent, effective value MUST default to `warning_fallback`.\n- If `unknown_variable_policy` is absent, effective value MUST default to `preserve`.\n- Implementations claiming `templating` MUST support portable double-brace variables from §5.3.5.\n- Implementations not claiming `templating` MAY ignore `templating` settings.\n\n## 9.15 reminders schema\n\nExample:\n\n```yaml\nreminders:\n date_only_anchor_time: \"00:00\"\n apply_defaults_when_explicit: false\n```\n\nRules:\n\n- `date_only_anchor_time` MUST be `HH:MM` 24-hour local time format.\n- `date_only_anchor_time` is used by §10.3.4 for relative reminders against date-only bases.\n- `apply_defaults_when_explicit` MUST be boolean when present.\n- if `apply_defaults_when_explicit` is absent, effective value MUST default to `false`.\n- `apply_defaults_when_explicit=false` means explicit input reminders replace default-reminder application at create time.\n- `apply_defaults_when_explicit=true` means explicit create-time reminders are merged with defaults using §10.3.9 deterministic merge rules.\n\n## 9.16 time_tracking schema\n\nExample:\n\n```yaml\ntime_tracking:\n auto_stop_on_complete: true\n auto_stop_notification: false\n```\n\nRules:\n\n- `auto_stop_on_complete` MUST be boolean when present.\n- `auto_stop_notification` MUST be boolean when present.\n- if `auto_stop_on_complete=true`, completion-triggered stop behavior MUST follow §5.19.5.\n- if `auto_stop_notification` is absent, effective value MUST default to `false`.\n\n## 9.17 occurrences schema\n\n`occurrences` defines collection-level defaults for recurrence materialization.\nThis schema is required only for implementations claiming profile `materialized-occurrences` (§7.3.4).\n\nExample:\n\n```yaml\noccurrences:\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n```\n\nRules:\n\n- `default_materialization` MUST be one of `manual`, `on_completion`, or `rolling`.\n- If `default_materialization` is absent, effective value MUST default to `manual`.\n- `default_next_trigger` MUST be `completion` or `completion_or_skip`.\n- If `default_next_trigger` is absent, effective value MUST default to `completion`.\n- `past_horizon` and `future_horizon`, when present, MUST be ISO 8601 duration strings.\n- If `default_materialization=rolling`, implementations MUST use finite rolling bounds. If bounds are absent, documented finite defaults MUST be used.\n- Parent task fields override collection defaults: `occurrence_materialization` overrides `occurrences.default_materialization`; `occurrence_next_trigger` overrides `occurrences.default_next_trigger`; `occurrence_past_horizon` and `occurrence_future_horizon` override `occurrences.past_horizon` and `occurrences.future_horizon`.\n- If `occurrences` is absent, the effective behavior is `manual` materialization and `completion` next trigger.\n\n## 9.17.1 nlp schema\n\n`nlp` advertises optional natural-language capture triggers. These settings\nallow another TaskNotes client to preserve the same capture vocabulary without\nmaking natural-language parsing a requirement of the core profile.\n\nExample:\n\n```yaml\nnlp:\n triggers:\n - property_id: tags\n trigger: \"#\"\n enabled: true\n - property_id: contexts\n trigger: \"@\"\n enabled: true\n - property_id: priority\n trigger: \"!\"\n enabled: false\n```\n\nRules:\n\n- `triggers` MUST be a list when present.\n- Every trigger entry MUST contain non-empty `property_id` and `trigger`\n strings.\n- `property_id` SHOULD use a stable TaskNotes role (`tags`, `contexts`,\n `projects`, `status`, or `priority`) or the stable identifier of a configured\n user field.\n- `enabled` MUST be boolean when present and MUST default to `true`.\n- Trigger strings MAY contain more than one character.\n- Trigger entries with unknown `property_id` values MUST be preserved by\n configuration round-trips and MAY be ignored by clients that cannot resolve\n the property.\n- If `nlp` is absent, clients MAY use documented local defaults.\n- This block controls capture parsing and suggestions only. It MUST NOT change\n persisted task field names or values.\n\nInformative mapping to TaskNotes settings:\n\n- `nlp.triggers` corresponds to `nlpTriggers.triggers`.\n- `property_id`, `trigger`, and `enabled` correspond to the plugin fields\n `propertyId`, `trigger`, and `enabled`.\n\n## 9.18 compatibility schema\n\nExample:\n\n```yaml\ncompatibility:\n read_aliases: true\n legacy_duration_field: true\n legacy_local_datetime_input: false\n```\n\nRules:\n\n- Compatibility flags MUST default to conservative behavior in new collections.\n- `legacy_local_datetime_input=true` MAY relax strict parsing for offset-less datetimes only in permissive mode; strict mode parsing rules in §3.4.2 still apply.\n- Enabled compatibility flags SHOULD be disclosed in conformance output (§7).\n\n## 9.19 Complete configuration example (`yaml_file` provider)\n\n```yaml\nspec_version: 0.3.0-rc.3\n\nmapping:\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n attachments: attachments\n completed_date: completedDate\n date_created: dateCreated\n date_modified: dateModified\n recurrence: recurrence\n recurrence_anchor: recurrenceAnchor\n complete_instances: completeInstances\n skipped_instances: skippedInstances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\n\ntask_detection:\n method: tag\n tag: task\n default_folder: TaskNotes/Tasks\n\ndefaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n reminders:\n - id: due_minus_1d\n type: relative\n relatedTo: due\n offset: -P1D\n\nstatus:\n values: [open, in-progress, done, cancelled]\n default: open\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n\nvalidation:\n mode: strict\n reject_unknown_fields: false\n\ndependencies:\n default_reltype: FINISHTOSTART\n treat_missing_target_as_blocked: true\n enforce_unique_uid: true\n unresolved_target_severity: warning\n require_resolved_uid_on_write: false\n\nlinks:\n extensions: [\".md\"]\n unresolved_default_severity: warning\n update_references_on_rename: true\n\ntitle:\n storage: filename\n\ntemplating:\n enabled: false\n failure_mode: warning_fallback\n unknown_variable_policy: preserve\n\nreminders:\n date_only_anchor_time: \"00:00\"\n apply_defaults_when_explicit: false\n\ntime_tracking:\n auto_stop_on_complete: true\n auto_stop_notification: false\n\noccurrences:\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n\nnlp:\n triggers:\n - property_id: tags\n trigger: \"#\"\n enabled: true\n - property_id: contexts\n trigger: \"@\"\n enabled: true\n - property_id: projects\n trigger: \"+\"\n enabled: true\n - property_id: status\n trigger: \"*\"\n enabled: true\n - property_id: priority\n trigger: \"!\"\n enabled: false\n\ncompatibility:\n read_aliases: true\n legacy_duration_field: true\n```\n\n## 9.20 Configuration errors\n\nConfiguration validation MUST report structured errors with key path context.\n\nExamples:\n\n- no readable configuration provider available in strict mode\n- required effective key unresolved after provider resolution (`spec_version` or `mapping`)\n- missing `mapping.title`\n- `status.default` not present in `status.values`\n- `status.completed_values` contains a value not present in `status.values`\n- `status.skipped_values` contains a value not present in `status.values`\n- `status.default_skipped` not present in `status.skipped_values`\n- `status.skipped_values` overlaps `status.completed_values` when `materialized-occurrences` is claimed\n- unsupported `validation.mode`\n- `validation.mode=permissive` but permissive mode is not implemented\n- invalid `task_detection.method`\n- invalid `task_detection.methods` entry\n- empty `task_detection.tag` when `tag` method is enabled\n- missing `task_detection.property_name` when `property` method is enabled\n- invalid `task_detection.combine`\n- invalid `dependencies.default_reltype`\n- invalid `dependencies.unresolved_target_severity`\n- invalid `links.unresolved_default_severity`\n- invalid `title.storage`\n- invalid `title.filename_format`\n- missing `title.filename_format` when `title.storage=frontmatter`\n- missing `title.custom_filename_template` when `title.storage=frontmatter` and `title.filename_format=custom`\n- missing `templating.template_path` when `templating.enabled=true`\n- invalid `templating.failure_mode`\n- invalid `templating.unknown_variable_policy`\n- invalid `reminders.date_only_anchor_time`\n- invalid `reminders.apply_defaults_when_explicit`\n- invalid `time_tracking.auto_stop_on_complete`\n- invalid `time_tracking.auto_stop_notification`\n- invalid `occurrences.default_materialization`\n- invalid `occurrences.default_next_trigger`\n- invalid `occurrences.past_horizon`\n- invalid `occurrences.future_horizon`\n- invalid `nlp.triggers`\n- empty `nlp.triggers[].property_id`\n- empty `nlp.triggers[].trigger`\n- invalid `nlp.triggers[].enabled`\n\n## 9.21 Default collection state\n\nThis section describes what a fresh tasknotes vault looks like before any user customization. Implementations that read an existing tasknotes vault without a `tasknotes.yaml` SHOULD apply these defaults when `data.json` is absent or fields are missing.\n\n### Folder layout\n\n```text\nMyVault/\n├── TaskNotes/\n│ ├── Tasks/ ← new tasks created here by default\n│ └── Archive/ ← archived tasks moved here (if moveArchivedTasks=true)\n└── .obsidian/\n └── plugins/\n └── tasknotes/\n └── data.json\n```\n\n### Task detection\n\nDefault method: `tag`. A file is a task if it contains the tag `#task` in its frontmatter `tags` array or inline in the body.\n\n### Default field mapping\n\n| Semantic role | Default storage key |\n|---|---|\n| `title` | `title` |\n| `status` | `status` |\n| `priority` | `priority` |\n| `due` | `due` |\n| `scheduled` | `scheduled` |\n| `contexts` | `contexts` |\n| `projects` | `projects` |\n| `time_estimate` | `timeEstimate` |\n| `completed_date` | `completedDate` |\n| `date_created` | `dateCreated` |\n| `date_modified` | `dateModified` |\n| `recurrence` | `recurrence` |\n| `recurrence_anchor` | `recurrence_anchor` |\n| `complete_instances` | `complete_instances` |\n| `skipped_instances` | `skipped_instances` |\n| `recurrence_parent` | `recurrence_parent` |\n| `occurrence_date` | `occurrence_date` |\n| `occurrence_materialization` | `occurrence_materialization` |\n| `occurrence_next_trigger` | `occurrence_next_trigger` |\n| `occurrence_template` | `occurrence_template` |\n| `occurrence_past_horizon` | `occurrence_past_horizon` |\n| `occurrence_future_horizon` | `occurrence_future_horizon` |\n| `time_entries` | `timeEntries` |\n| `blocked_by` | `blockedBy` |\n| `reminders` | `reminders` |\n\nNote: `recurrenceAnchor`, `completeInstances`, and `skippedInstances` are accepted as aliases on read (§2.5). The mixed camelCase/snake_case defaults are intentional for compatibility with historical TaskNotes frontmatter.\n\n### Default statuses\n\n| Value | Label | `isCompleted` | Order |\n|---|---|---|---|\n| `none` | None | false | 0 |\n| `open` | Open | false | 1 |\n| `in-progress` | In progress | false | 2 |\n| `done` | Done | true | 3 |\n\nDefault status on create: `open`. Default completed status (first `isCompleted=true`): `done`.\nNo skipped status is configured by default; implementations that support materialized occurrence skips MUST require configuration or expose a documented default before writing skipped occurrence state.\n\n### Default priorities\n\n| Value | Label | Weight |\n|---|---|---|\n| `none` | None | 0 |\n| `low` | Low | 1 |\n| `normal` | Normal | 2 |\n| `high` | High | 3 |\n\nDefault priority on create: `normal`.\n\n### Title and filename defaults\n\n- `title.storage`: `filename` (filename/path is the authoritative title source)\n- default basename generation under `title.storage=filename` derives from semantic title using filename-safe sanitization\n- implementations MAY also keep mapped `title` in frontmatter as a synchronized compatibility mirror\n- TaskNotes `data.json` may still contain legacy `taskFilenameFormat` values such as `zettel`, but these are compatibility inputs rather than the forward default when `title.storage=filename`\n- title is read from filename first; frontmatter `title` is compatibility fallback when filename-derived title is unavailable (§2.2.2)\n\n### Time tracking defaults\n\n- `auto_stop_on_complete`: `true`\n- `auto_stop_notification`: `false`\n\n### Link format defaults\n\n- `useFrontmatterMarkdownLinks`: `false` — wikilinks used by default (e.g. `[[task-name]]`)\n- To use markdown link format, the `obsidian-frontmatter-markdown-links` plugin must also be installed\n\n### Effective configuration for a minimal fresh vault\n\nWhen neither `data.json` nor `tasknotes.yaml` is present, implementations MUST use the following effective configuration:\n\n```yaml\nspec_version: 0.3.0-rc.3 # synthesized\nmapping:\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n attachments: attachments\n time_estimate: timeEstimate\n completed_date: completedDate\n date_created: dateCreated\n date_modified: dateModified\n recurrence: recurrence\n recurrence_anchor: recurrence_anchor\n complete_instances: complete_instances\n skipped_instances: skipped_instances\n recurrence_parent: recurrence_parent\n occurrence_date: occurrence_date\n occurrence_materialization: occurrence_materialization\n occurrence_next_trigger: occurrence_next_trigger\n occurrence_template: occurrence_template\n occurrence_past_horizon: occurrence_past_horizon\n occurrence_future_horizon: occurrence_future_horizon\n time_entries: timeEntries\n blocked_by: blockedBy\n reminders: reminders\ntask_detection:\n method: tag\n tag: task\n default_folder: TaskNotes/Tasks\nstatus:\n values: [none, open, in-progress, done]\n default: open\n completed_values: [done]\ntitle:\n storage: filename\ntime_tracking:\n auto_stop_on_complete: true\n auto_stop_notification: false\nlinks:\n use_markdown_format: false\n extensions: [\".md\"]\n unresolved_default_severity: warning\n update_references_on_rename: true\n```\n","aliases":["/spec/09-configuration/"],"toc":[{"level":2,"id":"91-purpose","text":"9.1 Purpose"},{"level":2,"id":"92-configuration-provider-model","text":"9.2 Configuration provider model"},{"level":3,"id":"921-common-provider-types","text":"9.2.1 Common provider types"},{"level":3,"id":"922-deterministic-precedence-and-merge","text":"9.2.2 Deterministic precedence and merge"},{"level":3,"id":"923-strict-vs-permissive-provider-behavior","text":"9.2.3 Strict vs permissive provider behavior"},{"level":3,"id":"924-tasknotes-plugin-provider-datajson","text":"9.2.4 TaskNotes plugin provider (data.json)"},{"level":2,"id":"93-required-top-level-keys","text":"9.3 Required top-level keys"},{"level":2,"id":"94-recommended-top-level-keys","text":"9.4 Recommended top-level keys"},{"level":2,"id":"95-specversion-behavior","text":"9.5 spec_version behavior"},{"level":2,"id":"96-mapping-schema","text":"9.6 mapping schema"},{"level":2,"id":"97-taskdetection-schema","text":"9.7 task_detection schema"},{"level":3,"id":"detection-methods","text":"Detection methods"},{"level":3,"id":"971-tag-matching-semantics","text":"9.7.1 Tag matching semantics"},{"level":3,"id":"972-property-matching-semantics","text":"9.7.2 Property matching semantics"},{"level":3,"id":"973-multi-method-extension-semantics","text":"9.7.3 Multi-method extension semantics"},{"level":2,"id":"98-defaults-schema","text":"9.8 defaults schema"},{"level":2,"id":"99-status-schema","text":"9.9 status schema"},{"level":2,"id":"910-validation-schema","text":"9.10 validation schema"},{"level":2,"id":"911-dependencies-schema","text":"9.11 dependencies schema"},{"level":2,"id":"912-links-schema","text":"9.12 links schema"},{"level":2,"id":"913-title-schema","text":"9.13 title schema"},{"level":2,"id":"914-templating-schema","text":"9.14 templating schema"},{"level":2,"id":"915-reminders-schema","text":"9.15 reminders schema"},{"level":2,"id":"916-timetracking-schema","text":"9.16 time_tracking schema"},{"level":2,"id":"917-occurrences-schema","text":"9.17 occurrences schema"},{"level":2,"id":"9171-nlp-schema","text":"9.17.1 nlp schema"},{"level":2,"id":"918-compatibility-schema","text":"9.18 compatibility schema"},{"level":2,"id":"919-complete-configuration-example-yamlfile-provider","text":"9.19 Complete configuration example (yaml_file provider)"},{"level":2,"id":"920-configuration-errors","text":"9.20 Configuration errors"},{"level":2,"id":"921-default-collection-state","text":"9.21 Default collection state"},{"level":3,"id":"folder-layout","text":"Folder layout"},{"level":3,"id":"task-detection","text":"Task detection"},{"level":3,"id":"default-field-mapping","text":"Default field mapping"},{"level":3,"id":"default-statuses","text":"Default statuses"},{"level":3,"id":"default-priorities","text":"Default priorities"},{"level":3,"id":"title-and-filename-defaults","text":"Title and filename defaults"},{"level":3,"id":"time-tracking-defaults","text":"Time tracking defaults"},{"level":3,"id":"link-format-defaults","text":"Link format defaults"},{"level":3,"id":"effective-configuration-for-a-minimal-fresh-vault","text":"Effective configuration for a minimal fresh vault"}],"html":"

9.1 Purpose#

\n

This section defines the normative configuration model for collections using tasknotes-spec.

\n

9.2 Configuration provider model#

\n

Implementations MUST derive an effective configuration from one or more configuration providers.

\n

A provider is a source adapter that returns a partial configuration normalized to this section's schema.

\n

Implementations MUST:

\n
    \n
  • support at least one provider,
  • \n
  • document supported providers,
  • \n
  • document provider precedence order,
  • \n
  • disclose active providers and fallback behavior in conformance output (§7).
  • \n
\n

9.2.1 Common provider types#

\n

Common providers include:

\n
    \n
  • yaml_file: a tasknotes.yaml document at collection root,
  • \n
  • tasknotes_plugin_data_json: .obsidian/plugins/tasknotes/data.json,
  • \n
  • built_in_defaults: implementation defaults,
  • \n
  • optional runtime/CLI/env overrides.
  • \n
\n

This list is not exhaustive.

\n

9.2.2 Deterministic precedence and merge#

\n

Provider precedence MUST be deterministic.

\n

Unless explicitly documented otherwise, implementations MUST resolve configuration per top-level key:

\n
    \n
  • for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins,
  • \n
  • winning object values replace lower-precedence object values as whole objects (no implicit deep merge),
  • \n
  • after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration.
  • \n
\n

If an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic.

\n

9.2.3 Strict vs permissive provider behavior#

\n

In strict mode:

\n
    \n
  • failure to resolve required effective keys (spec_version, mapping) MUST be a configuration error.
  • \n
\n

If permissive mode is implemented, then in permissive mode:

\n
    \n
  • implementations MAY continue with defaults when providers are missing/unreadable,
  • \n
  • implementations MUST emit configuration warnings,
  • \n
  • implementations MUST disclose that effective configuration is partial/default-derived.
  • \n
\n

9.2.4 TaskNotes plugin provider (data.json)#

\n

The TaskNotes plugin stores settings in .obsidian/plugins/tasknotes/data.json within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below.

\n

Key mapping table (data.json key → spec effective config):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
data.json keySpec keyNotes
fieldMappingmappingNormalize role names: dateCreated→date_created, completedDate→completed_date, recurrenceAnchor→recurrence_anchor, completeInstances→complete_instances, skippedInstances→skipped_instances, recurrenceParent→recurrence_parent, occurrenceDate→occurrence_date, occurrenceMaterialization→occurrence_materialization, occurrenceNextTrigger→occurrence_next_trigger, occurrenceTemplate→occurrence_template, occurrencePastHorizon→occurrence_past_horizon, occurrenceFutureHorizon→occurrence_future_horizon, blockedBy→blocked_by, timeEntries→time_entries, timeEstimate→time_estimate
storeTitleInFilenametitle.storagetrue → "filename", false → "frontmatter"
taskFilenameFormattitle.filename_formatValues: "title", "zettel", "timestamp", "custom"; used only when title.storage=frontmatter for canonical writes, but preserved as compatibility input when present
customFilenameTemplatetitle.custom_filename_templateTemplate string, e.g. "{title}"; used only when title.storage=frontmatter and filename_format=custom
taskCreationDefaults.useBodyTemplatetemplating.enabledboolean
taskCreationDefaults.bodyTemplatetemplating.template_pathPath to template file
customStatuses[*].valuestatus.valuesOrdered array of status value strings
defaultTaskStatusstatus.defaultDefault status string
customStatuses[isCompleted=true][*].valuestatus.completed_valuesStatuses where isCompleted: true
defaultTaskPrioritydefaults.priorityDefault priority string
autoStopTimeTrackingOnCompletetime_tracking.auto_stop_on_completeboolean
autoStopTimeTrackingNotificationtime_tracking.auto_stop_notificationboolean
taskIdentificationMethodtask_detection.method"tag" or "property"
taskTagtask_detection.tagTag string used when method="tag"
taskPropertyNametask_detection.property_nameFrontmatter key used when method="property"
taskPropertyValuetask_detection.property_valueExpected value; empty means key must exist
tasksFoldertask_detection.default_folderDefault folder for new tasks
excludedFolderstask_detection.excluded_foldersComma-separated folder paths to exclude
moveArchivedTasksarchive.move_on_archiveboolean
archiveFolderarchive.folderArchive destination folder
useFrontmatterMarkdownLinkslinks.use_markdown_formatboolean; see §11
\n

Key data.json fields with defaults (for cold-start reading of a vault with no tasknotes.yaml):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldTypeDefaultMeaning
tasksFolderstring"TaskNotes/Tasks"Default folder for new task files
taskIdentificationMethod"tag" | "property""tag"How task files are identified
taskTagstring"task"Tag that identifies task files (when method="tag")
taskPropertyNamestring""Frontmatter key for property-based identification
taskPropertyValuestring""Expected value for property-based identification (empty = key presence)
storeTitleInFilenamebooleantrueTitle storage mode
taskFilenameFormat"title" | "zettel" | "timestamp" | "custom""title"Filename generation format
customFilenameTemplatestring"{title}"Template for "custom" filename format
defaultTaskStatusstring"open"Default status on create
defaultTaskPrioritystring"normal"Default priority on create
customStatusesStatusConfig[]see object shape belowOrdered status definitions
autoStopTimeTrackingOnCompletebooleantrueAuto-stop active session on completion
autoStopTimeTrackingNotificationbooleanfalseShow notification when auto-stopping
useFrontmatterMarkdownLinksbooleanfalseUse markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin)
moveArchivedTasksbooleanfalseMove task file to archive folder on archive
archiveFolderstring"TaskNotes/Archive"Archive destination folder
excludedFoldersstring""Comma-separated folders to exclude from task indexing
\n

StatusConfig object shape:

\n
{\n  "id": "done",\n  "value": "done",\n  "label": "Done",\n  "color": "#00aa00",\n  "isCompleted": true,\n  "order": 3,\n  "autoArchive": false,\n  "autoArchiveDelay": 5\n}\n

spec_version is not present in data.json. Implementations MUST synthesize an effective spec_version as described in §9.5.

\n

Provider keys not listed above MAY be ignored by tasknotes-spec consumers.

\n

9.3 Required top-level keys#

\n

Required keys apply to the effective configuration after provider resolution.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyTypeRequiredDescription
spec_versionstringyestarget spec version (provider-supplied or synthesized per §9.5)
mappingobjectyessemantic role to storage key mapping
\n\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
KeyTypeDescription
task_detectionobjecttask file identification rules
defaultsobjectrole defaults used during create
statusobjectstatus set and completed-value semantics
validationobjectvalidation behavior (strict required, permissive optional)
linksobjectlink parsing/resolution behavior
titleobjecttitle source and filename behavior policy
templatingobjectoptional create-time templating behavior policy
dependenciesobjectdependency behavior policy
remindersobjectreminder behavior policy
time_trackingobjecttime-tracking management behavior policy
occurrencesobjectrecurrence materialization defaults and bounds
compatibilityobjectlegacy alias/behavior switches
\n

9.5 spec_version behavior#

\n

spec_version MUST be a semantic version string.\nPre-release identifiers are valid (for example 0.3.0-rc.3).

\n

Implementations in strict mode MUST reject unsupported major versions.

\n

If permissive mode is implemented, permissive mode MAY proceed with warning when major version differs.

\n

If a provider does not supply spec_version (for example TaskNotes data.json), implementations MUST synthesize an effective spec_version matching their target tasknotes-spec version and SHOULD disclose that it was synthesized.

\n

9.6 mapping schema#

\n

mapping MUST map semantic roles (from §2) to string storage keys.

\n

Minimum required roles in mapping:

\n
    \n
  • title
  • \n
  • status
  • \n
  • completed_date
  • \n
  • date_created
  • \n
  • date_modified
  • \n
\n

If semantic role id is supported (§2.6.5), mapping SHOULD include id.\nIf profile materialized-occurrences is claimed, mapping MUST include recurrence_parent and occurrence_date, and SHOULD include parent policy roles (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon).

\n

Example:

\n
mapping:\n  title: title\n  status: status\n  date_created: dateCreated\n  date_modified: dateModified\n  completed_date: completedDate\n  recurrence: recurrence\n  recurrence_anchor: recurrenceAnchor\n  complete_instances: completeInstances\n  skipped_instances: skippedInstances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\n  attachments: attachments\n

9.7 task_detection schema#

\n

task_detection controls how task files are identified within the vault.

\n

Detection methods#

\n

The tasknotes plugin natively supports two identification methods, controlled by taskIdentificationMethod in data.json (mapped to task_detection.method):

\n

tag (default) — A markdown file is a task if it contains the configured tag (default #task) in its frontmatter tags array or inline in the body. Configured by task_detection.tag.

\n

property — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by task_detection.property_name and task_detection.property_value.

\n

Schema and selection rules:

\n
    \n
  1. task_detection MAY specify either:
      \n
    • method (single-method form), or
    • \n
    • methods (multi-method form; non-empty list).
    • \n
    \n
  2. \n
  3. If both are present, methods MUST take precedence and implementations SHOULD emit a configuration warning.
  4. \n
  5. If neither is present, effective detection method MUST default to tag.
  6. \n
  7. method MUST be tag or property.
  8. \n
  9. methods entries MUST be unique and MUST be from:
      \n
    • tag
    • \n
    • property
    • \n
    • field_presence
    • \n
    • field_match
    • \n
    \n
  10. \n
  11. Method-specific required keys:
      \n
    • when tag is enabled, effective task_detection.tag MUST be non-empty (default task when absent);
    • \n
    • when property is enabled, task_detection.property_name MUST be provided and non-empty; task_detection.property_value MAY be empty (empty means key-exists semantics).
    • \n
    \n
  12. \n
  13. If methods has more than one entry, task_detection.combine controls combination semantics (§9.7.3). If omitted, it MUST default to or.
  14. \n
\n

9.7.1 Tag matching semantics#

\n

When task_detection.method=tag, matching MUST follow these rules:

\n
    \n
  1. Normalize configured task_detection.tag by stripping one leading # when present.
  2. \n
  3. Compare tag names case-insensitively after normalization.
  4. \n
  5. Frontmatter matching:
      \n
    • tags MAY be a list of strings or a single string.
    • \n
    • each tag value is normalized by trimming surrounding whitespace and stripping one leading #.
    • \n
    • match requires exact normalized equality (for example task matches #task; task does not match tasking).
    • \n
    \n
  6. \n
  7. Body matching:
      \n
    • only markdown text outside fenced code blocks and inline code spans is considered,
    • \n
    • a match requires a hashtag token with exact normalized name (for example #task),
    • \n
    • partial-word matches MUST NOT count (for example #tasking does not match configured task).
    • \n
    \n
  8. \n
\n

If either frontmatter or body matches, the file is identified as a task.

\n

9.7.2 Property matching semantics#

\n

When property detection is enabled (method=property or methods includes property):

\n
    \n
  1. task_detection.property_name MUST name the frontmatter key to inspect.
  2. \n
  3. If task_detection.property_value is non-empty, match requires semantic equality with the configured value.
  4. \n
  5. If task_detection.property_value is empty or absent, match requires key presence only.
  6. \n
\n

9.7.3 Multi-method extension semantics#

\n

tasknotes.yaml-level providers MAY additionally support:

\n
    \n
  • field_presence (example: required key status)
  • \n
  • field_match (example: type == "task")
  • \n
\n

Extension-key shape:

\n
    \n
  • field_presence: string or list of required frontmatter keys.
  • \n
  • field_match: object map of key -> expected scalar value for exact semantic equality checks.
  • \n
\n

If multiple methods are configured in tasknotes.yaml, task_detection.combine MUST define combinator semantics:

\n
    \n
  • or (default): file is a task if any enabled method matches.
  • \n
  • and: file is a task only if all enabled methods match.
  • \n
\n

If task_detection.combine is absent, implementations MUST default to or.

\n

Implementations MUST exclude folders listed in task_detection.excluded_folders from task indexing.

\n

Executable conformance: adapters participating in the fixture suite SHOULD expose config.detect_task_file to evaluate these detection semantics against fixture inputs.

\n

Example (tasknotes.yaml, equivalent to tag-based default):

\n
task_detection:\n  method: tag\n  tag: task\n  default_folder: TaskNotes/Tasks\n

Example (property-based):

\n
task_detection:\n  method: property\n  property_name: type\n  property_value: task\n

9.8 defaults schema#

\n

defaults defines values used at create time when caller input omits a role.

\n

Defaults MUST NOT override explicit user input.

\n

Example:

\n
defaults:\n  status: open\n  priority: normal\n  recurrence_anchor: scheduled\n  reminders:\n    - id: due_minus_1d\n      type: relative\n      relatedTo: due\n      offset: -P1D\n

defaults.reminders behavior is defined in §10.3.9.

\n

9.9 status schema#

\n

status defines known status values and completion semantics.

\n

Example:

\n
status:\n  values: [open, in-progress, done, cancelled]\n  default: open\n  completed_values: [done]\n  skipped_values: [cancelled]\n  default_skipped: cancelled\n

Rules:

\n
    \n
  • default MUST be one of values.
  • \n
  • completed_values MUST be a non-empty list.
  • \n
  • Each completed_values entry MUST be in values.
  • \n
  • skipped_values, when present, MUST be a list whose entries are in values.
  • \n
  • default_skipped, when present, MUST be in skipped_values.
  • \n
  • For implementations claiming materialized-occurrences, skipped_values MUST NOT overlap completed_values.
  • \n
  • Implementations claiming materialized-occurrences MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3).
  • \n
  • Non-recurring completion MUST use this list, not hardcoded literals.
  • \n
  • When a complete operation does not provide an explicit target status, writers MUST use the first entry of completed_values.
  • \n
  • When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use default_skipped when present, otherwise the first entry of skipped_values.
  • \n
\n

9.10 validation schema#

\n

Example:

\n
validation:\n  mode: strict\n  reject_unknown_fields: false\n

Rules:

\n
    \n
  • mode MUST be strict or permissive when present.
  • \n
  • If mode is absent, effective mode MUST default to strict.
  • \n
  • Conforming implementations MUST support strict.
  • \n
  • Implementations MAY support permissive.
  • \n
  • If mode=permissive is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode.
  • \n
  • reject_unknown_fields=true enforces closed-schema behavior for mapped roles.
  • \n
\n

9.11 dependencies schema#

\n

Example:

\n
dependencies:\n  default_reltype: FINISHTOSTART\n  treat_missing_target_as_blocked: true\n  enforce_unique_uid: true\n  unresolved_target_severity: warning\n  require_resolved_uid_on_write: false\n

Rules:

\n
    \n
  • default_reltype MUST be one of the allowed reltype values in §10.2.
  • \n
  • treat_missing_target_as_blocked controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5).
  • \n
  • If treat_missing_target_as_blocked is absent, effective value MUST default to true.
  • \n
  • enforce_unique_uid=true enforces uniqueness at validation/write time.
  • \n
  • If enforce_unique_uid is absent, effective value MUST default to true.
  • \n
  • unresolved_target_severity MUST be warning or error.
  • \n
  • require_resolved_uid_on_write=true requires dependency UID resolution success for add/update operations.
  • \n
\n\n

Example:

\n
links:\n  extensions: [".md"]\n  unresolved_default_severity: warning\n  update_references_on_rename: true\n

Rules:

\n
    \n
  • extensions defines extension trial order for extensionless targets.
  • \n
  • unresolved_default_severity MUST be warning or error.
  • \n
  • update_references_on_rename=true enables rename-time link rewrite behavior when supported.
  • \n
\n

9.13 title schema#

\n

Example (storage=frontmatter):

\n
title:\n  storage: frontmatter\n  filename_format: custom\n  custom_filename_template: "{{date}} {{title}}"\n

Example (storage=filename):

\n
title:\n  storage: filename\n

Rules:

\n
    \n
  • storage MUST be frontmatter or filename.
  • \n
  • when storage=frontmatter, filename_format MUST be title, zettel, timestamp, or custom.
  • \n
  • when storage=frontmatter and filename_format=custom, custom_filename_template MUST be provided and non-empty.
  • \n
  • when storage=filename, filename_format and custom_filename_template MAY be present for compatibility input but MUST be ignored for canonical write behavior.
  • \n
  • Read precedence MUST be storage-mode-aware:
      \n
    1. when storage=frontmatter, use mapped title key when present and non-empty, then file basename fallback;
    2. \n
    3. when storage=filename, use file basename first, then mapped title fallback when basename is unavailable.
    4. \n
    \n
  • \n
  • If frontmatter and basename titles both exist and differ, the source authoritative for active storage MUST win.
  • \n
  • If storage=filename, canonical writes MUST treat filename as title source, MUST rename on title change, and MUST ignore filename_format and custom_filename_template.
  • \n
  • If storage=frontmatter, canonical writes MUST persist mapped title key; filename_format and custom_filename_template govern create-time filename generation.
  • \n
\n

Informative mapping to TaskNotes settings:

\n
    \n
  • title.storage=filename corresponds to storeTitleInFilename=true.
  • \n
  • title.filename_format corresponds to taskFilenameFormat.
  • \n
  • title.custom_filename_template corresponds to customFilenameTemplate.
  • \n
\n

9.14 templating schema#

\n

templating defines optional create-time template behavior.\nThis schema is required only for implementations claiming profile templating (§7.3.3).

\n

Example:

\n
templating:\n  enabled: true\n  template_path: Templates/Task.md\n  failure_mode: warning_fallback\n  unknown_variable_policy: preserve\n

Rules:

\n
    \n
  • enabled MUST be boolean.
  • \n
  • If enabled=true, template_path MUST be provided and non-empty.
  • \n
  • failure_mode MUST be error or warning_fallback when present.
  • \n
  • unknown_variable_policy MUST be preserve or empty when present.
  • \n
  • If failure_mode is absent, effective value MUST default to warning_fallback.
  • \n
  • If unknown_variable_policy is absent, effective value MUST default to preserve.
  • \n
  • Implementations claiming templating MUST support portable double-brace variables from §5.3.5.
  • \n
  • Implementations not claiming templating MAY ignore templating settings.
  • \n
\n

9.15 reminders schema#

\n

Example:

\n
reminders:\n  date_only_anchor_time: "00:00"\n  apply_defaults_when_explicit: false\n

Rules:

\n
    \n
  • date_only_anchor_time MUST be HH:MM 24-hour local time format.
  • \n
  • date_only_anchor_time is used by §10.3.4 for relative reminders against date-only bases.
  • \n
  • apply_defaults_when_explicit MUST be boolean when present.
  • \n
  • if apply_defaults_when_explicit is absent, effective value MUST default to false.
  • \n
  • apply_defaults_when_explicit=false means explicit input reminders replace default-reminder application at create time.
  • \n
  • apply_defaults_when_explicit=true means explicit create-time reminders are merged with defaults using §10.3.9 deterministic merge rules.
  • \n
\n

9.16 time_tracking schema#

\n

Example:

\n
time_tracking:\n  auto_stop_on_complete: true\n  auto_stop_notification: false\n

Rules:

\n
    \n
  • auto_stop_on_complete MUST be boolean when present.
  • \n
  • auto_stop_notification MUST be boolean when present.
  • \n
  • if auto_stop_on_complete=true, completion-triggered stop behavior MUST follow §5.19.5.
  • \n
  • if auto_stop_notification is absent, effective value MUST default to false.
  • \n
\n

9.17 occurrences schema#

\n

occurrences defines collection-level defaults for recurrence materialization.\nThis schema is required only for implementations claiming profile materialized-occurrences (§7.3.4).

\n

Example:

\n
occurrences:\n  default_materialization: manual\n  default_next_trigger: completion\n  past_horizon: P0D\n  future_horizon: P14D\n

Rules:

\n
    \n
  • default_materialization MUST be one of manual, on_completion, or rolling.
  • \n
  • If default_materialization is absent, effective value MUST default to manual.
  • \n
  • default_next_trigger MUST be completion or completion_or_skip.
  • \n
  • If default_next_trigger is absent, effective value MUST default to completion.
  • \n
  • past_horizon and future_horizon, when present, MUST be ISO 8601 duration strings.
  • \n
  • If default_materialization=rolling, implementations MUST use finite rolling bounds. If bounds are absent, documented finite defaults MUST be used.
  • \n
  • Parent task fields override collection defaults: occurrence_materialization overrides occurrences.default_materialization; occurrence_next_trigger overrides occurrences.default_next_trigger; occurrence_past_horizon and occurrence_future_horizon override occurrences.past_horizon and occurrences.future_horizon.
  • \n
  • If occurrences is absent, the effective behavior is manual materialization and completion next trigger.
  • \n
\n

9.17.1 nlp schema#

\n

nlp advertises optional natural-language capture triggers. These settings\nallow another TaskNotes client to preserve the same capture vocabulary without\nmaking natural-language parsing a requirement of the core profile.

\n

Example:

\n
nlp:\n  triggers:\n    - property_id: tags\n      trigger: "#"\n      enabled: true\n    - property_id: contexts\n      trigger: "@"\n      enabled: true\n    - property_id: priority\n      trigger: "!"\n      enabled: false\n

Rules:

\n
    \n
  • triggers MUST be a list when present.
  • \n
  • Every trigger entry MUST contain non-empty property_id and trigger\nstrings.
  • \n
  • property_id SHOULD use a stable TaskNotes role (tags, contexts,\nprojects, status, or priority) or the stable identifier of a configured\nuser field.
  • \n
  • enabled MUST be boolean when present and MUST default to true.
  • \n
  • Trigger strings MAY contain more than one character.
  • \n
  • Trigger entries with unknown property_id values MUST be preserved by\nconfiguration round-trips and MAY be ignored by clients that cannot resolve\nthe property.
  • \n
  • If nlp is absent, clients MAY use documented local defaults.
  • \n
  • This block controls capture parsing and suggestions only. It MUST NOT change\npersisted task field names or values.
  • \n
\n

Informative mapping to TaskNotes settings:

\n
    \n
  • nlp.triggers corresponds to nlpTriggers.triggers.
  • \n
  • property_id, trigger, and enabled correspond to the plugin fields\npropertyId, trigger, and enabled.
  • \n
\n

9.18 compatibility schema#

\n

Example:

\n
compatibility:\n  read_aliases: true\n  legacy_duration_field: true\n  legacy_local_datetime_input: false\n

Rules:

\n
    \n
  • Compatibility flags MUST default to conservative behavior in new collections.
  • \n
  • legacy_local_datetime_input=true MAY relax strict parsing for offset-less datetimes only in permissive mode; strict mode parsing rules in §3.4.2 still apply.
  • \n
  • Enabled compatibility flags SHOULD be disclosed in conformance output (§7).
  • \n
\n

9.19 Complete configuration example (yaml_file provider)#

\n
spec_version: 0.3.0-rc.3\n\nmapping:\n  title: title\n  status: status\n  priority: priority\n  due: due\n  scheduled: scheduled\n  attachments: attachments\n  completed_date: completedDate\n  date_created: dateCreated\n  date_modified: dateModified\n  recurrence: recurrence\n  recurrence_anchor: recurrenceAnchor\n  complete_instances: completeInstances\n  skipped_instances: skippedInstances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\n\ntask_detection:\n  method: tag\n  tag: task\n  default_folder: TaskNotes/Tasks\n\ndefaults:\n  status: open\n  priority: normal\n  recurrence_anchor: scheduled\n  reminders:\n    - id: due_minus_1d\n      type: relative\n      relatedTo: due\n      offset: -P1D\n\nstatus:\n  values: [open, in-progress, done, cancelled]\n  default: open\n  completed_values: [done]\n  skipped_values: [cancelled]\n  default_skipped: cancelled\n\nvalidation:\n  mode: strict\n  reject_unknown_fields: false\n\ndependencies:\n  default_reltype: FINISHTOSTART\n  treat_missing_target_as_blocked: true\n  enforce_unique_uid: true\n  unresolved_target_severity: warning\n  require_resolved_uid_on_write: false\n\nlinks:\n  extensions: [".md"]\n  unresolved_default_severity: warning\n  update_references_on_rename: true\n\ntitle:\n  storage: filename\n\ntemplating:\n  enabled: false\n  failure_mode: warning_fallback\n  unknown_variable_policy: preserve\n\nreminders:\n  date_only_anchor_time: "00:00"\n  apply_defaults_when_explicit: false\n\ntime_tracking:\n  auto_stop_on_complete: true\n  auto_stop_notification: false\n\noccurrences:\n  default_materialization: manual\n  default_next_trigger: completion\n  past_horizon: P0D\n  future_horizon: P14D\n\nnlp:\n  triggers:\n    - property_id: tags\n      trigger: "#"\n      enabled: true\n    - property_id: contexts\n      trigger: "@"\n      enabled: true\n    - property_id: projects\n      trigger: "+"\n      enabled: true\n    - property_id: status\n      trigger: "*"\n      enabled: true\n    - property_id: priority\n      trigger: "!"\n      enabled: false\n\ncompatibility:\n  read_aliases: true\n  legacy_duration_field: true\n

9.20 Configuration errors#

\n

Configuration validation MUST report structured errors with key path context.

\n

Examples:

\n
    \n
  • no readable configuration provider available in strict mode
  • \n
  • required effective key unresolved after provider resolution (spec_version or mapping)
  • \n
  • missing mapping.title
  • \n
  • status.default not present in status.values
  • \n
  • status.completed_values contains a value not present in status.values
  • \n
  • status.skipped_values contains a value not present in status.values
  • \n
  • status.default_skipped not present in status.skipped_values
  • \n
  • status.skipped_values overlaps status.completed_values when materialized-occurrences is claimed
  • \n
  • unsupported validation.mode
  • \n
  • validation.mode=permissive but permissive mode is not implemented
  • \n
  • invalid task_detection.method
  • \n
  • invalid task_detection.methods entry
  • \n
  • empty task_detection.tag when tag method is enabled
  • \n
  • missing task_detection.property_name when property method is enabled
  • \n
  • invalid task_detection.combine
  • \n
  • invalid dependencies.default_reltype
  • \n
  • invalid dependencies.unresolved_target_severity
  • \n
  • invalid links.unresolved_default_severity
  • \n
  • invalid title.storage
  • \n
  • invalid title.filename_format
  • \n
  • missing title.filename_format when title.storage=frontmatter
  • \n
  • missing title.custom_filename_template when title.storage=frontmatter and title.filename_format=custom
  • \n
  • missing templating.template_path when templating.enabled=true
  • \n
  • invalid templating.failure_mode
  • \n
  • invalid templating.unknown_variable_policy
  • \n
  • invalid reminders.date_only_anchor_time
  • \n
  • invalid reminders.apply_defaults_when_explicit
  • \n
  • invalid time_tracking.auto_stop_on_complete
  • \n
  • invalid time_tracking.auto_stop_notification
  • \n
  • invalid occurrences.default_materialization
  • \n
  • invalid occurrences.default_next_trigger
  • \n
  • invalid occurrences.past_horizon
  • \n
  • invalid occurrences.future_horizon
  • \n
  • invalid nlp.triggers
  • \n
  • empty nlp.triggers[].property_id
  • \n
  • empty nlp.triggers[].trigger
  • \n
  • invalid nlp.triggers[].enabled
  • \n
\n

9.21 Default collection state#

\n

This section describes what a fresh tasknotes vault looks like before any user customization. Implementations that read an existing tasknotes vault without a tasknotes.yaml SHOULD apply these defaults when data.json is absent or fields are missing.

\n

Folder layout#

\n
MyVault/\n├── TaskNotes/\n│   ├── Tasks/          ← new tasks created here by default\n│   └── Archive/        ← archived tasks moved here (if moveArchivedTasks=true)\n└── .obsidian/\n    └── plugins/\n        └── tasknotes/\n            └── data.json\n

Task detection#

\n

Default method: tag. A file is a task if it contains the tag #task in its frontmatter tags array or inline in the body.

\n

Default field mapping#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Semantic roleDefault storage key
titletitle
statusstatus
prioritypriority
duedue
scheduledscheduled
contextscontexts
projectsprojects
time_estimatetimeEstimate
completed_datecompletedDate
date_createddateCreated
date_modifieddateModified
recurrencerecurrence
recurrence_anchorrecurrence_anchor
complete_instancescomplete_instances
skipped_instancesskipped_instances
recurrence_parentrecurrence_parent
occurrence_dateoccurrence_date
occurrence_materializationoccurrence_materialization
occurrence_next_triggeroccurrence_next_trigger
occurrence_templateoccurrence_template
occurrence_past_horizonoccurrence_past_horizon
occurrence_future_horizonoccurrence_future_horizon
time_entriestimeEntries
blocked_byblockedBy
remindersreminders
\n

Note: recurrenceAnchor, completeInstances, and skippedInstances are accepted as aliases on read (§2.5). The mixed camelCase/snake_case defaults are intentional for compatibility with historical TaskNotes frontmatter.

\n

Default statuses#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ValueLabelisCompletedOrder
noneNonefalse0
openOpenfalse1
in-progressIn progressfalse2
doneDonetrue3
\n

Default status on create: open. Default completed status (first isCompleted=true): done.\nNo skipped status is configured by default; implementations that support materialized occurrence skips MUST require configuration or expose a documented default before writing skipped occurrence state.

\n

Default priorities#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ValueLabelWeight
noneNone0
lowLow1
normalNormal2
highHigh3
\n

Default priority on create: normal.

\n

Title and filename defaults#

\n
    \n
  • title.storage: filename (filename/path is the authoritative title source)
  • \n
  • default basename generation under title.storage=filename derives from semantic title using filename-safe sanitization
  • \n
  • implementations MAY also keep mapped title in frontmatter as a synchronized compatibility mirror
  • \n
  • TaskNotes data.json may still contain legacy taskFilenameFormat values such as zettel, but these are compatibility inputs rather than the forward default when title.storage=filename
  • \n
  • title is read from filename first; frontmatter title is compatibility fallback when filename-derived title is unavailable (§2.2.2)
  • \n
\n

Time tracking defaults#

\n
    \n
  • auto_stop_on_complete: true
  • \n
  • auto_stop_notification: false
  • \n
\n\n
    \n
  • useFrontmatterMarkdownLinks: false — wikilinks used by default (e.g. [[task-name]])
  • \n
  • To use markdown link format, the obsidian-frontmatter-markdown-links plugin must also be installed
  • \n
\n

Effective configuration for a minimal fresh vault#

\n

When neither data.json nor tasknotes.yaml is present, implementations MUST use the following effective configuration:

\n
spec_version: 0.3.0-rc.3   # synthesized\nmapping:\n  title: title\n  status: status\n  priority: priority\n  due: due\n  scheduled: scheduled\n  contexts: contexts\n  projects: projects\n  attachments: attachments\n  time_estimate: timeEstimate\n  completed_date: completedDate\n  date_created: dateCreated\n  date_modified: dateModified\n  recurrence: recurrence\n  recurrence_anchor: recurrence_anchor\n  complete_instances: complete_instances\n  skipped_instances: skipped_instances\n  recurrence_parent: recurrence_parent\n  occurrence_date: occurrence_date\n  occurrence_materialization: occurrence_materialization\n  occurrence_next_trigger: occurrence_next_trigger\n  occurrence_template: occurrence_template\n  occurrence_past_horizon: occurrence_past_horizon\n  occurrence_future_horizon: occurrence_future_horizon\n  time_entries: timeEntries\n  blocked_by: blockedBy\n  reminders: reminders\ntask_detection:\n  method: tag\n  tag: task\n  default_folder: TaskNotes/Tasks\nstatus:\n  values: [none, open, in-progress, done]\n  default: open\n  completed_values: [done]\ntitle:\n  storage: filename\ntime_tracking:\n  auto_stop_on_complete: true\n  auto_stop_notification: false\nlinks:\n  use_markdown_format: false\n  extensions: [".md"]\n  unresolved_default_severity: warning\n  update_references_on_rename: true\n
","text":"9.1 Purpose# This section defines the normative configuration model for collections using tasknotes-spec. 9.2 Configuration provider model# Implementations MUST derive an effective configuration from one or more configuration providers. A provider is a source adapter that returns a partial configuration normalized to this section's schema. Implementations MUST: support at least one provider, document supported providers, document provider precedence order, disclose active providers and fallback behavior in conformance output (§7). 9.2.1 Common provider types# Common providers include: yaml_file: a tasknotes.yaml document at collection root, tasknotes_plugin_data_json: .obsidian/plugins/tasknotes/data.json, built_in_defaults: implementation defaults, optional runtime/CLI/env overrides. This list is not exhaustive. 9.2.2 Deterministic precedence and merge# Provider precedence MUST be deterministic. Unless explicitly documented otherwise, implementations MUST resolve configuration per top-level key: for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins, winning object values replace lower-precedence object values as whole objects (no implicit deep merge), after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration. If an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic. 9.2.3 Strict vs permissive provider behavior# In strict mode: failure to resolve required effective keys (spec_version, mapping) MUST be a configuration error. If permissive mode is implemented, then in permissive mode: implementations MAY continue with defaults when providers are missing/unreadable, implementations MUST emit configuration warnings, implementations MUST disclose that effective configuration is partial/default-derived. 9.2.4 TaskNotes plugin provider (data.json)# The TaskNotes plugin stores settings in .obsidian/plugins/tasknotes/data.json within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below. Key mapping table (data.json key → spec effective config): data.json key Spec key Notes fieldMapping mapping Normalize role names: dateCreated→date_created, completedDate→completed_date, recurrenceAnchor→recurrence_anchor, completeInstances→complete_instances, skippedInstances→skipped_instances, recurrenceParent→recurrence_parent, occurrenceDate→occurrence_date, occurrenceMaterialization→occurrence_materialization, occurrenceNextTrigger→occurrence_next_trigger, occurrenceTemplate→occurrence_template, occurrencePastHorizon→occurrence_past_horizon, occurrenceFutureHorizon→occurrence_future_horizon, blockedBy→blocked_by, timeEntries→time_entries, timeEstimate→time_estimate storeTitleInFilename title.storage true → \"filename\", false → \"frontmatter\" taskFilenameFormat title.filename_format Values: \"title\", \"zettel\", \"timestamp\", \"custom\"; used only when title.storage=frontmatter for canonical writes, but preserved as compatibility input when present customFilenameTemplate title.custom_filename_template Template string, e.g. \"{title}\"; used only when title.storage=frontmatter and filename_format=custom taskCreationDefaults.useBodyTemplate templating.enabled boolean taskCreationDefaults.bodyTemplate templating.template_path Path to template file customStatuses[*].value status.values Ordered array of status value strings defaultTaskStatus status.default Default status string customStatuses[isCompleted=true][*].value status.completed_values Statuses where isCompleted: true defaultTaskPriority defaults.priority Default priority string autoStopTimeTrackingOnComplete time_tracking.auto_stop_on_complete boolean autoStopTimeTrackingNotification time_tracking.auto_stop_notification boolean taskIdentificationMethod task_detection.method \"tag\" or \"property\" taskTag task_detection.tag Tag string used when method=\"tag\" taskPropertyName task_detection.property_name Frontmatter key used when method=\"property\" taskPropertyValue task_detection.property_value Expected value; empty means key must exist tasksFolder task_detection.default_folder Default folder for new tasks excludedFolders task_detection.excluded_folders Comma-separated folder paths to exclude moveArchivedTasks archive.move_on_archive boolean archiveFolder archive.folder Archive destination folder useFrontmatterMarkdownLinks links.use_markdown_format boolean; see §11 Key data.json fields with defaults (for cold-start reading of a vault with no tasknotes.yaml): Field Type Default Meaning tasksFolder string \"TaskNotes/Tasks\" Default folder for new task files taskIdentificationMethod \"tag\" | \"property\" \"tag\" How task files are identified taskTag string \"task\" Tag that identifies task files (when method=\"tag\") taskPropertyName string \"\" Frontmatter key for property-based identification taskPropertyValue string \"\" Expected value for property-based identification (empty = key presence) storeTitleInFilename boolean true Title storage mode taskFilenameFormat \"title\" | \"zettel\" | \"timestamp\" | \"custom\" \"title\" Filename generation format customFilenameTemplate string \"{title}\" Template for \"custom\" filename format defaultTaskStatus string \"open\" Default status on create defaultTaskPriority string \"normal\" Default priority on create customStatuses StatusConfig[] see object shape below Ordered status definitions autoStopTimeTrackingOnComplete boolean true Auto-stop active session on completion autoStopTimeTrackingNotification boolean false Show notification when auto-stopping useFrontmatterMarkdownLinks boolean false Use markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin) moveArchivedTasks boolean false Move task file to archive folder on archive archiveFolder string \"TaskNotes/Archive\" Archive destination folder excludedFolders string \"\" Comma-separated folders to exclude from task indexing StatusConfig object shape: { \"id\": \"done\", \"value\": \"done\", \"label\": \"Done\", \"color\": \"#00aa00\", \"isCompleted\": true, \"order\": 3, \"autoArchive\": false, \"autoArchiveDelay\": 5 } spec_version is not present in data.json. Implementations MUST synthesize an effective spec_version as described in §9.5. Provider keys not listed above MAY be ignored by tasknotes-spec consumers. 9.3 Required top-level keys# Required keys apply to the effective configuration after provider resolution. Key Type Required Description spec_version string yes target spec version (provider-supplied or synthesized per §9.5) mapping object yes semantic role to storage key mapping 9.4 Recommended top-level keys# Key Type Description task_detection object task file identification rules defaults object role defaults used during create status object status set and completed-value semantics validation object validation behavior (strict required, permissive optional) links object link parsing/resolution behavior title object title source and filename behavior policy templating object optional create-time templating behavior policy dependencies object dependency behavior policy reminders object reminder behavior policy time_tracking object time-tracking management behavior policy occurrences object recurrence materialization defaults and bounds compatibility object legacy alias/behavior switches 9.5 spec_version behavior# spec_version MUST be a semantic version string. Pre-release identifiers are valid (for example 0.3.0-rc.3). Implementations in strict mode MUST reject unsupported major versions. If permissive mode is implemented, permissive mode MAY proceed with warning when major version differs. If a provider does not supply spec_version (for example TaskNotes data.json), implementations MUST synthesize an effective spec_version matching their target tasknotes-spec version and SHOULD disclose that it was synthesized. 9.6 mapping schema# mapping MUST map semantic roles (from §2) to string storage keys. Minimum required roles in mapping: title status completed_date date_created date_modified If semantic role id is supported (§2.6.5), mapping SHOULD include id. If profile materialized-occurrences is claimed, mapping MUST include recurrence_parent and occurrence_date, and SHOULD include parent policy roles (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon). Example: mapping: title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrenceAnchor complete_instances: completeInstances skipped_instances: skippedInstances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_entries: timeEntries blocked_by: blockedBy reminders: reminders attachments: attachments 9.7 task_detection schema# task_detection controls how task files are identified within the vault. Detection methods# The tasknotes plugin natively supports two identification methods, controlled by taskIdentificationMethod in data.json (mapped to task_detection.method): tag (default) — A markdown file is a task if it contains the configured tag (default #task) in its frontmatter tags array or inline in the body. Configured by task_detection.tag. property — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by task_detection.property_name and task_detection.property_value. Schema and selection rules: task_detection MAY specify either: method (single-method form), or methods (multi-method form; non-empty list). If both are present, methods MUST take precedence and implementations SHOULD emit a configuration warning. If neither is present, effective detection method MUST default to tag. method MUST be tag or property. methods entries MUST be unique and MUST be from: tag property field_presence field_match Method-specific required keys: when tag is enabled, effective task_detection.tag MUST be non-empty (default task when absent); when property is enabled, task_detection.property_name MUST be provided and non-empty; task_detection.property_value MAY be empty (empty means key-exists semantics). If methods has more than one entry, task_detection.combine controls combination semantics (§9.7.3). If omitted, it MUST default to or. 9.7.1 Tag matching semantics# When task_detection.method=tag, matching MUST follow these rules: Normalize configured task_detection.tag by stripping one leading # when present. Compare tag names case-insensitively after normalization. Frontmatter matching: tags MAY be a list of strings or a single string. each tag value is normalized by trimming surrounding whitespace and stripping one leading #. match requires exact normalized equality (for example task matches #task; task does not match tasking). Body matching: only markdown text outside fenced code blocks and inline code spans is considered, a match requires a hashtag token with exact normalized name (for example #task), partial-word matches MUST NOT count (for example #tasking does not match configured task). If either frontmatter or body matches, the file is identified as a task. 9.7.2 Property matching semantics# When property detection is enabled (method=property or methods includes property): task_detection.property_name MUST name the frontmatter key to inspect. If task_detection.property_value is non-empty, match requires semantic equality with the configured value. If task_detection.property_value is empty or absent, match requires key presence only. 9.7.3 Multi-method extension semantics# tasknotes.yaml-level providers MAY additionally support: field_presence (example: required key status) field_match (example: type == \"task\") Extension-key shape: field_presence: string or list of required frontmatter keys. field_match: object map of key -> expected scalar value for exact semantic equality checks. If multiple methods are configured in tasknotes.yaml, task_detection.combine MUST define combinator semantics: or (default): file is a task if any enabled method matches. and: file is a task only if all enabled methods match. If task_detection.combine is absent, implementations MUST default to or. Implementations MUST exclude folders listed in task_detection.excluded_folders from task indexing. Executable conformance: adapters participating in the fixture suite SHOULD expose config.detect_task_file to evaluate these detection semantics against fixture inputs. Example (tasknotes.yaml, equivalent to tag-based default): task_detection: method: tag tag: task default_folder: TaskNotes/Tasks Example (property-based): task_detection: method: property property_name: type property_value: task 9.8 defaults schema# defaults defines values used at create time when caller input omits a role. Defaults MUST NOT override explicit user input. Example: defaults: status: open priority: normal recurrence_anchor: scheduled reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D defaults.reminders behavior is defined in §10.3.9. 9.9 status schema# status defines known status values and completion semantics. Example: status: values: [open, in-progress, done, cancelled] default: open completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled Rules: default MUST be one of values. completed_values MUST be a non-empty list. Each completed_values entry MUST be in values. skipped_values, when present, MUST be a list whose entries are in values. default_skipped, when present, MUST be in skipped_values. For implementations claiming materialized-occurrences, skipped_values MUST NOT overlap completed_values. Implementations claiming materialized-occurrences MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3). Non-recurring completion MUST use this list, not hardcoded literals. When a complete operation does not provide an explicit target status, writers MUST use the first entry of completed_values. When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use default_skipped when present, otherwise the first entry of skipped_values. 9.10 validation schema# Example: validation: mode: strict reject_unknown_fields: false Rules: mode MUST be strict or permissive when present. If mode is absent, effective mode MUST default to strict. Conforming implementations MUST support strict. Implementations MAY support permissive. If mode=permissive is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode. reject_unknown_fields=true enforces closed-schema behavior for mapped roles. 9.11 dependencies schema# Example: dependencies: default_reltype: FINISHTOSTART treat_missing_target_as_blocked: true enforce_unique_uid: true unresolved_target_severity: warning require_resolved_uid_on_write: false Rules: default_reltype MUST be one of the allowed reltype values in §10.2. treat_missing_target_as_blocked controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5). If treat_missing_target_as_blocked is absent, effective value MUST default to true. enforce_unique_uid=true enforces uniqueness at validation/write time. If enforce_unique_uid is absent, effective value MUST default to true. unresolved_target_severity MUST be warning or error. require_resolved_uid_on_write=true requires dependency UID resolution success for add/update operations. 9.12 links schema# Example: links: extensions: [\".md\"] unresolved_default_severity: warning update_references_on_rename: true Rules: extensions defines extension trial order for extensionless targets"},{"route":"/developers/specification/10-dependencies-and-reminders/","title":"10. Dependencies and Reminders","description":"This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders).","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:10-dependencies-and-reminders.md","namespace":"specification","relativePath":"10-dependencies-and-reminders.md","raw":"# 10. Dependencies and Reminders\n\n## 10.1 Purpose\n\nThis section defines canonical semantics for task dependencies (`blocked_by`) and task reminders (`reminders`).\n\n## 10.2 Dependencies (`blocked_by`)\n\n### 10.2.1 Data shape\n\n`blocked_by` MUST be a list of dependency entries.\n\nEach entry MUST be an object with:\n\n- `uid` (required): reference to a blocking task (link or string)\n- `reltype` (required): one of\n - `FINISHTOSTART`\n - `STARTTOSTART`\n - `FINISHTOFINISH`\n - `STARTTOFINISH`\n- `gap` (optional): ISO 8601 duration string\n\nIf `reltype` is omitted on read in compatibility mode, implementations MAY treat it as `FINISHTOSTART` and SHOULD emit a warning.\n\n### 10.2.2 UID normalization\n\nImplementations SHOULD normalize `uid` values to a canonical reference representation on write.\n\nIf link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented.\nLink parsing and resolution MUST follow §11.\n\n### 10.2.3 Dependency uniqueness\n\nWithin a task, dependency entries are keyed by normalized `uid`.\n\nPolicy is configuration-driven and MUST be deterministic:\n\n- when `dependencies.enforce_unique_uid=true` (default), duplicate normalized `uid` values MUST NOT be accepted as canonical persisted state:\n - strict mode: duplicates MUST fail validation/write with `duplicate_dependency_uid`;\n - permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit `duplicate_dependency_uid`.\n- when `dependencies.enforce_unique_uid=false`, duplicates MAY be preserved as compatibility behavior.\n\nThe active policy MUST be documented in conformance claims.\n\n### 10.2.4 Self-dependency\n\nA task MUST NOT depend on itself.\n\nSelf-dependency is a validation error.\n\n### 10.2.5 Blocking semantics (v0.1)\n\nFor v0.1, blocking evaluation MUST be status-presence based:\n\n1. A task is blocked if it has at least one unresolved dependency.\n2. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status.\n3. Completed status MUST be determined from configured `status.completed_values`.\n4. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base `status` only; `complete_instances`/`skipped_instances` are not consulted.\n5. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow `dependencies.treat_missing_target_as_blocked` (§9.11, default `true`).\n\nFor v0.1, `reltype` and `gap` are preserved and validated but MUST NOT change the unresolved/resolved decision.\n\n### 10.2.6 Missing referenced task\n\nWhen `uid` cannot be resolved:\n\n- implementations SHOULD emit `unresolved_dependency_target`.\n- blocked-state contribution for this missing target MUST follow `dependencies.treat_missing_target_as_blocked` (§9.11).\n- issue severity SHOULD follow `dependencies.unresolved_target_severity` (default: `warning`).\n- for `blocked_by.uid`, this dependency-specific severity policy MUST take precedence over `links.unresolved_default_severity`.\n- parse failures that produce `invalid_link_format` and containment violations that produce `path_traversal` remain error-severity conditions from §11.\n- if `dependencies.require_resolved_uid_on_write=true`, add/update MUST fail with error.\n\n### 10.2.7 Cycles\n\nImplementations MUST reject direct self-cycles.\n\nDetection of multi-hop dependency cycles is RECOMMENDED but not required for `core-lite` or `recurrence` profiles.\n\n### 10.2.8 Reverse relation field\n\nSome implementations maintain reverse relationships (for example `blocking`). Such fields are derived and non-canonical in this spec unless explicitly mapped.\n\nIf maintained, reverse updates SHOULD remain consistent with `blocked_by` edits.\n\n### 10.2.9 Dependency operation semantics\n\n#### Add dependency\n\nAdd dependency MUST:\n\n- validate entry shape,\n- handle duplicates by policy (preserve, normalize, or reject),\n- preserve unrelated dependency entries,\n- update `date_modified` on change.\n\n#### Remove dependency\n\nRemove dependency MUST remove by normalized `uid` and be idempotent.\n\n#### Replace dependencies\n\nReplace behavior MUST be explicit operation mode (not default for patch update).\n\n### 10.2.10 Dependency examples\n\nExample entry:\n\n```yaml\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n gap: PT4H\n```\n\nExample unresolved dependency (target missing):\n\n```yaml\nblockedBy:\n - uid: \"[[non-existent-task]]\"\n reltype: FINISHTOSTART\n```\n\n## 10.3 Reminders (`reminders`)\n\n### 10.3.1 Data shape\n\n`reminders` MUST be a list of reminder entries.\n\nEach reminder MUST include:\n\n- `id` (required): unique string within the task\n- `type` (required): `absolute` or `relative`\n\nOptional field:\n\n- `description` string\n\nType-specific fields:\n\n- `absolute`: requires `absoluteTime` datetime\n- `relative`: requires `relatedTo` (`due` or `scheduled`) and `offset` (ISO 8601 duration)\n\n### 10.3.2 Reminder uniqueness\n\nReminder `id` values MUST be unique within the task.\n\nIf duplicates occur:\n\n- strict mode: MUST raise `duplicate_reminder_id`.\n- permissive mode: MAY normalize deterministically and emit warning.\n\n### 10.3.3 Relative reminder base\n\n`relatedTo` MUST reference semantic role `due` or `scheduled`.\n\nIf the referenced role is absent, the reminder is unresolved.\n\n### 10.3.4 Trigger instant computation\n\nTrigger instant MUST be computed as follows:\n\n1. If `type=absolute`, trigger = `absoluteTime` instant.\n2. If `type=relative`,\n - resolve base field from `relatedTo`,\n - if base is datetime: use that instant,\n - if base is date: convert to local datetime at configured `reminders.date_only_anchor_time`,\n - trigger = base + `offset`.\n\nIf `reminders.date_only_anchor_time` is not configured, implementations MUST use `00:00` local time.\n\n### 10.3.5 Offset semantics\n\n`offset` MUST be a valid ISO 8601 duration with optional sign.\n\n- negative offset = before base\n- positive offset = after base\n- zero offset = at base instant\n\n### 10.3.6 Invalid mixed fields\n\nEntries with incompatible field combinations MUST fail validation in strict mode.\n\nExamples:\n\n- `type=absolute` with `relatedTo` and no `absoluteTime`\n- `type=relative` with `absoluteTime` and missing `offset`\n\n### 10.3.7 Reminder ordering\n\nWhen computing reminder schedules, implementations MUST sort by trigger instant ascending.\n\nFor identical trigger instants, implementations MUST use stable tie-break ordering by `id` ascending.\n\n### 10.3.8 Reminder operation semantics\n\n#### Add reminder\n\nAdd reminder MUST validate shape and unique `id`, then update `date_modified`.\n\nIf `id` is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task.\n\n#### Update reminder\n\nUpdate reminder MUST address reminders by `id` and be patch-by-default.\n\n#### Remove reminder\n\nRemove reminder by `id` MUST be idempotent.\n\n### 10.3.9 Default reminders\n\nIf `defaults.reminders` is configured (see §9):\n\n- create without explicit reminders MUST apply defaults.\n- create with explicit reminders MUST follow `reminders.apply_defaults_when_explicit` (§9.15):\n - `false` (default): explicit reminders replace defaults.\n - `true`: explicit reminders are merged with defaults.\n\nDeterministic merge rules when `apply_defaults_when_explicit=true`:\n\n1. Start with explicit reminders in caller order.\n2. Append each default reminder whose `id` is not already present.\n3. If explicit and default reminders share an `id`, explicit reminder MUST win.\n\n### 10.3.10 Reminder examples\n\nRelative reminder:\n\n```yaml\nreminders:\n - id: due_minus_15m\n type: relative\n relatedTo: due\n offset: -PT15M\n```\n\nAbsolute reminder:\n\n```yaml\nreminders:\n - id: call_now\n type: absolute\n absoluteTime: 2026-02-20T09:00:00Z\n```\n\n### 10.3.11 Reminder resolution error handling\n\nIf relative reminder base is unavailable (`relatedTo=due` but no `due` field):\n\n- strict mode: validation error `unresolvable_reminder_base`.\n- permissive mode: warning and reminder excluded from trigger computation.\n\n## 10.4 Interactions\n\n### 10.4.1 Rename interaction\n\nIf implementation supports rename/reference updates, dependency `uid` references SHOULD be updated consistently with other link references.\n\n### 10.4.2 Completion interaction\n\nChanging task completion state does not automatically remove dependencies or reminders unless explicitly configured.\n\n### 10.4.3 Archive interaction\n\nArchive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested.\n","aliases":["/spec/10-dependencies-and-reminders/"],"toc":[{"level":2,"id":"101-purpose","text":"10.1 Purpose"},{"level":2,"id":"102-dependencies-blockedby","text":"10.2 Dependencies (blocked_by)"},{"level":3,"id":"1021-data-shape","text":"10.2.1 Data shape"},{"level":3,"id":"1022-uid-normalization","text":"10.2.2 UID normalization"},{"level":3,"id":"1023-dependency-uniqueness","text":"10.2.3 Dependency uniqueness"},{"level":3,"id":"1024-self-dependency","text":"10.2.4 Self-dependency"},{"level":3,"id":"1025-blocking-semantics-v01","text":"10.2.5 Blocking semantics (v0.1)"},{"level":3,"id":"1026-missing-referenced-task","text":"10.2.6 Missing referenced task"},{"level":3,"id":"1027-cycles","text":"10.2.7 Cycles"},{"level":3,"id":"1028-reverse-relation-field","text":"10.2.8 Reverse relation field"},{"level":3,"id":"1029-dependency-operation-semantics","text":"10.2.9 Dependency operation semantics"},{"level":3,"id":"10210-dependency-examples","text":"10.2.10 Dependency examples"},{"level":2,"id":"103-reminders-reminders","text":"10.3 Reminders (reminders)"},{"level":3,"id":"1031-data-shape","text":"10.3.1 Data shape"},{"level":3,"id":"1032-reminder-uniqueness","text":"10.3.2 Reminder uniqueness"},{"level":3,"id":"1033-relative-reminder-base","text":"10.3.3 Relative reminder base"},{"level":3,"id":"1034-trigger-instant-computation","text":"10.3.4 Trigger instant computation"},{"level":3,"id":"1035-offset-semantics","text":"10.3.5 Offset semantics"},{"level":3,"id":"1036-invalid-mixed-fields","text":"10.3.6 Invalid mixed fields"},{"level":3,"id":"1037-reminder-ordering","text":"10.3.7 Reminder ordering"},{"level":3,"id":"1038-reminder-operation-semantics","text":"10.3.8 Reminder operation semantics"},{"level":3,"id":"1039-default-reminders","text":"10.3.9 Default reminders"},{"level":3,"id":"10310-reminder-examples","text":"10.3.10 Reminder examples"},{"level":3,"id":"10311-reminder-resolution-error-handling","text":"10.3.11 Reminder resolution error handling"},{"level":2,"id":"104-interactions","text":"10.4 Interactions"},{"level":3,"id":"1041-rename-interaction","text":"10.4.1 Rename interaction"},{"level":3,"id":"1042-completion-interaction","text":"10.4.2 Completion interaction"},{"level":3,"id":"1043-archive-interaction","text":"10.4.3 Archive interaction"}],"html":"

10.1 Purpose#

\n

This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders).

\n

10.2 Dependencies (blocked_by)#

\n

10.2.1 Data shape#

\n

blocked_by MUST be a list of dependency entries.

\n

Each entry MUST be an object with:

\n
    \n
  • uid (required): reference to a blocking task (link or string)
  • \n
  • reltype (required): one of
      \n
    • FINISHTOSTART
    • \n
    • STARTTOSTART
    • \n
    • FINISHTOFINISH
    • \n
    • STARTTOFINISH
    • \n
    \n
  • \n
  • gap (optional): ISO 8601 duration string
  • \n
\n

If reltype is omitted on read in compatibility mode, implementations MAY treat it as FINISHTOSTART and SHOULD emit a warning.

\n

10.2.2 UID normalization#

\n

Implementations SHOULD normalize uid values to a canonical reference representation on write.

\n

If link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented.\nLink parsing and resolution MUST follow §11.

\n

10.2.3 Dependency uniqueness#

\n

Within a task, dependency entries are keyed by normalized uid.

\n

Policy is configuration-driven and MUST be deterministic:

\n
    \n
  • when dependencies.enforce_unique_uid=true (default), duplicate normalized uid values MUST NOT be accepted as canonical persisted state:
      \n
    • strict mode: duplicates MUST fail validation/write with duplicate_dependency_uid;
    • \n
    • permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit duplicate_dependency_uid.
    • \n
    \n
  • \n
  • when dependencies.enforce_unique_uid=false, duplicates MAY be preserved as compatibility behavior.
  • \n
\n

The active policy MUST be documented in conformance claims.

\n

10.2.4 Self-dependency#

\n

A task MUST NOT depend on itself.

\n

Self-dependency is a validation error.

\n

10.2.5 Blocking semantics (v0.1)#

\n

For v0.1, blocking evaluation MUST be status-presence based:

\n
    \n
  1. A task is blocked if it has at least one unresolved dependency.
  2. \n
  3. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status.
  4. \n
  5. Completed status MUST be determined from configured status.completed_values.
  6. \n
  7. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base status only; complete_instances/skipped_instances are not consulted.
  8. \n
  9. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow dependencies.treat_missing_target_as_blocked (§9.11, default true).
  10. \n
\n

For v0.1, reltype and gap are preserved and validated but MUST NOT change the unresolved/resolved decision.

\n

10.2.6 Missing referenced task#

\n

When uid cannot be resolved:

\n
    \n
  • implementations SHOULD emit unresolved_dependency_target.
  • \n
  • blocked-state contribution for this missing target MUST follow dependencies.treat_missing_target_as_blocked (§9.11).
  • \n
  • issue severity SHOULD follow dependencies.unresolved_target_severity (default: warning).
  • \n
  • for blocked_by.uid, this dependency-specific severity policy MUST take precedence over links.unresolved_default_severity.
  • \n
  • parse failures that produce invalid_link_format and containment violations that produce path_traversal remain error-severity conditions from §11.
  • \n
  • if dependencies.require_resolved_uid_on_write=true, add/update MUST fail with error.
  • \n
\n

10.2.7 Cycles#

\n

Implementations MUST reject direct self-cycles.

\n

Detection of multi-hop dependency cycles is RECOMMENDED but not required for core-lite or recurrence profiles.

\n

10.2.8 Reverse relation field#

\n

Some implementations maintain reverse relationships (for example blocking). Such fields are derived and non-canonical in this spec unless explicitly mapped.

\n

If maintained, reverse updates SHOULD remain consistent with blocked_by edits.

\n

10.2.9 Dependency operation semantics#

\n

Add dependency#

\n

Add dependency MUST:

\n
    \n
  • validate entry shape,
  • \n
  • handle duplicates by policy (preserve, normalize, or reject),
  • \n
  • preserve unrelated dependency entries,
  • \n
  • update date_modified on change.
  • \n
\n

Remove dependency#

\n

Remove dependency MUST remove by normalized uid and be idempotent.

\n

Replace dependencies#

\n

Replace behavior MUST be explicit operation mode (not default for patch update).

\n

10.2.10 Dependency examples#

\n

Example entry:

\n
blockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n    gap: PT4H\n

Example unresolved dependency (target missing):

\n
blockedBy:\n  - uid: "[[non-existent-task]]"\n    reltype: FINISHTOSTART\n

10.3 Reminders (reminders)#

\n

10.3.1 Data shape#

\n

reminders MUST be a list of reminder entries.

\n

Each reminder MUST include:

\n
    \n
  • id (required): unique string within the task
  • \n
  • type (required): absolute or relative
  • \n
\n

Optional field:

\n
    \n
  • description string
  • \n
\n

Type-specific fields:

\n
    \n
  • absolute: requires absoluteTime datetime
  • \n
  • relative: requires relatedTo (due or scheduled) and offset (ISO 8601 duration)
  • \n
\n

10.3.2 Reminder uniqueness#

\n

Reminder id values MUST be unique within the task.

\n

If duplicates occur:

\n
    \n
  • strict mode: MUST raise duplicate_reminder_id.
  • \n
  • permissive mode: MAY normalize deterministically and emit warning.
  • \n
\n

10.3.3 Relative reminder base#

\n

relatedTo MUST reference semantic role due or scheduled.

\n

If the referenced role is absent, the reminder is unresolved.

\n

10.3.4 Trigger instant computation#

\n

Trigger instant MUST be computed as follows:

\n
    \n
  1. If type=absolute, trigger = absoluteTime instant.
  2. \n
  3. If type=relative,
      \n
    • resolve base field from relatedTo,
    • \n
    • if base is datetime: use that instant,
    • \n
    • if base is date: convert to local datetime at configured reminders.date_only_anchor_time,
    • \n
    • trigger = base + offset.
    • \n
    \n
  4. \n
\n

If reminders.date_only_anchor_time is not configured, implementations MUST use 00:00 local time.

\n

10.3.5 Offset semantics#

\n

offset MUST be a valid ISO 8601 duration with optional sign.

\n
    \n
  • negative offset = before base
  • \n
  • positive offset = after base
  • \n
  • zero offset = at base instant
  • \n
\n

10.3.6 Invalid mixed fields#

\n

Entries with incompatible field combinations MUST fail validation in strict mode.

\n

Examples:

\n
    \n
  • type=absolute with relatedTo and no absoluteTime
  • \n
  • type=relative with absoluteTime and missing offset
  • \n
\n

10.3.7 Reminder ordering#

\n

When computing reminder schedules, implementations MUST sort by trigger instant ascending.

\n

For identical trigger instants, implementations MUST use stable tie-break ordering by id ascending.

\n

10.3.8 Reminder operation semantics#

\n

Add reminder#

\n

Add reminder MUST validate shape and unique id, then update date_modified.

\n

If id is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task.

\n

Update reminder#

\n

Update reminder MUST address reminders by id and be patch-by-default.

\n

Remove reminder#

\n

Remove reminder by id MUST be idempotent.

\n

10.3.9 Default reminders#

\n

If defaults.reminders is configured (see §9):

\n
    \n
  • create without explicit reminders MUST apply defaults.
  • \n
  • create with explicit reminders MUST follow reminders.apply_defaults_when_explicit (§9.15):
      \n
    • false (default): explicit reminders replace defaults.
    • \n
    • true: explicit reminders are merged with defaults.
    • \n
    \n
  • \n
\n

Deterministic merge rules when apply_defaults_when_explicit=true:

\n
    \n
  1. Start with explicit reminders in caller order.
  2. \n
  3. Append each default reminder whose id is not already present.
  4. \n
  5. If explicit and default reminders share an id, explicit reminder MUST win.
  6. \n
\n

10.3.10 Reminder examples#

\n

Relative reminder:

\n
reminders:\n  - id: due_minus_15m\n    type: relative\n    relatedTo: due\n    offset: -PT15M\n

Absolute reminder:

\n
reminders:\n  - id: call_now\n    type: absolute\n    absoluteTime: 2026-02-20T09:00:00Z\n

10.3.11 Reminder resolution error handling#

\n

If relative reminder base is unavailable (relatedTo=due but no due field):

\n
    \n
  • strict mode: validation error unresolvable_reminder_base.
  • \n
  • permissive mode: warning and reminder excluded from trigger computation.
  • \n
\n

10.4 Interactions#

\n

10.4.1 Rename interaction#

\n

If implementation supports rename/reference updates, dependency uid references SHOULD be updated consistently with other link references.

\n

10.4.2 Completion interaction#

\n

Changing task completion state does not automatically remove dependencies or reminders unless explicitly configured.

\n

10.4.3 Archive interaction#

\n

Archive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested.

\n","text":"10.1 Purpose# This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders). 10.2 Dependencies (blocked_by)# 10.2.1 Data shape# blocked_by MUST be a list of dependency entries. Each entry MUST be an object with: uid (required): reference to a blocking task (link or string) reltype (required): one of FINISHTOSTART STARTTOSTART FINISHTOFINISH STARTTOFINISH gap (optional): ISO 8601 duration string If reltype is omitted on read in compatibility mode, implementations MAY treat it as FINISHTOSTART and SHOULD emit a warning. 10.2.2 UID normalization# Implementations SHOULD normalize uid values to a canonical reference representation on write. If link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented. Link parsing and resolution MUST follow §11. 10.2.3 Dependency uniqueness# Within a task, dependency entries are keyed by normalized uid. Policy is configuration-driven and MUST be deterministic: when dependencies.enforce_unique_uid=true (default), duplicate normalized uid values MUST NOT be accepted as canonical persisted state: strict mode: duplicates MUST fail validation/write with duplicate_dependency_uid; permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit duplicate_dependency_uid. when dependencies.enforce_unique_uid=false, duplicates MAY be preserved as compatibility behavior. The active policy MUST be documented in conformance claims. 10.2.4 Self-dependency# A task MUST NOT depend on itself. Self-dependency is a validation error. 10.2.5 Blocking semantics (v0.1)# For v0.1, blocking evaluation MUST be status-presence based: A task is blocked if it has at least one unresolved dependency. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status. Completed status MUST be determined from configured status.completed_values. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base status only; complete_instances/skipped_instances are not consulted. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow dependencies.treat_missing_target_as_blocked (§9.11, default true). For v0.1, reltype and gap are preserved and validated but MUST NOT change the unresolved/resolved decision. 10.2.6 Missing referenced task# When uid cannot be resolved: implementations SHOULD emit unresolved_dependency_target. blocked-state contribution for this missing target MUST follow dependencies.treat_missing_target_as_blocked (§9.11). issue severity SHOULD follow dependencies.unresolved_target_severity (default: warning). for blocked_by.uid, this dependency-specific severity policy MUST take precedence over links.unresolved_default_severity. parse failures that produce invalid_link_format and containment violations that produce path_traversal remain error-severity conditions from §11. if dependencies.require_resolved_uid_on_write=true, add/update MUST fail with error. 10.2.7 Cycles# Implementations MUST reject direct self-cycles. Detection of multi-hop dependency cycles is RECOMMENDED but not required for core-lite or recurrence profiles. 10.2.8 Reverse relation field# Some implementations maintain reverse relationships (for example blocking). Such fields are derived and non-canonical in this spec unless explicitly mapped. If maintained, reverse updates SHOULD remain consistent with blocked_by edits. 10.2.9 Dependency operation semantics# Add dependency# Add dependency MUST: validate entry shape, handle duplicates by policy (preserve, normalize, or reject), preserve unrelated dependency entries, update date_modified on change. Remove dependency# Remove dependency MUST remove by normalized uid and be idempotent. Replace dependencies# Replace behavior MUST be explicit operation mode (not default for patch update). 10.2.10 Dependency examples# Example entry: blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: PT4H Example unresolved dependency (target missing): blockedBy: - uid: \"[[non-existent-task]]\" reltype: FINISHTOSTART 10.3 Reminders (reminders)# 10.3.1 Data shape# reminders MUST be a list of reminder entries. Each reminder MUST include: id (required): unique string within the task type (required): absolute or relative Optional field: description string Type-specific fields: absolute: requires absoluteTime datetime relative: requires relatedTo (due or scheduled) and offset (ISO 8601 duration) 10.3.2 Reminder uniqueness# Reminder id values MUST be unique within the task. If duplicates occur: strict mode: MUST raise duplicate_reminder_id. permissive mode: MAY normalize deterministically and emit warning. 10.3.3 Relative reminder base# relatedTo MUST reference semantic role due or scheduled. If the referenced role is absent, the reminder is unresolved. 10.3.4 Trigger instant computation# Trigger instant MUST be computed as follows: If type=absolute, trigger = absoluteTime instant. If type=relative, resolve base field from relatedTo, if base is datetime: use that instant, if base is date: convert to local datetime at configured reminders.date_only_anchor_time, trigger = base + offset. If reminders.date_only_anchor_time is not configured, implementations MUST use 00:00 local time. 10.3.5 Offset semantics# offset MUST be a valid ISO 8601 duration with optional sign. negative offset = before base positive offset = after base zero offset = at base instant 10.3.6 Invalid mixed fields# Entries with incompatible field combinations MUST fail validation in strict mode. Examples: type=absolute with relatedTo and no absoluteTime type=relative with absoluteTime and missing offset 10.3.7 Reminder ordering# When computing reminder schedules, implementations MUST sort by trigger instant ascending. For identical trigger instants, implementations MUST use stable tie-break ordering by id ascending. 10.3.8 Reminder operation semantics# Add reminder# Add reminder MUST validate shape and unique id, then update date_modified. If id is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task. Update reminder# Update reminder MUST address reminders by id and be patch-by-default. Remove reminder# Remove reminder by id MUST be idempotent. 10.3.9 Default reminders# If defaults.reminders is configured (see §9): create without explicit reminders MUST apply defaults. create with explicit reminders MUST follow reminders.apply_defaults_when_explicit (§9.15): false (default): explicit reminders replace defaults. true: explicit reminders are merged with defaults. Deterministic merge rules when apply_defaults_when_explicit=true: Start with explicit reminders in caller order. Append each default reminder whose id is not already present. If explicit and default reminders share an id, explicit reminder MUST win. 10.3.10 Reminder examples# Relative reminder: reminders: - id: due_minus_15m type: relative relatedTo: due offset: -PT15M Absolute reminder: reminders: - id: call_now type: absolute absoluteTime: 2026-02-20T09:00:00Z 10.3.11 Reminder resolution error handling# If relative reminder base is unavailable (relatedTo=due but no due field): strict mode: validation error unresolvable_reminder_base. permissive mode: warning and reminder excluded from trigger computation. 10.4 Interactions# 10.4.1 Rename interaction# If implementation supports rename/reference updates, dependency uid references SHOULD be updated consistently with other link references. 10.4.2 Completion interaction# Changing task completion state does not automatically remove dependencies or reminders unless explicitly configured. 10.4.3 Archive interaction# Archive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested."},{"route":"/developers/specification/11-links/","title":"11. Links","description":"This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects, blocked_by.uid, and attachments. Alignment w...","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:11-links.md","namespace":"specification","relativePath":"11-links.md","raw":"# 11. Links\n\n## 11.1 Purpose\n\nThis section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily `projects`, `blocked_by.uid`, and `attachments`.\nAlignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section.\n\nApplicability:\n\n- Implementations claiming profile `extended` (§7.3.5) MUST conform to this section for supported link-bearing roles.\n- Implementations claiming profile `materialized-occurrences` (§7.3.4) MUST conform to this section for `recurrence_parent` links, but are not required to support unrelated extended link-bearing roles solely because of that profile.\n- Implementations supporting the `attachments` role MUST conform to this section for attachment references regardless of profile.\n- Implementations that claim neither `extended` nor `materialized-occurrences` MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior.\n\n---\n\n## 11.2 Link formats\n\nImplementations that conform to §11 (see §11.1 applicability) MUST support three link formats.\n\n### 11.2.1 Wikilinks\n\n```\n[[target]]\n[[target|alias]]\n[[target#anchor]]\n[[target#anchor|alias]]\n[[folder/target]]\n[[./relative]]\n[[../parent/target]]\n```\n\n**Components:**\n- **target**: The file being linked to (without extension by default)\n- **alias**: Display text; does not affect resolution\n- **anchor**: A heading or block reference within the target\n- **path**: May be absolute (from collection root) or relative (from current file)\n\nExamples in frontmatter:\n\n```yaml\nprojects:\n - \"[[home-project]]\"\n - \"[[projects/alpha|Alpha Project]]\"\nblockedBy:\n - uid: \"[[prepare-metrics]]\"\n reltype: FINISHTOSTART\n```\n\n### 11.2.2 Markdown links\n\n```\n[text](path.md)\n[text](./relative.md)\n[text](../other/file.md)\n[text](path.md#anchor)\n```\n\nThe text portion is treated as an alias and does not affect resolution.\n\nMarkdown links in frontmatter require the `obsidian-frontmatter-markdown-links` Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless `links.use_markdown_format=true` is configured (§11.7).\n\n### 11.2.3 Bare paths\n\n```\n./sibling.md\n../other/file.md\nfolder/file.md\n```\n\nBare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with `/`).\n\n---\n\n## 11.3 Link parsing\n\nWhen a link value is read, implementations MUST parse it into a structured representation:\n\n| Component | Type | Description |\n|---|---|---|\n| `raw` | string | Original string value exactly as written |\n| `target` | string | File path or identifier (without anchor or alias) |\n| `alias` | string? | Display text if provided, otherwise null |\n| `anchor` | string? | Heading or block reference if provided, otherwise null |\n| `format` | enum | One of: `wikilink`, `markdown`, `path` |\n| `is_relative` | boolean | Whether target begins with `./` or `../` |\n\nParsing examples:\n\n| Input | target | alias | anchor | format | is_relative |\n|---|---|---|---|---|---|\n| `[[task-001]]` | `task-001` | null | null | wikilink | false |\n| `[[task-001\\|My Task]]` | `task-001` | `My Task` | null | wikilink | false |\n| `[[docs/api#auth]]` | `docs/api` | null | `auth` | wikilink | false |\n| `[[./sibling]]` | `./sibling` | null | null | wikilink | true |\n| `[Link](file.md)` | `file.md` | `Link` | null | markdown | false |\n| `./other.md` | `./other.md` | null | null | path | true |\n\n---\n\n## 11.4 Resolution algorithm\n\nResolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file.\n\nGiven a parsed link and the path of the source file containing it:\n\n### Step 1: Parse the link into components (target, format, is_relative)\n\n### Step 2: Route by format\n\n**If format is `markdown` or `path`:**\n- If target starts with `/`, resolve from collection root (strip the leading `/`)\n- Otherwise, resolve relative to the source file's directory (standard markdown behavior)\n- Example: link `[Docs](docs/api.md)` in `notes/meeting.md` resolves to `notes/docs/api.md`\n\n**If format is `wikilink`:**\n- If target starts with `./` or `../`, resolve relative to the source file's directory\n- If target starts with `/`, resolve from collection root (strip the leading `/`)\n- If target contains `/` (and is not relative), resolve from collection root\n - Example: `[[docs/api]]` resolves to `docs/api`\n- If simple name (no `/`, no `./` or `../`): proceed to Step 3\n\n### Step 3: Simple-name resolution (wikilinks only)\n\nFor simple wikilink names (no path separator):\n\n1. **Define the search scope:**\n - For `blocked_by.uid`: scope to files matching `task_detection` (task files only)\n - For `projects`: scope to all markdown files in the collection unless narrowed by explicit configuration\n - For `attachments`: scope to all non-directory files in the collection\n\n2. **ID match pass:** search scoped files for semantic role `id` (§2.6.5) equal to the name.\n - Implementations MAY treat literal frontmatter key `id` as compatibility input when semantic mapping for `id` is unavailable.\n - Equality MUST be exact string equality.\n - If exactly one match: resolve to that file\n - If multiple matches: fail with `ambiguous_link`\n\n3. **Filename match pass:** if no ID match, search scoped markdown files by filename (without extension).\n4. Implementations MUST deduplicate normalized candidate paths before final selection.\n5. If exactly one filename candidate remains after normalization and extension handling, resolve to that file.\n6. If multiple filename candidates remain, resolve to `null` and emit `ambiguous_link`. Callers SHOULD use a path-qualified or relative target to disambiguate.\n\n### Step 4: Extension handling\n\nIf the target has no extension, implementations SHOULD try configured extensions in order.\n\nDefault extension order: `[\".md\"]`.\n\nExample: `[[readme]]` tries `readme.md`, `readme.mdx`, etc.\n\n### Step 5: Path traversal check\n\nAfter resolution and normalization, if the resolved path would escape the collection root, abort with `path_traversal`. See §11.5.\n\n### Step 6: Return result\n\n- The normalized collection-relative path if found\n- `null` if no matching file exists\n\n### Resolution examples\n\nGiven collection structure:\n```\n/\n├── TaskNotes/\n│ ├── Tasks/\n│ │ ├── task-001.md\n│ │ └── subtasks/\n│ │ └── task-002.md\n├── notes/\n│ └── meeting.md\n└── projects/\n └── alpha.md\n```\n\nResolution from `TaskNotes/Tasks/subtasks/task-002.md`:\n\n| Link value | Resolved path | Notes |\n|---|---|---|\n| `[[task-001]]` | `TaskNotes/Tasks/task-001.md` | Simple-name search |\n| `[[../task-001]]` | `TaskNotes/Tasks/task-001.md` | Relative wikilink |\n| `[[./task-003]]` | `TaskNotes/Tasks/subtasks/task-003.md` | Relative (may not exist) |\n| `[[notes/meeting]]` | `notes/meeting.md` | Absolute from root |\n| `[[alpha]]` | `projects/alpha.md` | Simple-name search (projects scope) |\n| `[link](../task-001.md)` | `TaskNotes/Tasks/task-001.md` | Markdown, relative |\n| `../task-001.md` | `TaskNotes/Tasks/task-001.md` | Bare path, relative |\n\n---\n\n## 11.5 Path sandboxing\n\nLink resolution MUST NOT produce paths outside the collection root.\n\n**Rules:**\n- After resolving relative paths (applying `../` segments), the resulting path MUST be within the collection root directory\n- If resolution would escape the collection root, the link MUST resolve to `null` and implementations MUST emit a `path_traversal` error\n- This applies to all link formats: wikilinks, markdown links, and bare paths\n- Implementations MUST normalize paths (resolve `.` and `..` segments) before checking containment\n\n**Examples** (collection rooted at `/home/user/MyVault/`):\n\n| Link | From file | Result |\n|---|---|---|\n| `[[../../../etc/passwd]]` | `TaskNotes/Tasks/task.md` | `null` + `path_traversal` |\n| `[[../../secrets/key]]` | `deep/nested/file.md` | `null` + `path_traversal` |\n| `[[../task-001]]` | `TaskNotes/Tasks/subtasks/t.md` | Resolves normally |\n\n---\n\n## 11.6 Canonical write format\n\nWhen creating new link values or changing a link target, implementations MUST use a deterministic canonical form.\n\n### Default (wikilink format)\n\nBy default (`links.use_markdown_format=false`), the canonical write format is a **simple wikilink**:\n\n```yaml\nblockedBy:\n - uid: \"[[task-001]]\"\n reltype: FINISHTOSTART\nprojects:\n - \"[[projects/alpha]]\"\n```\n\nRules:\n- Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope.\n- Use a path-qualified target (`folder/name`) when the simple name would be ambiguous.\n- Do NOT include the alias component in dependency `uid` writes.\n- Do NOT include the anchor component in dependency `uid` writes.\n- Preserve the alias component in `projects` entries when the alias was provided by the user.\n- For `attachments`, always write a path-qualified collection-relative target\n with its file extension, for example `[[Attachments/01K1-photo.jpg]]`.\n Attachment writes MUST NOT include an alias or anchor.\n\n### Markdown link format (`links.use_markdown_format=true`)\n\nWhen `links.use_markdown_format=true` is configured (requires the `obsidian-frontmatter-markdown-links` Obsidian plugin), the canonical write format for link-bearing fields is a **markdown link** using the collection-relative path:\n\n```yaml\nblockedBy:\n - uid: \"[task-001](TaskNotes/Tasks/task-001.md)\"\n reltype: FINISHTOSTART\n```\n\n### Round-trip preservation\n\nWhen writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible:\n- If the user wrote `[[task-001|My Task]]`, preserve alias for `projects` entries.\n- If the user wrote a relative path, preserve relativity when possible.\n- For `blocked_by.uid`, alias and anchor components MUST still be removed on canonical writes.\n- If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section.\n\n---\n\n## 11.7 Configuration\n\n`links` configuration keys (see §9.12):\n\n```yaml\nlinks:\n extensions: [\".md\"] # Extension trial order for extensionless targets\n use_markdown_format: false # Write markdown links instead of wikilinks\n unresolved_default_severity: warning # \"warning\" or \"error\"\n update_references_on_rename: true # Update link targets when files are renamed\n```\n\nRules:\n- `extensions` MUST be a non-empty list when present\n- `unresolved_default_severity` MUST be `\"warning\"` or `\"error\"`\n- `update_references_on_rename=true` enables rename-time link rewrite behavior (§11.9)\n- `use_markdown_format=true` requires the `obsidian-frontmatter-markdown-links` plugin in Obsidian deployments\n\n---\n\n## 11.8 Role-specific rules\n\n### 11.8.1 `projects`\n\n`projects` entries SHOULD be interpreted with this section's parsing/resolution rules.\n\nIf a `projects` entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution.\n\nIf unresolved:\n- `links.unresolved_default_severity=error`: validation error\n- otherwise: SHOULD emit `unresolved_link_target` warning\n\n### 11.8.2 `blocked_by.uid`\n\n`blocked_by.uid` values MUST use this section's parsing/resolution rules.\n\nFor dependency semantics, unresolved `uid` handling follows §10.2.6.\nFor unresolved-target severity, `dependencies.unresolved_target_severity` controls and takes precedence over `links.unresolved_default_severity`.\n\nThe canonical write form for `uid` values is specified in §11.6.\n\n### 11.8.3 `attachments`\n\nAttachment references MUST resolve to files, not directories. Canonical\nattachment targets MUST be collection-relative, path-qualified, and retain an\nexplicit file extension. This avoids ambiguous simple-name lookup, makes the\nfrontmatter portable without a media-specific extension search policy, and\npreserves the actual filename.\n\nReaders MUST accept wikilinks, Markdown links, and bare paths. They MAY accept\nsimple-name or extensionless values as non-canonical compatibility input, but\ncanonical writes MUST resolve and replace them with an explicit path and\nextension. Aliases and anchors are not part of attachment identity and MUST be\nremoved on canonical writes.\n\nThe normalized resolved collection path defines attachment identity for\nduplicate detection. Implementations MUST preserve list order and MUST reject\nduplicates after path normalization. Unresolved attachment targets use the\nconfigured `unresolved_link_target` severity; offline-capable clients SHOULD\ndistinguish a known-but-not-locally-cached file from a genuinely unresolved\ntarget.\n\n---\n\n## 11.9 Rename and reference updates\n\nIf an implementation supports reference updates on rename (i.e. claims the `rename` capability):\n\n1. It MUST update resolvable references in `blocked_by.uid`, `projects`, and `attachments` link fields.\n2. It SHOULD update links in body content.\n3. It SHOULD preserve the original link format when possible.\n4. It MUST preserve alias and anchor components where valid for the target field. For `blocked_by.uid`, alias and anchor are non-canonical and MUST be removed on write (§11.6).\n5. It MUST report unresolved or ambiguous rewrite cases.\n\nIf reference updates are not supported, this limitation MUST be disclosed in conformance claims.\n\n---\n\n## 11.10 Validation\n\nLink validation issues:\n\n| Code | Severity | Trigger |\n|---|---|---|\n| `invalid_link_format` | error | Link value cannot be parsed as any supported format |\n| `ambiguous_link` | warning | Simple-name resolution found multiple candidates after normalization |\n| `unresolved_link_target` | warning | Link target cannot be resolved to an existing file |\n| `path_traversal` | error | Resolved path escapes collection root |\n\n`unresolved_link_target` severity may be promoted to error via `links.unresolved_default_severity=error`.\nFor `blocked_by.uid`, use `unresolved_dependency_target` severity policy from §10.2.6 instead of `unresolved_link_target`.\n\n---\n\n## 11.11 Examples\n\n### Dependency with wikilink (default)\n\n```yaml\n---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n - uid: \"[[design-api]]\"\n reltype: FINISHTOSTART\n - uid: \"[[projects/infra/setup-server]]\"\n reltype: FINISHTOSTART\n gap: P1D\nprojects:\n - \"[[projects/alpha]]\"\ndateCreated: 2026-02-20T10:00:00Z\ndateModified: 2026-02-20T10:00:00Z\n---\n```\n\n### Dependency with markdown links (`links.use_markdown_format=true`)\n\n```yaml\n---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n - uid: \"[design-api](TaskNotes/Tasks/design-api.md)\"\n reltype: FINISHTOSTART\n---\n```\n\n### Relative links from nested task\n\n```yaml\n# TaskNotes/Tasks/subtasks/task-002.md\n---\ntitle: Sub-task\nstatus: open\ntags: [task]\nblockedBy:\n - uid: \"[[../task-001]]\" # resolves to TaskNotes/Tasks/task-001.md\n reltype: FINISHTOSTART\nprojects:\n - \"[[projects/alpha]]\" # resolves from collection root\n---\n```\n","aliases":["/spec/11-links/"],"toc":[{"level":2,"id":"111-purpose","text":"11.1 Purpose"},{"level":2,"id":"112-link-formats","text":"11.2 Link formats"},{"level":3,"id":"1121-wikilinks","text":"11.2.1 Wikilinks"},{"level":3,"id":"1122-markdown-links","text":"11.2.2 Markdown links"},{"level":3,"id":"1123-bare-paths","text":"11.2.3 Bare paths"},{"level":2,"id":"113-link-parsing","text":"11.3 Link parsing"},{"level":2,"id":"114-resolution-algorithm","text":"11.4 Resolution algorithm"},{"level":3,"id":"step-1-parse-the-link-into-components-target-format-isrelative","text":"Step 1: Parse the link into components (target, format, is_relative)"},{"level":3,"id":"step-2-route-by-format","text":"Step 2: Route by format"},{"level":3,"id":"step-3-simple-name-resolution-wikilinks-only","text":"Step 3: Simple-name resolution (wikilinks only)"},{"level":3,"id":"step-4-extension-handling","text":"Step 4: Extension handling"},{"level":3,"id":"step-5-path-traversal-check","text":"Step 5: Path traversal check"},{"level":3,"id":"step-6-return-result","text":"Step 6: Return result"},{"level":3,"id":"resolution-examples","text":"Resolution examples"},{"level":2,"id":"115-path-sandboxing","text":"11.5 Path sandboxing"},{"level":2,"id":"116-canonical-write-format","text":"11.6 Canonical write format"},{"level":3,"id":"default-wikilink-format","text":"Default (wikilink format)"},{"level":3,"id":"markdown-link-format-linksusemarkdownformattrue","text":"Markdown link format (links.use_markdown_format=true)"},{"level":3,"id":"round-trip-preservation","text":"Round-trip preservation"},{"level":2,"id":"117-configuration","text":"11.7 Configuration"},{"level":2,"id":"118-role-specific-rules","text":"11.8 Role-specific rules"},{"level":3,"id":"1181-projects","text":"11.8.1 projects"},{"level":3,"id":"1182-blockedbyuid","text":"11.8.2 blocked_by.uid"},{"level":3,"id":"1183-attachments","text":"11.8.3 attachments"},{"level":2,"id":"119-rename-and-reference-updates","text":"11.9 Rename and reference updates"},{"level":2,"id":"1110-validation","text":"11.10 Validation"},{"level":2,"id":"1111-examples","text":"11.11 Examples"},{"level":3,"id":"dependency-with-wikilink-default","text":"Dependency with wikilink (default)"},{"level":3,"id":"dependency-with-markdown-links-linksusemarkdownformattrue","text":"Dependency with markdown links (links.use_markdown_format=true)"},{"level":3,"id":"relative-links-from-nested-task","text":"Relative links from nested task"}],"html":"

11.1 Purpose#

\n

This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects, blocked_by.uid, and attachments.\nAlignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section.

\n

Applicability:

\n
    \n
  • Implementations claiming profile extended (§7.3.5) MUST conform to this section for supported link-bearing roles.
  • \n
  • Implementations claiming profile materialized-occurrences (§7.3.4) MUST conform to this section for recurrence_parent links, but are not required to support unrelated extended link-bearing roles solely because of that profile.
  • \n
  • Implementations supporting the attachments role MUST conform to this section for attachment references regardless of profile.
  • \n
  • Implementations that claim neither extended nor materialized-occurrences MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior.
  • \n
\n
\n\n

Implementations that conform to §11 (see §11.1 applicability) MUST support three link formats.

\n

11.2.1 Wikilinks#

\n
[[target]]\n[[target|alias]]\n[[target#anchor]]\n[[target#anchor|alias]]\n[[folder/target]]\n[[./relative]]\n[[../parent/target]]\n

Components:

\n
    \n
  • target: The file being linked to (without extension by default)
  • \n
  • alias: Display text; does not affect resolution
  • \n
  • anchor: A heading or block reference within the target
  • \n
  • path: May be absolute (from collection root) or relative (from current file)
  • \n
\n

Examples in frontmatter:

\n
projects:\n  - "[[home-project]]"\n  - "[[projects/alpha|Alpha Project]]"\nblockedBy:\n  - uid: "[[prepare-metrics]]"\n    reltype: FINISHTOSTART\n

11.2.2 Markdown links#

\n
[text](path.md)\n[text](./relative.md)\n[text](../other/file.md)\n[text](path.md#anchor)\n

The text portion is treated as an alias and does not affect resolution.

\n

Markdown links in frontmatter require the obsidian-frontmatter-markdown-links Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless links.use_markdown_format=true is configured (§11.7).

\n

11.2.3 Bare paths#

\n
./sibling.md\n../other/file.md\nfolder/file.md\n

Bare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with /).

\n
\n\n

When a link value is read, implementations MUST parse it into a structured representation:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ComponentTypeDescription
rawstringOriginal string value exactly as written
targetstringFile path or identifier (without anchor or alias)
aliasstring?Display text if provided, otherwise null
anchorstring?Heading or block reference if provided, otherwise null
formatenumOne of: wikilink, markdown, path
is_relativebooleanWhether target begins with ./ or ../
\n

Parsing examples:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Inputtargetaliasanchorformatis_relative
[[task-001]]task-001nullnullwikilinkfalse
[[task-001|My Task]]task-001My Tasknullwikilinkfalse
[[docs/api#auth]]docs/apinullauthwikilinkfalse
[[./sibling]]./siblingnullnullwikilinktrue
[Link](file.md)file.mdLinknullmarkdownfalse
./other.md./other.mdnullnullpathtrue
\n
\n

11.4 Resolution algorithm#

\n

Resolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file.

\n

Given a parsed link and the path of the source file containing it:

\n\n

Step 2: Route by format#

\n

If format is markdown or path:

\n
    \n
  • If target starts with /, resolve from collection root (strip the leading /)
  • \n
  • Otherwise, resolve relative to the source file's directory (standard markdown behavior)
  • \n
  • Example: link [Docs](docs/api.md) in notes/meeting.md resolves to notes/docs/api.md
  • \n
\n

If format is wikilink:

\n
    \n
  • If target starts with ./ or ../, resolve relative to the source file's directory
  • \n
  • If target starts with /, resolve from collection root (strip the leading /)
  • \n
  • If target contains / (and is not relative), resolve from collection root
      \n
    • Example: [[docs/api]] resolves to docs/api
    • \n
    \n
  • \n
  • If simple name (no /, no ./ or ../): proceed to Step 3
  • \n
\n\n

For simple wikilink names (no path separator):

\n
    \n
  1. Define the search scope:

    \n
      \n
    • For blocked_by.uid: scope to files matching task_detection (task files only)
    • \n
    • For projects: scope to all markdown files in the collection unless narrowed by explicit configuration
    • \n
    • For attachments: scope to all non-directory files in the collection
    • \n
    \n
  2. \n
  3. ID match pass: search scoped files for semantic role id (§2.6.5) equal to the name.

    \n
      \n
    • Implementations MAY treat literal frontmatter key id as compatibility input when semantic mapping for id is unavailable.
    • \n
    • Equality MUST be exact string equality.
    • \n
    • If exactly one match: resolve to that file
    • \n
    • If multiple matches: fail with ambiguous_link
    • \n
    \n
  4. \n
  5. Filename match pass: if no ID match, search scoped markdown files by filename (without extension).

    \n
  6. \n
  7. Implementations MUST deduplicate normalized candidate paths before final selection.

    \n
  8. \n
  9. If exactly one filename candidate remains after normalization and extension handling, resolve to that file.

    \n
  10. \n
  11. If multiple filename candidates remain, resolve to null and emit ambiguous_link. Callers SHOULD use a path-qualified or relative target to disambiguate.

    \n
  12. \n
\n

Step 4: Extension handling#

\n

If the target has no extension, implementations SHOULD try configured extensions in order.

\n

Default extension order: [".md"].

\n

Example: [[readme]] tries readme.md, readme.mdx, etc.

\n

Step 5: Path traversal check#

\n

After resolution and normalization, if the resolved path would escape the collection root, abort with path_traversal. See §11.5.

\n

Step 6: Return result#

\n
    \n
  • The normalized collection-relative path if found
  • \n
  • null if no matching file exists
  • \n
\n

Resolution examples#

\n

Given collection structure:

\n
/\n├── TaskNotes/\n│   ├── Tasks/\n│   │   ├── task-001.md\n│   │   └── subtasks/\n│   │       └── task-002.md\n├── notes/\n│   └── meeting.md\n└── projects/\n    └── alpha.md\n

Resolution from TaskNotes/Tasks/subtasks/task-002.md:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Link valueResolved pathNotes
[[task-001]]TaskNotes/Tasks/task-001.mdSimple-name search
[[../task-001]]TaskNotes/Tasks/task-001.mdRelative wikilink
[[./task-003]]TaskNotes/Tasks/subtasks/task-003.mdRelative (may not exist)
[[notes/meeting]]notes/meeting.mdAbsolute from root
[[alpha]]projects/alpha.mdSimple-name search (projects scope)
[link](../task-001.md)TaskNotes/Tasks/task-001.mdMarkdown, relative
../task-001.mdTaskNotes/Tasks/task-001.mdBare path, relative
\n
\n

11.5 Path sandboxing#

\n

Link resolution MUST NOT produce paths outside the collection root.

\n

Rules:

\n
    \n
  • After resolving relative paths (applying ../ segments), the resulting path MUST be within the collection root directory
  • \n
  • If resolution would escape the collection root, the link MUST resolve to null and implementations MUST emit a path_traversal error
  • \n
  • This applies to all link formats: wikilinks, markdown links, and bare paths
  • \n
  • Implementations MUST normalize paths (resolve . and .. segments) before checking containment
  • \n
\n

Examples (collection rooted at /home/user/MyVault/):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LinkFrom fileResult
[[../../../etc/passwd]]TaskNotes/Tasks/task.mdnull + path_traversal
[[../../secrets/key]]deep/nested/file.mdnull + path_traversal
[[../task-001]]TaskNotes/Tasks/subtasks/t.mdResolves normally
\n
\n

11.6 Canonical write format#

\n

When creating new link values or changing a link target, implementations MUST use a deterministic canonical form.

\n\n

By default (links.use_markdown_format=false), the canonical write format is a simple wikilink:

\n
blockedBy:\n  - uid: "[[task-001]]"\n    reltype: FINISHTOSTART\nprojects:\n  - "[[projects/alpha]]"\n

Rules:

\n
    \n
  • Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope.
  • \n
  • Use a path-qualified target (folder/name) when the simple name would be ambiguous.
  • \n
  • Do NOT include the alias component in dependency uid writes.
  • \n
  • Do NOT include the anchor component in dependency uid writes.
  • \n
  • Preserve the alias component in projects entries when the alias was provided by the user.
  • \n
  • For attachments, always write a path-qualified collection-relative target\nwith its file extension, for example [[Attachments/01K1-photo.jpg]].\nAttachment writes MUST NOT include an alias or anchor.
  • \n
\n\n

When links.use_markdown_format=true is configured (requires the obsidian-frontmatter-markdown-links Obsidian plugin), the canonical write format for link-bearing fields is a markdown link using the collection-relative path:

\n
blockedBy:\n  - uid: "[task-001](TaskNotes/Tasks/task-001.md)"\n    reltype: FINISHTOSTART\n

Round-trip preservation#

\n

When writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible:

\n
    \n
  • If the user wrote [[task-001|My Task]], preserve alias for projects entries.
  • \n
  • If the user wrote a relative path, preserve relativity when possible.
  • \n
  • For blocked_by.uid, alias and anchor components MUST still be removed on canonical writes.
  • \n
  • If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section.
  • \n
\n
\n

11.7 Configuration#

\n

links configuration keys (see §9.12):

\n
links:\n  extensions: [".md"]                  # Extension trial order for extensionless targets\n  use_markdown_format: false           # Write markdown links instead of wikilinks\n  unresolved_default_severity: warning # "warning" or "error"\n  update_references_on_rename: true    # Update link targets when files are renamed\n

Rules:

\n
    \n
  • extensions MUST be a non-empty list when present
  • \n
  • unresolved_default_severity MUST be "warning" or "error"
  • \n
  • update_references_on_rename=true enables rename-time link rewrite behavior (§11.9)
  • \n
  • use_markdown_format=true requires the obsidian-frontmatter-markdown-links plugin in Obsidian deployments
  • \n
\n
\n

11.8 Role-specific rules#

\n

11.8.1 projects#

\n

projects entries SHOULD be interpreted with this section's parsing/resolution rules.

\n

If a projects entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution.

\n

If unresolved:

\n
    \n
  • links.unresolved_default_severity=error: validation error
  • \n
  • otherwise: SHOULD emit unresolved_link_target warning
  • \n
\n

11.8.2 blocked_by.uid#

\n

blocked_by.uid values MUST use this section's parsing/resolution rules.

\n

For dependency semantics, unresolved uid handling follows §10.2.6.\nFor unresolved-target severity, dependencies.unresolved_target_severity controls and takes precedence over links.unresolved_default_severity.

\n

The canonical write form for uid values is specified in §11.6.

\n

11.8.3 attachments#

\n

Attachment references MUST resolve to files, not directories. Canonical\nattachment targets MUST be collection-relative, path-qualified, and retain an\nexplicit file extension. This avoids ambiguous simple-name lookup, makes the\nfrontmatter portable without a media-specific extension search policy, and\npreserves the actual filename.

\n

Readers MUST accept wikilinks, Markdown links, and bare paths. They MAY accept\nsimple-name or extensionless values as non-canonical compatibility input, but\ncanonical writes MUST resolve and replace them with an explicit path and\nextension. Aliases and anchors are not part of attachment identity and MUST be\nremoved on canonical writes.

\n

The normalized resolved collection path defines attachment identity for\nduplicate detection. Implementations MUST preserve list order and MUST reject\nduplicates after path normalization. Unresolved attachment targets use the\nconfigured unresolved_link_target severity; offline-capable clients SHOULD\ndistinguish a known-but-not-locally-cached file from a genuinely unresolved\ntarget.

\n
\n

11.9 Rename and reference updates#

\n

If an implementation supports reference updates on rename (i.e. claims the rename capability):

\n
    \n
  1. It MUST update resolvable references in blocked_by.uid, projects, and attachments link fields.
  2. \n
  3. It SHOULD update links in body content.
  4. \n
  5. It SHOULD preserve the original link format when possible.
  6. \n
  7. It MUST preserve alias and anchor components where valid for the target field. For blocked_by.uid, alias and anchor are non-canonical and MUST be removed on write (§11.6).
  8. \n
  9. It MUST report unresolved or ambiguous rewrite cases.
  10. \n
\n

If reference updates are not supported, this limitation MUST be disclosed in conformance claims.

\n
\n

11.10 Validation#

\n

Link validation issues:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CodeSeverityTrigger
invalid_link_formaterrorLink value cannot be parsed as any supported format
ambiguous_linkwarningSimple-name resolution found multiple candidates after normalization
unresolved_link_targetwarningLink target cannot be resolved to an existing file
path_traversalerrorResolved path escapes collection root
\n

unresolved_link_target severity may be promoted to error via links.unresolved_default_severity=error.\nFor blocked_by.uid, use unresolved_dependency_target severity policy from §10.2.6 instead of unresolved_link_target.

\n
\n

11.11 Examples#

\n\n
---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n  - uid: "[[design-api]]"\n    reltype: FINISHTOSTART\n  - uid: "[[projects/infra/setup-server]]"\n    reltype: FINISHTOSTART\n    gap: P1D\nprojects:\n  - "[[projects/alpha]]"\ndateCreated: 2026-02-20T10:00:00Z\ndateModified: 2026-02-20T10:00:00Z\n---\n
\n
---\ntitle: Implement API\nstatus: open\ntags: [task]\nblockedBy:\n  - uid: "[design-api](TaskNotes/Tasks/design-api.md)"\n    reltype: FINISHTOSTART\n---\n
\n
# TaskNotes/Tasks/subtasks/task-002.md\n---\ntitle: Sub-task\nstatus: open\ntags: [task]\nblockedBy:\n  - uid: "[[../task-001]]"    # resolves to TaskNotes/Tasks/task-001.md\n    reltype: FINISHTOSTART\nprojects:\n  - "[[projects/alpha]]"      # resolves from collection root\n---\n
","text":"11.1 Purpose# This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects, blocked_by.uid, and attachments. Alignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section. Applicability: Implementations claiming profile extended (§7.3.5) MUST conform to this section for supported link-bearing roles. Implementations claiming profile materialized-occurrences (§7.3.4) MUST conform to this section for recurrence_parent links, but are not required to support unrelated extended link-bearing roles solely because of that profile. Implementations supporting the attachments role MUST conform to this section for attachment references regardless of profile. Implementations that claim neither extended nor materialized-occurrences MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior. 11.2 Link formats# Implementations that conform to §11 (see §11.1 applicability) MUST support three link formats. 11.2.1 Wikilinks# [[target]] [[target|alias]] [[target#anchor]] [[target#anchor|alias]] [[folder/target]] [[./relative]] [[../parent/target]] Components: target: The file being linked to (without extension by default) alias: Display text; does not affect resolution anchor: A heading or block reference within the target path: May be absolute (from collection root) or relative (from current file) Examples in frontmatter: projects: - \"[[home-project]]\" - \"[[projects/alpha|Alpha Project]]\" blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART 11.2.2 Markdown links# [text](path.md) [text](./relative.md) [text](../other/file.md) [text](path.md#anchor) The text portion is treated as an alias and does not affect resolution. Markdown links in frontmatter require the obsidian-frontmatter-markdown-links Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless links.use_markdown_format=true is configured (§11.7). 11.2.3 Bare paths# ./sibling.md ../other/file.md folder/file.md Bare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with /). 11.3 Link parsing# When a link value is read, implementations MUST parse it into a structured representation: Component Type Description raw string Original string value exactly as written target string File path or identifier (without anchor or alias) alias string? Display text if provided, otherwise null anchor string? Heading or block reference if provided, otherwise null format enum One of: wikilink, markdown, path is_relative boolean Whether target begins with ./ or ../ Parsing examples: Input target alias anchor format is_relative [[task-001]] task-001 null null wikilink false [[task-001|My Task]] task-001 My Task null wikilink false [[docs/api#auth]] docs/api null auth wikilink false [[./sibling]] ./sibling null null wikilink true [Link](file.md) file.md Link null markdown false ./other.md ./other.md null null path true 11.4 Resolution algorithm# Resolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file. Given a parsed link and the path of the source file containing it: Step 1: Parse the link into components (target, format, is_relative)# Step 2: Route by format# If format is markdown or path: If target starts with /, resolve from collection root (strip the leading /) Otherwise, resolve relative to the source file's directory (standard markdown behavior) Example: link [Docs](docs/api.md) in notes/meeting.md resolves to notes/docs/api.md If format is wikilink: If target starts with ./ or ../, resolve relative to the source file's directory If target starts with /, resolve from collection root (strip the leading /) If target contains / (and is not relative), resolve from collection root Example: [[docs/api]] resolves to docs/api If simple name (no /, no ./ or ../): proceed to Step 3 Step 3: Simple-name resolution (wikilinks only)# For simple wikilink names (no path separator): Define the search scope: For blocked_by.uid: scope to files matching task_detection (task files only) For projects: scope to all markdown files in the collection unless narrowed by explicit configuration For attachments: scope to all non-directory files in the collection ID match pass: search scoped files for semantic role id (§2.6.5) equal to the name. Implementations MAY treat literal frontmatter key id as compatibility input when semantic mapping for id is unavailable. Equality MUST be exact string equality. If exactly one match: resolve to that file If multiple matches: fail with ambiguous_link Filename match pass: if no ID match, search scoped markdown files by filename (without extension). Implementations MUST deduplicate normalized candidate paths before final selection. If exactly one filename candidate remains after normalization and extension handling, resolve to that file. If multiple filename candidates remain, resolve to null and emit ambiguous_link. Callers SHOULD use a path-qualified or relative target to disambiguate. Step 4: Extension handling# If the target has no extension, implementations SHOULD try configured extensions in order. Default extension order: [\".md\"]. Example: [[readme]] tries readme.md, readme.mdx, etc. Step 5: Path traversal check# After resolution and normalization, if the resolved path would escape the collection root, abort with path_traversal. See §11.5. Step 6: Return result# The normalized collection-relative path if found null if no matching file exists Resolution examples# Given collection structure: / ├── TaskNotes/ │ ├── Tasks/ │ │ ├── task-001.md │ │ └── subtasks/ │ │ └── task-002.md ├── notes/ │ └── meeting.md └── projects/ └── alpha.md Resolution from TaskNotes/Tasks/subtasks/task-002.md: Link value Resolved path Notes [[task-001]] TaskNotes/Tasks/task-001.md Simple-name search [[../task-001]] TaskNotes/Tasks/task-001.md Relative wikilink [[./task-003]] TaskNotes/Tasks/subtasks/task-003.md Relative (may not exist) [[notes/meeting]] notes/meeting.md Absolute from root [[alpha]] projects/alpha.md Simple-name search (projects scope) [link](../task-001.md) TaskNotes/Tasks/task-001.md Markdown, relative ../task-001.md TaskNotes/Tasks/task-001.md Bare path, relative 11.5 Path sandboxing# Link resolution MUST NOT produce paths outside the collection root. Rules: After resolving relative paths (applying ../ segments), the resulting path MUST be within the collection root directory If resolution would escape the collection root, the link MUST resolve to null and implementations MUST emit a path_traversal error This applies to all link formats: wikilinks, markdown links, and bare paths Implementations MUST normalize paths (resolve . and .. segments) before checking containment Examples (collection rooted at /home/user/MyVault/): Link From file Result [[../../../etc/passwd]] TaskNotes/Tasks/task.md null + path_traversal [[../../secrets/key]] deep/nested/file.md null + path_traversal [[../task-001]] TaskNotes/Tasks/subtasks/t.md Resolves normally 11.6 Canonical write format# When creating new link values or changing a link target, implementations MUST use a deterministic canonical form. Default (wikilink format)# By default (links.use_markdown_format=false), the canonical write format is a simple wikilink: blockedBy: - uid: \"[[task-001]]\" reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" Rules: Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope. Use a path-qualified target (folder/name) when the simple name would be ambiguous. Do NOT include the alias component in dependency uid writes. Do NOT include the anchor component in dependency uid writes. Preserve the alias component in projects entries when the alias was provided by the user. For attachments, always write a path-qualified collection-relative target with its file extension, for example [[Attachments/01K1-photo.jpg]]. Attachment writes MUST NOT include an alias or anchor. Markdown link format (links.use_markdown_format=true)# When links.use_markdown_format=true is configured (requires the obsidian-frontmatter-markdown-links Obsidian plugin), the canonical write format for link-bearing fields is a markdown link using the collection-relative path: blockedBy: - uid: \"[task-001](TaskNotes/Tasks/task-001.md)\" reltype: FINISHTOSTART Round-trip preservation# When writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible: If the user wrote [[task-001|My Task]], preserve alias for projects entries. If the user wrote a relative path, preserve relativity when possible. For blocked_by.uid, alias and anchor components MUST still be removed on canonical writes. If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section. 11.7 Configuration# links configuration keys (see §9.12): links: extensions: [\".md\"] # Extension trial order for extensionless targets use_markdown_format: false # Write markdown links instead of wikilinks unresolved_default_severity: warning # \"warning\" or \"error\" update_references_on_rename: true # Update link targets when files are renamed Rules: extensions MUST be a non-empty list when present unresolved_default_severity MUST be \"warning\" or \"error\" update_references_on_rename=true enables rename-time link rewrite behavior (§11.9) use_markdown_format=true requires the obsidian-frontmatter-markdown-links plugin in Obsidian deployments 11.8 Role-specific rules# 11.8.1 projects# projects entries SHOULD be interpreted with this section's parsing/resolution rules. If a projects entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution. If unresolved: links.unresolved_default_severity=error: validation error otherwise: SHOULD emit unresolved_link_target warning 11.8.2 blocked_by.uid# blocked_by.uid values MUST use this section's parsing/resolution rules. For dependency semantics, unresolved uid handling follows §10.2.6. For unresolved-target severity, dependencies.unresolved_target_severity controls and takes precedence over links.unresolved_default_severity. The canonical write form for uid values is specified in §11.6. 11.8.3 attachments# Attachment references MUST resolve to files, not directories. Canonical attachment targets MUST be collection-relative, path-qualified, and retain an explicit file extension. This avoids ambiguous simple-name lookup, makes the frontmatter portable without a media-specific extension search policy, and preserves the actual filename. Readers MUST accept wikilinks, Markdown links, and bare paths. They MAY accept simple-name or extensionless values as non-canonical compatibility input, but canonical writes MUST resolve and replace them with an explicit path and extension. Aliases and anchors are not part of attachment identity and MUST be removed on canonical writes. The normalized resolved collection path defines attachment identity for duplicate detection. Implementations MUST preserve list order and MUST reject duplicates after path normalization. Unresolved attachment targets use the configured unresolved_link_target severity; offline-capable clients SHOULD distinguish a known-but-not-locally-cached file from a genuinely unresolved target. 11.9 Rename and reference updates# If an implementation supports reference updates on rename (i.e. claims the rename capability): It MUST update resolvable references in blocked_by.uid, projects, and attachments link fields. It SHOULD update links in body content. It SHOULD preserve the original link format when possible. It MUST preserve alias and anchor components where valid for the target field. For blocked_by.uid, alias and anchor are non-canonical and MUST be removed on write (§11.6). It MUST report unresolved or ambiguous rewrite cases. If reference updates are not supported, this limitation MUST be disclosed in conformance claims. 11.10 Validation# Link validation issues: Code Severity Trigger invalid_link_format error Link value cannot be parsed as any supported format ambiguous_link warning Simple-name resolution found multiple candidates after normalization unresolved_link_target warning Link target cannot be resolved to an existing file path_traversal error Resolved path escapes collection root unresolved_link_target severity may be promoted to error via links.unresolved_default_severity=error. For blocked_by.uid, use unresolved_dependency_target severity policy from §10.2.6 instead of unresolved_link_target. 11.11 Examples# Dependency with wikilink (default)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[[design-api]]\" reltype: FINISHTOSTART - uid: \"[[projects/infra/setup-server]]\" reltype: FINISHTOSTART gap: P1D projects: - \"[[projects/alpha]]\" dateCreated: 2026-02-20T10:00:00Z dateModified: 2026-02-20T10:00:00Z --- Dependency with markdown links (links.use_markdown_format=true)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[design-api](TaskNotes/Tasks/design-api.md)\" reltype: FINISHTOSTART --- Relative links from nested task# # TaskNotes/Tasks/subtasks/task-002.md --- title: Sub-task status: open tags: [task] blockedBy: - uid: \"[[../task-001]]\" # resolves to TaskNotes/Tasks/task-001.md reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" # resolves from collection root ---"},{"route":"/developers/specification/12-mdbase-v0.3-binding/","title":"12. mdbase v0.3 Data-Contract Binding","description":"Status: Draft","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:12-mdbase-v0.3-binding.md","namespace":"specification","relativePath":"12-mdbase-v0.3-binding.md","raw":"# 12. mdbase v0.3 Data-Contract Binding\n\n**Status:** Draft\n\n**Record contract:** `tasknotes.task` `0.3.0-rc.3`\n\n**Event contract:** `tasknotes.task.completed` `1.0.0`\n\n**Target:** mdbase `0.3.x`\n\n## 12.1 Purpose\n\nThis chapter defines how a TaskNotes task model is exposed through mdbase\nwithout coupling TaskNotes to one record type or one application's private\nextension.\n\nThe binding has three deliberately separate parts:\n\n1. the `tasknotes.task` data contract defines the portable task view;\n2. an mdbase type's `implements` entry maps that view to its own frontmatter\n fields and supplies TaskNotes behavior; and\n3. the rest of the type file continues to define that type's storage,\n matching, defaults, lifecycle, links, and paths.\n\nThe normative artifacts are:\n\n- [`mdbase/tasknotes.task.md`](mdbase/tasknotes.task.md), the record contract;\n- [`schemas/tasknotes-task.schema.json`](schemas/tasknotes-task.schema.json),\n the projected task-view schema; and\n- [`schemas/tasknotes-task-binding.schema.json`](schemas/tasknotes-task-binding.schema.json),\n the implementation binding schema.\n\nThe optional event-interoperability artifacts are:\n\n- [`mdbase/tasknotes.task.completed.md`](mdbase/tasknotes.task.completed.md),\n the event contract; and\n- [`schemas/tasknotes-task-completed.schema.json`](schemas/tasknotes-task-completed.schema.json),\n its event-data schema.\n\n## 12.2 The mental model\n\nA contract is not another record type. It is a view that several record types\ncan implement and several applications can consume.\n\n```text\npersonal_task ─┐\nwork_task ─────┼─ implements tasknotes.task 0.3.0-rc.3 ── TaskNotes\nissue_task ────┘ ├─ automation\n └─ another task app\n```\n\nReading or listing through the contract uses the union of all implementing\ntypes. Creating a task is different: the caller MUST choose one exact target\ntype because the contract does not choose storage, paths, or lifecycle policy.\n\nThe contract version is an exact semantic version. For this draft it is also\nthe tasknotes-spec version whose task semantics the contract exposes. There is\nno independent `x-tasknotes.version` or `spec_version` mirror.\n\nRecord types use `implements` because they adapt persisted fields and semantic\nbindings to the `tasknotes.task` record contract. Event sources do not use a\ntype file. A TaskNotes application instead registers an event-source\ndeclaration for `tasknotes.task.completed` with an active mdbase\ninteroperability bridge.\n\n## 12.3 Layering\n\nAn implementing type MUST keep these responsibilities in their canonical\nlocations:\n\n| Information | mdbase v0.3 location |\n|---|---|\n| Persisted frontmatter shape, required fields, enum values, formats | `schema` |\n| Type identification | `match` |\n| Display field, defaults, links, uniqueness, and path generation | `collection` |\n| Managed create/update values | `lifecycle` |\n| Contract identity and custom field names | `implements[].contract`, `version`, and `fields` |\n| TaskNotes semantic behavior | `implements[].binding` |\n\nTaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords.\n`x-tasknotes` MUST NOT be used for contract discovery, field mapping,\nconformance, or authorization.\n\n## 12.4 Declaring an implementation\n\nAn mdbase TaskNotes type declares one implementation:\n\n```yaml\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.3\n fields:\n title: summary\n status: state\n priority: importance\n dateCreated: created_at\n binding:\n # TaskNotes behavior; abbreviated here\n profiles: [core-lite]\n capabilities: []\n title:\n storage: frontmatter\n filename_format: title\n status:\n values: [todo, doing, done]\n default: todo\n completed_values: [done]\n definitions: []\n priority:\n values: [normal]\n default: normal\n definitions: []\n```\n\nThe contract file identified by the exact `contract` and `version` MUST exist\nin the collection contract registry. The `binding` MUST validate against that\ncontract's `binding_schema`.\n\nEach type MUST declare at most one implementation of one exact contract\nidentity. A type may implement several different contracts.\n\n## 12.5 Portable fields\n\n`fields` maps contract field paths to record field paths. Consumers access\ncontract fields and MUST NOT assume that their names are also frontmatter\nproperty names.\n\n```yaml\nfields:\n title: summary\n status: state\n blockedBy: dependencies\n attachments: files\n```\n\nEvery unconditionally required contract field MUST be mapped. Every mapped\ncontract field and record field MUST exist in its respective JSON Schema.\n\nThe contract view contains only mapped fields. It does not expose unmapped\nfrontmatter or the Markdown body. A consumer that requires either needs\nseparate, explicit whole-record access.\n\n`title` is optional in the portable schema because TaskNotes permits filename\ntitle storage. When `binding.title.storage` is `filename`, consumers derive\nthe effective title from the record identity/path rules in §9.13 instead of\nexpecting a projected frontmatter value.\n\nThe camel-case contract field names are stable portable identifiers. Their\nsnake-case tasknotes-spec counterparts include:\n\n| Contract field | tasknotes-spec role |\n|---|---|\n| `timeEstimate` | `time_estimate` |\n| `completedDate` | `completed_date` |\n| `dateCreated` | `date_created` |\n| `dateModified` | `date_modified` |\n| `recurrenceAnchor` | `recurrence_anchor` |\n| `completeInstances` | `complete_instances` |\n| `skippedInstances` | `skipped_instances` |\n| `recurrenceParent` | `recurrence_parent` |\n| `occurrenceDate` | `occurrence_date` |\n| `occurrenceMaterialization` | `occurrence_materialization` |\n| `occurrenceNextTrigger` | `occurrence_next_trigger` |\n| `occurrenceTemplate` | `occurrence_template` |\n| `occurrencePastHorizon` | `occurrence_past_horizon` |\n| `occurrenceFutureHorizon` | `occurrence_future_horizon` |\n| `timeEntries` | `time_entries` |\n| `blockedBy` | `blocked_by` |\n| `attachments` | `attachments` |\n\n## 12.6 Semantic profiles and capabilities\n\n`binding.profiles` and `binding.capabilities` describe semantics that records\nof this implementation may use:\n\n```yaml\nbinding:\n profiles: [core-lite, recurrence, materialized-occurrences]\n capabilities:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n```\n\nThese are properties of the implementation, not claims that every consuming\napplication supports them. Before mutating a governed field, a consumer SHOULD\nverify its own corresponding capability. It may still perform unrelated\noperations when it preserves unsupported fields and invariants.\n\n## 12.7 Status and priority semantics\n\nThe implementing type schema defines the legal persisted values of the mapped\nfields. The binding gives those values TaskNotes meaning:\n\n```yaml\nbinding:\n status:\n values: [todo, doing, done, cancelled]\n default: todo\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n definitions: []\n priority:\n values: [low, normal, high]\n default: normal\n definitions: []\n```\n\nThe following consistency rules apply:\n\n- binding values MUST equal the mapped type-schema enum values;\n- defaults MUST equal mapped `collection.read_defaults` values when present;\n- completed and skipped values MUST be members of `status.values`;\n- `default_skipped` MUST be a skipped value;\n- completed and skipped values MUST NOT overlap for materialized occurrences;\n and\n- definition semantics MUST agree with completed/skipped membership.\n\nStatus and priority labels, colors, and icons are presentation hints. Status\ncycle, completion, skipping, auto-archive, and priority weight are semantic.\n\n## 12.8 Title, recurrence, links, and operations\n\nThe remaining binding sections project the effective TaskNotes behavior\ndefined elsewhere in this specification:\n\n- `title` follows §9.13 and MUST agree with `collection.display` and\n `collection.path`;\n- `recurrence` follows §4;\n- `occurrences` follows §2.6.6, §4.18, §5.20, and §9.17;\n- `links` follows §11;\n- attachment membership is the portable `attachments` contract field; binary\n MIME type, digest, byte size, revision, and timestamps remain authoritative\n in mdbase file descriptors and are not projected into task frontmatter;\n- `archive` follows §5.12;\n- `time_tracking` follows §5.19 and §9.16;\n- `templating` follows §5.3.5 and §9.14; and\n- optional `nlp` triggers follow §9.18.\n\nArchive always operates on the portable `tags` contract field, so the binding\ndoes not repeat a record-specific `tags_field`. The implementation's `fields`\nmap determines the actual frontmatter property.\n\nApplication-local notification preferences and generator bookkeeping MUST NOT\nbe placed in the binding.\n\n## 12.9 Multiple implementations\n\nA collection may contain any number of types implementing\n`tasknotes.task 0.3.0-rc.3`. TaskNotes-aware readers MUST:\n\n1. resolve the exact local contract;\n2. enumerate every implementation in canonical type-name order;\n3. read each matching record through that implementation's projected view;\n4. validate the projected view; and\n5. retain the concrete type identity for updates.\n\nImplementations MUST NOT merge type schemas into one synthetic schema. A record\nis validated by its concrete type and then by its projected contract view.\n\nWhen an approval, cache, or external protocol pins an implementation set, it\nMUST pin the exact contract digest and sorted implementation descriptors,\nincluding each implementation digest. A newly installed type is therefore not\nsilently added to an existing approval.\n\nCreation MUST name one concrete implementing type. If no type is selected,\ncreation fails as ambiguous.\n\n## 12.10 Task-completed event\n\nAn event source that claims `tasknotes.task.completed 1.0.0` MUST emit one\nCloudEvents structured event for each observed transition from a\nnon-completed status to a completed status. Its `data` contains only:\n\n- `task_id`, using the stable TaskNotes ID when present and otherwise the\n normalized path;\n- `task_path`;\n- the current `title` and completed `status`; and\n- `completed_at`, the instant when TaskNotes observed the transition.\n\nThe event source MUST use the mdbase event/action interoperability profile\n`0.1`, pin the exact event-contract digest, and preserve any correlation and\ncausation identifiers supplied by the mutation context. It MUST NOT include a\ncomplete task record merely because one is locally available. An authorized\nconsumer can retrieve current state separately, avoiding stale snapshots and\nunnecessary disclosure.\n\nContract compatibility and bridge authorization are independent. Installing\nTaskNotes or resolving this contract does not grant permission to publish or\nconsume the event.\n\n## 12.11 Precedence and consistency\n\nThe complete implementation is self-describing:\n\n1. the contract schema is authoritative for the portable projected view;\n2. the type schema is authoritative for persisted value shapes;\n3. `collection` is authoritative for generic mdbase behavior;\n4. `lifecycle` is authoritative for generic managed writes; and\n5. `implements[].binding` is authoritative for TaskNotes semantics.\n\nWhere values intentionally mirror each other, producers MUST keep them equal.\nA TaskNotes-aware consumer MUST report a configuration error instead of\nsilently choosing between contradictory values.\n\n## 12.12 Safe writes\n\nTaskNotes-aware consumers MUST preserve:\n\n- unknown frontmatter properties unless explicit replacement or migration was\n requested;\n- Markdown body content unless an operation explicitly replaces it;\n- fields governed by unsupported capabilities; and\n- unrelated type metadata and implementations.\n\nGeneric mdbase operations are safe only when they preserve the same data.\nCompletion, recurrence mutation, occurrence materialization, dependency\nupdates, time tracking, archive, and other domain operations MUST follow the\nTaskNotes semantics referenced by the binding.\n\n## 12.13 Complete custom-field example\n\n```yaml\n---\nkind: mdbase.type\nname: work_task\nversion: 1\nschema:\n dialect: json-schema-2020-12\n value:\n type: object\n additionalProperties: true\n required: [summary, state, created_at]\n properties:\n summary: { type: string, minLength: 1 }\n state: { enum: [todo, doing, done, cancelled] }\n importance: { enum: [low, normal, high] }\n created_at: { type: string, format: date-time }\n tags:\n type: array\n items: { type: string }\ncollection:\n display:\n name_field: summary\n read_defaults:\n state: todo\n importance: normal\nlifecycle:\n on_create:\n set:\n created_at: { now: true }\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.3\n fields:\n title: summary\n status: state\n priority: importance\n dateCreated: created_at\n tags: tags\n binding:\n profiles: [core-lite]\n capabilities: [archive]\n title:\n storage: frontmatter\n filename_format: title\n status:\n values: [todo, doing, done, cancelled]\n default: todo\n completed_values: [done]\n skipped_values: [cancelled]\n default_skipped: cancelled\n definitions: []\n priority:\n values: [low, normal, high]\n default: normal\n definitions: []\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: false\n reset_body_checkboxes: false\n occurrences:\n identity_roles: [recurrenceParent, occurrenceDate]\n default_materialization: manual\n default_next_trigger: completion\n links:\n accepted_formats: [wikilink, markdown]\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: true\n templating:\n enabled: false\n occurrence_enabled: false\n---\n```\n","aliases":["/spec/12-mdbase-v0.3-binding/"],"toc":[{"level":2,"id":"121-purpose","text":"12.1 Purpose"},{"level":2,"id":"122-the-mental-model","text":"12.2 The mental model"},{"level":2,"id":"123-layering","text":"12.3 Layering"},{"level":2,"id":"124-declaring-an-implementation","text":"12.4 Declaring an implementation"},{"level":2,"id":"125-portable-fields","text":"12.5 Portable fields"},{"level":2,"id":"126-semantic-profiles-and-capabilities","text":"12.6 Semantic profiles and capabilities"},{"level":2,"id":"127-status-and-priority-semantics","text":"12.7 Status and priority semantics"},{"level":2,"id":"128-title-recurrence-links-and-operations","text":"12.8 Title, recurrence, links, and operations"},{"level":2,"id":"129-multiple-implementations","text":"12.9 Multiple implementations"},{"level":2,"id":"1210-task-completed-event","text":"12.10 Task-completed event"},{"level":2,"id":"1211-precedence-and-consistency","text":"12.11 Precedence and consistency"},{"level":2,"id":"1212-safe-writes","text":"12.12 Safe writes"},{"level":2,"id":"1213-complete-custom-field-example","text":"12.13 Complete custom-field example"}],"html":"

Status: Draft

\n

Record contract: tasknotes.task 0.3.0-rc.3

\n

Event contract: tasknotes.task.completed 1.0.0

\n

Target: mdbase 0.3.x

\n

12.1 Purpose#

\n

This chapter defines how a TaskNotes task model is exposed through mdbase\nwithout coupling TaskNotes to one record type or one application's private\nextension.

\n

The binding has three deliberately separate parts:

\n
    \n
  1. the tasknotes.task data contract defines the portable task view;
  2. \n
  3. an mdbase type's implements entry maps that view to its own frontmatter\nfields and supplies TaskNotes behavior; and
  4. \n
  5. the rest of the type file continues to define that type's storage,\nmatching, defaults, lifecycle, links, and paths.
  6. \n
\n

The normative artifacts are:

\n\n

The optional event-interoperability artifacts are:

\n\n

12.2 The mental model#

\n

A contract is not another record type. It is a view that several record types\ncan implement and several applications can consume.

\n
personal_task ─┐\nwork_task ─────┼─ implements tasknotes.task 0.3.0-rc.3 ── TaskNotes\nissue_task ────┘                                  ├─ automation\n                                                  └─ another task app\n

Reading or listing through the contract uses the union of all implementing\ntypes. Creating a task is different: the caller MUST choose one exact target\ntype because the contract does not choose storage, paths, or lifecycle policy.

\n

The contract version is an exact semantic version. For this draft it is also\nthe tasknotes-spec version whose task semantics the contract exposes. There is\nno independent x-tasknotes.version or spec_version mirror.

\n

Record types use implements because they adapt persisted fields and semantic\nbindings to the tasknotes.task record contract. Event sources do not use a\ntype file. A TaskNotes application instead registers an event-source\ndeclaration for tasknotes.task.completed with an active mdbase\ninteroperability bridge.

\n

12.3 Layering#

\n

An implementing type MUST keep these responsibilities in their canonical\nlocations:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Informationmdbase v0.3 location
Persisted frontmatter shape, required fields, enum values, formatsschema
Type identificationmatch
Display field, defaults, links, uniqueness, and path generationcollection
Managed create/update valueslifecycle
Contract identity and custom field namesimplements[].contract, version, and fields
TaskNotes semantic behaviorimplements[].binding
\n

TaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords.\nx-tasknotes MUST NOT be used for contract discovery, field mapping,\nconformance, or authorization.

\n

12.4 Declaring an implementation#

\n

An mdbase TaskNotes type declares one implementation:

\n
implements:\n  - contract: tasknotes.task\n    version: 0.3.0-rc.3\n    fields:\n      title: summary\n      status: state\n      priority: importance\n      dateCreated: created_at\n    binding:\n      # TaskNotes behavior; abbreviated here\n      profiles: [core-lite]\n      capabilities: []\n      title:\n        storage: frontmatter\n        filename_format: title\n      status:\n        values: [todo, doing, done]\n        default: todo\n        completed_values: [done]\n        definitions: []\n      priority:\n        values: [normal]\n        default: normal\n        definitions: []\n

The contract file identified by the exact contract and version MUST exist\nin the collection contract registry. The binding MUST validate against that\ncontract's binding_schema.

\n

Each type MUST declare at most one implementation of one exact contract\nidentity. A type may implement several different contracts.

\n

12.5 Portable fields#

\n

fields maps contract field paths to record field paths. Consumers access\ncontract fields and MUST NOT assume that their names are also frontmatter\nproperty names.

\n
fields:\n  title: summary\n  status: state\n  blockedBy: dependencies\n  attachments: files\n

Every unconditionally required contract field MUST be mapped. Every mapped\ncontract field and record field MUST exist in its respective JSON Schema.

\n

The contract view contains only mapped fields. It does not expose unmapped\nfrontmatter or the Markdown body. A consumer that requires either needs\nseparate, explicit whole-record access.

\n

title is optional in the portable schema because TaskNotes permits filename\ntitle storage. When binding.title.storage is filename, consumers derive\nthe effective title from the record identity/path rules in §9.13 instead of\nexpecting a projected frontmatter value.

\n

The camel-case contract field names are stable portable identifiers. Their\nsnake-case tasknotes-spec counterparts include:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Contract fieldtasknotes-spec role
timeEstimatetime_estimate
completedDatecompleted_date
dateCreateddate_created
dateModifieddate_modified
recurrenceAnchorrecurrence_anchor
completeInstancescomplete_instances
skippedInstancesskipped_instances
recurrenceParentrecurrence_parent
occurrenceDateoccurrence_date
occurrenceMaterializationoccurrence_materialization
occurrenceNextTriggeroccurrence_next_trigger
occurrenceTemplateoccurrence_template
occurrencePastHorizonoccurrence_past_horizon
occurrenceFutureHorizonoccurrence_future_horizon
timeEntriestime_entries
blockedByblocked_by
attachmentsattachments
\n

12.6 Semantic profiles and capabilities#

\n

binding.profiles and binding.capabilities describe semantics that records\nof this implementation may use:

\n
binding:\n  profiles: [core-lite, recurrence, materialized-occurrences]\n  capabilities:\n    - dependencies\n    - reminders\n    - attachments\n    - links\n    - time-tracking\n    - materialized-occurrences\n    - archive\n

These are properties of the implementation, not claims that every consuming\napplication supports them. Before mutating a governed field, a consumer SHOULD\nverify its own corresponding capability. It may still perform unrelated\noperations when it preserves unsupported fields and invariants.

\n

12.7 Status and priority semantics#

\n

The implementing type schema defines the legal persisted values of the mapped\nfields. The binding gives those values TaskNotes meaning:

\n
binding:\n  status:\n    values: [todo, doing, done, cancelled]\n    default: todo\n    completed_values: [done]\n    skipped_values: [cancelled]\n    default_skipped: cancelled\n    definitions: []\n  priority:\n    values: [low, normal, high]\n    default: normal\n    definitions: []\n

The following consistency rules apply:

\n
    \n
  • binding values MUST equal the mapped type-schema enum values;
  • \n
  • defaults MUST equal mapped collection.read_defaults values when present;
  • \n
  • completed and skipped values MUST be members of status.values;
  • \n
  • default_skipped MUST be a skipped value;
  • \n
  • completed and skipped values MUST NOT overlap for materialized occurrences;\nand
  • \n
  • definition semantics MUST agree with completed/skipped membership.
  • \n
\n

Status and priority labels, colors, and icons are presentation hints. Status\ncycle, completion, skipping, auto-archive, and priority weight are semantic.

\n\n

The remaining binding sections project the effective TaskNotes behavior\ndefined elsewhere in this specification:

\n
    \n
  • title follows §9.13 and MUST agree with collection.display and\ncollection.path;
  • \n
  • recurrence follows §4;
  • \n
  • occurrences follows §2.6.6, §4.18, §5.20, and §9.17;
  • \n
  • links follows §11;
  • \n
  • attachment membership is the portable attachments contract field; binary\nMIME type, digest, byte size, revision, and timestamps remain authoritative\nin mdbase file descriptors and are not projected into task frontmatter;
  • \n
  • archive follows §5.12;
  • \n
  • time_tracking follows §5.19 and §9.16;
  • \n
  • templating follows §5.3.5 and §9.14; and
  • \n
  • optional nlp triggers follow §9.18.
  • \n
\n

Archive always operates on the portable tags contract field, so the binding\ndoes not repeat a record-specific tags_field. The implementation's fields\nmap determines the actual frontmatter property.

\n

Application-local notification preferences and generator bookkeeping MUST NOT\nbe placed in the binding.

\n

12.9 Multiple implementations#

\n

A collection may contain any number of types implementing\ntasknotes.task 0.3.0-rc.3. TaskNotes-aware readers MUST:

\n
    \n
  1. resolve the exact local contract;
  2. \n
  3. enumerate every implementation in canonical type-name order;
  4. \n
  5. read each matching record through that implementation's projected view;
  6. \n
  7. validate the projected view; and
  8. \n
  9. retain the concrete type identity for updates.
  10. \n
\n

Implementations MUST NOT merge type schemas into one synthetic schema. A record\nis validated by its concrete type and then by its projected contract view.

\n

When an approval, cache, or external protocol pins an implementation set, it\nMUST pin the exact contract digest and sorted implementation descriptors,\nincluding each implementation digest. A newly installed type is therefore not\nsilently added to an existing approval.

\n

Creation MUST name one concrete implementing type. If no type is selected,\ncreation fails as ambiguous.

\n

12.10 Task-completed event#

\n

An event source that claims tasknotes.task.completed 1.0.0 MUST emit one\nCloudEvents structured event for each observed transition from a\nnon-completed status to a completed status. Its data contains only:

\n
    \n
  • task_id, using the stable TaskNotes ID when present and otherwise the\nnormalized path;
  • \n
  • task_path;
  • \n
  • the current title and completed status; and
  • \n
  • completed_at, the instant when TaskNotes observed the transition.
  • \n
\n

The event source MUST use the mdbase event/action interoperability profile\n0.1, pin the exact event-contract digest, and preserve any correlation and\ncausation identifiers supplied by the mutation context. It MUST NOT include a\ncomplete task record merely because one is locally available. An authorized\nconsumer can retrieve current state separately, avoiding stale snapshots and\nunnecessary disclosure.

\n

Contract compatibility and bridge authorization are independent. Installing\nTaskNotes or resolving this contract does not grant permission to publish or\nconsume the event.

\n

12.11 Precedence and consistency#

\n

The complete implementation is self-describing:

\n
    \n
  1. the contract schema is authoritative for the portable projected view;
  2. \n
  3. the type schema is authoritative for persisted value shapes;
  4. \n
  5. collection is authoritative for generic mdbase behavior;
  6. \n
  7. lifecycle is authoritative for generic managed writes; and
  8. \n
  9. implements[].binding is authoritative for TaskNotes semantics.
  10. \n
\n

Where values intentionally mirror each other, producers MUST keep them equal.\nA TaskNotes-aware consumer MUST report a configuration error instead of\nsilently choosing between contradictory values.

\n

12.12 Safe writes#

\n

TaskNotes-aware consumers MUST preserve:

\n
    \n
  • unknown frontmatter properties unless explicit replacement or migration was\nrequested;
  • \n
  • Markdown body content unless an operation explicitly replaces it;
  • \n
  • fields governed by unsupported capabilities; and
  • \n
  • unrelated type metadata and implementations.
  • \n
\n

Generic mdbase operations are safe only when they preserve the same data.\nCompletion, recurrence mutation, occurrence materialization, dependency\nupdates, time tracking, archive, and other domain operations MUST follow the\nTaskNotes semantics referenced by the binding.

\n

12.13 Complete custom-field example#

\n
---\nkind: mdbase.type\nname: work_task\nversion: 1\nschema:\n  dialect: json-schema-2020-12\n  value:\n    type: object\n    additionalProperties: true\n    required: [summary, state, created_at]\n    properties:\n      summary: { type: string, minLength: 1 }\n      state: { enum: [todo, doing, done, cancelled] }\n      importance: { enum: [low, normal, high] }\n      created_at: { type: string, format: date-time }\n      tags:\n        type: array\n        items: { type: string }\ncollection:\n  display:\n    name_field: summary\n  read_defaults:\n    state: todo\n    importance: normal\nlifecycle:\n  on_create:\n    set:\n      created_at: { now: true }\nimplements:\n  - contract: tasknotes.task\n    version: 0.3.0-rc.3\n    fields:\n      title: summary\n      status: state\n      priority: importance\n      dateCreated: created_at\n      tags: tags\n    binding:\n      profiles: [core-lite]\n      capabilities: [archive]\n      title:\n        storage: frontmatter\n        filename_format: title\n      status:\n        values: [todo, doing, done, cancelled]\n        default: todo\n        completed_values: [done]\n        skipped_values: [cancelled]\n        default_skipped: cancelled\n        definitions: []\n      priority:\n        values: [low, normal, high]\n        default: normal\n        definitions: []\n      recurrence:\n        syntax: tasknotes\n        maintain_due_date_offset: false\n        reset_body_checkboxes: false\n      occurrences:\n        identity_roles: [recurrenceParent, occurrenceDate]\n        default_materialization: manual\n        default_next_trigger: completion\n      links:\n        accepted_formats: [wikilink, markdown]\n        write_format: wikilink\n      archive:\n        archived_tag: archived\n        move_on_archive: false\n      time_tracking:\n        auto_stop_on_complete: true\n      templating:\n        enabled: false\n        occurrence_enabled: false\n---\n
","text":"Status: Draft Record contract: tasknotes.task 0.3.0-rc.3 Event contract: tasknotes.task.completed 1.0.0 Target: mdbase 0.3.x 12.1 Purpose# This chapter defines how a TaskNotes task model is exposed through mdbase without coupling TaskNotes to one record type or one application's private extension. The binding has three deliberately separate parts: the tasknotes.task data contract defines the portable task view; an mdbase type's implements entry maps that view to its own frontmatter fields and supplies TaskNotes behavior; and the rest of the type file continues to define that type's storage, matching, defaults, lifecycle, links, and paths. The normative artifacts are: mdbase/tasknotes.task.md, the record contract; schemas/tasknotes-task.schema.json, the projected task-view schema; and schemas/tasknotes-task-binding.schema.json, the implementation binding schema. The optional event-interoperability artifacts are: mdbase/tasknotes.task.completed.md, the event contract; and schemas/tasknotes-task-completed.schema.json, its event-data schema. 12.2 The mental model# A contract is not another record type. It is a view that several record types can implement and several applications can consume. personal_task ─┐ work_task ─────┼─ implements tasknotes.task 0.3.0-rc.3 ── TaskNotes issue_task ────┘ ├─ automation └─ another task app Reading or listing through the contract uses the union of all implementing types. Creating a task is different: the caller MUST choose one exact target type because the contract does not choose storage, paths, or lifecycle policy. The contract version is an exact semantic version. For this draft it is also the tasknotes-spec version whose task semantics the contract exposes. There is no independent x-tasknotes.version or spec_version mirror. Record types use implements because they adapt persisted fields and semantic bindings to the tasknotes.task record contract. Event sources do not use a type file. A TaskNotes application instead registers an event-source declaration for tasknotes.task.completed with an active mdbase interoperability bridge. 12.3 Layering# An implementing type MUST keep these responsibilities in their canonical locations: Information mdbase v0.3 location Persisted frontmatter shape, required fields, enum values, formats schema Type identification match Display field, defaults, links, uniqueness, and path generation collection Managed create/update values lifecycle Contract identity and custom field names implements[].contract, version, and fields TaskNotes semantic behavior implements[].binding TaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords. x-tasknotes MUST NOT be used for contract discovery, field mapping, conformance, or authorization. 12.4 Declaring an implementation# An mdbase TaskNotes type declares one implementation: implements: - contract: tasknotes.task version: 0.3.0-rc.3 fields: title: summary status: state priority: importance dateCreated: created_at binding: # TaskNotes behavior; abbreviated here profiles: [core-lite] capabilities: [] title: storage: frontmatter filename_format: title status: values: [todo, doing, done] default: todo completed_values: [done] definitions: [] priority: values: [normal] default: normal definitions: [] The contract file identified by the exact contract and version MUST exist in the collection contract registry. The binding MUST validate against that contract's binding_schema. Each type MUST declare at most one implementation of one exact contract identity. A type may implement several different contracts. 12.5 Portable fields# fields maps contract field paths to record field paths. Consumers access contract fields and MUST NOT assume that their names are also frontmatter property names. fields: title: summary status: state blockedBy: dependencies attachments: files Every unconditionally required contract field MUST be mapped. Every mapped contract field and record field MUST exist in its respective JSON Schema. The contract view contains only mapped fields. It does not expose unmapped frontmatter or the Markdown body. A consumer that requires either needs separate, explicit whole-record access. title is optional in the portable schema because TaskNotes permits filename title storage. When binding.title.storage is filename, consumers derive the effective title from the record identity/path rules in §9.13 instead of expecting a projected frontmatter value. The camel-case contract field names are stable portable identifiers. Their snake-case tasknotes-spec counterparts include: Contract field tasknotes-spec role timeEstimate time_estimate completedDate completed_date dateCreated date_created dateModified date_modified recurrenceAnchor recurrence_anchor completeInstances complete_instances skippedInstances skipped_instances recurrenceParent recurrence_parent occurrenceDate occurrence_date occurrenceMaterialization occurrence_materialization occurrenceNextTrigger occurrence_next_trigger occurrenceTemplate occurrence_template occurrencePastHorizon occurrence_past_horizon occurrenceFutureHorizon occurrence_future_horizon timeEntries time_entries blockedBy blocked_by attachments attachments 12.6 Semantic profiles and capabilities# binding.profiles and binding.capabilities describe semantics that records of this implementation may use: binding: profiles: [core-lite, recurrence, materialized-occurrences] capabilities: - dependencies - reminders - attachments - links - time-tracking - materialized-occurrences - archive These are properties of the implementation, not claims that every consuming application supports them. Before mutating a governed field, a consumer SHOULD verify its own corresponding capability. It may still perform unrelated operations when it preserves unsupported fields and invariants. 12.7 Status and priority semantics# The implementing type schema defines the legal persisted values of the mapped fields. The binding gives those values TaskNotes meaning: binding: status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] The following consistency rules apply: binding values MUST equal the mapped type-schema enum values; defaults MUST equal mapped collection.read_defaults values when present; completed and skipped values MUST be members of status.values; default_skipped MUST be a skipped value; completed and skipped values MUST NOT overlap for materialized occurrences; and definition semantics MUST agree with completed/skipped membership. Status and priority labels, colors, and icons are presentation hints. Status cycle, completion, skipping, auto-archive, and priority weight are semantic. 12.8 Title, recurrence, links, and operations# The remaining binding sections project the effective TaskNotes behavior defined elsewhere in this specification: title follows §9.13 and MUST agree with collection.display and collection.path; recurrence follows §4; occurrences follows §2.6.6, §4.18, §5.20, and §9.17; links follows §11; attachment membership is the portable attachments contract field; binary MIME type, digest, byte size, revision, and timestamps remain authoritative in mdbase file descriptors and are not projected into task frontmatter; archive follows §5.12; time_tracking follows §5.19 and §9.16; templating follows §5.3.5 and §9.14; and optional nlp triggers follow §9.18. Archive always operates on the portable tags contract field, so the binding does not repeat a record-specific tags_field. The implementation's fields map determines the actual frontmatter property. Application-local notification preferences and generator bookkeeping MUST NOT be placed in the binding. 12.9 Multiple implementations# A collection may contain any number of types implementing tasknotes.task 0.3.0-rc.3. TaskNotes-aware readers MUST: resolve the exact local contract; enumerate every implementation in canonical type-name order; read each matching record through that implementation's projected view; validate the projected view; and retain the concrete type identity for updates. Implementations MUST NOT merge type schemas into one synthetic schema. A record is validated by its concrete type and then by its projected contract view. When an approval, cache, or external protocol pins an implementation set, it MUST pin the exact contract digest and sorted implementation descriptors, including each implementation digest. A newly installed type is therefore not silently added to an existing approval. Creation MUST name one concrete implementing type. If no type is selected, creation fails as ambiguous. 12.10 Task-completed event# An event source that claims tasknotes.task.completed 1.0.0 MUST emit one CloudEvents structured event for each observed transition from a non-completed status to a completed status. Its data contains only: task_id, using the stable TaskNotes ID when present and otherwise the normalized path; task_path; the current title and completed status; and completed_at, the instant when TaskNotes observed the transition. The event source MUST use the mdbase event/action interoperability profile 0.1, pin the exact event-contract digest, and preserve any correlation and causation identifiers supplied by the mutation context. It MUST NOT include a complete task record merely because one is locally available. An authorized consumer can retrieve current state separately, avoiding stale snapshots and unnecessary disclosure. Contract compatibility and bridge authorization are independent. Installing TaskNotes or resolving this contract does not grant permission to publish or consume the event. 12.11 Precedence and consistency# The complete implementation is self-describing: the contract schema is authoritative for the portable projected view; the type schema is authoritative for persisted value shapes; collection is authoritative for generic mdbase behavior; lifecycle is authoritative for generic managed writes; and implements[].binding is authoritative for TaskNotes semantics. Where values intentionally mirror each other, producers MUST keep them equal. A TaskNotes-aware consumer MUST report a configuration error instead of silently choosing between contradictory values. 12.12 Safe writes# TaskNotes-aware consumers MUST preserve: unknown frontmatter properties unless explicit replacement or migration was requested; Markdown body content unless an operation explicitly replaces it; fields governed by unsupported capabilities; and unrelated type metadata and implementations. Generic mdbase operations are safe only when they preserve the same data. Completion, recurrence mutation, occurrence materialization, dependency updates, time tracking, archive, and other domain operations MUST follow the TaskNotes semantics referenced by the binding. 12.13 Complete custom-field example# --- kind: mdbase.type name: work_task version: 1 schema: dialect: json-schema-2020-12 value: type: object additionalProperties: true required: [summary, state, created_at] properties: summary: { type: string, minLength: 1 } state: { enum: [todo, doing, done, cancelled] } importance: { enum: [low, normal, high] } created_at: { type: string, format: date-time } tags: type: array items: { type: string } collection: display: name_field: summary read_defaults: state: todo importance: normal lifecycle: on_create: set: created_at: { now: true } implements: - contract: tasknotes.task version: 0.3.0-rc.3 fields: title: summary status: state priority: importance dateCreated: created_at tags: tags binding: profiles: [core-lite] capabilities: [archive] title: storage: frontmatter filename_format: title status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] recurrence: syntax: tasknotes maintain_due_date_offset: false reset_body_checkboxes: false occurrences: identity_roles: [recurrenceParent, occurrenceDate] default_materialization: manual default_next_trigger: completion links: accepted_formats: [wikilink, markdown] write_format: wikilink archive: archived_tag: archived move_on_archive: false time_tracking: auto_stop_on_complete: true templating: enabled: false occurrence_enabled: false ---"},{"route":"/developers/specification/CHANGELOG/","title":"Changelog","description":"Initial standalone draft of tasknotes-spec including:","product":"specification","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes-spec:CHANGELOG.md","namespace":"specification","relativePath":"CHANGELOG.md","raw":"# Changelog\n\n## 0.3.0-rc.3 - 2026-08-02\n\n- define manual ordering as an opaque string rank so clients can insert and\n reorder tasks without renumbering an entire view\n\n## 0.3.0-rc.2 - 2026-08-02\n\n- add first-class `attachments` as an ordered frontmatter list of portable file\n links, with explicit membership, canonical-path, reference-safety, and\n materialized-occurrence semantics\n- expose attachment references in the `tasknotes.task` mdbase contract while\n leaving binary metadata authoritative in the file store\n\n## 0.3.0-rc.1 - 2026-07-28\n\n- adopt the discriminated first-class mdbase contract shape for\n `tasknotes.task`, including explicit `contract_type: record`\n- add the `tasknotes.task.completed 1.0.0` event contract and minimal\n privacy-preserving event-data schema for the mdbase interoperability profile\n- separate type-file record implementation bindings from application-level\n event-source declarations\n\n## 0.2.0-draft - 2026-05-31\n\n- add optional `materialized-occurrences` profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation\n- add optional NLP trigger configuration so TaskNotes clients can share capture\n suggestion vocabulary\n- replace the private `x-tasknotes` discovery envelope with the first-class\n `tasknotes.task 0.2.0` mdbase data contract, portable task-view schema, and\n implementation binding schema\n- document the precedence and consistency rules between JSON Schema,\n `collection`, `lifecycle`, contract field mappings, and TaskNotes behavior\n\n## 0.1.0-draft - 2026-02-20\n\nInitial standalone draft of `tasknotes-spec` including:\n\n- motivation, scope, and normative conventions\n- terminology\n- task model and field mapping\n- temporal semantics\n- recurrence semantics\n- operation semantics\n- validation model\n- conformance profiles\n- compatibility and migration policy\n- collection configuration schema and provider model (`tasknotes.yaml`, TaskNotes `data.json`)\n- full dependency (`blocked_by`) semantics\n- full reminder (`reminders`) semantics\n- explicit time-tracking management semantics (`time_entries` lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration)\n- explicit links chapter and link-resolution rules for projects/dependencies\n- optional `templating` conformance profile with create-time template expansion/merge semantics\n","aliases":["/spec/CHANGELOG/"],"toc":[{"level":2,"id":"030-rc3-2026-08-02","text":"0.3.0-rc.3 - 2026-08-02"},{"level":2,"id":"030-rc2-2026-08-02","text":"0.3.0-rc.2 - 2026-08-02"},{"level":2,"id":"030-rc1-2026-07-28","text":"0.3.0-rc.1 - 2026-07-28"},{"level":2,"id":"020-draft-2026-05-31","text":"0.2.0-draft - 2026-05-31"},{"level":2,"id":"010-draft-2026-02-20","text":"0.1.0-draft - 2026-02-20"}],"html":"

0.3.0-rc.3 - 2026-08-02#

\n
    \n
  • define manual ordering as an opaque string rank so clients can insert and\nreorder tasks without renumbering an entire view
  • \n
\n

0.3.0-rc.2 - 2026-08-02#

\n
    \n
  • add first-class attachments as an ordered frontmatter list of portable file\nlinks, with explicit membership, canonical-path, reference-safety, and\nmaterialized-occurrence semantics
  • \n
  • expose attachment references in the tasknotes.task mdbase contract while\nleaving binary metadata authoritative in the file store
  • \n
\n

0.3.0-rc.1 - 2026-07-28#

\n
    \n
  • adopt the discriminated first-class mdbase contract shape for\ntasknotes.task, including explicit contract_type: record
  • \n
  • add the tasknotes.task.completed 1.0.0 event contract and minimal\nprivacy-preserving event-data schema for the mdbase interoperability profile
  • \n
  • separate type-file record implementation bindings from application-level\nevent-source declarations
  • \n
\n

0.2.0-draft - 2026-05-31#

\n
    \n
  • add optional materialized-occurrences profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation
  • \n
  • add optional NLP trigger configuration so TaskNotes clients can share capture\nsuggestion vocabulary
  • \n
  • replace the private x-tasknotes discovery envelope with the first-class\ntasknotes.task 0.2.0 mdbase data contract, portable task-view schema, and\nimplementation binding schema
  • \n
  • document the precedence and consistency rules between JSON Schema,\ncollection, lifecycle, contract field mappings, and TaskNotes behavior
  • \n
\n

0.1.0-draft - 2026-02-20#

\n

Initial standalone draft of tasknotes-spec including:

\n
    \n
  • motivation, scope, and normative conventions
  • \n
  • terminology
  • \n
  • task model and field mapping
  • \n
  • temporal semantics
  • \n
  • recurrence semantics
  • \n
  • operation semantics
  • \n
  • validation model
  • \n
  • conformance profiles
  • \n
  • compatibility and migration policy
  • \n
  • collection configuration schema and provider model (tasknotes.yaml, TaskNotes data.json)
  • \n
  • full dependency (blocked_by) semantics
  • \n
  • full reminder (reminders) semantics
  • \n
  • explicit time-tracking management semantics (time_entries lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration)
  • \n
  • explicit links chapter and link-resolution rules for projects/dependencies
  • \n
  • optional templating conformance profile with create-time template expansion/merge semantics
  • \n
\n","text":"0.3.0-rc.3 - 2026-08-02# define manual ordering as an opaque string rank so clients can insert and reorder tasks without renumbering an entire view 0.3.0-rc.2 - 2026-08-02# add first-class attachments as an ordered frontmatter list of portable file links, with explicit membership, canonical-path, reference-safety, and materialized-occurrence semantics expose attachment references in the tasknotes.task mdbase contract while leaving binary metadata authoritative in the file store 0.3.0-rc.1 - 2026-07-28# adopt the discriminated first-class mdbase contract shape for tasknotes.task, including explicit contract_type: record add the tasknotes.task.completed 1.0.0 event contract and minimal privacy-preserving event-data schema for the mdbase interoperability profile separate type-file record implementation bindings from application-level event-source declarations 0.2.0-draft - 2026-05-31# add optional materialized-occurrences profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation add optional NLP trigger configuration so TaskNotes clients can share capture suggestion vocabulary replace the private x-tasknotes discovery envelope with the first-class tasknotes.task 0.2.0 mdbase data contract, portable task-view schema, and implementation binding schema document the precedence and consistency rules between JSON Schema, collection, lifecycle, contract field mappings, and TaskNotes behavior 0.1.0-draft - 2026-02-20# Initial standalone draft of tasknotes-spec including: motivation, scope, and normative conventions terminology task model and field mapping temporal semantics recurrence semantics operation semantics validation model conformance profiles compatibility and migration policy collection configuration schema and provider model (tasknotes.yaml, TaskNotes data.json) full dependency (blocked_by) semantics full reminder (reminders) semantics explicit time-tracking management semantics (time_entries lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration) explicit links chapter and link-resolution rules for projects/dependencies optional templating conformance profile with create-time template expansion/merge semantics"},{"route":"/obsidian/","title":"TaskNotes for Obsidian","description":"Install TaskNotes, create a first task, and open the default Obsidian Base views.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/index.md","namespace":"obsidian","relativePath":"index.md","raw":"---\ndescription: Install TaskNotes, create a first task, and open the default Obsidian Base views.\nhide:\n - toc\n---\n\n# TaskNotes for Obsidian\n\nThis guide covers the TaskNotes plugin for Obsidian. It follows the \"one note per task\" principle: each task is a Markdown file with structured metadata in YAML frontmatter.\n\n![Task List view](assets/views-tasks-list.png)\n\n## Requirements\n\nTaskNotes 4.12.3 requires **Obsidian 1.12.2** or later and depends on the **Bases** core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins.\n\n## Getting Started\n\n### 1. Install and Enable\n\nInstall TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly.\n\n### 2. Create Your First Task\n\nPress Ctrl+P (or Cmd+P on macOS), run **TaskNotes: Create new task**, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like `- [ ] Buy groceries` and convert it using the inline task command.\n\n![Create task modal](assets/modal-task-create.png)\n\n### 3. Open the Task List\n\nOpen your first view from the TaskNotes ribbon icon or by running **TaskNotes: Open tasks view** from the command palette. This opens the default Task List `.base` file inside `TaskNotes/Views`.\n\n### 4. Explore\n\nUse [Core Concepts](core-concepts.md) to understand the data model, [Features](features.md) for workflow capabilities, [Views](views.md) for interface behaviour, and [Settings](settings.md) to tune TaskNotes for your vault. If you already have task-like notes, start with [Adopt TaskNotes in an existing vault](getting-started/existing-vault.md).\n\n## Quick Links\n\n\n","aliases":[],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"getting-started","text":"Getting Started"},{"level":3,"id":"1-install-and-enable","text":"1. Install and Enable"},{"level":3,"id":"2-create-your-first-task","text":"2. Create Your First Task"},{"level":3,"id":"3-open-the-task-list","text":"3. Open the Task List"},{"level":3,"id":"4-explore","text":"4. Explore"},{"level":2,"id":"quick-links","text":"Quick Links"}],"html":"

This guide covers the TaskNotes plugin for Obsidian. It follows the "one note per task" principle: each task is a Markdown file with structured metadata in YAML frontmatter.

\n

\"Task

\n

Requirements#

\n

TaskNotes 4.12.3 requires Obsidian 1.12.2 or later and depends on the Bases core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins.

\n

Getting Started#

\n

1. Install and Enable#

\n

Install TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly.

\n

2. Create Your First Task#

\n

Press Ctrl+P (or Cmd+P on macOS), run TaskNotes: Create new task, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like - [ ] Buy groceries and convert it using the inline task command.

\n

\"Create

\n

3. Open the Task List#

\n

Open your first view from the TaskNotes ribbon icon or by running TaskNotes: Open tasks view from the command palette. This opens the default Task List .base file inside TaskNotes/Views.

\n

4. Explore#

\n

Use Core Concepts to understand the data model, Features for workflow capabilities, Views for interface behaviour, and Settings to tune TaskNotes for your vault. If you already have task-like notes, start with Adopt TaskNotes in an existing vault.

\n

Quick Links#

\n\n","text":"This guide covers the TaskNotes plugin for Obsidian. It follows the \"one note per task\" principle: each task is a Markdown file with structured metadata in YAML frontmatter. Requirements# TaskNotes 4.12.3 requires Obsidian 1.12.2 or later and depends on the Bases core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins. Getting Started# 1. Install and Enable# Install TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly. 2. Create Your First Task# Press Ctrl+P (or Cmd+P on macOS), run TaskNotes: Create new task, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like - [ ] Buy groceries and convert it using the inline task command. 3. Open the Task List# Open your first view from the TaskNotes ribbon icon or by running TaskNotes: Open tasks view from the command palette. This opens the default Task List .base file inside TaskNotes/Views. 4. Explore# Use Core Concepts to understand the data model, Features for workflow capabilities, Views for interface behaviour, and Settings to tune TaskNotes for your vault. If you already have task-like notes, start with Adopt TaskNotes in an existing vault. Quick Links# GitHub Repository Source code, issues, releases, and contribution discussions Task Management Status, priority, dates, reminders, and recurring tasks Inline Tasks Widgets, natural language parsing, and checkbox conversion Calendar Integration Google Calendar, Outlook, and ICS subscriptions HTTP API REST API for automation and external integrations JavaScript API In-process API for companion plugins and in-vault scripts Companion Plugins Optional plugins such as Canvas Bases and TaskNotes Workflows that build on TaskNotes Migration Guide Upgrading from TaskNotes v3 to v4 Troubleshooting Common issues and how to resolve them Command Reference Every registered command, generated from the plugin source Backup & Recovery Protect task notes, Base files, settings, and integration data Specification The formal spec behind TaskNotes: data model, operations, recurrence, and conformance"},{"route":"/obsidian/calendar-setup/","title":"Calendar Integration Setup","description":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/calendar-setup.md","namespace":"obsidian","relativePath":"calendar-setup.md","raw":"# Calendar Integration Setup\n\nTaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.\n\n## Setup (Your Own OAuth Credentials)\n\nTo connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider.\n\n![Integrations calendar settings](assets/settings-integrations-calendar.png)\n\n### Google Calendar\n\n\n\n*Video by [@antoneheyward](https://www.youtube.com/@antoneheyward)*\n\nIn [Google Cloud Console](https://console.cloud.google.com), create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (`Settings -> TaskNotes -> Integrations`) and click **Connect Google Calendar**.\n\nIf your Google OAuth app is still in testing mode, add the Google account you will connect with under **Google Auth Platform -> Audience -> Test users**. Otherwise Google may block sign-in with a 403 `access_denied` error saying the app has not completed verification.\n\n### Microsoft Calendar\n\nIn [Azure Portal](https://portal.azure.com), create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's `common` OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet.\n\nUnder **Authentication**, add the **Mobile and desktop applications** platform and add this redirect URI:\n\n```text\nhttp://localhost\n```\n\nAlso turn on **Allow public client flows**. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI.\n\nIf Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding:\n\n```json\n{\n \"url\": \"http://127.0.0.1\",\n \"type\": \"Web\"\n}\n```\n\nNext, add delegated Microsoft Graph API permissions (`Calendars.Read`, `Calendars.ReadWrite`, and `offline_access`) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click **Connect Microsoft Calendar**. The client secret field can be left blank for public-client desktop setup.\n\n## Security Notes\n\nOAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' `data.json`. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access.\n\nSecret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use **Forget saved credentials** if you also want to remove the client ID and client secret.\n\n## Troubleshooting\n\n**\"Failed to connect\"**\n\nVerify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on `127.0.0.1` with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted.\n\nFor Google 403 `access_denied` errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode.\n\n**\"Failed to fetch events\"**\n\nDisconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions.\n\n**Connection lost after Obsidian restart**\n\nTokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault.\n","aliases":["/calendar-setup/"],"toc":[{"level":2,"id":"setup-your-own-oauth-credentials","text":"Setup (Your Own OAuth Credentials)"},{"level":3,"id":"google-calendar","text":"Google Calendar"},{"level":3,"id":"microsoft-calendar","text":"Microsoft Calendar"},{"level":2,"id":"security-notes","text":"Security Notes"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"}],"html":"

TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.

\n

Setup (Your Own OAuth Credentials)#

\n

To connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider.

\n

\"Integrations

\n

Google Calendar#

\n\n\n

Video by @antoneheyward

\n

In Google Cloud Console, create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (Settings -> TaskNotes -> Integrations) and click Connect Google Calendar.

\n

If your Google OAuth app is still in testing mode, add the Google account you will connect with under Google Auth Platform -> Audience -> Test users. Otherwise Google may block sign-in with a 403 access_denied error saying the app has not completed verification.

\n

Microsoft Calendar#

\n

In Azure Portal, create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's common OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet.

\n

Under Authentication, add the Mobile and desktop applications platform and add this redirect URI:

\n
http://localhost\n

Also turn on Allow public client flows. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI.

\n

If Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding:

\n
{\n  "url": "http://127.0.0.1",\n  "type": "Web"\n}\n

Next, add delegated Microsoft Graph API permissions (Calendars.Read, Calendars.ReadWrite, and offline_access) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click Connect Microsoft Calendar. The client secret field can be left blank for public-client desktop setup.

\n

Security Notes#

\n

OAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' data.json. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access.

\n

Secret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use Forget saved credentials if you also want to remove the client ID and client secret.

\n

Troubleshooting#

\n

"Failed to connect"

\n

Verify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on 127.0.0.1 with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted.

\n

For Google 403 access_denied errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode.

\n

"Failed to fetch events"

\n

Disconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions.

\n

Connection lost after Obsidian restart

\n

Tokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault.

\n","text":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0. Setup (Your Own OAuth Credentials)# To connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider. Google Calendar# Video by @antoneheyward In Google Cloud Console, create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (Settings -> TaskNotes -> Integrations) and click Connect Google Calendar. If your Google OAuth app is still in testing mode, add the Google account you will connect with under Google Auth Platform -> Audience -> Test users. Otherwise Google may block sign-in with a 403 access_denied error saying the app has not completed verification. Microsoft Calendar# In Azure Portal, create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's common OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet. Under Authentication, add the Mobile and desktop applications platform and add this redirect URI: http://localhost Also turn on Allow public client flows. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI. If Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding: { \"url\": \"http://127.0.0.1\", \"type\": \"Web\" } Next, add delegated Microsoft Graph API permissions (Calendars.Read, Calendars.ReadWrite, and offline_access) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click Connect Microsoft Calendar. The client secret field can be left blank for public-client desktop setup. Security Notes# OAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' data.json. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access. Secret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use Forget saved credentials if you also want to remove the client ID and client secret. Troubleshooting# \"Failed to connect\" Verify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on 127.0.0.1 with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted. For Google 403 access_denied errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode. \"Failed to fetch events\" Disconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions. Connection lost after Obsidian restart Tokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault."},{"route":"/obsidian/companion-plugins/","title":"Companion Plugins","description":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/companion-plugins.md","namespace":"obsidian","relativePath":"companion-plugins.md","raw":"# Companion Plugins\n\nCompanion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files.\n\nUse companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior.\n\n## Available Companion Plugins\n\n| Plugin | Purpose | Documentation |\n| --- | --- | --- |\n| Canvas Bases | TaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges. | [Canvas Bases](companion-plugins/canvas-bases.md) |\n| TaskNotes Workflows | Markdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows. | [TaskNotes Workflows](companion-plugins/tasknotes-workflows.md) |\n\nMore companion plugins may be documented here over time.\n\n## How Companion Plugins Relate to TaskNotes\n\nTaskNotes remains the source of truth for task behavior. Companion plugins should use the [TaskNotes JavaScript Runtime API](javascript-api.md) for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes.\n\nCompanion plugins can also publish their own runtime surface through `api.extensions`. Other plugins and scripts can discover those extension APIs from TaskNotes:\n\n```js\nconst tasknotes = app.plugins.getPlugin(\"tasknotes\");\nconst workflows = tasknotes?.api?.extensions.get(\"tasknotes-workflows\");\n```\n\nThe extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools.\n\n## Choosing an Integration Surface\n\n| Use case | Prefer |\n| --- | --- |\n| A user-facing Obsidian UI that works with TaskNotes tasks | Companion plugin |\n| In-vault scripting with Templater, QuickAdd, MetaBind, or another plugin | [JavaScript Runtime API](javascript-api.md) |\n| Local tools outside Obsidian | [HTTP API](HTTP_API.md) or [TaskNotes Obsidian CLI](obsidian-cli.md) |\n| Notifications to external services when tasks change | [Webhooks](webhooks.md) |\n| Direct file analysis without Obsidian running | [mdbase-tasknotes CLI](mdbase-tasknotes-cli.md) |\n\n## Compatibility Expectations\n\nCompanion plugins should:\n\n- Check `api.apiVersion` and `api.hasCapability(...)` before using runtime features.\n- Use `api.catalog` and canonical runtime query DTOs from `api.query` instead of reaching into TaskNotes filter/view internals.\n- Include a `source` value when mutating tasks so TaskNotes events are debuggable.\n- Avoid reacting to their own mutations unless the behavior is explicit.\n- Keep user data in the vault where possible, using readable Markdown or JSON files.\n- Treat TaskNotes task notes and Bases files as user-owned documents.\n\nTaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work.\n","aliases":["/companion-plugins/"],"toc":[{"level":2,"id":"available-companion-plugins","text":"Available Companion Plugins"},{"level":2,"id":"how-companion-plugins-relate-to-tasknotes","text":"How Companion Plugins Relate to TaskNotes"},{"level":2,"id":"choosing-an-integration-surface","text":"Choosing an Integration Surface"},{"level":2,"id":"compatibility-expectations","text":"Compatibility Expectations"}],"html":"

Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files.

\n

Use companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior.

\n

Available Companion Plugins#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PluginPurposeDocumentation
Canvas BasesTaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges.Canvas Bases
TaskNotes WorkflowsMarkdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows.TaskNotes Workflows
\n

More companion plugins may be documented here over time.

\n

How Companion Plugins Relate to TaskNotes#

\n

TaskNotes remains the source of truth for task behavior. Companion plugins should use the TaskNotes JavaScript Runtime API for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes.

\n

Companion plugins can also publish their own runtime surface through api.extensions. Other plugins and scripts can discover those extension APIs from TaskNotes:

\n
const tasknotes = app.plugins.getPlugin("tasknotes");\nconst workflows = tasknotes?.api?.extensions.get("tasknotes-workflows");\n

The extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools.

\n

Choosing an Integration Surface#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Use casePrefer
A user-facing Obsidian UI that works with TaskNotes tasksCompanion plugin
In-vault scripting with Templater, QuickAdd, MetaBind, or another pluginJavaScript Runtime API
Local tools outside ObsidianHTTP API or TaskNotes Obsidian CLI
Notifications to external services when tasks changeWebhooks
Direct file analysis without Obsidian runningmdbase-tasknotes CLI
\n

Compatibility Expectations#

\n

Companion plugins should:

\n
    \n
  • Check api.apiVersion and api.hasCapability(...) before using runtime features.
  • \n
  • Use api.catalog and canonical runtime query DTOs from api.query instead of reaching into TaskNotes filter/view internals.
  • \n
  • Include a source value when mutating tasks so TaskNotes events are debuggable.
  • \n
  • Avoid reacting to their own mutations unless the behavior is explicit.
  • \n
  • Keep user data in the vault where possible, using readable Markdown or JSON files.
  • \n
  • Treat TaskNotes task notes and Bases files as user-owned documents.
  • \n
\n

TaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work.

\n","text":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files. Use companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior. Available Companion Plugins# Plugin Purpose Documentation Canvas Bases TaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges. Canvas Bases TaskNotes Workflows Markdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows. TaskNotes Workflows More companion plugins may be documented here over time. How Companion Plugins Relate to TaskNotes# TaskNotes remains the source of truth for task behavior. Companion plugins should use the TaskNotes JavaScript Runtime API for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes. Companion plugins can also publish their own runtime surface through api.extensions. Other plugins and scripts can discover those extension APIs from TaskNotes: const tasknotes = app.plugins.getPlugin(\"tasknotes\"); const workflows = tasknotes?.api?.extensions.get(\"tasknotes-workflows\"); The extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools. Choosing an Integration Surface# Use case Prefer A user-facing Obsidian UI that works with TaskNotes tasks Companion plugin In-vault scripting with Templater, QuickAdd, MetaBind, or another plugin JavaScript Runtime API Local tools outside Obsidian HTTP API or TaskNotes Obsidian CLI Notifications to external services when tasks change Webhooks Direct file analysis without Obsidian running mdbase-tasknotes CLI Compatibility Expectations# Companion plugins should: Check api.apiVersion and api.hasCapability(...) before using runtime features. Use api.catalog and canonical runtime query DTOs from api.query instead of reaching into TaskNotes filter/view internals. Include a source value when mutating tasks so TaskNotes events are debuggable. Avoid reacting to their own mutations unless the behavior is explicit. Keep user data in the vault where possible, using readable Markdown or JSON files. Treat TaskNotes task notes and Bases files as user-owned documents. TaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work."},{"route":"/obsidian/companion-plugins/canvas-bases/","title":"Canvas Bases","description":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layo...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/companion-plugins/canvas-bases.md","namespace":"obsidian","relativePath":"companion-plugins/canvas-bases.md","raw":"# Canvas Bases\n\nCanvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named **Canvas Bases** or as a generated JSON Canvas snapshot.\n\nCanvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the `.base` file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates.\n\n## Requirements\n\n- Obsidian 1.10.1 or newer.\n- The Obsidian Bases core plugin.\n- The Obsidian Canvas core plugin when opening or editing generated `.canvas` files.\n- TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions.\n\nIf TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability.\n\n## When to Use Canvas Bases\n\nUse Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set.\n\nCommon uses include:\n\n- Planning project tasks on a visual board.\n- Seeing dependencies or related notes as edges between cards.\n- Embedding a board in a daily note, project note, or meeting note.\n- Turning a filtered Base view into a reusable `.canvas` snapshot.\n- Grouping notes with Bases, then manually arranging the result.\n- Dropping cards into assignment zones to update a note property or run a supported TaskNotes action.\n\nIf the question is only \"which tasks should appear?\", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set.\n\n## Canvas Bases Layout\n\nAfter Canvas Bases is installed, open or create a `.base` file and add a view using the **Canvas Bases** layout.\n\nIn the live layout:\n\n- Each Base result row becomes a file card.\n- Displayed Base properties appear on each card in the same order as the Base properties menu.\n- Base groups become group frames.\n- Cards and group frames can be dragged and resized.\n- Ungrouped views place cards directly on the board.\n- The initial card order follows the Base sort order.\n- Inline note-body editing is available when **Show body editor** is enabled.\n- Board controls support panning, zooming, fit view, reset view, and opening cards.\n- Manual notes, manual groups, and text cards can be added without changing the Base query.\n\nCanvas Bases stores layout and board state in Canvas Bases-owned keys in the `.base` view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path.\n\n## Materialize a Canvas\n\nCanvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts.\n\nRun these commands from the command palette:\n\n```text\nCanvas Bases: Create canvas from current bases view\nCanvas Bases: Update linked canvas\nCanvas Bases: Open linked canvas\n```\n\nThe create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges.\n\nThe generated `.canvas` file is a snapshot, not a live query. Re-run **Canvas Bases: Update linked canvas** after changing the Base result set or board layout.\n\n## TaskNotes Integration\n\nCanvas Bases reads TaskNotes through the [TaskNotes JavaScript Runtime API](../javascript-api.md). It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing.\n\nWhen TaskNotes integration is enabled, Canvas Bases can:\n\n- Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards.\n- Add TaskNotes task actions to card context menus through the TaskNotes task menu API.\n- Draw dependency edges between visible tasks.\n- Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to `all`.\n- Add or remove dependency and subtask relationships by dragging from one card's link handle to another.\n- Update mapped TaskNotes task properties when a card is dropped into a property zone.\n- Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence.\n\nTaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly.\n\n## Edges and Relationships\n\nCanvas Bases can draw edges when both endpoint notes are present on the board.\n\nSupported edge sources include:\n\n| Source | What it uses |\n| --- | --- |\n| `wikilinks` | Links found in the note body. |\n| `properties` | Links stored in configured note properties. |\n| `all` | Wikilinks and configured property links. |\n| TaskNotes dependencies | Blocking relationships from TaskNotes. |\n| TaskNotes subtasks | Parent-child task relationships from TaskNotes when enabled. |\n\nFor property edges, configure a comma-separated list of property names, such as:\n\n```text\ndepends_on, related\n```\n\nEdges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu.\n\n## Assignment Zones\n\nAssignment zones are board regions that do something when a card is dropped into them.\n\nThe default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note.\n\nCustom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones.\n\n## Files and Data\n\nCanvas Bases keeps user data in normal vault files:\n\n| Data | Where it lives |\n| --- | --- |\n| Task and note content | Markdown files. |\n| Query, visible properties, sorting, and grouping | `.base` files. |\n| Live board geometry and Canvas Bases options | Canvas Bases-owned keys in the `.base` view config. |\n| Generated board snapshots | `.canvas` files. |\n| Options for non-Canvas Bases active views | Canvas Bases plugin data. |\n\nManual non-Canvas Bases nodes in a generated `.canvas` file are preserved when Canvas Bases updates that canvas.\n\n## First Board\n\nA practical first Canvas Bases setup is:\n\n1. Create or duplicate a TaskNotes `.base` view.\n2. Filter it to the tasks or notes you want on the board.\n3. Add a Canvas Bases layout view to that `.base` file.\n4. Choose which properties to show on cards.\n5. Enable TaskNotes badges, actions, or relationships if the board is task-focused.\n6. Arrange the cards and groups.\n7. Use the toolbar to create a linked `.canvas` snapshot when you want a Canvas file.\n\nCanvas Bases can also create starter files under `Canvas Bases/` with a demo Base, sample notes, and a linked Canvas path. Run **Canvas Bases: Create starter files** from the command palette if you want a small example board to inspect before adapting your own TaskNotes views.\n","aliases":["/companion-plugins/canvas-bases/"],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"when-to-use-canvas-bases","text":"When to Use Canvas Bases"},{"level":2,"id":"canvas-bases-layout","text":"Canvas Bases Layout"},{"level":2,"id":"materialize-a-canvas","text":"Materialize a Canvas"},{"level":2,"id":"tasknotes-integration","text":"TaskNotes Integration"},{"level":2,"id":"edges-and-relationships","text":"Edges and Relationships"},{"level":2,"id":"assignment-zones","text":"Assignment Zones"},{"level":2,"id":"files-and-data","text":"Files and Data"},{"level":2,"id":"first-board","text":"First Board"}],"html":"

Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named Canvas Bases or as a generated JSON Canvas snapshot.

\n

Canvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the .base file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates.

\n

Requirements#

\n
    \n
  • Obsidian 1.10.1 or newer.
  • \n
  • The Obsidian Bases core plugin.
  • \n
  • The Obsidian Canvas core plugin when opening or editing generated .canvas files.
  • \n
  • TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions.
  • \n
\n

If TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability.

\n

When to Use Canvas Bases#

\n

Use Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set.

\n

Common uses include:

\n
    \n
  • Planning project tasks on a visual board.
  • \n
  • Seeing dependencies or related notes as edges between cards.
  • \n
  • Embedding a board in a daily note, project note, or meeting note.
  • \n
  • Turning a filtered Base view into a reusable .canvas snapshot.
  • \n
  • Grouping notes with Bases, then manually arranging the result.
  • \n
  • Dropping cards into assignment zones to update a note property or run a supported TaskNotes action.
  • \n
\n

If the question is only "which tasks should appear?", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set.

\n

Canvas Bases Layout#

\n

After Canvas Bases is installed, open or create a .base file and add a view using the Canvas Bases layout.

\n

In the live layout:

\n
    \n
  • Each Base result row becomes a file card.
  • \n
  • Displayed Base properties appear on each card in the same order as the Base properties menu.
  • \n
  • Base groups become group frames.
  • \n
  • Cards and group frames can be dragged and resized.
  • \n
  • Ungrouped views place cards directly on the board.
  • \n
  • The initial card order follows the Base sort order.
  • \n
  • Inline note-body editing is available when Show body editor is enabled.
  • \n
  • Board controls support panning, zooming, fit view, reset view, and opening cards.
  • \n
  • Manual notes, manual groups, and text cards can be added without changing the Base query.
  • \n
\n

Canvas Bases stores layout and board state in Canvas Bases-owned keys in the .base view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path.

\n

Materialize a Canvas#

\n

Canvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts.

\n

Run these commands from the command palette:

\n
Canvas Bases: Create canvas from current bases view\nCanvas Bases: Update linked canvas\nCanvas Bases: Open linked canvas\n

The create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges.

\n

The generated .canvas file is a snapshot, not a live query. Re-run Canvas Bases: Update linked canvas after changing the Base result set or board layout.

\n

TaskNotes Integration#

\n

Canvas Bases reads TaskNotes through the TaskNotes JavaScript Runtime API. It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing.

\n

When TaskNotes integration is enabled, Canvas Bases can:

\n
    \n
  • Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards.
  • \n
  • Add TaskNotes task actions to card context menus through the TaskNotes task menu API.
  • \n
  • Draw dependency edges between visible tasks.
  • \n
  • Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to all.
  • \n
  • Add or remove dependency and subtask relationships by dragging from one card's link handle to another.
  • \n
  • Update mapped TaskNotes task properties when a card is dropped into a property zone.
  • \n
  • Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence.
  • \n
\n

TaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly.

\n

Edges and Relationships#

\n

Canvas Bases can draw edges when both endpoint notes are present on the board.

\n

Supported edge sources include:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SourceWhat it uses
wikilinksLinks found in the note body.
propertiesLinks stored in configured note properties.
allWikilinks and configured property links.
TaskNotes dependenciesBlocking relationships from TaskNotes.
TaskNotes subtasksParent-child task relationships from TaskNotes when enabled.
\n

For property edges, configure a comma-separated list of property names, such as:

\n
depends_on, related\n

Edges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu.

\n

Assignment Zones#

\n

Assignment zones are board regions that do something when a card is dropped into them.

\n

The default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note.

\n

Custom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones.

\n

Files and Data#

\n

Canvas Bases keeps user data in normal vault files:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DataWhere it lives
Task and note contentMarkdown files.
Query, visible properties, sorting, and grouping.base files.
Live board geometry and Canvas Bases optionsCanvas Bases-owned keys in the .base view config.
Generated board snapshots.canvas files.
Options for non-Canvas Bases active viewsCanvas Bases plugin data.
\n

Manual non-Canvas Bases nodes in a generated .canvas file are preserved when Canvas Bases updates that canvas.

\n

First Board#

\n

A practical first Canvas Bases setup is:

\n
    \n
  1. Create or duplicate a TaskNotes .base view.
  2. \n
  3. Filter it to the tasks or notes you want on the board.
  4. \n
  5. Add a Canvas Bases layout view to that .base file.
  6. \n
  7. Choose which properties to show on cards.
  8. \n
  9. Enable TaskNotes badges, actions, or relationships if the board is task-focused.
  10. \n
  11. Arrange the cards and groups.
  12. \n
  13. Use the toolbar to create a linked .canvas snapshot when you want a Canvas file.
  14. \n
\n

Canvas Bases can also create starter files under Canvas Bases/ with a demo Base, sample notes, and a linked Canvas path. Run Canvas Bases: Create starter files from the command palette if you want a small example board to inspect before adapting your own TaskNotes views.

\n","text":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named Canvas Bases or as a generated JSON Canvas snapshot. Canvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the .base file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates. Requirements# Obsidian 1.10.1 or newer. The Obsidian Bases core plugin. The Obsidian Canvas core plugin when opening or editing generated .canvas files. TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions. If TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability. When to Use Canvas Bases# Use Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set. Common uses include: Planning project tasks on a visual board. Seeing dependencies or related notes as edges between cards. Embedding a board in a daily note, project note, or meeting note. Turning a filtered Base view into a reusable .canvas snapshot. Grouping notes with Bases, then manually arranging the result. Dropping cards into assignment zones to update a note property or run a supported TaskNotes action. If the question is only \"which tasks should appear?\", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set. Canvas Bases Layout# After Canvas Bases is installed, open or create a .base file and add a view using the Canvas Bases layout. In the live layout: Each Base result row becomes a file card. Displayed Base properties appear on each card in the same order as the Base properties menu. Base groups become group frames. Cards and group frames can be dragged and resized. Ungrouped views place cards directly on the board. The initial card order follows the Base sort order. Inline note-body editing is available when Show body editor is enabled. Board controls support panning, zooming, fit view, reset view, and opening cards. Manual notes, manual groups, and text cards can be added without changing the Base query. Canvas Bases stores layout and board state in Canvas Bases-owned keys in the .base view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path. Materialize a Canvas# Canvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts. Run these commands from the command palette: Canvas Bases: Create canvas from current bases view Canvas Bases: Update linked canvas Canvas Bases: Open linked canvas The create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges. The generated .canvas file is a snapshot, not a live query. Re-run Canvas Bases: Update linked canvas after changing the Base result set or board layout. TaskNotes Integration# Canvas Bases reads TaskNotes through the TaskNotes JavaScript Runtime API. It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing. When TaskNotes integration is enabled, Canvas Bases can: Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards. Add TaskNotes task actions to card context menus through the TaskNotes task menu API. Draw dependency edges between visible tasks. Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to all. Add or remove dependency and subtask relationships by dragging from one card's link handle to another. Update mapped TaskNotes task properties when a card is dropped into a property zone. Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence. TaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly. Edges and Relationships# Canvas Bases can draw edges when both endpoint notes are present on the board. Supported edge sources include: Source What it uses wikilinks Links found in the note body. properties Links stored in configured note properties. all Wikilinks and configured property links. TaskNotes dependencies Blocking relationships from TaskNotes. TaskNotes subtasks Parent-child task relationships from TaskNotes when enabled. For property edges, configure a comma-separated list of property names, such as: depends_on, related Edges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu. Assignment Zones# Assignment zones are board regions that do something when a card is dropped into them. The default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note. Custom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones. Files and Data# Canvas Bases keeps user data in normal vault files: Data Where it lives Task and note content Markdown files. Query, visible properties, sorting, and grouping .base files. Live board geometry and Canvas Bases options Canvas Bases-owned keys in the .base view config. Generated board snapshots .canvas files. Options for non-Canvas Bases active views Canvas Bases plugin data. Manual non-Canvas Bases nodes in a generated .canvas file are preserved when Canvas Bases updates that canvas. First Board# A practical first Canvas Bases setup is: Create or duplicate a TaskNotes .base view. Filter it to the tasks or notes you want on the board. Add a Canvas Bases layout view to that .base file. Choose which properties to show on cards. Enable TaskNotes badges, actions, or relationships if the board is task-focused. Arrange the cards and groups. Use the toolbar to create a linked .canvas snapshot when you want a Canvas file. Canvas Bases can also create starter files under Canvas Bases/ with a demo Base, sample notes, and a linked Canvas path. Run Canvas Bases: Create starter files from the command palette if you want a small example board to inspect before adapting your own TaskNotes views."},{"route":"/obsidian/companion-plugins/tasknotes-workflows/","title":"TaskNotes Workflows","description":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and se...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/companion-plugins/tasknotes-workflows.md","namespace":"obsidian","relativePath":"companion-plugins/tasknotes-workflows.md","raw":"# TaskNotes Workflows\n\nTaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks.\n\n## Install TaskNotes Workflows\n\n\n\nYou can also install it from Obsidian: open Settings > Community plugins > Browse, then search for `TaskNotes Workflows`.\n\nThe plugin is designed for workflows users often ask TaskNotes core to handle, such as:\n\n- Start time tracking when a task becomes active.\n- Stop time tracking when a task is completed.\n- Move completed tasks into a review folder.\n- Copy parent task context, tags, priority, dates, or dependencies to subtasks.\n- Warn when a blocked task is moved to active.\n- Run a daily review query.\n\nTaskNotes Workflows keeps this behavior outside TaskNotes core while still using the [TaskNotes JavaScript Runtime API](../javascript-api.md) for safe task reads, writes, canonical queries, events, and relationship resolution.\n\n## Requirements\n\n- TaskNotes must be installed and enabled.\n- TaskNotes must expose the JavaScript runtime API.\n- Obsidian must be open for workflows to run.\n- Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed.\n- The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded.\n\nIf TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run.\n\n## Files Created by the Plugin\n\nBy default, TaskNotes Workflows uses:\n\n| Path | Purpose |\n| --- | --- |\n| `TaskNotes/Workflows/` | Workflow Markdown files. |\n| `TaskNotes/Views/workflows.base` | Generated Obsidian Base that renders workflow cards through the custom workflow view. |\n| Plugin config folder | Run history and detail logs, unless a run-log folder is configured. |\n\nWorkflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance.\n\n## First Run\n\nOn first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally.\n\nThe generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note.\n\nWorkflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly.\n\n## Default Workflows\n\nThe plugin can write these starter workflows:\n\n| Workflow | What it demonstrates |\n| --- | --- |\n| Auto-start time tracking | Starts a timer when a task status changes to active. |\n| Stop time tracking on complete | Stops the timer when a task is completed. |\n| Morning overdue review | Runs a daily cron query and marks overdue open tasks high priority. |\n| Move completed tasks to review | Moves completed task notes into a review folder. |\n| Inherit subtask contexts and tags | Copies contexts and tags from the first parent task when a task becomes a subtask. |\n| Inherit subtask priority | Copies priority from the first parent task when a task becomes a subtask. |\n| Inherit subtask planning dates | Copies scheduled and due dates from the first parent task when a task becomes a subtask. |\n| Inherit subtask dependencies | Adds the first parent task's blocking dependencies to new subtasks. |\n| Mirror parent priority to subtasks | Updates existing subtasks when a parent task priority changes. |\n| Mirror parent planning dates to subtasks | Updates existing subtasks when a parent scheduled or due date changes. |\n| Mirror parent dependencies to subtasks | Replaces each subtask's dependencies with the parent task's current dependencies. |\n| Warn when starting a blocked task | Shows a notice when a task becomes active while dependencies remain. |\n| Daily active task review | Shows a daily count of tasks still marked active. |\n\nTreat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows.\n\n## Workflow Shape\n\nA workflow file looks like this:\n\n```markdown\n---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: auto-start-time-tracking\nname: Auto-start time tracking\nenabled: false\ndescription: Start a timer when a task status changes to active.\ntriggers:\n - id: status-active\n type: tasknotes.event\n event: task.status.changed\n to: active\nconditions:\n - field: trigger.after.path\n operator: exists\nsteps:\n - id: start-time\n type: time.start\n input:\n task: \"{{trigger.after.path}}\"\n options:\n description: \"Started by {{workflow.name}}\"\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 1\n onError: stop\n---\n\n# Auto-start time tracking\n\nEnable this workflow to start time tracking when a TaskNotes task moves to `active`.\n```\n\nRequired frontmatter fields:\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `type` | string | Must be `tasknotes-workflow`. |\n| `schemaVersion` | number | Must be `1`. |\n| `id` | string | Stable lowercase identifier. Use letters, numbers, dots, underscores, and dashes. |\n| `name` | string | Human-readable name shown in workflow cards and command-palette commands. |\n| `enabled` | boolean | Disabled workflows can be edited and dry-run but do not run automatically or from manual commands. |\n| `triggers` | array | One or more trigger definitions. |\n| `conditions` | array | Optional workflow-level guards. |\n| `steps` | array | Linear typed step pipeline. |\n| `run` | object | Run policy and safety limits. |\n\n## Triggers\n\nTriggers decide when a workflow should run.\n\n### TaskNotes Events\n\nUse `tasknotes.event` to react to TaskNotes runtime events:\n\n```yaml\ntriggers:\n - id: status-active\n type: tasknotes.event\n event: task.status.changed\n from: open\n to: active\n```\n\nCommon event names include:\n\n- `task.created`\n- `task.updated`\n- `task.deleted`\n- `task.moved`\n- `task.status.changed`\n- `task.completed`\n- `task.uncompleted`\n- `task.archived`\n- `task.unarchived`\n- `task.scheduled.changed`\n- `task.due.changed`\n- `task.priority.changed`\n- `task.tags.changed`\n- `task.contexts.changed`\n- `task.projects.changed`\n- `task.reminders.changed`\n- `task.dependencies.changed`\n- `task.recurrence.changed`\n- `time.started`\n- `time.stopped`\n- `pomodoro.started`\n- `pomodoro.completed`\n- `pomodoro.interrupted`\n- `recurring.instance.completed`\n- `recurring.instance.skipped`\n\nThe workflow editor loads available TaskNotes events dynamically from `api.events.list()`, so event pickers can follow the runtime API instead of relying on a hardcoded list.\n\nTaskNotes event triggers can use these filters:\n\n| Field | Purpose |\n| --- | --- |\n| `event` | Runtime event name. |\n| `from` | Previous status or value for status-change workflows. |\n| `to` | New status or value for status-change workflows. |\n| `path.glob` | Optional path glob limiting which task files can trigger the workflow. |\n| `allowSelfTrigger` | Allows this workflow to react to writes caused by `tasknotes-workflows`. Leave off unless you have a clear reason. |\n\nTaskNotes event output fields include values such as `trigger.after.path`, `trigger.after.status`, `trigger.before.status`, `trigger.changes`, `trigger.source`, and `trigger.correlationId`.\n\n### Cron\n\nCron triggers run on matching minutes while Obsidian is open:\n\n```yaml\ntriggers:\n - id: weekday-review\n type: cron\n schedule: \"0 17 * * 1-5\"\n timezone: local\n```\n\nThe schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with `run.maxTasks`, especially if they query many tasks.\n\n### Interval\n\nInterval triggers run repeatedly while Obsidian is open:\n\n```yaml\ntriggers:\n - id: half-hour-check\n type: interval\n every: 30m\n```\n\nThe plugin enforces a minimum interval to avoid excessive background work.\n\n### Manual\n\nManual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette:\n\n```yaml\ntriggers:\n - id: manual\n type: manual\n```\n\nEnabled workflows with a manual trigger are registered as Obsidian commands named `Run: `. You can launch them from the command palette or assign hotkeys in Obsidian settings.\n\nThe generated command id is based on the workflow `id`. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned.\n\n### Obsidian Events\n\nAdvanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events:\n\n```yaml\ntriggers:\n - id: project-note-opened\n type: obsidian.workspace\n event: file-open\n path:\n glob: \"Projects/**/*.md\"\n\n - id: task-note-modified\n type: obsidian.vault\n event: modify\n path:\n glob: \"Tasks/**/*.md\"\n\n - id: metadata-changed\n type: obsidian.metadata\n event: changed\n path:\n glob: \"Projects/**/*.md\"\n```\n\nKeep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent.\n\n## Conditions\n\nConditions can appear at workflow level or on individual steps.\n\n```yaml\nconditions:\n - field: trigger.after.path\n operator: exists\n - field: trigger.after.status\n operator: is\n value: active\n```\n\nSupported operators:\n\n| Operator | Meaning |\n| --- | --- |\n| `is` / `isNot` | Exact comparison after scalar normalization. |\n| `in` / `notIn` | Check a value against an array. |\n| `exists` / `missing` | Check whether a field has a value. |\n| `contains` | Check whether a string contains text or an array contains a value. |\n| `startsWith` | String prefix check. |\n| `before` / `after` | Date comparison. |\n| `onOrBefore` / `onOrAfter` | Inclusive date comparison. |\n\nStep-level conditions use the same shape:\n\n```yaml\nsteps:\n - id: warn\n type: notice.show\n if:\n - field: steps.dependencies.tasks[0].path\n operator: exists\n input:\n message: \"This task still has dependencies.\"\n```\n\n## References\n\nReferences use constrained template expressions. Arbitrary JavaScript is not evaluated.\n\n```text\n{{workflow.id}}\n{{workflow.name}}\n{{trigger.after.path}}\n{{trigger.changes.status.after}}\n{{steps.query.tasks}}\n{{steps.parents.tasks[0].path}}\n{{item.path}}\n{{today}}\n{{now}}\n```\n\nIf a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified.\n\nUse `forEach` when a step should run once per item:\n\n```yaml\nsteps:\n - id: overdue\n type: task.query\n input:\n query:\n where:\n all:\n - field: task.due\n op: lt\n value:\n fn: today\n - field: task.status\n op: notIn\n value:\n - done\n - cancelled\n sort:\n - field: task.due\n direction: asc\n limit: 50\n scope:\n includeArchived: false\n\n - id: mark-high\n type: task.patch\n forEach: \"{{steps.overdue.tasks}}\"\n input:\n task: \"{{item.path}}\"\n patch:\n priority: high\n```\n\nWhen a step uses `forEach`, `{{item}}` refers to the current item and the step output becomes an array of per-item outputs.\n\n`task.query` uses the canonical TaskNotes runtime query DTO. Its output includes `tasks`, `count`, `total`, `matched`, `returned`, `groups`, `groupPaths`, `query`, and `warnings`.\n\nRuntime query conditions use canonical field IDs and operators:\n\n```yaml\nquery:\n where:\n all:\n - field: task.status\n op: ne\n value: done\n - any:\n - field: task.due\n op: lte\n value:\n fn: today\n - field: task.priority\n op: eq\n value: high\n sort:\n - field: task.due\n direction: asc\n group:\n - field: task.status\n limit: 25\n scope:\n includeArchived: false\n```\n\nCommon fields include `task.status`, `task.priority`, `task.due`, `task.scheduled`, `task.projects`, `task.contexts`, `task.tags`, `task.isBlocked`, and `file.path`. Operators include `eq`, `ne`, `contains`, `notContains`, `in`, `notIn`, `exists`, `missing`, `lt`, `lte`, `gt`, `gte`, `isTrue`, and `isFalse`. Use `api.catalog.filterProperties()` and `api.catalog.filterOperators()` for the complete runtime catalog.\n\n## Steps\n\nSteps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers.\n\nTask read steps:\n\n| Step | Output |\n| --- | --- |\n| `task.get` | One task. |\n| `task.query` | Tasks matching a canonical TaskNotes runtime query. |\n| `task.parents` | Parent tasks linked from the task's projects. |\n| `task.subtasks` | Tasks that reference the current task as a project. |\n| `task.dependencies` | Dependencies stored in `blockedBy`, with resolved task data when available. |\n| `task.blocking` | Tasks blocked by the current task. |\n| `task.relationships` | The task plus parents, subtasks, dependencies, and blocking tasks. |\n\nTask write steps:\n\n| Step | Purpose |\n| --- | --- |\n| `task.create` | Create a new TaskNotes task. |\n| `task.patch` | Update one or more fields. |\n| `task.set` | Set one field. |\n| `task.move` | Move the task note to a target folder. |\n| `task.archive` / `task.unarchive` | Archive or unarchive a task. |\n| `task.complete` / `task.uncomplete` | Complete or reopen a task. |\n| `task.reschedule` | Update planning dates. |\n| `task.setDue` / `task.clearDue` | Set or clear due date. |\n| `task.setScheduled` / `task.clearScheduled` | Set or clear scheduled date. |\n| `task.addTag` / `task.removeTag` | Mutate tags. |\n| `task.addProject` / `task.removeProject` | Mutate project links. |\n| `task.addContext` / `task.removeContext` | Mutate contexts. |\n| `task.addDependency` / `task.removeDependency` | Mutate blocking dependencies. |\n\nTime and utility steps:\n\n| Step | Purpose |\n| --- | --- |\n| `time.start` | Start time tracking for a task. |\n| `time.stop` | Stop active time tracking for a task. |\n| `time.appendEntry` | Append a time entry. |\n| `notice.show` | Show an Obsidian notice. |\n| `workflow.stop` | Stop a workflow early. |\n\nCompanion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension:\n\n```js\nconst tasknotes = app.plugins.getPlugin(\"tasknotes\")?.api;\nconst workflows = tasknotes?.extensions.get(\"tasknotes-workflows\");\nconst steps = workflows?.listStepDefinitions();\n```\n\n## Run Policy\n\nEvery workflow has a run policy:\n\n```yaml\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 25\n onError: stop\n timeout: 30s\n```\n\n| Field | Notes |\n| --- | --- |\n| `mode` | Currently `sequential`. Steps run in order. |\n| `noOverlap` | Skips a new run if the same workflow is already running. |\n| `source` | Mutation source passed to TaskNotes runtime API calls. |\n| `maxTasks` | Safety limit for `forEach` batch steps. |\n| `onError` | `stop` or `continue`. |\n| `timeout` | Optional duration string. |\n\nTaskNotes attaches `source`, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops.\n\n## Run Logs and Debugging\n\nWorkflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings.\n\nRun records include:\n\n- Workflow id, name, and source path.\n- Trigger payload.\n- Step statuses.\n- Inputs and outputs, depending on the configured log level.\n- Error text when a run fails.\n\nUse dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files.\n\n## Example: Manual Command Workflow\n\nThis workflow can be run from the command palette after it is enabled:\n\n```markdown\n---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: show-active-count\nname: Show active task count\nenabled: true\ndescription: Show a notice with the number of active tasks.\ntriggers:\n - id: manual\n type: manual\nsteps:\n - id: active\n type: task.query\n input:\n query:\n where:\n field: task.status\n op: eq\n value: active\n limit: 25\n scope:\n includeArchived: false\n - id: notice\n type: notice.show\n input:\n message: \"Active tasks: {{steps.active.count}}\"\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 25\n onError: stop\n---\n\n# Show active task count\n\nRun this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`.\n```\n\n## Example: Inherit Parent Priority\n\nThis workflow copies priority from the first parent task when a task becomes a subtask:\n\n```yaml\ntype: tasknotes-workflow\nschemaVersion: 1\nid: inherit-subtask-priority\nname: Inherit subtask priority\nenabled: false\ntriggers:\n - id: projects-changed\n type: tasknotes.event\n event: task.projects.changed\n - id: task-created\n type: tasknotes.event\n event: task.created\nconditions:\n - field: trigger.after.path\n operator: exists\n - field: trigger.after.projects\n operator: exists\nsteps:\n - id: parents\n type: task.parents\n input:\n task: \"{{trigger.after.path}}\"\n - id: inherit-priority\n type: task.patch\n if:\n - field: steps.parents.tasks[0].priority\n operator: exists\n input:\n task: \"{{trigger.after.path}}\"\n patch:\n priority: \"{{steps.parents.tasks[0].priority}}\"\nrun:\n mode: sequential\n noOverlap: true\n source: tasknotes-workflows\n maxTasks: 1\n onError: stop\n```\n\nThis pattern uses `task.parents` rather than trying to parse project links manually.\n\n## Authoring Guidelines\n\nWhen writing workflow notes:\n\n- Start with `enabled: false` for any workflow that mutates tasks.\n- Give every trigger and step a stable `id`.\n- Prefer typed TaskNotes steps over direct frontmatter editing.\n- Use relationship read steps such as `task.parents`, `task.subtasks`, and `task.dependencies` for parent/subtask/dependency logic.\n- Add workflow-level conditions for required trigger fields such as `trigger.after.path`.\n- Add `run.noOverlap: true` unless overlapping runs are intentional.\n- Set `run.maxTasks` for batch workflows.\n- Use `allowSelfTrigger: true` only when the workflow really should react to its own writes.\n- Keep the Markdown body useful for future maintenance: describe what the workflow changes, how to test it, and why it exists.\n\n## Troubleshooting\n\n### Task steps do not run\n\nConfirm TaskNotes is enabled and exposes the runtime API. The workflow Base can display definitions without TaskNotes, but steps such as `task.patch`, `time.start`, or `task.dependencies` need TaskNotes.\n\n### A manual workflow is missing from the command palette\n\nCheck that:\n\n- The workflow is valid.\n- `enabled` is `true`.\n- It has a `manual` trigger.\n- The workflow `id` is valid and stable.\n- Workflows have reloaded after editing the file.\n\nDisabled manual workflows can still be dry-run from the workflow card, but they are not registered as run commands.\n\n### A cron or interval workflow did not run\n\nScheduled workflows only run while Obsidian is open and the plugin is loaded. Check the schedule, timezone, enabled state, and `run.maxTasks` limit.\n\n### A workflow runs more than once\n\nCheck whether multiple triggers match the same update. Also check `allowSelfTrigger`; most workflows should leave it unset so they do not react to writes caused by `tasknotes-workflows`.\n\n### A workflow is invalid\n\nOpen the workflow Base or the workflow note card. Validation messages point to the field path, such as `triggers[0].type` or `steps[1].input`.\n\nCommon causes are missing required fields, unsupported trigger types, invalid YAML, or references to step outputs that do not exist.\n","aliases":["/companion-plugins/tasknotes-workflows/"],"toc":[{"level":2,"id":"install-tasknotes-workflows","text":"Install TaskNotes Workflows"},{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"files-created-by-the-plugin","text":"Files Created by the Plugin"},{"level":2,"id":"first-run","text":"First Run"},{"level":2,"id":"default-workflows","text":"Default Workflows"},{"level":2,"id":"workflow-shape","text":"Workflow Shape"},{"level":2,"id":"triggers","text":"Triggers"},{"level":3,"id":"tasknotes-events","text":"TaskNotes Events"},{"level":3,"id":"cron","text":"Cron"},{"level":3,"id":"interval","text":"Interval"},{"level":3,"id":"manual","text":"Manual"},{"level":3,"id":"obsidian-events","text":"Obsidian Events"},{"level":2,"id":"conditions","text":"Conditions"},{"level":2,"id":"references","text":"References"},{"level":2,"id":"steps","text":"Steps"},{"level":2,"id":"run-policy","text":"Run Policy"},{"level":2,"id":"run-logs-and-debugging","text":"Run Logs and Debugging"},{"level":2,"id":"example-manual-command-workflow","text":"Example: Manual Command Workflow"},{"level":2,"id":"example-inherit-parent-priority","text":"Example: Inherit Parent Priority"},{"level":2,"id":"authoring-guidelines","text":"Authoring Guidelines"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"task-steps-do-not-run","text":"Task steps do not run"},{"level":3,"id":"a-manual-workflow-is-missing-from-the-command-palette","text":"A manual workflow is missing from the command palette"},{"level":3,"id":"a-cron-or-interval-workflow-did-not-run","text":"A cron or interval workflow did not run"},{"level":3,"id":"a-workflow-runs-more-than-once","text":"A workflow runs more than once"},{"level":3,"id":"a-workflow-is-invalid","text":"A workflow is invalid"}],"html":"

TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks.

\n

Install TaskNotes Workflows#

\n\n\n

You can also install it from Obsidian: open Settings > Community plugins > Browse, then search for TaskNotes Workflows.

\n

The plugin is designed for workflows users often ask TaskNotes core to handle, such as:

\n
    \n
  • Start time tracking when a task becomes active.
  • \n
  • Stop time tracking when a task is completed.
  • \n
  • Move completed tasks into a review folder.
  • \n
  • Copy parent task context, tags, priority, dates, or dependencies to subtasks.
  • \n
  • Warn when a blocked task is moved to active.
  • \n
  • Run a daily review query.
  • \n
\n

TaskNotes Workflows keeps this behavior outside TaskNotes core while still using the TaskNotes JavaScript Runtime API for safe task reads, writes, canonical queries, events, and relationship resolution.

\n

Requirements#

\n
    \n
  • TaskNotes must be installed and enabled.
  • \n
  • TaskNotes must expose the JavaScript runtime API.
  • \n
  • Obsidian must be open for workflows to run.
  • \n
  • Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed.
  • \n
  • The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded.
  • \n
\n

If TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run.

\n

Files Created by the Plugin#

\n

By default, TaskNotes Workflows uses:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PathPurpose
TaskNotes/Workflows/Workflow Markdown files.
TaskNotes/Views/workflows.baseGenerated Obsidian Base that renders workflow cards through the custom workflow view.
Plugin config folderRun history and detail logs, unless a run-log folder is configured.
\n

Workflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance.

\n

First Run#

\n

On first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally.

\n

The generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note.

\n

Workflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly.

\n

Default Workflows#

\n

The plugin can write these starter workflows:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
WorkflowWhat it demonstrates
Auto-start time trackingStarts a timer when a task status changes to active.
Stop time tracking on completeStops the timer when a task is completed.
Morning overdue reviewRuns a daily cron query and marks overdue open tasks high priority.
Move completed tasks to reviewMoves completed task notes into a review folder.
Inherit subtask contexts and tagsCopies contexts and tags from the first parent task when a task becomes a subtask.
Inherit subtask priorityCopies priority from the first parent task when a task becomes a subtask.
Inherit subtask planning datesCopies scheduled and due dates from the first parent task when a task becomes a subtask.
Inherit subtask dependenciesAdds the first parent task's blocking dependencies to new subtasks.
Mirror parent priority to subtasksUpdates existing subtasks when a parent task priority changes.
Mirror parent planning dates to subtasksUpdates existing subtasks when a parent scheduled or due date changes.
Mirror parent dependencies to subtasksReplaces each subtask's dependencies with the parent task's current dependencies.
Warn when starting a blocked taskShows a notice when a task becomes active while dependencies remain.
Daily active task reviewShows a daily count of tasks still marked active.
\n

Treat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows.

\n

Workflow Shape#

\n

A workflow file looks like this:

\n
---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: auto-start-time-tracking\nname: Auto-start time tracking\nenabled: false\ndescription: Start a timer when a task status changes to active.\ntriggers:\n  - id: status-active\n    type: tasknotes.event\n    event: task.status.changed\n    to: active\nconditions:\n  - field: trigger.after.path\n    operator: exists\nsteps:\n  - id: start-time\n    type: time.start\n    input:\n      task: "{{trigger.after.path}}"\n      options:\n        description: "Started by {{workflow.name}}"\nrun:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 1\n  onError: stop\n---\n\n# Auto-start time tracking\n\nEnable this workflow to start time tracking when a TaskNotes task moves to `active`.\n

Required frontmatter fields:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldTypeNotes
typestringMust be tasknotes-workflow.
schemaVersionnumberMust be 1.
idstringStable lowercase identifier. Use letters, numbers, dots, underscores, and dashes.
namestringHuman-readable name shown in workflow cards and command-palette commands.
enabledbooleanDisabled workflows can be edited and dry-run but do not run automatically or from manual commands.
triggersarrayOne or more trigger definitions.
conditionsarrayOptional workflow-level guards.
stepsarrayLinear typed step pipeline.
runobjectRun policy and safety limits.
\n

Triggers#

\n

Triggers decide when a workflow should run.

\n

TaskNotes Events#

\n

Use tasknotes.event to react to TaskNotes runtime events:

\n
triggers:\n  - id: status-active\n    type: tasknotes.event\n    event: task.status.changed\n    from: open\n    to: active\n

Common event names include:

\n
    \n
  • task.created
  • \n
  • task.updated
  • \n
  • task.deleted
  • \n
  • task.moved
  • \n
  • task.status.changed
  • \n
  • task.completed
  • \n
  • task.uncompleted
  • \n
  • task.archived
  • \n
  • task.unarchived
  • \n
  • task.scheduled.changed
  • \n
  • task.due.changed
  • \n
  • task.priority.changed
  • \n
  • task.tags.changed
  • \n
  • task.contexts.changed
  • \n
  • task.projects.changed
  • \n
  • task.reminders.changed
  • \n
  • task.dependencies.changed
  • \n
  • task.recurrence.changed
  • \n
  • time.started
  • \n
  • time.stopped
  • \n
  • pomodoro.started
  • \n
  • pomodoro.completed
  • \n
  • pomodoro.interrupted
  • \n
  • recurring.instance.completed
  • \n
  • recurring.instance.skipped
  • \n
\n

The workflow editor loads available TaskNotes events dynamically from api.events.list(), so event pickers can follow the runtime API instead of relying on a hardcoded list.

\n

TaskNotes event triggers can use these filters:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldPurpose
eventRuntime event name.
fromPrevious status or value for status-change workflows.
toNew status or value for status-change workflows.
path.globOptional path glob limiting which task files can trigger the workflow.
allowSelfTriggerAllows this workflow to react to writes caused by tasknotes-workflows. Leave off unless you have a clear reason.
\n

TaskNotes event output fields include values such as trigger.after.path, trigger.after.status, trigger.before.status, trigger.changes, trigger.source, and trigger.correlationId.

\n

Cron#

\n

Cron triggers run on matching minutes while Obsidian is open:

\n
triggers:\n  - id: weekday-review\n    type: cron\n    schedule: "0 17 * * 1-5"\n    timezone: local\n

The schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with run.maxTasks, especially if they query many tasks.

\n

Interval#

\n

Interval triggers run repeatedly while Obsidian is open:

\n
triggers:\n  - id: half-hour-check\n    type: interval\n    every: 30m\n

The plugin enforces a minimum interval to avoid excessive background work.

\n

Manual#

\n

Manual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette:

\n
triggers:\n  - id: manual\n    type: manual\n

Enabled workflows with a manual trigger are registered as Obsidian commands named Run: <workflow name>. You can launch them from the command palette or assign hotkeys in Obsidian settings.

\n

The generated command id is based on the workflow id. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned.

\n

Obsidian Events#

\n

Advanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events:

\n
triggers:\n  - id: project-note-opened\n    type: obsidian.workspace\n    event: file-open\n    path:\n      glob: "Projects/**/*.md"\n\n  - id: task-note-modified\n    type: obsidian.vault\n    event: modify\n    path:\n      glob: "Tasks/**/*.md"\n\n  - id: metadata-changed\n    type: obsidian.metadata\n    event: changed\n    path:\n      glob: "Projects/**/*.md"\n

Keep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent.

\n

Conditions#

\n

Conditions can appear at workflow level or on individual steps.

\n
conditions:\n  - field: trigger.after.path\n    operator: exists\n  - field: trigger.after.status\n    operator: is\n    value: active\n

Supported operators:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperatorMeaning
is / isNotExact comparison after scalar normalization.
in / notInCheck a value against an array.
exists / missingCheck whether a field has a value.
containsCheck whether a string contains text or an array contains a value.
startsWithString prefix check.
before / afterDate comparison.
onOrBefore / onOrAfterInclusive date comparison.
\n

Step-level conditions use the same shape:

\n
steps:\n  - id: warn\n    type: notice.show\n    if:\n      - field: steps.dependencies.tasks[0].path\n        operator: exists\n    input:\n      message: "This task still has dependencies."\n

References#

\n

References use constrained template expressions. Arbitrary JavaScript is not evaluated.

\n
{{workflow.id}}\n{{workflow.name}}\n{{trigger.after.path}}\n{{trigger.changes.status.after}}\n{{steps.query.tasks}}\n{{steps.parents.tasks[0].path}}\n{{item.path}}\n{{today}}\n{{now}}\n

If a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified.

\n

Use forEach when a step should run once per item:

\n
steps:\n  - id: overdue\n    type: task.query\n    input:\n      query:\n        where:\n          all:\n            - field: task.due\n              op: lt\n              value:\n                fn: today\n            - field: task.status\n              op: notIn\n              value:\n                - done\n                - cancelled\n        sort:\n          - field: task.due\n            direction: asc\n        limit: 50\n        scope:\n          includeArchived: false\n\n  - id: mark-high\n    type: task.patch\n    forEach: "{{steps.overdue.tasks}}"\n    input:\n      task: "{{item.path}}"\n      patch:\n        priority: high\n

When a step uses forEach, {{item}} refers to the current item and the step output becomes an array of per-item outputs.

\n

task.query uses the canonical TaskNotes runtime query DTO. Its output includes tasks, count, total, matched, returned, groups, groupPaths, query, and warnings.

\n

Runtime query conditions use canonical field IDs and operators:

\n
query:\n  where:\n    all:\n      - field: task.status\n        op: ne\n        value: done\n      - any:\n          - field: task.due\n            op: lte\n            value:\n              fn: today\n          - field: task.priority\n            op: eq\n            value: high\n  sort:\n    - field: task.due\n      direction: asc\n  group:\n    - field: task.status\n  limit: 25\n  scope:\n    includeArchived: false\n

Common fields include task.status, task.priority, task.due, task.scheduled, task.projects, task.contexts, task.tags, task.isBlocked, and file.path. Operators include eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Use api.catalog.filterProperties() and api.catalog.filterOperators() for the complete runtime catalog.

\n

Steps#

\n

Steps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers.

\n

Task read steps:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StepOutput
task.getOne task.
task.queryTasks matching a canonical TaskNotes runtime query.
task.parentsParent tasks linked from the task's projects.
task.subtasksTasks that reference the current task as a project.
task.dependenciesDependencies stored in blockedBy, with resolved task data when available.
task.blockingTasks blocked by the current task.
task.relationshipsThe task plus parents, subtasks, dependencies, and blocking tasks.
\n

Task write steps:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StepPurpose
task.createCreate a new TaskNotes task.
task.patchUpdate one or more fields.
task.setSet one field.
task.moveMove the task note to a target folder.
task.archive / task.unarchiveArchive or unarchive a task.
task.complete / task.uncompleteComplete or reopen a task.
task.rescheduleUpdate planning dates.
task.setDue / task.clearDueSet or clear due date.
task.setScheduled / task.clearScheduledSet or clear scheduled date.
task.addTag / task.removeTagMutate tags.
task.addProject / task.removeProjectMutate project links.
task.addContext / task.removeContextMutate contexts.
task.addDependency / task.removeDependencyMutate blocking dependencies.
\n

Time and utility steps:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StepPurpose
time.startStart time tracking for a task.
time.stopStop active time tracking for a task.
time.appendEntryAppend a time entry.
notice.showShow an Obsidian notice.
workflow.stopStop a workflow early.
\n

Companion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension:

\n
const tasknotes = app.plugins.getPlugin("tasknotes")?.api;\nconst workflows = tasknotes?.extensions.get("tasknotes-workflows");\nconst steps = workflows?.listStepDefinitions();\n

Run Policy#

\n

Every workflow has a run policy:

\n
run:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 25\n  onError: stop\n  timeout: 30s\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FieldNotes
modeCurrently sequential. Steps run in order.
noOverlapSkips a new run if the same workflow is already running.
sourceMutation source passed to TaskNotes runtime API calls.
maxTasksSafety limit for forEach batch steps.
onErrorstop or continue.
timeoutOptional duration string.
\n

TaskNotes attaches source, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops.

\n

Run Logs and Debugging#

\n

Workflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings.

\n

Run records include:

\n
    \n
  • Workflow id, name, and source path.
  • \n
  • Trigger payload.
  • \n
  • Step statuses.
  • \n
  • Inputs and outputs, depending on the configured log level.
  • \n
  • Error text when a run fails.
  • \n
\n

Use dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files.

\n

Example: Manual Command Workflow#

\n

This workflow can be run from the command palette after it is enabled:

\n
---\ntype: tasknotes-workflow\nschemaVersion: 1\nid: show-active-count\nname: Show active task count\nenabled: true\ndescription: Show a notice with the number of active tasks.\ntriggers:\n  - id: manual\n    type: manual\nsteps:\n  - id: active\n    type: task.query\n    input:\n      query:\n        where:\n          field: task.status\n          op: eq\n          value: active\n        limit: 25\n        scope:\n          includeArchived: false\n  - id: notice\n    type: notice.show\n    input:\n      message: "Active tasks: {{steps.active.count}}"\nrun:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 25\n  onError: stop\n---\n\n# Show active task count\n\nRun this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`.\n

Example: Inherit Parent Priority#

\n

This workflow copies priority from the first parent task when a task becomes a subtask:

\n
type: tasknotes-workflow\nschemaVersion: 1\nid: inherit-subtask-priority\nname: Inherit subtask priority\nenabled: false\ntriggers:\n  - id: projects-changed\n    type: tasknotes.event\n    event: task.projects.changed\n  - id: task-created\n    type: tasknotes.event\n    event: task.created\nconditions:\n  - field: trigger.after.path\n    operator: exists\n  - field: trigger.after.projects\n    operator: exists\nsteps:\n  - id: parents\n    type: task.parents\n    input:\n      task: "{{trigger.after.path}}"\n  - id: inherit-priority\n    type: task.patch\n    if:\n      - field: steps.parents.tasks[0].priority\n        operator: exists\n    input:\n      task: "{{trigger.after.path}}"\n      patch:\n        priority: "{{steps.parents.tasks[0].priority}}"\nrun:\n  mode: sequential\n  noOverlap: true\n  source: tasknotes-workflows\n  maxTasks: 1\n  onError: stop\n

This pattern uses task.parents rather than trying to parse project links manually.

\n

Authoring Guidelines#

\n

When writing workflow notes:

\n
    \n
  • Start with enabled: false for any workflow that mutates tasks.
  • \n
  • Give every trigger and step a stable id.
  • \n
  • Prefer typed TaskNotes steps over direct frontmatter editing.
  • \n
  • Use relationship read steps such as task.parents, task.subtasks, and task.dependencies for parent/subtask/dependency logic.
  • \n
  • Add workflow-level conditions for required trigger fields such as trigger.after.path.
  • \n
  • Add run.noOverlap: true unless overlapping runs are intentional.
  • \n
  • Set run.maxTasks for batch workflows.
  • \n
  • Use allowSelfTrigger: true only when the workflow really should react to its own writes.
  • \n
  • Keep the Markdown body useful for future maintenance: describe what the workflow changes, how to test it, and why it exists.
  • \n
\n

Troubleshooting#

\n

Task steps do not run#

\n

Confirm TaskNotes is enabled and exposes the runtime API. The workflow Base can display definitions without TaskNotes, but steps such as task.patch, time.start, or task.dependencies need TaskNotes.

\n

A manual workflow is missing from the command palette#

\n

Check that:

\n
    \n
  • The workflow is valid.
  • \n
  • enabled is true.
  • \n
  • It has a manual trigger.
  • \n
  • The workflow id is valid and stable.
  • \n
  • Workflows have reloaded after editing the file.
  • \n
\n

Disabled manual workflows can still be dry-run from the workflow card, but they are not registered as run commands.

\n

A cron or interval workflow did not run#

\n

Scheduled workflows only run while Obsidian is open and the plugin is loaded. Check the schedule, timezone, enabled state, and run.maxTasks limit.

\n

A workflow runs more than once#

\n

Check whether multiple triggers match the same update. Also check allowSelfTrigger; most workflows should leave it unset so they do not react to writes caused by tasknotes-workflows.

\n

A workflow is invalid#

\n

Open the workflow Base or the workflow note card. Validation messages point to the field path, such as triggers[0].type or steps[1].input.

\n

Common causes are missing required fields, unsupported trigger types, invalid YAML, or references to step outputs that do not exist.

\n","text":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks. Install TaskNotes Workflows# Install from Obsidian Community Plugins Open the TaskNotes Workflows listing in the Obsidian plugin directory You can also install it from Obsidian: open Settings > Community plugins > Browse, then search for TaskNotes Workflows. The plugin is designed for workflows users often ask TaskNotes core to handle, such as: Start time tracking when a task becomes active. Stop time tracking when a task is completed. Move completed tasks into a review folder. Copy parent task context, tags, priority, dates, or dependencies to subtasks. Warn when a blocked task is moved to active. Run a daily review query. TaskNotes Workflows keeps this behavior outside TaskNotes core while still using the TaskNotes JavaScript Runtime API for safe task reads, writes, canonical queries, events, and relationship resolution. Requirements# TaskNotes must be installed and enabled. TaskNotes must expose the JavaScript runtime API. Obsidian must be open for workflows to run. Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed. The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded. If TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run. Files Created by the Plugin# By default, TaskNotes Workflows uses: Path Purpose TaskNotes/Workflows/ Workflow Markdown files. TaskNotes/Views/workflows.base Generated Obsidian Base that renders workflow cards through the custom workflow view. Plugin config folder Run history and detail logs, unless a run-log folder is configured. Workflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance. First Run# On first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally. The generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note. Workflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly. Default Workflows# The plugin can write these starter workflows: Workflow What it demonstrates Auto-start time tracking Starts a timer when a task status changes to active. Stop time tracking on complete Stops the timer when a task is completed. Morning overdue review Runs a daily cron query and marks overdue open tasks high priority. Move completed tasks to review Moves completed task notes into a review folder. Inherit subtask contexts and tags Copies contexts and tags from the first parent task when a task becomes a subtask. Inherit subtask priority Copies priority from the first parent task when a task becomes a subtask. Inherit subtask planning dates Copies scheduled and due dates from the first parent task when a task becomes a subtask. Inherit subtask dependencies Adds the first parent task's blocking dependencies to new subtasks. Mirror parent priority to subtasks Updates existing subtasks when a parent task priority changes. Mirror parent planning dates to subtasks Updates existing subtasks when a parent scheduled or due date changes. Mirror parent dependencies to subtasks Replaces each subtask's dependencies with the parent task's current dependencies. Warn when starting a blocked task Shows a notice when a task becomes active while dependencies remain. Daily active task review Shows a daily count of tasks still marked active. Treat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows. Workflow Shape# A workflow file looks like this: --- type: tasknotes-workflow schemaVersion: 1 id: auto-start-time-tracking name: Auto-start time tracking enabled: false description: Start a timer when a task status changes to active. triggers: - id: status-active type: tasknotes.event event: task.status.changed to: active conditions: - field: trigger.after.path operator: exists steps: - id: start-time type: time.start input: task: \"{{trigger.after.path}}\" options: description: \"Started by {{workflow.name}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop --- # Auto-start time tracking Enable this workflow to start time tracking when a TaskNotes task moves to `active`. Required frontmatter fields: Field Type Notes type string Must be tasknotes-workflow. schemaVersion number Must be 1. id string Stable lowercase identifier. Use letters, numbers, dots, underscores, and dashes. name string Human-readable name shown in workflow cards and command-palette commands. enabled boolean Disabled workflows can be edited and dry-run but do not run automatically or from manual commands. triggers array One or more trigger definitions. conditions array Optional workflow-level guards. steps array Linear typed step pipeline. run object Run policy and safety limits. Triggers# Triggers decide when a workflow should run. TaskNotes Events# Use tasknotes.event to react to TaskNotes runtime events: triggers: - id: status-active type: tasknotes.event event: task.status.changed from: open to: active Common event names include: task.created task.updated task.deleted task.moved task.status.changed task.completed task.uncompleted task.archived task.unarchived task.scheduled.changed task.due.changed task.priority.changed task.tags.changed task.contexts.changed task.projects.changed task.reminders.changed task.dependencies.changed task.recurrence.changed time.started time.stopped pomodoro.started pomodoro.completed pomodoro.interrupted recurring.instance.completed recurring.instance.skipped The workflow editor loads available TaskNotes events dynamically from api.events.list(), so event pickers can follow the runtime API instead of relying on a hardcoded list. TaskNotes event triggers can use these filters: Field Purpose event Runtime event name. from Previous status or value for status-change workflows. to New status or value for status-change workflows. path.glob Optional path glob limiting which task files can trigger the workflow. allowSelfTrigger Allows this workflow to react to writes caused by tasknotes-workflows. Leave off unless you have a clear reason. TaskNotes event output fields include values such as trigger.after.path, trigger.after.status, trigger.before.status, trigger.changes, trigger.source, and trigger.correlationId. Cron# Cron triggers run on matching minutes while Obsidian is open: triggers: - id: weekday-review type: cron schedule: \"0 17 * * 1-5\" timezone: local The schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with run.maxTasks, especially if they query many tasks. Interval# Interval triggers run repeatedly while Obsidian is open: triggers: - id: half-hour-check type: interval every: 30m The plugin enforces a minimum interval to avoid excessive background work. Manual# Manual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette: triggers: - id: manual type: manual Enabled workflows with a manual trigger are registered as Obsidian commands named Run: . You can launch them from the command palette or assign hotkeys in Obsidian settings. The generated command id is based on the workflow id. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned. Obsidian Events# Advanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events: triggers: - id: project-note-opened type: obsidian.workspace event: file-open path: glob: \"Projects/**/*.md\" - id: task-note-modified type: obsidian.vault event: modify path: glob: \"Tasks/**/*.md\" - id: metadata-changed type: obsidian.metadata event: changed path: glob: \"Projects/**/*.md\" Keep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent. Conditions# Conditions can appear at workflow level or on individual steps. conditions: - field: trigger.after.path operator: exists - field: trigger.after.status operator: is value: active Supported operators: Operator Meaning is / isNot Exact comparison after scalar normalization. in / notIn Check a value against an array. exists / missing Check whether a field has a value. contains Check whether a string contains text or an array contains a value. startsWith String prefix check. before / after Date comparison. onOrBefore / onOrAfter Inclusive date comparison. Step-level conditions use the same shape: steps: - id: warn type: notice.show if: - field: steps.dependencies.tasks[0].path operator: exists input: message: \"This task still has dependencies.\" References# References use constrained template expressions. Arbitrary JavaScript is not evaluated. {{workflow.id}} {{workflow.name}} {{trigger.after.path}} {{trigger.changes.status.after}} {{steps.query.tasks}} {{steps.parents.tasks[0].path}} {{item.path}} {{today}} {{now}} If a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified. Use forEach when a step should run once per item: steps: - id: overdue type: task.query input: query: where: all: - field: task.due op: lt value: fn: today - field: task.status op: notIn value: - done - cancelled sort: - field: task.due direction: asc limit: 50 scope: includeArchived: false - id: mark-high type: task.patch forEach: \"{{steps.overdue.tasks}}\" input: task: \"{{item.path}}\" patch: priority: high When a step uses forEach, {{item}} refers to the current item and the step output becomes an array of per-item outputs. task.query uses the canonical TaskNotes runtime query DTO. Its output includes tasks, count, total, matched, returned, groups, groupPaths, query, and warnings. Runtime query conditions use canonical field IDs and operators: query: where: all: - field: task.status op: ne value: done - any: - field: task.due op: lte value: fn: today - field: task.priority op: eq value: high sort: - field: task.due direction: asc group: - field: task.status limit: 25 scope: includeArchived: false Common fields include task.status, task.priority, task.due, task.scheduled, task.projects, task.contexts, task.tags, task.isBlocked, and file.path. Operators include eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Use api.catalog.filterProperties() and api.catalog.filterOperators() for the complete runtime catalog. Steps# Steps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers. Task read steps: Step Output task.get One task. task.query Tasks matching a canonical TaskNotes runtime query. task.parents Parent tasks linked from the task's projects. task.subtasks Tasks that reference the current task as a project. task.dependencies Dependencies stored in blockedBy, with resolved task data when available. task.blocking Tasks blocked by the current task. task.relationships The task plus parents, subtasks, dependencies, and blocking tasks. Task write steps: Step Purpose task.create Create a new TaskNotes task. task.patch Update one or more fields. task.set Set one field. task.move Move the task note to a target folder. task.archive / task.unarchive Archive or unarchive a task. task.complete / task.uncomplete Complete or reopen a task. task.reschedule Update planning dates. task.setDue / task.clearDue Set or clear due date. task.setScheduled / task.clearScheduled Set or clear scheduled date. task.addTag / task.removeTag Mutate tags. task.addProject / task.removeProject Mutate project links. task.addContext / task.removeContext Mutate contexts. task.addDependency / task.removeDependency Mutate blocking dependencies. Time and utility steps: Step Purpose time.start Start time tracking for a task. time.stop Stop active time tracking for a task. time.appendEntry Append a time entry. notice.show Show an Obsidian notice. workflow.stop Stop a workflow early. Companion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension: const tasknotes = app.plugins.getPlugin(\"tasknotes\")?.api; const workflows = tasknotes?.extensions.get(\"tasknotes-workflows\"); const steps = workflows?.listStepDefinitions(); Run Policy# Every workflow has a run policy: run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop timeout: 30s Field Notes mode Currently sequential. Steps run in order. noOverlap Skips a new run if the same workflow is already running. source Mutation source passed to TaskNotes runtime API calls. maxTasks Safety limit for forEach batch steps. onError stop or continue. timeout Optional duration string. TaskNotes attaches source, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops. Run Logs and Debugging# Workflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings. Run records include: Workflow id, name, and source path. Trigger payload. Step statuses. Inputs and outputs, depending on the configured log level. Error text when a run fails. Use dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files. Example: Manual Command Workflow# This workflow can be run from the command palette after it is enabled: --- type: tasknotes-workflow schemaVersion: 1 id: show-active-count name: Show active task count enabled: true description: Show a notice with the number of active tasks. triggers: - id: manual type: manual steps: - id: active type: task.query input: query: where: field: task.status op: eq value: active limit: 25 scope: includeArchived: false - id: notice type: notice.show input: message: \"Active tasks: {{steps.active.count}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop --- # Show active task count Run this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`. Example: Inherit Parent Priority# This workflow copies priority from the first parent task when a task becomes a subtask: type: tasknotes-workflow schemaVersion: 1 id: inherit-subtask-priority name: Inherit subtask priority enabled: false triggers: - id: projects-changed type: tasknotes.event event: task.projects.changed - id: task-created type: tasknotes.event event: task.created conditions: - field: trigger.after.path operator: exists - field: trigger.after.projects operator: exists steps: - id: parents type: task.parents input: task: \"{{trigger.after.path}}\" - id: inherit-priority type: task.patch if: - field: steps.parents.tasks[0].priority operator: exists input: task: \"{{trigger.after.path}}\" patch: priority: \"{{steps.parents.tasks[0].priority}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop This pattern uses task.parents rather than trying to parse project links manually. Authoring Guidelines# When writing workflow notes: Start with enabled: false fo"},{"route":"/obsidian/core-concepts/","title":"Core Concepts","description":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/core-concepts.md","namespace":"obsidian","relativePath":"core-concepts.md","raw":"# Core Concepts\n\nTaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.\n\n## The Note-Per-Task Approach\n\nIndividual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool.\n\n### Task Structure\n\nA TaskNotes task is a standard Markdown file with YAML frontmatter:\n\n```markdown\n---\ntags:\n - task\ntitle: Review quarterly report\nstatus: in-progress\npriority: high\ndue: 2025-01-15\nscheduled: 2025-01-14\ncontexts:\n - office\nprojects:\n - \"[[Q1 Planning]]\"\n---\n\n## Notes\n\nKey points to review:\n- Revenue projections\n- Budget allocations\n\n## Meeting Notes\n\nDiscussion with finance team on 2025-01-10...\n```\n\nThe frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents.\n\n### Obsidian Integration\n\nSince tasks are proper notes, they work with Obsidian's core features:\n\n- **Backlinks**: See which notes reference a task\n- **Graph View**: Visualize task relationships and project connections\n- **Tags**: Use Obsidian's tag system for additional categorization\n- **Search**: Find tasks using Obsidian's search\n- **Links**: Reference tasks from daily notes, meeting notes, or project documents\n\nThis approach creates many small files. TaskNotes stores tasks in a configurable folder (default: `TaskNotes/Tasks/`) to keep them organized.\nIn practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top.\n\n## YAML Frontmatter\n\nTask properties are stored in YAML frontmatter, a standard format with broad tool support.\nTreat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body.\n\n### Property Types\n\nTaskNotes uses several property types:\n\n| Type | Example | Description |\n|------|---------|-------------|\n| Text | `title: Buy groceries` | Single text value |\n| List | `tags: [work, urgent]` | Multiple values |\n| Date | `due: 2025-01-15` | ISO 8601 date format |\n| DateTime | `scheduled: 2025-01-15T09:00` | Date with time |\n| Link | `projects: [\"[[Project A]]\"]` | Obsidian wikilinks |\n| Number | `timeEstimate: 60` | Numeric values (minutes) |\n\n### Field Mapping\n\nProperty keys are configurable. If your vault uses `deadline` instead of `due`, you can map TaskNotes to use your existing field names without modifying your files.\n\nThe exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the [TaskNotes Specification](spec.md). The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data.\n\n### Custom Fields\n\nAdd any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in `Settings -> TaskNotes -> Task Properties` to include them in task modals and views.\n\n## Bases Integration\n\nTaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides:\n\n- **Filtering**: Query tasks using AND/OR conditions\n- **Sorting**: Order tasks by any property\n- **Grouping**: Organize tasks by status, priority, project, or custom fields\n- **Views**: Task List, Kanban, Calendar, and Agenda are all Bases views\n\nViews are stored as `.base` files in `TaskNotes/Views/`. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files.\nThis makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the `.base` file and see exactly which filter or grouping rule produced that result.\n\n### Enabling Bases\n\nBases is a core plugin included with Obsidian 1.10.1+:\n\n1. Open `Settings -> Core Plugins`\n2. Enable \"Bases\"\n3. TaskNotes views will now function\n","aliases":["/core-concepts/"],"toc":[{"level":2,"id":"the-note-per-task-approach","text":"The Note-Per-Task Approach"},{"level":3,"id":"task-structure","text":"Task Structure"},{"level":3,"id":"obsidian-integration","text":"Obsidian Integration"},{"level":2,"id":"yaml-frontmatter","text":"YAML Frontmatter"},{"level":3,"id":"property-types","text":"Property Types"},{"level":3,"id":"field-mapping","text":"Field Mapping"},{"level":3,"id":"custom-fields","text":"Custom Fields"},{"level":2,"id":"bases-integration","text":"Bases Integration"},{"level":3,"id":"enabling-bases","text":"Enabling Bases"}],"html":"

TaskNotes follows the "one note per task" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.

\n

The Note-Per-Task Approach#

\n

Individual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool.

\n

Task Structure#

\n

A TaskNotes task is a standard Markdown file with YAML frontmatter:

\n
---\ntags:\n  - task\ntitle: Review quarterly report\nstatus: in-progress\npriority: high\ndue: 2025-01-15\nscheduled: 2025-01-14\ncontexts:\n  - office\nprojects:\n  - "[[Q1 Planning]]"\n---\n\n## Notes\n\nKey points to review:\n- Revenue projections\n- Budget allocations\n\n## Meeting Notes\n\nDiscussion with finance team on 2025-01-10...\n

The frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents.

\n

Obsidian Integration#

\n

Since tasks are proper notes, they work with Obsidian's core features:

\n
    \n
  • Backlinks: See which notes reference a task
  • \n
  • Graph View: Visualize task relationships and project connections
  • \n
  • Tags: Use Obsidian's tag system for additional categorization
  • \n
  • Search: Find tasks using Obsidian's search
  • \n
  • Links: Reference tasks from daily notes, meeting notes, or project documents
  • \n
\n

This approach creates many small files. TaskNotes stores tasks in a configurable folder (default: TaskNotes/Tasks/) to keep them organized.\nIn practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top.

\n

YAML Frontmatter#

\n

Task properties are stored in YAML frontmatter, a standard format with broad tool support.\nTreat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body.

\n

Property Types#

\n

TaskNotes uses several property types:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TypeExampleDescription
Texttitle: Buy groceriesSingle text value
Listtags: [work, urgent]Multiple values
Datedue: 2025-01-15ISO 8601 date format
DateTimescheduled: 2025-01-15T09:00Date with time
Linkprojects: ["[[Project A]]"]Obsidian wikilinks
NumbertimeEstimate: 60Numeric values (minutes)
\n

Field Mapping#

\n

Property keys are configurable. If your vault uses deadline instead of due, you can map TaskNotes to use your existing field names without modifying your files.

\n

The exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the TaskNotes Specification. The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data.

\n

Custom Fields#

\n

Add any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in Settings -> TaskNotes -> Task Properties to include them in task modals and views.

\n

Bases Integration#

\n

TaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides:

\n
    \n
  • Filtering: Query tasks using AND/OR conditions
  • \n
  • Sorting: Order tasks by any property
  • \n
  • Grouping: Organize tasks by status, priority, project, or custom fields
  • \n
  • Views: Task List, Kanban, Calendar, and Agenda are all Bases views
  • \n
\n

Views are stored as .base files in TaskNotes/Views/. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files.\nThis makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the .base file and see exactly which filter or grouping rule produced that result.

\n

Enabling Bases#

\n

Bases is a core plugin included with Obsidian 1.10.1+:

\n
    \n
  1. Open Settings -> Core Plugins
  2. \n
  3. Enable "Bases"
  4. \n
  5. TaskNotes views will now function
  6. \n
\n","text":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter. The Note-Per-Task Approach# Individual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool. Task Structure# A TaskNotes task is a standard Markdown file with YAML frontmatter: --- tags: - task title: Review quarterly report status: in-progress priority: high due: 2025-01-15 scheduled: 2025-01-14 contexts: - office projects: - \"[[Q1 Planning]]\" --- ## Notes Key points to review: - Revenue projections - Budget allocations ## Meeting Notes Discussion with finance team on 2025-01-10... The frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents. Obsidian Integration# Since tasks are proper notes, they work with Obsidian's core features: Backlinks: See which notes reference a task Graph View: Visualize task relationships and project connections Tags: Use Obsidian's tag system for additional categorization Search: Find tasks using Obsidian's search Links: Reference tasks from daily notes, meeting notes, or project documents This approach creates many small files. TaskNotes stores tasks in a configurable folder (default: TaskNotes/Tasks/) to keep them organized. In practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top. YAML Frontmatter# Task properties are stored in YAML frontmatter, a standard format with broad tool support. Treat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body. Property Types# TaskNotes uses several property types: Type Example Description Text title: Buy groceries Single text value List tags: [work, urgent] Multiple values Date due: 2025-01-15 ISO 8601 date format DateTime scheduled: 2025-01-15T09:00 Date with time Link projects: [\"[[Project A]]\"] Obsidian wikilinks Number timeEstimate: 60 Numeric values (minutes) Field Mapping# Property keys are configurable. If your vault uses deadline instead of due, you can map TaskNotes to use your existing field names without modifying your files. The exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the TaskNotes Specification. The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data. Custom Fields# Add any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in Settings -> TaskNotes -> Task Properties to include them in task modals and views. Bases Integration# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides: Filtering: Query tasks using AND/OR conditions Sorting: Order tasks by any property Grouping: Organize tasks by status, priority, project, or custom fields Views: Task List, Kanban, Calendar, and Agenda are all Bases views Views are stored as .base files in TaskNotes/Views/. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files. This makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the .base file and see exactly which filter or grouping rule produced that result. Enabling Bases# Bases is a core plugin included with Obsidian 1.10.1+: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes views will now function"},{"route":"/obsidian/features/","title":"Features","description":"TaskNotes includes task organization, time tracking, and calendar integration features.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features.md","namespace":"obsidian","relativePath":"features.md","raw":"# Features\n\nTaskNotes includes task organization, time tracking, and calendar integration features.\n\n## Task Management\n\nTaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases.\n\nReminders can be relative (for example, \"3 days before due\") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance.\n\nSee [Task Management](features/task-management.md) for details.\nFor recurrence behavior, see [Recurring Tasks](features/recurring-tasks.md).\nFor reminder setup and data format, see [Task Reminders](features/reminders.md).\n\n## Filtering and Views\n\nTaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a `.base` file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state.\n\nThis design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault.\n\n![Kanban view](assets/views-kanban.png)\n\nFor details on how Bases integration works, see [Core Concepts](core-concepts.md#bases-integration). For Bases syntax documentation, see the [official Obsidian Bases documentation](https://help.obsidian.md/Bases/Introduction+to+Bases).\n\n## Inline Task Integration\n\nInline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place.\n\nNatural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data.\n\nSee [Inline Task Integration](features/inline-tasks.md) for details.\n\n## Time Management\n\nTime tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution.\n\n![Pomodoro timer](assets/feature-pomodoro-timer.png)\n\nSee [Time Management](features/time-management.md) for details.\n\n## Calendar Integration\n\nTaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly.\n\nFor planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace.\n\n![Calendar month view](assets/views-calendar-month.png)\n\nSee [Calendar Integration](features/calendar-integration.md) for details.\n\n## User Fields\n\nUser fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas.\n\nSee [User Fields](features/user-fields.md) for details.\n\n## Integrations\n\nBeyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling.\n\nSee [Integrations](settings/integrations.md) for details.\n\n## Companion Plugins\n\nTaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. [Canvas Bases](companion-plugins/canvas-bases.md) is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. [TaskNotes Workflows](companion-plugins/tasknotes-workflows.md) adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions.\n\nSee [Companion Plugins](companion-plugins.md) for details.\n\n## REST API\n\nExternal applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools.\n\nSee [HTTP API](HTTP_API.md) for details.\n","aliases":["/features/"],"toc":[{"level":2,"id":"task-management","text":"Task Management"},{"level":2,"id":"filtering-and-views","text":"Filtering and Views"},{"level":2,"id":"inline-task-integration","text":"Inline Task Integration"},{"level":2,"id":"time-management","text":"Time Management"},{"level":2,"id":"calendar-integration","text":"Calendar Integration"},{"level":2,"id":"user-fields","text":"User Fields"},{"level":2,"id":"integrations","text":"Integrations"},{"level":2,"id":"companion-plugins","text":"Companion Plugins"},{"level":2,"id":"rest-api","text":"REST API"}],"html":"

TaskNotes includes task organization, time tracking, and calendar integration features.

\n

Task Management#

\n

TaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases.

\n

Reminders can be relative (for example, "3 days before due") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance.

\n

See Task Management for details.\nFor recurrence behavior, see Recurring Tasks.\nFor reminder setup and data format, see Task Reminders.

\n

Filtering and Views#

\n

TaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a .base file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state.

\n

This design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault.

\n

\"Kanban

\n

For details on how Bases integration works, see Core Concepts. For Bases syntax documentation, see the official Obsidian Bases documentation.

\n

Inline Task Integration#

\n

Inline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place.

\n

Natural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data.

\n

See Inline Task Integration for details.

\n

Time Management#

\n

Time tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution.

\n

\"Pomodoro

\n

See Time Management for details.

\n

Calendar Integration#

\n

TaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly.

\n

For planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace.

\n

\"Calendar

\n

See Calendar Integration for details.

\n

User Fields#

\n

User fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas.

\n

See User Fields for details.

\n

Integrations#

\n

Beyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling.

\n

See Integrations for details.

\n

Companion Plugins#

\n

TaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. Canvas Bases is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. TaskNotes Workflows adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions.

\n

See Companion Plugins for details.

\n

REST API#

\n

External applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools.

\n

See HTTP API for details.

\n","text":"TaskNotes includes task organization, time tracking, and calendar integration features. Task Management# TaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases. Reminders can be relative (for example, \"3 days before due\") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance. See Task Management for details. For recurrence behavior, see Recurring Tasks. For reminder setup and data format, see Task Reminders. Filtering and Views# TaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a .base file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state. This design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault. For details on how Bases integration works, see Core Concepts. For Bases syntax documentation, see the official Obsidian Bases documentation. Inline Task Integration# Inline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place. Natural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data. See Inline Task Integration for details. Time Management# Time tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution. See Time Management for details. Calendar Integration# TaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly. For planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace. See Calendar Integration for details. User Fields# User fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas. See User Fields for details. Integrations# Beyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling. See Integrations for details. Companion Plugins# TaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. Canvas Bases is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. TaskNotes Workflows adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions. See Companion Plugins for details. REST API# External applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools. See HTTP API for details."},{"route":"/obsidian/features/calendar-integration/","title":"Calendar Integration","description":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/calendar-integration.md","namespace":"obsidian","relativePath":"features/calendar-integration.md","raw":"# Calendar Integration\n\nTaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.\n\n## OAuth Calendar Integration\n\nTaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider.\n\n### Supported Providers\n\n- **Google Calendar** - OAuth 2.0 authentication with access to all calendars in your Google account\n- **Microsoft Outlook** - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account\n\n### Setup Requirements\n\nOAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to:\n\n1. Create an OAuth application in Google Cloud Console or Microsoft Azure Portal\n2. Configure redirect URIs and scopes\n3. Obtain client ID and client secret\n4. Enter credentials in TaskNotes settings (`Settings -> TaskNotes -> Integrations`, OAuth calendar section)\n\n### Synchronization Behavior\n\n- Events are fetched automatically every 15 minutes\n- Events are also fetched when local changes occur (task creation, updates, rescheduling)\n- Dragging calendar events to new dates/times updates the event in the calendar provider\n- Per-calendar visibility toggles allow selective display of calendars\n- Access tokens are automatically refreshed when expired\n\n### Token Management\n\nTaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' `data.json`. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings.\n\n## Calendar Views\n\nTaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling.\n\nFor detailed view documentation, see [Calendar Views](../views/calendar-views.md).\n\nNotes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in [Integrations settings](../settings/integrations.md#calendar-subscriptions-ics).\n\n## Time Entry Editor\n\nTaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View.\n\n### Creating Time Entries\n\nTo create a time entry on the Calendar View:\n\n1. Click and drag on a time slot in the calendar to select a time range\n2. When the selection menu appears, choose **Create time entry** (timeblock appears only if the feature is enabled)\n3. Choose a task in the task selector modal\n4. A time entry is created for that task with the selected start/end range\n\nTime entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task.\n\n### Managing Time Entries\n\nThe time entry editor modal provides functions to:\n\n- View all time entries for a task\n- Edit the start time, end time, and duration of time entries\n- Delete time entries\n- See the total time tracked across all entries for a task\n\nAccess the time entry editor by clicking an existing time entry in the calendar.\n\n## ICS Calendar Subscriptions\n\nTaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar.\n\nAdd and manage ICS subscriptions from `Settings -> TaskNotes -> Integrations` (Calendar Subscriptions section).\n\nFor details on creating notes and tasks from calendar events, see [ICS Integration](ics-integration.md).\n\n## Time Blocking\n\nThe Calendar View supports time blocking for scheduling dedicated work periods. To create a time block:\n\n1. Click and drag on a time slot in the calendar to select a time range\n2. A context menu will appear with available options\n3. Select \"Create timeblock\" from the menu (this option only appears if timeblocking is enabled in settings)\n\nTime blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes.\n\nEnable time blocking under `Settings -> TaskNotes -> Features` (Timeblocking section).\n","aliases":["/features/calendar-integration/"],"toc":[{"level":2,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"supported-providers","text":"Supported Providers"},{"level":3,"id":"setup-requirements","text":"Setup Requirements"},{"level":3,"id":"synchronization-behavior","text":"Synchronization Behavior"},{"level":3,"id":"token-management","text":"Token Management"},{"level":2,"id":"calendar-views","text":"Calendar Views"},{"level":2,"id":"time-entry-editor","text":"Time Entry Editor"},{"level":3,"id":"creating-time-entries","text":"Creating Time Entries"},{"level":3,"id":"managing-time-entries","text":"Managing Time Entries"},{"level":2,"id":"ics-calendar-subscriptions","text":"ICS Calendar Subscriptions"},{"level":2,"id":"time-blocking","text":"Time Blocking"}],"html":"

TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.

\n

OAuth Calendar Integration#

\n

TaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider.

\n

Supported Providers#

\n
    \n
  • Google Calendar - OAuth 2.0 authentication with access to all calendars in your Google account
  • \n
  • Microsoft Outlook - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account
  • \n
\n

Setup Requirements#

\n

OAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to:

\n
    \n
  1. Create an OAuth application in Google Cloud Console or Microsoft Azure Portal
  2. \n
  3. Configure redirect URIs and scopes
  4. \n
  5. Obtain client ID and client secret
  6. \n
  7. Enter credentials in TaskNotes settings (Settings -> TaskNotes -> Integrations, OAuth calendar section)
  8. \n
\n

Synchronization Behavior#

\n
    \n
  • Events are fetched automatically every 15 minutes
  • \n
  • Events are also fetched when local changes occur (task creation, updates, rescheduling)
  • \n
  • Dragging calendar events to new dates/times updates the event in the calendar provider
  • \n
  • Per-calendar visibility toggles allow selective display of calendars
  • \n
  • Access tokens are automatically refreshed when expired
  • \n
\n

Token Management#

\n

TaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' data.json. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings.

\n

Calendar Views#

\n

TaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling.

\n

For detailed view documentation, see Calendar Views.

\n

Notes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in Integrations settings.

\n

Time Entry Editor#

\n

TaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View.

\n

Creating Time Entries#

\n

To create a time entry on the Calendar View:

\n
    \n
  1. Click and drag on a time slot in the calendar to select a time range
  2. \n
  3. When the selection menu appears, choose Create time entry (timeblock appears only if the feature is enabled)
  4. \n
  5. Choose a task in the task selector modal
  6. \n
  7. A time entry is created for that task with the selected start/end range
  8. \n
\n

Time entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task.

\n

Managing Time Entries#

\n

The time entry editor modal provides functions to:

\n
    \n
  • View all time entries for a task
  • \n
  • Edit the start time, end time, and duration of time entries
  • \n
  • Delete time entries
  • \n
  • See the total time tracked across all entries for a task
  • \n
\n

Access the time entry editor by clicking an existing time entry in the calendar.

\n

ICS Calendar Subscriptions#

\n

TaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar.

\n

Add and manage ICS subscriptions from Settings -> TaskNotes -> Integrations (Calendar Subscriptions section).

\n

For details on creating notes and tasks from calendar events, see ICS Integration.

\n

Time Blocking#

\n

The Calendar View supports time blocking for scheduling dedicated work periods. To create a time block:

\n
    \n
  1. Click and drag on a time slot in the calendar to select a time range
  2. \n
  3. A context menu will appear with available options
  4. \n
  5. Select "Create timeblock" from the menu (this option only appears if timeblocking is enabled in settings)
  6. \n
\n

Time blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes.

\n

Enable time blocking under Settings -> TaskNotes -> Features (Timeblocking section).

\n","text":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions. OAuth Calendar Integration# TaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider. Supported Providers# Google Calendar - OAuth 2.0 authentication with access to all calendars in your Google account Microsoft Outlook - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account Setup Requirements# OAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to: Create an OAuth application in Google Cloud Console or Microsoft Azure Portal Configure redirect URIs and scopes Obtain client ID and client secret Enter credentials in TaskNotes settings (Settings -> TaskNotes -> Integrations, OAuth calendar section) Synchronization Behavior# Events are fetched automatically every 15 minutes Events are also fetched when local changes occur (task creation, updates, rescheduling) Dragging calendar events to new dates/times updates the event in the calendar provider Per-calendar visibility toggles allow selective display of calendars Access tokens are automatically refreshed when expired Token Management# TaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' data.json. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings. Calendar Views# TaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling. For detailed view documentation, see Calendar Views. Notes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in Integrations settings. Time Entry Editor# TaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View. Creating Time Entries# To create a time entry on the Calendar View: Click and drag on a time slot in the calendar to select a time range When the selection menu appears, choose Create time entry (timeblock appears only if the feature is enabled) Choose a task in the task selector modal A time entry is created for that task with the selected start/end range Time entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task. Managing Time Entries# The time entry editor modal provides functions to: View all time entries for a task Edit the start time, end time, and duration of time entries Delete time entries See the total time tracked across all entries for a task Access the time entry editor by clicking an existing time entry in the calendar. ICS Calendar Subscriptions# TaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar. Add and manage ICS subscriptions from Settings -> TaskNotes -> Integrations (Calendar Subscriptions section). For details on creating notes and tasks from calendar events, see ICS Integration. Time Blocking# The Calendar View supports time blocking for scheduling dedicated work periods. To create a time block: Click and drag on a time slot in the calendar to select a time range A context menu will appear with available options Select \"Create timeblock\" from the menu (this option only appears if timeblocking is enabled in settings) Time blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes. Enable time blocking under Settings -> TaskNotes -> Features (Timeblocking section)."},{"route":"/obsidian/features/ics-integration/","title":"ICS Calendar Event Integration","description":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/ics-integration.md","namespace":"obsidian","relativePath":"features/ics-integration.md","raw":"# ICS Calendar Event Integration\n\nTaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries.\nICS integration creates linked notes and tasks from event data without manual re-entry.\n\n## Overview\n\nThe ICS integration allows you to:\n\n- View detailed information about calendar events\n- Create notes from calendar events with customizable templates\n- Generate tasks from events with proper scheduling and context\n- Link existing vault content to calendar events\n- Maintain relationships between events and created content\nEvent context, notes, and follow-up tasks remain connected through frontmatter links.\n\n## Event Information Modal\n\nWhen you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides:\n\n### Event Details\n\n- Event title and description\n- Start and end times (formatted according to your locale)\n- Location information\n- Source calendar name\n- Event URL (if available)\n\n### Related Content\n\nThe modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as:\n\n- **Task** - Files containing the configured task tag\n- **Note** - Files without the task tag\n\nThe relationship is maintained through the ICS Event ID field in the content's frontmatter.\n\n### Available Actions\n\n**Create Note** - Opens a creation dialog for generating a new note from the event data.\n\n**Create Task** - Creates a task immediately using the event information with default settings.\n\n**Link Note** - Opens a file selection dialog to link an existing note to the calendar event.\n\n**Refresh** - Reloads the list of related content to reflect recent changes.\n\n## Note Creation from Events\n\nThe note creation process allows customization of the generated content:\n\n### Basic Settings\n\n- **Title** - Default combines event title and date, but can be modified\n- **Folder** - Destination for the new note (uses default ICS note folder if configured)\n- **Template** - Optional template file to structure the note content\n\n### Template Usage\n\nWhen a template is specified:\n\n- The template file is processed with ICS-specific variables\n- Standard TaskNotes template variables are also available\n- Template content replaces the default event description format\n- Frontmatter from templates is merged with required ICS fields\nTemplates apply a consistent note structure across imported events.\n\n### Default Content\n\nWithout a template, notes include:\n\n- Event title as the main heading\n- Formatted start and end times\n- Location information\n- Source calendar name\n- Event description (if provided)\n- Event URL (if available)\n\n## Task Creation from Events\n\nTasks created from calendar events include relevant event data:\n\n### Scheduled Date and Time\n\nTasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing.\n\n### Task Properties\n\n- **Title** - Uses the event title\n- **Status** - Set to the default task status configured in settings\n- **Priority** - Set to the default task priority\n- **Contexts** - Event location is added as a context (if provided)\n- **Time Estimate** - Calculated from event duration (if start and end times are available)\n- **Tags** - Includes the ICS event tag and any default task tags\nAfter creation, priority, status, and schedule can be edited if event data does not match the final task plan.\n\n### Content\n\nTask content includes formatted event details similar to note creation, providing context about the original calendar event.\n\n## Linking Existing Content\n\nYou can establish connections between existing vault content and calendar events:\n\n### Link Process\n\n1. Select an existing markdown file from your vault\n2. The file's frontmatter is updated to include the event ID\n3. The modification date is updated to reflect the change\n4. The connection appears in the related content list\n\n### Bidirectional References\n\n- Calendar events can display all linked content\n- Content files maintain references to their associated events\n- Multiple pieces of content can be linked to a single event\n- Content can be linked to multiple events (stored as an array)\n\n## Field Mapping Integration\n\nThe ICS integration extends the field mapping system with two new fields:\n\n### ICS Event ID Field\n\n- Stores the unique identifier connecting content to calendar events\n- Default field name is `icsEventId`\n- Values are stored as arrays to support multiple event associations\n- Field name can be customized through field mapping settings\n\n### ICS Event Tag Field\n\n- Tag automatically applied to content created from events\n- Default tag is `ics_event`\n- Used to identify ICS-related content throughout the system\n- Can be customized through field mapping settings\n\n## Template Variables\n\nTemplates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables:\n\n### Event Information\n\n- `{{icsEventTitle}}` - Event title\n- `{{icsEventStart}}` - Start date and time (ISO format)\n- `{{icsEventEnd}}` - End date and time (ISO format)\n- `{{icsEventLocation}}` - Event location\n- `{{icsEventDescription}}` - Event description\n- `{{icsEventUrl}}` - Event URL\n- `{{icsEventSubscription}}` - Calendar subscription name\n- `{{icsEventId}}` - Unique event identifier\n\n### Standard Variables\n\nAll standard TaskNotes template variables remain available:\n- `{{title}}`, `{{date}}`, `{{time}}`\n- `{{priority}}`, `{{status}}`, `{{contexts}}`\n- And others as documented in the template system\n\n## Configuration\n\nICS integration settings are located under `Settings -> TaskNotes -> Integrations`:\n\n### Default Templates\n\nConfigure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified.\n\n### Default Folders\n\nSet destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired.\n\nFolder paths support template variables for dynamic organization:\n\n- Date variables: `{{year}}`, `{{month}}`, `{{day}}`, `{{monthName}}`, etc.\n- ICS event variables: `{{icsEventTitle}}`, `{{icsEventLocation}}`, `{{icsEventDescription}}`\n- Other variables: See template variables section below\n\nExample folder paths:\n\n- `Daily/{{year}}/{{month}}/{{day}}` creates date-based hierarchy\n- `Events/{{year}}/{{icsEventTitle}}` organizes by year and event title\n- `Meetings/{{monthName}}` groups by month name\n\n### Filename Formats\n\nThe system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content.\n\n## Technical Implementation\n\n### Event Identification\n\nCalendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change.\n\n### Content Type Detection\n\nThe system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions.\n\n### Error Handling\n\nThe integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow.\n","aliases":["/features/ics-integration/"],"toc":[{"level":2,"id":"overview","text":"Overview"},{"level":2,"id":"event-information-modal","text":"Event Information Modal"},{"level":3,"id":"event-details","text":"Event Details"},{"level":3,"id":"related-content","text":"Related Content"},{"level":3,"id":"available-actions","text":"Available Actions"},{"level":2,"id":"note-creation-from-events","text":"Note Creation from Events"},{"level":3,"id":"basic-settings","text":"Basic Settings"},{"level":3,"id":"template-usage","text":"Template Usage"},{"level":3,"id":"default-content","text":"Default Content"},{"level":2,"id":"task-creation-from-events","text":"Task Creation from Events"},{"level":3,"id":"scheduled-date-and-time","text":"Scheduled Date and Time"},{"level":3,"id":"task-properties","text":"Task Properties"},{"level":3,"id":"content","text":"Content"},{"level":2,"id":"linking-existing-content","text":"Linking Existing Content"},{"level":3,"id":"link-process","text":"Link Process"},{"level":3,"id":"bidirectional-references","text":"Bidirectional References"},{"level":2,"id":"field-mapping-integration","text":"Field Mapping Integration"},{"level":3,"id":"ics-event-id-field","text":"ICS Event ID Field"},{"level":3,"id":"ics-event-tag-field","text":"ICS Event Tag Field"},{"level":2,"id":"template-variables","text":"Template Variables"},{"level":3,"id":"event-information","text":"Event Information"},{"level":3,"id":"standard-variables","text":"Standard Variables"},{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"default-templates","text":"Default Templates"},{"level":3,"id":"default-folders","text":"Default Folders"},{"level":3,"id":"filename-formats","text":"Filename Formats"},{"level":2,"id":"technical-implementation","text":"Technical Implementation"},{"level":3,"id":"event-identification","text":"Event Identification"},{"level":3,"id":"content-type-detection","text":"Content Type Detection"},{"level":3,"id":"error-handling","text":"Error Handling"}],"html":"

TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries.\nICS integration creates linked notes and tasks from event data without manual re-entry.

\n

Overview#

\n

The ICS integration allows you to:

\n
    \n
  • View detailed information about calendar events
  • \n
  • Create notes from calendar events with customizable templates
  • \n
  • Generate tasks from events with proper scheduling and context
  • \n
  • Link existing vault content to calendar events
  • \n
  • Maintain relationships between events and created content\nEvent context, notes, and follow-up tasks remain connected through frontmatter links.
  • \n
\n

Event Information Modal#

\n

When you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides:

\n

Event Details#

\n
    \n
  • Event title and description
  • \n
  • Start and end times (formatted according to your locale)
  • \n
  • Location information
  • \n
  • Source calendar name
  • \n
  • Event URL (if available)
  • \n
\n

Related Content#

\n

The modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as:

\n
    \n
  • Task - Files containing the configured task tag
  • \n
  • Note - Files without the task tag
  • \n
\n

The relationship is maintained through the ICS Event ID field in the content's frontmatter.

\n

Available Actions#

\n

Create Note - Opens a creation dialog for generating a new note from the event data.

\n

Create Task - Creates a task immediately using the event information with default settings.

\n

Link Note - Opens a file selection dialog to link an existing note to the calendar event.

\n

Refresh - Reloads the list of related content to reflect recent changes.

\n

Note Creation from Events#

\n

The note creation process allows customization of the generated content:

\n

Basic Settings#

\n
    \n
  • Title - Default combines event title and date, but can be modified
  • \n
  • Folder - Destination for the new note (uses default ICS note folder if configured)
  • \n
  • Template - Optional template file to structure the note content
  • \n
\n

Template Usage#

\n

When a template is specified:

\n
    \n
  • The template file is processed with ICS-specific variables
  • \n
  • Standard TaskNotes template variables are also available
  • \n
  • Template content replaces the default event description format
  • \n
  • Frontmatter from templates is merged with required ICS fields\nTemplates apply a consistent note structure across imported events.
  • \n
\n

Default Content#

\n

Without a template, notes include:

\n
    \n
  • Event title as the main heading
  • \n
  • Formatted start and end times
  • \n
  • Location information
  • \n
  • Source calendar name
  • \n
  • Event description (if provided)
  • \n
  • Event URL (if available)
  • \n
\n

Task Creation from Events#

\n

Tasks created from calendar events include relevant event data:

\n

Scheduled Date and Time#

\n

Tasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing.

\n

Task Properties#

\n
    \n
  • Title - Uses the event title
  • \n
  • Status - Set to the default task status configured in settings
  • \n
  • Priority - Set to the default task priority
  • \n
  • Contexts - Event location is added as a context (if provided)
  • \n
  • Time Estimate - Calculated from event duration (if start and end times are available)
  • \n
  • Tags - Includes the ICS event tag and any default task tags\nAfter creation, priority, status, and schedule can be edited if event data does not match the final task plan.
  • \n
\n

Content#

\n

Task content includes formatted event details similar to note creation, providing context about the original calendar event.

\n

Linking Existing Content#

\n

You can establish connections between existing vault content and calendar events:

\n\n
    \n
  1. Select an existing markdown file from your vault
  2. \n
  3. The file's frontmatter is updated to include the event ID
  4. \n
  5. The modification date is updated to reflect the change
  6. \n
  7. The connection appears in the related content list
  8. \n
\n

Bidirectional References#

\n
    \n
  • Calendar events can display all linked content
  • \n
  • Content files maintain references to their associated events
  • \n
  • Multiple pieces of content can be linked to a single event
  • \n
  • Content can be linked to multiple events (stored as an array)
  • \n
\n

Field Mapping Integration#

\n

The ICS integration extends the field mapping system with two new fields:

\n

ICS Event ID Field#

\n
    \n
  • Stores the unique identifier connecting content to calendar events
  • \n
  • Default field name is icsEventId
  • \n
  • Values are stored as arrays to support multiple event associations
  • \n
  • Field name can be customized through field mapping settings
  • \n
\n

ICS Event Tag Field#

\n
    \n
  • Tag automatically applied to content created from events
  • \n
  • Default tag is ics_event
  • \n
  • Used to identify ICS-related content throughout the system
  • \n
  • Can be customized through field mapping settings
  • \n
\n

Template Variables#

\n

Templates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables:

\n

Event Information#

\n
    \n
  • {{icsEventTitle}} - Event title
  • \n
  • {{icsEventStart}} - Start date and time (ISO format)
  • \n
  • {{icsEventEnd}} - End date and time (ISO format)
  • \n
  • {{icsEventLocation}} - Event location
  • \n
  • {{icsEventDescription}} - Event description
  • \n
  • {{icsEventUrl}} - Event URL
  • \n
  • {{icsEventSubscription}} - Calendar subscription name
  • \n
  • {{icsEventId}} - Unique event identifier
  • \n
\n

Standard Variables#

\n

All standard TaskNotes template variables remain available:

\n
    \n
  • {{title}}, {{date}}, {{time}}
  • \n
  • {{priority}}, {{status}}, {{contexts}}
  • \n
  • And others as documented in the template system
  • \n
\n

Configuration#

\n

ICS integration settings are located under Settings -> TaskNotes -> Integrations:

\n

Default Templates#

\n

Configure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified.

\n

Default Folders#

\n

Set destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired.

\n

Folder paths support template variables for dynamic organization:

\n
    \n
  • Date variables: {{year}}, {{month}}, {{day}}, {{monthName}}, etc.
  • \n
  • ICS event variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}}
  • \n
  • Other variables: See template variables section below
  • \n
\n

Example folder paths:

\n
    \n
  • Daily/{{year}}/{{month}}/{{day}} creates date-based hierarchy
  • \n
  • Events/{{year}}/{{icsEventTitle}} organizes by year and event title
  • \n
  • Meetings/{{monthName}} groups by month name
  • \n
\n

Filename Formats#

\n

The system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content.

\n

Technical Implementation#

\n

Event Identification#

\n

Calendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change.

\n

Content Type Detection#

\n

The system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions.

\n

Error Handling#

\n

The integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow.

\n","text":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-entry. Overview# The ICS integration allows you to: View detailed information about calendar events Create notes from calendar events with customizable templates Generate tasks from events with proper scheduling and context Link existing vault content to calendar events Maintain relationships between events and created content Event context, notes, and follow-up tasks remain connected through frontmatter links. Event Information Modal# When you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides: Event Details# Event title and description Start and end times (formatted according to your locale) Location information Source calendar name Event URL (if available) Related Content# The modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as: Task - Files containing the configured task tag Note - Files without the task tag The relationship is maintained through the ICS Event ID field in the content's frontmatter. Available Actions# Create Note - Opens a creation dialog for generating a new note from the event data. Create Task - Creates a task immediately using the event information with default settings. Link Note - Opens a file selection dialog to link an existing note to the calendar event. Refresh - Reloads the list of related content to reflect recent changes. Note Creation from Events# The note creation process allows customization of the generated content: Basic Settings# Title - Default combines event title and date, but can be modified Folder - Destination for the new note (uses default ICS note folder if configured) Template - Optional template file to structure the note content Template Usage# When a template is specified: The template file is processed with ICS-specific variables Standard TaskNotes template variables are also available Template content replaces the default event description format Frontmatter from templates is merged with required ICS fields Templates apply a consistent note structure across imported events. Default Content# Without a template, notes include: Event title as the main heading Formatted start and end times Location information Source calendar name Event description (if provided) Event URL (if available) Task Creation from Events# Tasks created from calendar events include relevant event data: Scheduled Date and Time# Tasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing. Task Properties# Title - Uses the event title Status - Set to the default task status configured in settings Priority - Set to the default task priority Contexts - Event location is added as a context (if provided) Time Estimate - Calculated from event duration (if start and end times are available) Tags - Includes the ICS event tag and any default task tags After creation, priority, status, and schedule can be edited if event data does not match the final task plan. Content# Task content includes formatted event details similar to note creation, providing context about the original calendar event. Linking Existing Content# You can establish connections between existing vault content and calendar events: Link Process# Select an existing markdown file from your vault The file's frontmatter is updated to include the event ID The modification date is updated to reflect the change The connection appears in the related content list Bidirectional References# Calendar events can display all linked content Content files maintain references to their associated events Multiple pieces of content can be linked to a single event Content can be linked to multiple events (stored as an array) Field Mapping Integration# The ICS integration extends the field mapping system with two new fields: ICS Event ID Field# Stores the unique identifier connecting content to calendar events Default field name is icsEventId Values are stored as arrays to support multiple event associations Field name can be customized through field mapping settings ICS Event Tag Field# Tag automatically applied to content created from events Default tag is ics_event Used to identify ICS-related content throughout the system Can be customized through field mapping settings Template Variables# Templates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables: Event Information# {{icsEventTitle}} - Event title {{icsEventStart}} - Start date and time (ISO format) {{icsEventEnd}} - End date and time (ISO format) {{icsEventLocation}} - Event location {{icsEventDescription}} - Event description {{icsEventUrl}} - Event URL {{icsEventSubscription}} - Calendar subscription name {{icsEventId}} - Unique event identifier Standard Variables# All standard TaskNotes template variables remain available: {{title}}, {{date}}, {{time}} {{priority}}, {{status}}, {{contexts}} And others as documented in the template system Configuration# ICS integration settings are located under Settings -> TaskNotes -> Integrations: Default Templates# Configure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified. Default Folders# Set destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired. Folder paths support template variables for dynamic organization: Date variables: {{year}}, {{month}}, {{day}}, {{monthName}}, etc. ICS event variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Other variables: See template variables section below Example folder paths: Daily/{{year}}/{{month}}/{{day}} creates date-based hierarchy Events/{{year}}/{{icsEventTitle}} organizes by year and event title Meetings/{{monthName}} groups by month name Filename Formats# The system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content. Technical Implementation# Event Identification# Calendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change. Content Type Detection# The system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions. Error Handling# The integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow."},{"route":"/obsidian/features/inline-tasks/","title":"Inline Task Integration","description":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes,...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/inline-tasks.md","namespace":"obsidian","relativePath":"features/inline-tasks.md","raw":"# Inline Task Integration\n\n\nTaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing.\nInline features support capture and task updates without leaving the current note.\n\n## Task Link Overlays\n\nWhen a wikilink to a task note is created, TaskNotes can replace it with an interactive **Task Link Overlay**. Enable or disable overlays from `Settings -> TaskNotes -> Features` (`Task link overlay`). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal.\n\n![Task Link Overlays in Live Preview mode](../assets/2025-07-17_21-03-55.png)\n\n*Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions*\n\n![Task Link Overlays in Source mode](../assets/2025-07-17_21-04-24.png)\n\n*In Source mode, task links appear as standard wikilinks until rendered*\n\n### Widget Features\n\nThe task link overlay displays:\n\n- **Status Dot**: Clickable circular indicator showing current task status. Click to cycle through available statuses.\n- **Priority Dot**: Color-coded indicator for task priority (only shown when assigned).\n- **Task Title**: Displays the task name (truncated to 80 characters). Click to open the task edit modal.\n- **Date Information**: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus.\n- **Recurrence Indicator**: Rotating arrow icon for recurring tasks with modification options.\n- **Action Menu**: Ellipsis icon (shown on hover) provides additional task actions.\nThe widget exposes common task actions at the link location, so status and metadata can be updated in-place.\n\n### Mode-Specific Behavior\n\nTask link overlays work in both Live Preview and Reading modes:\n\n- **Live Preview Mode**: Widgets hide when the cursor is within the wikilink range, allowing for easy editing.\n- **Reading Mode**: Widgets display with full functionality and integrate with the reading mode typography.\n\nThe overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file).\n\n## Create New Inline Task Command\n\nThe `Create new inline task` command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette.\n\nWhen the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title.\n\nTo turn the current line into a TaskNote, use `Convert to TaskNote` or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file.\n\n## Instant Task Conversion\n\nThe **Instant Task Conversion** feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from `Settings -> TaskNotes -> Features` (`Show convert button next to checkboxes`). When enabled, a \"convert\" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file.\nThis supports progressive conversion from draft notes to dedicated task files.\n\n### Folder Configuration\n\nBy default, converted tasks are placed in the same folder as the current note (`{{currentNotePath}}`). You can change this behavior in `Settings -> TaskNotes -> General` (`Folder for converted tasks`):\n\n- **Leave empty**: Uses your default tasks folder (configured in the same section)\n- **`{{currentNotePath}}`**: Places tasks in the same folder as the note you're editing (default)\n- **`{{currentNoteTitle}}`**: Creates a subfolder named after the current note\n- **Custom path**: Specify any folder path (e.g., `TaskNotes/Converted`)\n\n### Supported Line Types\n\nThe conversion feature works with:\n\n- **Checkbox tasks**: `- [ ] Task description` becomes a TaskNote with task metadata\n- **Bullet points**: `- Some task idea` becomes a TaskNote with the text as title\n- **Numbered lists**: `1. Important item` becomes a TaskNote\n- **Blockquoted content**: `> Task in callout` becomes a TaskNote (preserves blockquote formatting)\n- **Plain text lines**: `Important thing to do` becomes a TaskNote\n- **Mixed formats**: `> - [ ] Task in blockquote` handles both blockquote and checkbox formatting\n\n### Content Processing\n\nWhen converting lines:\n\n- **Special characters** like `>`, `#`, `-` are automatically removed from the task title\n- **Original formatting** is preserved in the note (e.g., `> [[Task Title]]` for blockquoted content)\n- **Task metadata** is extracted from checkbox tasks (due dates, priorities, etc.)\n- **Natural language processing** can extract dates and metadata from plain text (if enabled)\nConversion preserves surrounding formatting, including callouts, outlines, and nested lists.\n\nThe feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement.\n\n## Bulk Task Conversion\n\nThe **Bulk Task Conversion** command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as \"Convert all tasks in note to TaskNotes\".\n\n### How It Works\n\nThe command:\n\n1. Scans the entire current note for checkbox tasks (`- [ ]`, `* [ ]`, `1. [ ]`, etc.)\n2. Includes tasks inside blockquotes (e.g., `> - [ ] task in callout`)\n3. Applies the same enhanced conversion logic as instant task conversion\n4. Creates individual TaskNote files for each task\n5. Replaces the original checkboxes with links to the new task files\n6. Preserves original indentation and formatting (including blockquote markers)\n\nThe bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note.\n\n### Usage\n\nTo use bulk conversion:\n\n1. Open a note containing checkbox tasks\n2. Access the command palette (`Ctrl+P` / `Cmd+P`)\n3. Search for \"Convert all tasks in note to TaskNotes\"\n4. Execute the command\n\nThe command displays progress and shows a summary when complete (for example, \"Successfully converted 5 tasks to TaskNotes.\").\n\n!!! warning \"Important Considerations\"\n\n **This command modifies note content permanently.** Before using:\n\n - **Create a backup** of your note if it contains important data\n - **Review the tasks** to ensure they should become individual TaskNotes\n - **Expect processing time** - notes with many tasks may take several seconds to process\n - **Avoid interruption** - do not edit the note while conversion is running\n\n!!! note \"Performance\"\n\n Processing time depends on the number of tasks:\n\n - Small notes (1-10 tasks): Near-instant\n - Medium notes (10-50 tasks): 2-5 seconds\n - Large notes (50+ tasks): 10+ seconds\n\n The operation creates multiple files and updates the note content, which requires disk I/O and editor updates.\n\n### Error Handling\n\nIf some tasks fail to convert, the command will:\n\n- Complete successfully converted tasks\n- Display a summary showing both successes and failures\n- Log detailed error information to the console for troubleshooting\n\nFailed conversions typically occur due to:\n\n- Tasks with titles containing invalid filename characters\n- Insufficient disk permissions\n- Very long task titles (over 200 characters)\nFor large notes, converting a small section first helps validate folder and filename settings.\n\n## Relationships Widget\n\n**New in v4**: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface.\n\nThe widget appears in task notes and automatically displays up to five tabs based on available relationship data:\n\n- **Subtasks Tab (Kanban)**: Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management.\n- **Occurrences Tab (List)**: Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date.\n- **Projects Tab (List)**: Shows projects that the current task belongs to. Uses list layout.\n- **Blocked By Tab (List)**: Shows tasks that are blocking the current task. Uses list layout.\n- **Blocking Tab (Kanban)**: Shows tasks that the current task is blocking. Uses Kanban layout.\n\n### Automatic Tab Management\n\nTabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information.\nThe widget layout changes with available data, so simple tasks show fewer sections.\n\n### Features\n\nThe widget embeds the `TaskNotes/Views/relationships.base` view directly in the editor. Every filter, grouping rule, or property shown in that `.base` file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view.\n\nAdditional behavior:\n\n- **Collapsible Interface**: Click the widget title to expand or collapse. The state is remembered between sessions.\n- **Persistent Grouping**: Any grouping defined in the `.base` file is honoured, and collapsed groups retain their state per note.\n- **Task Details**: Each task shows its status, priority, due date, and other configured properties.\n- **Real-time Updates**: The widget updates automatically when tasks are added, modified, or deleted via Bases views.\n\n### Configuration\n\nEnable or disable the widget in `Settings -> TaskNotes -> Appearance` (`Show relationships widget`).\n\nPosition the widget at the top (after frontmatter) or bottom of the note using the **Relationships Position** setting.\n\n### Expandable Subtasks Chevron\n\nTasks with subtasks can display an expand/collapse chevron that toggles subtask visibility.\n\n- The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons).\n- Configure this in `Settings -> TaskNotes -> Appearance` (`Subtask chevron position`).\n\n![Left subtask chevron](../assets/left-task-subtask-chevron.gif)\n\n### Migration from v3\n\nIn v3, TaskNotes provided three separate widgets controlled by individual settings:\n\n- `showProjectSubtasks` and `projectSubtasksPosition`\n- `showTaskDependencies` and `taskDependenciesPosition`\n- `showBlockingTasks` and `blockingTasksPosition`\n\nThese settings are replaced in v4 by:\n\n- `showRelationships` and `relationshipsPosition`\n\nIf you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from `TaskNotes/Views/project-subtasks.base` to `TaskNotes/Views/relationships.base`. Run the **Create files** action in `Settings -> TaskNotes -> General -> Views & base files` if `relationships.base` is missing.\n\n## Natural Language Processing\n\nTaskNotes includes a **Natural Language Processor (NLP)** that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as \"Prepare quarterly report due Friday #work high priority,\" which would automatically set the due date, tag, and priority.\n\nThe NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian.\n\n### Supported Syntax\n\nThe NLP engine recognizes:\n\n- **Tags and Contexts**: `#tag` and `@context` syntax (triggers are customizable).\n- **Projects**: `+project` for simple projects or `+[[Project Name]]` for projects with spaces.\n- **Priority Levels**: Keywords like \"high,\" \"normal,\" and \"low\". Also supports a trigger character (default: `!`).\n- **Status Assignment**: Keywords like \"open,\" \"in-progress,\" and \"done\". Also supports a trigger character (default: `*`).\n- **Dates and Times**: Phrases like \"tomorrow,\" \"next Friday,\" and \"January 15th at 3pm\".\n- **Time Estimates**: Formats like \"2h,\" \"30min,\" and \"1h30m\".\n- **Recurrence Patterns**: Phrases like \"daily,\" \"weekly,\" and \"every Monday\".\n- **User-Defined Fields**: Custom fields can be assigned using configured triggers (e.g., `effort: high`). Supports quoted values for multi-word entries.\nNLP parses common patterns during capture; fields can be refined in the modal afterward.\n\n### Rich Markdown Editor\n\n**New in v4**: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea.\n\nFeatures include:\n\n- **Live Preview**: Rendered markdown preview as you type.\n- **Syntax Highlighting**: Code blocks, links, and formatting are highlighted.\n- **Wikilink Support**: Create links to other notes using `[[Note Name]]` syntax.\n- **Keyboard Shortcuts**:\n - `Ctrl/Cmd+Enter` saves the task\n - `Esc` or `Tab` to navigate out of the editor\n- **Placeholder Text**: Shows an example task (e.g., \"Buy groceries tomorrow at 3pm @home #errands\") when the editor is empty.\n\n### Customizable Triggers\n\n**New in v4**: Triggers for NLP properties can be customized in `Settings -> TaskNotes -> Features` (`NLP Triggers`).\n\nYou can configure trigger characters or strings for:\n\n- **Tags** (default: `#`) - When set to `#`, Obsidian's native tag suggester is used\n- **Contexts** (default: `@`)\n- **Projects** (default: `+`)\n- **Status** (default: `*`)\n- **Priority** (default: `!`, disabled by default)\n- **User-Defined Fields** (default: `fieldname:`) - Each custom field can have its own trigger\n\nTriggers support up to 10 characters and can include trailing spaces (e.g., `\"def: \"` for a custom field).\n\n### Autocomplete\n\n**New in v4**: When typing a trigger in the NLP editor, an autocomplete menu appears with available values.\n\n- Navigate suggestions with arrow keys\n- Select with `Enter` or `Tab`\n- Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields\n- Tag autocomplete uses Obsidian's native tag suggester when using the `#` trigger\n- For user fields with multi-word values, wrap the value in quotes (e.g., `effort: \"very high\"`)\n\nThe NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically.\n","aliases":["/features/inline-tasks/"],"toc":[{"level":2,"id":"task-link-overlays","text":"Task Link Overlays"},{"level":3,"id":"widget-features","text":"Widget Features"},{"level":3,"id":"mode-specific-behavior","text":"Mode-Specific Behavior"},{"level":2,"id":"create-new-inline-task-command","text":"Create New Inline Task Command"},{"level":2,"id":"instant-task-conversion","text":"Instant Task Conversion"},{"level":3,"id":"folder-configuration","text":"Folder Configuration"},{"level":3,"id":"supported-line-types","text":"Supported Line Types"},{"level":3,"id":"content-processing","text":"Content Processing"},{"level":2,"id":"bulk-task-conversion","text":"Bulk Task Conversion"},{"level":3,"id":"how-it-works","text":"How It Works"},{"level":3,"id":"usage","text":"Usage"},{"level":3,"id":"error-handling","text":"Error Handling"},{"level":2,"id":"relationships-widget","text":"Relationships Widget"},{"level":3,"id":"automatic-tab-management","text":"Automatic Tab Management"},{"level":3,"id":"features","text":"Features"},{"level":3,"id":"configuration","text":"Configuration"},{"level":3,"id":"expandable-subtasks-chevron","text":"Expandable Subtasks Chevron"},{"level":3,"id":"migration-from-v3","text":"Migration from v3"},{"level":2,"id":"natural-language-processing","text":"Natural Language Processing"},{"level":3,"id":"supported-syntax","text":"Supported Syntax"},{"level":3,"id":"rich-markdown-editor","text":"Rich Markdown Editor"},{"level":3,"id":"customizable-triggers","text":"Customizable Triggers"},{"level":3,"id":"autocomplete","text":"Autocomplete"}],"html":"

TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing.\nInline features support capture and task updates without leaving the current note.

\n\n

When a wikilink to a task note is created, TaskNotes can replace it with an interactive Task Link Overlay. Enable or disable overlays from Settings -> TaskNotes -> Features (Task link overlay). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal.

\n

\"Task

\n

Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions

\n

\"Task

\n

In Source mode, task links appear as standard wikilinks until rendered

\n

Widget Features#

\n

The task link overlay displays:

\n
    \n
  • Status Dot: Clickable circular indicator showing current task status. Click to cycle through available statuses.
  • \n
  • Priority Dot: Color-coded indicator for task priority (only shown when assigned).
  • \n
  • Task Title: Displays the task name (truncated to 80 characters). Click to open the task edit modal.
  • \n
  • Date Information: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus.
  • \n
  • Recurrence Indicator: Rotating arrow icon for recurring tasks with modification options.
  • \n
  • Action Menu: Ellipsis icon (shown on hover) provides additional task actions.\nThe widget exposes common task actions at the link location, so status and metadata can be updated in-place.
  • \n
\n

Mode-Specific Behavior#

\n

Task link overlays work in both Live Preview and Reading modes:

\n
    \n
  • Live Preview Mode: Widgets hide when the cursor is within the wikilink range, allowing for easy editing.
  • \n
  • Reading Mode: Widgets display with full functionality and integrate with the reading mode typography.
  • \n
\n

The overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file).

\n

Create New Inline Task Command#

\n

The Create new inline task command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette.

\n

When the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title.

\n

To turn the current line into a TaskNote, use Convert to TaskNote or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file.

\n

Instant Task Conversion#

\n

The Instant Task Conversion feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from Settings -> TaskNotes -> Features (Show convert button next to checkboxes). When enabled, a "convert" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file.\nThis supports progressive conversion from draft notes to dedicated task files.

\n

Folder Configuration#

\n

By default, converted tasks are placed in the same folder as the current note ({{currentNotePath}}). You can change this behavior in Settings -> TaskNotes -> General (Folder for converted tasks):

\n
    \n
  • Leave empty: Uses your default tasks folder (configured in the same section)
  • \n
  • {{currentNotePath}}: Places tasks in the same folder as the note you're editing (default)
  • \n
  • {{currentNoteTitle}}: Creates a subfolder named after the current note
  • \n
  • Custom path: Specify any folder path (e.g., TaskNotes/Converted)
  • \n
\n

Supported Line Types#

\n

The conversion feature works with:

\n
    \n
  • Checkbox tasks: - [ ] Task description becomes a TaskNote with task metadata
  • \n
  • Bullet points: - Some task idea becomes a TaskNote with the text as title
  • \n
  • Numbered lists: 1. Important item becomes a TaskNote
  • \n
  • Blockquoted content: > Task in callout becomes a TaskNote (preserves blockquote formatting)
  • \n
  • Plain text lines: Important thing to do becomes a TaskNote
  • \n
  • Mixed formats: > - [ ] Task in blockquote handles both blockquote and checkbox formatting
  • \n
\n

Content Processing#

\n

When converting lines:

\n
    \n
  • Special characters like >, #, - are automatically removed from the task title
  • \n
  • Original formatting is preserved in the note (e.g., > [[Task Title]] for blockquoted content)
  • \n
  • Task metadata is extracted from checkbox tasks (due dates, priorities, etc.)
  • \n
  • Natural language processing can extract dates and metadata from plain text (if enabled)\nConversion preserves surrounding formatting, including callouts, outlines, and nested lists.
  • \n
\n

The feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement.

\n

Bulk Task Conversion#

\n

The Bulk Task Conversion command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as "Convert all tasks in note to TaskNotes".

\n

How It Works#

\n

The command:

\n
    \n
  1. Scans the entire current note for checkbox tasks (- [ ], * [ ], 1. [ ], etc.)
  2. \n
  3. Includes tasks inside blockquotes (e.g., > - [ ] task in callout)
  4. \n
  5. Applies the same enhanced conversion logic as instant task conversion
  6. \n
  7. Creates individual TaskNote files for each task
  8. \n
  9. Replaces the original checkboxes with links to the new task files
  10. \n
  11. Preserves original indentation and formatting (including blockquote markers)
  12. \n
\n

The bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note.

\n

Usage#

\n

To use bulk conversion:

\n
    \n
  1. Open a note containing checkbox tasks
  2. \n
  3. Access the command palette (Ctrl+P / Cmd+P)
  4. \n
  5. Search for "Convert all tasks in note to TaskNotes"
  6. \n
  7. Execute the command
  8. \n
\n

The command displays progress and shows a summary when complete (for example, "Successfully converted 5 tasks to TaskNotes.").

\n\n
**This command modifies note content permanently.** Before using:\n\n- **Create a backup** of your note if it contains important data\n- **Review the tasks** to ensure they should become individual TaskNotes\n- **Expect processing time** - notes with many tasks may take several seconds to process\n- **Avoid interruption** - do not edit the note while conversion is running\n
\n
Processing time depends on the number of tasks:\n\n- Small notes (1-10 tasks): Near-instant\n- Medium notes (10-50 tasks): 2-5 seconds\n- Large notes (50+ tasks): 10+ seconds\n\nThe operation creates multiple files and updates the note content, which requires disk I/O and editor updates.\n

Error Handling#

\n

If some tasks fail to convert, the command will:

\n
    \n
  • Complete successfully converted tasks
  • \n
  • Display a summary showing both successes and failures
  • \n
  • Log detailed error information to the console for troubleshooting
  • \n
\n

Failed conversions typically occur due to:

\n
    \n
  • Tasks with titles containing invalid filename characters
  • \n
  • Insufficient disk permissions
  • \n
  • Very long task titles (over 200 characters)\nFor large notes, converting a small section first helps validate folder and filename settings.
  • \n
\n

Relationships Widget#

\n

New in v4: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface.

\n

The widget appears in task notes and automatically displays up to five tabs based on available relationship data:

\n
    \n
  • Subtasks Tab (Kanban): Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management.
  • \n
  • Occurrences Tab (List): Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date.
  • \n
  • Projects Tab (List): Shows projects that the current task belongs to. Uses list layout.
  • \n
  • Blocked By Tab (List): Shows tasks that are blocking the current task. Uses list layout.
  • \n
  • Blocking Tab (Kanban): Shows tasks that the current task is blocking. Uses Kanban layout.
  • \n
\n

Automatic Tab Management#

\n

Tabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information.\nThe widget layout changes with available data, so simple tasks show fewer sections.

\n

Features#

\n

The widget embeds the TaskNotes/Views/relationships.base view directly in the editor. Every filter, grouping rule, or property shown in that .base file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view.

\n

Additional behavior:

\n
    \n
  • Collapsible Interface: Click the widget title to expand or collapse. The state is remembered between sessions.
  • \n
  • Persistent Grouping: Any grouping defined in the .base file is honoured, and collapsed groups retain their state per note.
  • \n
  • Task Details: Each task shows its status, priority, due date, and other configured properties.
  • \n
  • Real-time Updates: The widget updates automatically when tasks are added, modified, or deleted via Bases views.
  • \n
\n

Configuration#

\n

Enable or disable the widget in Settings -> TaskNotes -> Appearance (Show relationships widget).

\n

Position the widget at the top (after frontmatter) or bottom of the note using the Relationships Position setting.

\n

Expandable Subtasks Chevron#

\n

Tasks with subtasks can display an expand/collapse chevron that toggles subtask visibility.

\n
    \n
  • The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons).
  • \n
  • Configure this in Settings -> TaskNotes -> Appearance (Subtask chevron position).
  • \n
\n

\"Left

\n

Migration from v3#

\n

In v3, TaskNotes provided three separate widgets controlled by individual settings:

\n
    \n
  • showProjectSubtasks and projectSubtasksPosition
  • \n
  • showTaskDependencies and taskDependenciesPosition
  • \n
  • showBlockingTasks and blockingTasksPosition
  • \n
\n

These settings are replaced in v4 by:

\n
    \n
  • showRelationships and relationshipsPosition
  • \n
\n

If you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from TaskNotes/Views/project-subtasks.base to TaskNotes/Views/relationships.base. Run the Create files action in Settings -> TaskNotes -> General -> Views & base files if relationships.base is missing.

\n

Natural Language Processing#

\n

TaskNotes includes a Natural Language Processor (NLP) that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as "Prepare quarterly report due Friday #work high priority," which would automatically set the due date, tag, and priority.

\n

The NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian.

\n

Supported Syntax#

\n

The NLP engine recognizes:

\n
    \n
  • Tags and Contexts: #tag and @context syntax (triggers are customizable).
  • \n
  • Projects: +project for simple projects or +[[Project Name]] for projects with spaces.
  • \n
  • Priority Levels: Keywords like "high," "normal," and "low". Also supports a trigger character (default: !).
  • \n
  • Status Assignment: Keywords like "open," "in-progress," and "done". Also supports a trigger character (default: *).
  • \n
  • Dates and Times: Phrases like "tomorrow," "next Friday," and "January 15th at 3pm".
  • \n
  • Time Estimates: Formats like "2h," "30min," and "1h30m".
  • \n
  • Recurrence Patterns: Phrases like "daily," "weekly," and "every Monday".
  • \n
  • User-Defined Fields: Custom fields can be assigned using configured triggers (e.g., effort: high). Supports quoted values for multi-word entries.\nNLP parses common patterns during capture; fields can be refined in the modal afterward.
  • \n
\n

Rich Markdown Editor#

\n

New in v4: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea.

\n

Features include:

\n
    \n
  • Live Preview: Rendered markdown preview as you type.
  • \n
  • Syntax Highlighting: Code blocks, links, and formatting are highlighted.
  • \n
  • Wikilink Support: Create links to other notes using [[Note Name]] syntax.
  • \n
  • Keyboard Shortcuts:
      \n
    • Ctrl/Cmd+Enter saves the task
    • \n
    • Esc or Tab to navigate out of the editor
    • \n
    \n
  • \n
  • Placeholder Text: Shows an example task (e.g., "Buy groceries tomorrow at 3pm @home #errands") when the editor is empty.
  • \n
\n

Customizable Triggers#

\n

New in v4: Triggers for NLP properties can be customized in Settings -> TaskNotes -> Features (NLP Triggers).

\n

You can configure trigger characters or strings for:

\n
    \n
  • Tags (default: #) - When set to #, Obsidian's native tag suggester is used
  • \n
  • Contexts (default: @)
  • \n
  • Projects (default: +)
  • \n
  • Status (default: *)
  • \n
  • Priority (default: !, disabled by default)
  • \n
  • User-Defined Fields (default: fieldname:) - Each custom field can have its own trigger
  • \n
\n

Triggers support up to 10 characters and can include trailing spaces (e.g., "def: " for a custom field).

\n

Autocomplete#

\n

New in v4: When typing a trigger in the NLP editor, an autocomplete menu appears with available values.

\n
    \n
  • Navigate suggestions with arrow keys
  • \n
  • Select with Enter or Tab
  • \n
  • Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields
  • \n
  • Tag autocomplete uses Obsidian's native tag suggester when using the # trigger
  • \n
  • For user fields with multi-word values, wrap the value in quotes (e.g., effort: "very high")
  • \n
\n

The NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically.

\n","text":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing. Inline features support capture and task updates without leaving the current note. Task Link Overlays# When a wikilink to a task note is created, TaskNotes can replace it with an interactive Task Link Overlay. Enable or disable overlays from Settings -> TaskNotes -> Features (Task link overlay). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal. Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions In Source mode, task links appear as standard wikilinks until rendered Widget Features# The task link overlay displays: Status Dot: Clickable circular indicator showing current task status. Click to cycle through available statuses. Priority Dot: Color-coded indicator for task priority (only shown when assigned). Task Title: Displays the task name (truncated to 80 characters). Click to open the task edit modal. Date Information: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus. Recurrence Indicator: Rotating arrow icon for recurring tasks with modification options. Action Menu: Ellipsis icon (shown on hover) provides additional task actions. The widget exposes common task actions at the link location, so status and metadata can be updated in-place. Mode-Specific Behavior# Task link overlays work in both Live Preview and Reading modes: Live Preview Mode: Widgets hide when the cursor is within the wikilink range, allowing for easy editing. Reading Mode: Widgets display with full functionality and integrate with the reading mode typography. The overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file). Create New Inline Task Command# The Create new inline task command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette. When the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title. To turn the current line into a TaskNote, use Convert to TaskNote or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file. Instant Task Conversion# The Instant Task Conversion feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from Settings -> TaskNotes -> Features (Show convert button next to checkboxes). When enabled, a \"convert\" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file. This supports progressive conversion from draft notes to dedicated task files. Folder Configuration# By default, converted tasks are placed in the same folder as the current note ({{currentNotePath}}). You can change this behavior in Settings -> TaskNotes -> General (Folder for converted tasks): Leave empty: Uses your default tasks folder (configured in the same section) {{currentNotePath}}: Places tasks in the same folder as the note you're editing (default) {{currentNoteTitle}}: Creates a subfolder named after the current note Custom path: Specify any folder path (e.g., TaskNotes/Converted) Supported Line Types# The conversion feature works with: Checkbox tasks: - [ ] Task description becomes a TaskNote with task metadata Bullet points: - Some task idea becomes a TaskNote with the text as title Numbered lists: 1. Important item becomes a TaskNote Blockquoted content: > Task in callout becomes a TaskNote (preserves blockquote formatting) Plain text lines: Important thing to do becomes a TaskNote Mixed formats: > - [ ] Task in blockquote handles both blockquote and checkbox formatting Content Processing# When converting lines: Special characters like >, #, - are automatically removed from the task title Original formatting is preserved in the note (e.g., > [[Task Title]] for blockquoted content) Task metadata is extracted from checkbox tasks (due dates, priorities, etc.) Natural language processing can extract dates and metadata from plain text (if enabled) Conversion preserves surrounding formatting, including callouts, outlines, and nested lists. The feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement. Bulk Task Conversion# The Bulk Task Conversion command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as \"Convert all tasks in note to TaskNotes\". How It Works# The command: Scans the entire current note for checkbox tasks (- [ ], * [ ], 1. [ ], etc.) Includes tasks inside blockquotes (e.g., > - [ ] task in callout) Applies the same enhanced conversion logic as instant task conversion Creates individual TaskNote files for each task Replaces the original checkboxes with links to the new task files Preserves original indentation and formatting (including blockquote markers) The bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note. Usage# To use bulk conversion: Open a note containing checkbox tasks Access the command palette (Ctrl+P / Cmd+P) Search for \"Convert all tasks in note to TaskNotes\" Execute the command The command displays progress and shows a summary when complete (for example, \"Successfully converted 5 tasks to TaskNotes.\"). Important Considerations **This command modifies note content permanently.** Before using: - **Create a backup** of your note if it contains important data - **Review the tasks** to ensure they should become individual TaskNotes - **Expect processing time** - notes with many tasks may take several seconds to process - **Avoid interruption** - do not edit the note while conversion is running Performance Processing time depends on the number of tasks: - Small notes (1-10 tasks): Near-instant - Medium notes (10-50 tasks): 2-5 seconds - Large notes (50+ tasks): 10+ seconds The operation creates multiple files and updates the note content, which requires disk I/O and editor updates. Error Handling# If some tasks fail to convert, the command will: Complete successfully converted tasks Display a summary showing both successes and failures Log detailed error information to the console for troubleshooting Failed conversions typically occur due to: Tasks with titles containing invalid filename characters Insufficient disk permissions Very long task titles (over 200 characters) For large notes, converting a small section first helps validate folder and filename settings. Relationships Widget# New in v4: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface. The widget appears in task notes and automatically displays up to five tabs based on available relationship data: Subtasks Tab (Kanban): Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management. Occurrences Tab (List): Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date. Projects Tab (List): Shows projects that the current task belongs to. Uses list layout. Blocked By Tab (List): Shows tasks that are blocking the current task. Uses list layout. Blocking Tab (Kanban): Shows tasks that the current task is blocking. Uses Kanban layout. Automatic Tab Management# Tabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information. The widget layout changes with available data, so simple tasks show fewer sections. Features# The widget embeds the TaskNotes/Views/relationships.base view directly in the editor. Every filter, grouping rule, or property shown in that .base file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view. Additional behavior: Collapsible Interface: Click the widget title to expand or collapse. The state is remembered between sessions. Persistent Grouping: Any grouping defined in the .base file is honoured, and collapsed groups retain their state per note. Task Details: Each task shows its status, priority, due date, and other configured properties. Real-time Updates: The widget updates automatically when tasks are added, modified, or deleted via Bases views. Configuration# Enable or disable the widget in Settings -> TaskNotes -> Appearance (Show relationships widget). Position the widget at the top (after frontmatter) or bottom of the note using the Relationships Position setting. Expandable Subtasks Chevron# Tasks with subtasks can display an expand/collapse chevron that toggles subtask visibility. The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons). Configure this in Settings -> TaskNotes -> Appearance (Subtask chevron position). Migration from v3# In v3, TaskNotes provided three separate widgets controlled by individual settings: showProjectSubtasks and projectSubtasksPosition showTaskDependencies and taskDependenciesPosition showBlockingTasks and blockingTasksPosition These settings are replaced in v4 by: showRelationships and relationshipsPosition If you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from TaskNotes/Views/project-subtasks.base to TaskNotes/Views/relationships.base. Run the Create files action in Settings -> TaskNotes -> General -> Views & base files if relationships.base is missing. Natural Language Processing# TaskNotes includes a Natural Language Processor (NLP) that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as \"Prepare quarterly report due Friday #work high priority,\" which would automatically set the due date, tag, and priority. The NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian. Supported Syntax# The NLP engine recognizes: Tags and Contexts: #tag and @context syntax (triggers are customizable). Projects: +project for simple projects or +[[Project Name]] for projects with spaces. Priority Levels: Keywords like \"high,\" \"normal,\" and \"low\". Also supports a trigger character (default: !). Status Assignment: Keywords like \"open,\" \"in-progress,\" and \"done\". Also supports a trigger character (default: *). Dates and Times: Phrases like \"tomorrow,\" \"next Friday,\" and \"January 15th at 3pm\". Time Estimates: Formats like \"2h,\" \"30min,\" and \"1h30m\". Recurrence Patterns: Phrases like \"daily,\" \"weekly,\" and \"every Monday\". User-Defined Fields: Custom fields can be assigned using configured triggers (e.g., effort: high). Supports quoted values for multi-word entries. NLP parses common patterns during capture; fields can be refined in the modal afterward. Rich Markdown Editor# New in v4: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea. Features include: Live Preview: Rendered markdown preview as you type. Syntax Highlighting: Code blocks, links, and formatting are highlighted. Wikilink Support: Create links to other notes using [[Note Name]] syntax. Keyboard Shortcuts: Ctrl/Cmd+Enter saves the task Esc or Tab to navigate out of the editor Placeholder Text: Shows an example task (e.g., \"Buy groceries tomorrow at 3pm @home #errands\") when the editor is empty. Customizable Triggers# New in v4: Triggers for NLP properties can be customized in Settings -> TaskNotes -> Features (NLP Triggers). You can configure trigger characters or strings for: Tags (default: #) - When set to #, Obsidian's native tag suggester is used Contexts (default: @) Projects (default: +) Status (default: *) Priority (default: !, disabled by default) User-Defined Fields (default: fieldname:) - Each custom field can have its own trigger Triggers support up to 10 characters and can include trailing spaces (e.g., \"def: \" for a custom field). Autocomplete# New in v4: When typing a trigger in the NLP editor, an autocomplete menu appears with available values. Navigate suggestions with arrow keys Select with Enter or Tab Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields Tag autocomplete uses Obsidian's native tag suggester when using the # trigger For user fields with multi-word values, wrap the value in quotes (e.g., effort: \"very high\") The NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically."},{"route":"/obsidian/features/integrations/","title":"Integrations","description":"TaskNotes integrates with external services and Obsidian's core plugins.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/integrations.md","namespace":"obsidian","relativePath":"features/integrations.md","raw":"# Integrations\n\nTaskNotes integrates with external services and Obsidian's core plugins.\n\n\n## Bases Core Plugin\n\nTaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in `Settings -> Core Plugins`.\n\nFor details on Bases integration, see [Core Concepts](../core-concepts.md#bases-integration).\n\n## External Calendars\n\nTaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions.\n\nFor setup instructions, see [Calendar Integration](calendar-integration.md).\n\n## HTTP API\n\nA REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations.\n\nFor API documentation, see [HTTP API](../HTTP_API.md).\n\n## Webhooks\n\nWebhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats.\n\nFor configuration, see [Webhooks](../webhooks.md).\n\n## Companion Plugins\n\nCompanion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files.\n\nFor the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see [Companion Plugins](../companion-plugins.md).\n","aliases":["/features/integrations/"],"toc":[{"level":2,"id":"bases-core-plugin","text":"Bases Core Plugin"},{"level":2,"id":"external-calendars","text":"External Calendars"},{"level":2,"id":"http-api","text":"HTTP API"},{"level":2,"id":"webhooks","text":"Webhooks"},{"level":2,"id":"companion-plugins","text":"Companion Plugins"}],"html":"

TaskNotes integrates with external services and Obsidian's core plugins.

\n

Bases Core Plugin#

\n

TaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in Settings -> Core Plugins.

\n

For details on Bases integration, see Core Concepts.

\n

External Calendars#

\n

TaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions.

\n

For setup instructions, see Calendar Integration.

\n

HTTP API#

\n

A REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations.

\n

For API documentation, see HTTP API.

\n

Webhooks#

\n

Webhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats.

\n

For configuration, see Webhooks.

\n

Companion Plugins#

\n

Companion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files.

\n

For the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see Companion Plugins.

\n","text":"TaskNotes integrates with external services and Obsidian's core plugins. Bases Core Plugin# TaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in Settings -> Core Plugins. For details on Bases integration, see Core Concepts. External Calendars# TaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions. For setup instructions, see Calendar Integration. HTTP API# A REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations. For API documentation, see HTTP API. Webhooks# Webhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats. For configuration, see Webhooks. Companion Plugins# Companion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files. For the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see Companion Plugins."},{"route":"/obsidian/features/recurring-tasks/","title":"Recurring Tasks","description":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned i...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/recurring-tasks.md","namespace":"obsidian","relativePath":"features/recurring-tasks.md","raw":"# Recurring Tasks\n\n\nTaskNotes recurring tasks use RFC 5545 RRule strings with `DTSTART` support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content.\n\nIf you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the `scheduled` field as the next concrete commitment. Most day-to-day editing affects `scheduled`, while recurrence editing changes the plan itself.\n\n## Core Concepts\n\nRecurring tasks operate on two independent levels:\n\n1. **Recurring Pattern**: Defines when pattern instances appear (controlled by `DTSTART` in the recurrence rule)\n2. **Next Occurrence**: The specific date/time when you plan to work on the next instance (controlled by the `scheduled` field)\n3. **Materialized Occurrence Notes**: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content\n\nThis separation lets you reschedule the next occurrence without changing the pattern.\n\n## Setting Up Recurring Tasks\n\nIn practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance.\n\n### Creating Recurrence Patterns\n\nYou can create recurring tasks through:\n\n1. **Recurrence Context Menu** in task modals for presets or custom options\n2. **Preset Options** such as daily, weekly, or monthly\n3. **Custom Recurrence Modal** with date/time pickers and RRule configuration\n\n### Required Components\n\nRecurring tasks require:\n\n- **Recurrence Rule**: RRule string with `DTSTART`\n- **Scheduled Date**: Next occurrence date (independent from the pattern)\n\nMaterialized occurrence notes add two system fields to the occurrence note:\n\n- `recurrence_parent`: link/path back to the recurring parent task\n- `occurrence_date`: the occurrence date represented by the note\n\n### DTSTART Integration\n\n`DTSTART` is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances.\n\n- **Date-only**: `DTSTART:20250804;FREQ=DAILY`\n- **Date and time**: `DTSTART:20250804T090000Z;FREQ=DAILY`\n\n## Recurring Task Due Date\n\nWhen a recurring task is completed, `scheduled` advances to the next occurrence. By default, `due` does not change.\n\nEnable `Maintain due date offset in recurring tasks` in **Settings → TaskNotes → Features → Recurring Tasks** to preserve due/scheduled spacing.\n\nExample:\n\n- Scheduled: `2025-01-01`\n- Due: `2025-01-03`\n- Recurrence: weekly\n\nIf the task advances to `scheduled: 2025-01-08`, the due date becomes `2025-01-10` when this setting is enabled.\n\nThis setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, \"due two days after execution\"). If due dates are independent deadlines, leaving the setting off is usually clearer.\n\n## Recurrence Pattern Examples\n\n```text\nDTSTART:20250804T090000Z;FREQ=DAILY\n→ Daily at 9:00 AM, starting August 4, 2025\n\nDTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR\n→ Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025\n\nDTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15\n→ 15th of each month (all-day), starting August 15, 2025\n\nDTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1\n→ Last day of each month (all-day), starting August 31, 2025\n\nDTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR\n→ Last Friday of each month at 10:00 AM, starting August 1, 2025\n```\n\n## Dynamic Scheduled Dates\n\nThe `scheduled` field automatically tracks the next uncompleted occurrence:\n\n1. Initially set to the `DTSTART` date\n2. Advances when occurrences are completed\n3. Recalculates when the rule changes\n4. Can be manually rescheduled independently\n\nThis behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities.\n\n## Materialized Occurrence Notes\n\nMost recurring tasks can remain virtual: the parent task stores `complete_instances` and `skipped_instances`, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note.\n\nGood uses include:\n\n- A weekly review where each week needs a separate agenda and notes\n- A maintenance task where each visit needs photos, links, or a checklist\n- A recurring meeting where every occurrence should have its own time entries and completion state\n\nTo create one manually, right-click a recurring task card or calendar occurrence and choose **Open or create occurrence note**. The Task Action Palette also exposes **Open or create occurrence note** for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate.\n\nAn occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time.\n\nIts frontmatter includes:\n\n```yaml\nrecurrence_parent: \"[[Tasks/Weekly review]]\"\noccurrence_date: \"2026-06-01\"\nscheduled: \"2026-06-01T09:30\"\ntimeEstimate: 45\n```\n\nWhen TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at `09:30` creates an occurrence scheduled at `09:30` on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date.\n\nOccurrence notes can use a separate template from regular new tasks. Set `occurrence_template` on the recurring parent to point at a template note, or configure **Settings → Features → Body template → Occurrence note template file** as a global fallback. Parent-level `occurrence_template` wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior.\n\nThe parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's `recurrence`, `complete_instances`, `skipped_instances`, `completedDate`, calendar provider IDs, or `timeEntries`. New time entries belong to the occurrence note once you track time there.\n\n### Occurrence Filenames\n\nBy default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set **Occurrence filename template** under **Settings → Task Properties → Title**. For example, `{{title}} — {{occurrenceDate}}` produces `Weekly review — 2026-08-01.md`.\n\nOccurrence filename templates support all regular filename variables plus these occurrence-specific variables:\n\n- `{{occurrenceDate}}` - occurrence date, such as `2026-08-01`\n- `{{occurrenceWeek}}` - ISO week, such as `2026-W31`\n- `{{occurrenceMonth}}` - month, such as `2026-08`\n- `{{occurrenceYear}}` - year, such as `2026`\n- `{{occurrenceMonthName}}` - full month name, such as `August`\n\nChoose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by **Occurrence template override property** (by default, `occurrenceFilenameTemplate`):\n\n```yaml\noccurrenceFilenameTemplate: \"{{title}} ({{occurrenceWeek}})\"\n```\n\nLeaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix.\n\n### Occurrence Note Policies\n\nEach recurring parent has an **Occurrence notes** submenu under its recurrence menu:\n\n- **Create manually**: occurrence notes are only created by explicit action.\n- **Create next after completion**: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note.\n- **Rolling window**: defined by the TaskNotes spec, but not automated in the plugin yet.\n\nWhen **Create next after completion** is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence.\n\nHTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use `POST /api/tasks/:id/materialize-occurrence` or the MCP `tasknotes_materialize_occurrence` tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the **Create next after completion** policy.\n\nThe same submenu also controls the next-note trigger:\n\n- **Completion only**: create the next occurrence note only when the current occurrence is completed.\n- **Completion or skip**: create the next occurrence note when the current occurrence is completed or skipped.\n\nSkip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent `skipped_instances` list.\n\n### Completion Reconciliation\n\nWhen a materialized occurrence note is completed, TaskNotes updates both sides of the relationship:\n\n- The occurrence note is completed like a normal task.\n- The parent adds the occurrence date to `complete_instances`.\n- The parent removes that date from `skipped_instances` if needed.\n- The parent recalculates `scheduled` to the next uncompleted occurrence.\n- If the parent policy is **Create next after completion**, TaskNotes creates the next occurrence note idempotently.\n\nUncompleting an occurrence note removes the date from the parent's `complete_instances` list, but it does not delete later occurrence notes that were already created.\n\n### Example Behavior\n\n```yaml\n# Initial state\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\"\nscheduled: \"2025-08-04T09:00\"\ncomplete_instances: []\n\n# After completing Aug 4\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\"\nscheduled: \"2025-08-05T09:00\"\ncomplete_instances: [\"2025-08-04\"]\n\n# After manually rescheduling next occurrence\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\"\nscheduled: \"2025-08-05T14:30\"\ncomplete_instances: [\"2025-08-04\"]\n```\n\n## Calendar Drag and Drop\n\nCalendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor.\n\nRecurring tasks can show:\n\n- **Next occurrence** (solid border): dragging updates only `scheduled`\n- **Pattern instances** (dashed border): dragging updates `DTSTART` and future pattern instances\n- **Materialized occurrence notes**: dragging updates the occurrence note's own `scheduled` or `due` date like a normal task, without changing the parent's recurrence rule\n\n![Recurring tasks in calendar week view](../assets/views-calendar-week.png)\n\nMaterialized occurrence notes keep `occurrence_date` as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note.\n\n## Completion Tracking\n\nEach occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar).\n\nCompleted instances are stored in:\n\n```yaml\ncomplete_instances: [\"2025-08-04\", \"2025-08-06\", \"2025-08-08\"]\n```\n\nSkipped instances are stored in:\n\n```yaml\nskipped_instances: [\"2025-08-05\"]\n```\n\nWhen completion changes, `scheduled` updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions.\n\nThis means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks.\n\n## Flexible Scheduling\n\nTaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule.\n\nThe next occurrence can be:\n\n- Before `DTSTART`\n- Outside the pattern day\n- At a different time than pattern instances\n- Far ahead while pattern continues unchanged\n\n### Examples\n\n```yaml\n# Early start before DTSTART\nrecurrence: \"DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO\"\nscheduled: \"2025-08-07T14:00\"\n```\n\n```yaml\n# Off-pattern next occurrence\nrecurrence: \"DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO\"\nscheduled: \"2025-08-06T15:30\"\n```\n\n## Timezone Handling\n\nRecurring task logic uses a UTC anchor approach:\n\n- Pattern generation uses UTC dates\n- `DTSTART` dates are interpreted as UTC anchors\n- Display adapts to local timezone\n- Prevents common off-by-one date issues\n\nIn other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones.\n\n## Backward Compatibility\n\nRecurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites.\n\n- Legacy RRule strings without `DTSTART` continue to work using `scheduled` as anchor\n- Legacy recurrence objects are converted to RRule format\n- Existing tasks continue to function without migration steps\n- Mixed formats are handled transparently\n","aliases":["/features/recurring-tasks/"],"toc":[{"level":2,"id":"core-concepts","text":"Core Concepts"},{"level":2,"id":"setting-up-recurring-tasks","text":"Setting Up Recurring Tasks"},{"level":3,"id":"creating-recurrence-patterns","text":"Creating Recurrence Patterns"},{"level":3,"id":"required-components","text":"Required Components"},{"level":3,"id":"dtstart-integration","text":"DTSTART Integration"},{"level":2,"id":"recurring-task-due-date","text":"Recurring Task Due Date"},{"level":2,"id":"recurrence-pattern-examples","text":"Recurrence Pattern Examples"},{"level":2,"id":"dynamic-scheduled-dates","text":"Dynamic Scheduled Dates"},{"level":2,"id":"materialized-occurrence-notes","text":"Materialized Occurrence Notes"},{"level":3,"id":"occurrence-filenames","text":"Occurrence Filenames"},{"level":3,"id":"occurrence-note-policies","text":"Occurrence Note Policies"},{"level":3,"id":"completion-reconciliation","text":"Completion Reconciliation"},{"level":3,"id":"example-behavior","text":"Example Behavior"},{"level":2,"id":"calendar-drag-and-drop","text":"Calendar Drag and Drop"},{"level":2,"id":"completion-tracking","text":"Completion Tracking"},{"level":2,"id":"flexible-scheduling","text":"Flexible Scheduling"},{"level":3,"id":"examples","text":"Examples"},{"level":2,"id":"timezone-handling","text":"Timezone Handling"},{"level":2,"id":"backward-compatibility","text":"Backward Compatibility"}],"html":"

TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content.

\n

If you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the scheduled field as the next concrete commitment. Most day-to-day editing affects scheduled, while recurrence editing changes the plan itself.

\n

Core Concepts#

\n

Recurring tasks operate on two independent levels:

\n
    \n
  1. Recurring Pattern: Defines when pattern instances appear (controlled by DTSTART in the recurrence rule)
  2. \n
  3. Next Occurrence: The specific date/time when you plan to work on the next instance (controlled by the scheduled field)
  4. \n
  5. Materialized Occurrence Notes: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content
  6. \n
\n

This separation lets you reschedule the next occurrence without changing the pattern.

\n

Setting Up Recurring Tasks#

\n

In practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance.

\n

Creating Recurrence Patterns#

\n

You can create recurring tasks through:

\n
    \n
  1. Recurrence Context Menu in task modals for presets or custom options
  2. \n
  3. Preset Options such as daily, weekly, or monthly
  4. \n
  5. Custom Recurrence Modal with date/time pickers and RRule configuration
  6. \n
\n

Required Components#

\n

Recurring tasks require:

\n
    \n
  • Recurrence Rule: RRule string with DTSTART
  • \n
  • Scheduled Date: Next occurrence date (independent from the pattern)
  • \n
\n

Materialized occurrence notes add two system fields to the occurrence note:

\n
    \n
  • recurrence_parent: link/path back to the recurring parent task
  • \n
  • occurrence_date: the occurrence date represented by the note
  • \n
\n

DTSTART Integration#

\n

DTSTART is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances.

\n
    \n
  • Date-only: DTSTART:20250804;FREQ=DAILY
  • \n
  • Date and time: DTSTART:20250804T090000Z;FREQ=DAILY
  • \n
\n

Recurring Task Due Date#

\n

When a recurring task is completed, scheduled advances to the next occurrence. By default, due does not change.

\n

Enable Maintain due date offset in recurring tasks in Settings → TaskNotes → Features → Recurring Tasks to preserve due/scheduled spacing.

\n

Example:

\n
    \n
  • Scheduled: 2025-01-01
  • \n
  • Due: 2025-01-03
  • \n
  • Recurrence: weekly
  • \n
\n

If the task advances to scheduled: 2025-01-08, the due date becomes 2025-01-10 when this setting is enabled.

\n

This setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, "due two days after execution"). If due dates are independent deadlines, leaving the setting off is usually clearer.

\n

Recurrence Pattern Examples#

\n
DTSTART:20250804T090000Z;FREQ=DAILY\n→ Daily at 9:00 AM, starting August 4, 2025\n\nDTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR\n→ Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025\n\nDTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15\n→ 15th of each month (all-day), starting August 15, 2025\n\nDTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1\n→ Last day of each month (all-day), starting August 31, 2025\n\nDTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR\n→ Last Friday of each month at 10:00 AM, starting August 1, 2025\n

Dynamic Scheduled Dates#

\n

The scheduled field automatically tracks the next uncompleted occurrence:

\n
    \n
  1. Initially set to the DTSTART date
  2. \n
  3. Advances when occurrences are completed
  4. \n
  5. Recalculates when the rule changes
  6. \n
  7. Can be manually rescheduled independently
  8. \n
\n

This behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities.

\n

Materialized Occurrence Notes#

\n

Most recurring tasks can remain virtual: the parent task stores complete_instances and skipped_instances, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note.

\n

Good uses include:

\n
    \n
  • A weekly review where each week needs a separate agenda and notes
  • \n
  • A maintenance task where each visit needs photos, links, or a checklist
  • \n
  • A recurring meeting where every occurrence should have its own time entries and completion state
  • \n
\n

To create one manually, right-click a recurring task card or calendar occurrence and choose Open or create occurrence note. The Task Action Palette also exposes Open or create occurrence note for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate.

\n

An occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time.

\n

Its frontmatter includes:

\n
recurrence_parent: "[[Tasks/Weekly review]]"\noccurrence_date: "2026-06-01"\nscheduled: "2026-06-01T09:30"\ntimeEstimate: 45\n

When TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at 09:30 creates an occurrence scheduled at 09:30 on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date.

\n

Occurrence notes can use a separate template from regular new tasks. Set occurrence_template on the recurring parent to point at a template note, or configure Settings → Features → Body template → Occurrence note template file as a global fallback. Parent-level occurrence_template wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior.

\n

The parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's recurrence, complete_instances, skipped_instances, completedDate, calendar provider IDs, or timeEntries. New time entries belong to the occurrence note once you track time there.

\n

Occurrence Filenames#

\n

By default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set Occurrence filename template under Settings → Task Properties → Title. For example, {{title}} — {{occurrenceDate}} produces Weekly review — 2026-08-01.md.

\n

Occurrence filename templates support all regular filename variables plus these occurrence-specific variables:

\n
    \n
  • {{occurrenceDate}} - occurrence date, such as 2026-08-01
  • \n
  • {{occurrenceWeek}} - ISO week, such as 2026-W31
  • \n
  • {{occurrenceMonth}} - month, such as 2026-08
  • \n
  • {{occurrenceYear}} - year, such as 2026
  • \n
  • {{occurrenceMonthName}} - full month name, such as August
  • \n
\n

Choose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by Occurrence template override property (by default, occurrenceFilenameTemplate):

\n
occurrenceFilenameTemplate: "{{title}} ({{occurrenceWeek}})"\n

Leaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix.

\n

Occurrence Note Policies#

\n

Each recurring parent has an Occurrence notes submenu under its recurrence menu:

\n
    \n
  • Create manually: occurrence notes are only created by explicit action.
  • \n
  • Create next after completion: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note.
  • \n
  • Rolling window: defined by the TaskNotes spec, but not automated in the plugin yet.
  • \n
\n

When Create next after completion is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence.

\n

HTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use POST /api/tasks/:id/materialize-occurrence or the MCP tasknotes_materialize_occurrence tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the Create next after completion policy.

\n

The same submenu also controls the next-note trigger:

\n
    \n
  • Completion only: create the next occurrence note only when the current occurrence is completed.
  • \n
  • Completion or skip: create the next occurrence note when the current occurrence is completed or skipped.
  • \n
\n

Skip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent skipped_instances list.

\n

Completion Reconciliation#

\n

When a materialized occurrence note is completed, TaskNotes updates both sides of the relationship:

\n
    \n
  • The occurrence note is completed like a normal task.
  • \n
  • The parent adds the occurrence date to complete_instances.
  • \n
  • The parent removes that date from skipped_instances if needed.
  • \n
  • The parent recalculates scheduled to the next uncompleted occurrence.
  • \n
  • If the parent policy is Create next after completion, TaskNotes creates the next occurrence note idempotently.
  • \n
\n

Uncompleting an occurrence note removes the date from the parent's complete_instances list, but it does not delete later occurrence notes that were already created.

\n

Example Behavior#

\n
# Initial state\nrecurrence: "DTSTART:20250804T090000Z;FREQ=DAILY"\nscheduled: "2025-08-04T09:00"\ncomplete_instances: []\n\n# After completing Aug 4\nrecurrence: "DTSTART:20250804T090000Z;FREQ=DAILY"\nscheduled: "2025-08-05T09:00"\ncomplete_instances: ["2025-08-04"]\n\n# After manually rescheduling next occurrence\nrecurrence: "DTSTART:20250804T090000Z;FREQ=DAILY"\nscheduled: "2025-08-05T14:30"\ncomplete_instances: ["2025-08-04"]\n

Calendar Drag and Drop#

\n

Calendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor.

\n

Recurring tasks can show:

\n
    \n
  • Next occurrence (solid border): dragging updates only scheduled
  • \n
  • Pattern instances (dashed border): dragging updates DTSTART and future pattern instances
  • \n
  • Materialized occurrence notes: dragging updates the occurrence note's own scheduled or due date like a normal task, without changing the parent's recurrence rule
  • \n
\n

\"Recurring

\n

Materialized occurrence notes keep occurrence_date as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note.

\n

Completion Tracking#

\n

Each occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar).

\n

Completed instances are stored in:

\n
complete_instances: ["2025-08-04", "2025-08-06", "2025-08-08"]\n

Skipped instances are stored in:

\n
skipped_instances: ["2025-08-05"]\n

When completion changes, scheduled updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions.

\n

This means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks.

\n

Flexible Scheduling#

\n

TaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule.

\n

The next occurrence can be:

\n
    \n
  • Before DTSTART
  • \n
  • Outside the pattern day
  • \n
  • At a different time than pattern instances
  • \n
  • Far ahead while pattern continues unchanged
  • \n
\n

Examples#

\n
# Early start before DTSTART\nrecurrence: "DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO"\nscheduled: "2025-08-07T14:00"\n
# Off-pattern next occurrence\nrecurrence: "DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO"\nscheduled: "2025-08-06T15:30"\n

Timezone Handling#

\n

Recurring task logic uses a UTC anchor approach:

\n
    \n
  • Pattern generation uses UTC dates
  • \n
  • DTSTART dates are interpreted as UTC anchors
  • \n
  • Display adapts to local timezone
  • \n
  • Prevents common off-by-one date issues
  • \n
\n

In other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones.

\n

Backward Compatibility#

\n

Recurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites.

\n
    \n
  • Legacy RRule strings without DTSTART continue to work using scheduled as anchor
  • \n
  • Legacy recurrence objects are converted to RRule format
  • \n
  • Existing tasks continue to function without migration steps
  • \n
  • Mixed formats are handled transparently
  • \n
\n","text":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content. If you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the scheduled field as the next concrete commitment. Most day-to-day editing affects scheduled, while recurrence editing changes the plan itself. Core Concepts# Recurring tasks operate on two independent levels: Recurring Pattern: Defines when pattern instances appear (controlled by DTSTART in the recurrence rule) Next Occurrence: The specific date/time when you plan to work on the next instance (controlled by the scheduled field) Materialized Occurrence Notes: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content This separation lets you reschedule the next occurrence without changing the pattern. Setting Up Recurring Tasks# In practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance. Creating Recurrence Patterns# You can create recurring tasks through: Recurrence Context Menu in task modals for presets or custom options Preset Options such as daily, weekly, or monthly Custom Recurrence Modal with date/time pickers and RRule configuration Required Components# Recurring tasks require: Recurrence Rule: RRule string with DTSTART Scheduled Date: Next occurrence date (independent from the pattern) Materialized occurrence notes add two system fields to the occurrence note: recurrence_parent: link/path back to the recurring parent task occurrence_date: the occurrence date represented by the note DTSTART Integration# DTSTART is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances. Date-only: DTSTART:20250804;FREQ=DAILY Date and time: DTSTART:20250804T090000Z;FREQ=DAILY Recurring Task Due Date# When a recurring task is completed, scheduled advances to the next occurrence. By default, due does not change. Enable Maintain due date offset in recurring tasks in Settings → TaskNotes → Features → Recurring Tasks to preserve due/scheduled spacing. Example: Scheduled: 2025-01-01 Due: 2025-01-03 Recurrence: weekly If the task advances to scheduled: 2025-01-08, the due date becomes 2025-01-10 when this setting is enabled. This setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, \"due two days after execution\"). If due dates are independent deadlines, leaving the setting off is usually clearer. Recurrence Pattern Examples# DTSTART:20250804T090000Z;FREQ=DAILY → Daily at 9:00 AM, starting August 4, 2025 DTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR → Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025 DTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15 → 15th of each month (all-day), starting August 15, 2025 DTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1 → Last day of each month (all-day), starting August 31, 2025 DTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR → Last Friday of each month at 10:00 AM, starting August 1, 2025 Dynamic Scheduled Dates# The scheduled field automatically tracks the next uncompleted occurrence: Initially set to the DTSTART date Advances when occurrences are completed Recalculates when the rule changes Can be manually rescheduled independently This behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities. Materialized Occurrence Notes# Most recurring tasks can remain virtual: the parent task stores complete_instances and skipped_instances, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note. Good uses include: A weekly review where each week needs a separate agenda and notes A maintenance task where each visit needs photos, links, or a checklist A recurring meeting where every occurrence should have its own time entries and completion state To create one manually, right-click a recurring task card or calendar occurrence and choose Open or create occurrence note. The Task Action Palette also exposes Open or create occurrence note for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate. An occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time. Its frontmatter includes: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date: \"2026-06-01\" scheduled: \"2026-06-01T09:30\" timeEstimate: 45 When TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at 09:30 creates an occurrence scheduled at 09:30 on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date. Occurrence notes can use a separate template from regular new tasks. Set occurrence_template on the recurring parent to point at a template note, or configure Settings → Features → Body template → Occurrence note template file as a global fallback. Parent-level occurrence_template wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior. The parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's recurrence, complete_instances, skipped_instances, completedDate, calendar provider IDs, or timeEntries. New time entries belong to the occurrence note once you track time there. Occurrence Filenames# By default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set Occurrence filename template under Settings → Task Properties → Title. For example, {{title}} — {{occurrenceDate}} produces Weekly review — 2026-08-01.md. Occurrence filename templates support all regular filename variables plus these occurrence-specific variables: {{occurrenceDate}} - occurrence date, such as 2026-08-01 {{occurrenceWeek}} - ISO week, such as 2026-W31 {{occurrenceMonth}} - month, such as 2026-08 {{occurrenceYear}} - year, such as 2026 {{occurrenceMonthName}} - full month name, such as August Choose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by Occurrence template override property (by default, occurrenceFilenameTemplate): occurrenceFilenameTemplate: \"{{title}} ({{occurrenceWeek}})\" Leaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix. Occurrence Note Policies# Each recurring parent has an Occurrence notes submenu under its recurrence menu: Create manually: occurrence notes are only created by explicit action. Create next after completion: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note. Rolling window: defined by the TaskNotes spec, but not automated in the plugin yet. When Create next after completion is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence. HTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use POST /api/tasks/:id/materialize-occurrence or the MCP tasknotes_materialize_occurrence tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the Create next after completion policy. The same submenu also controls the next-note trigger: Completion only: create the next occurrence note only when the current occurrence is completed. Completion or skip: create the next occurrence note when the current occurrence is completed or skipped. Skip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent skipped_instances list. Completion Reconciliation# When a materialized occurrence note is completed, TaskNotes updates both sides of the relationship: The occurrence note is completed like a normal task. The parent adds the occurrence date to complete_instances. The parent removes that date from skipped_instances if needed. The parent recalculates scheduled to the next uncompleted occurrence. If the parent policy is Create next after completion, TaskNotes creates the next occurrence note idempotently. Uncompleting an occurrence note removes the date from the parent's complete_instances list, but it does not delete later occurrence notes that were already created. Example Behavior# # Initial state recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-04T09:00\" complete_instances: [] # After completing Aug 4 recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T09:00\" complete_instances: [\"2025-08-04\"] # After manually rescheduling next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T14:30\" complete_instances: [\"2025-08-04\"] Calendar Drag and Drop# Calendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor. Recurring tasks can show: Next occurrence (solid border): dragging updates only scheduled Pattern instances (dashed border): dragging updates DTSTART and future pattern instances Materialized occurrence notes: dragging updates the occurrence note's own scheduled or due date like a normal task, without changing the parent's recurrence rule Materialized occurrence notes keep occurrence_date as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note. Completion Tracking# Each occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar). Completed instances are stored in: complete_instances: [\"2025-08-04\", \"2025-08-06\", \"2025-08-08\"] Skipped instances are stored in: skipped_instances: [\"2025-08-05\"] When completion changes, scheduled updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions. This means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks. Flexible Scheduling# TaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule. The next occurrence can be: Before DTSTART Outside the pattern day At a different time than pattern instances Far ahead while pattern continues unchanged Examples# # Early start before DTSTART recurrence: \"DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-07T14:00\" # Off-pattern next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-06T15:30\" Timezone Handling# Recurring task logic uses a UTC anchor approach: Pattern generation uses UTC dates DTSTART dates are interpreted as UTC anchors Display adapts to local timezone Prevents common off-by-one date issues In other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones. Backward Compatibility# Recurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites. Legacy RRule strings without DTSTART continue to work using scheduled as anchor Legacy recurrence objects are converted to RRule format Existing tasks continue to function without migration steps Mixed formats are handled transparently"},{"route":"/obsidian/features/reminders/","title":"Task Reminders","description":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/reminders.md","namespace":"obsidian","relativePath":"features/reminders.md","raw":"# Task Reminders\n\n\nTaskNotes reminders use iCalendar `VALARM` semantics and support both relative and absolute reminder types.\n\nThe reminders system is designed to support both habit-like workflows (\"always remind me 15 minutes before\") and one-off commitments (\"alert me exactly at this date and time\"). Most users mix both styles depending on the task.\n\n## Reminder Types\n\n### Relative Reminders\n\nRelative reminders trigger from `due` or `scheduled` dates.\n\nUse relative reminders when you want reminder behavior to stay consistent even when task dates change.\n\nExamples:\n\n- 15 minutes before due date\n- 1 hour before scheduled date\n- 2 days before due date\n- 30 minutes after scheduled date\n\n### Absolute Reminders\n\nAbsolute reminders trigger at a fixed date/time.\n\nUse absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling.\n\nExamples:\n\n- October 26, 2025 at 9:00 AM\n- Tomorrow at 2:30 PM\n- Next Monday at 10:00 AM\n\n## Adding Reminders\n\nYou can add reminders from:\n\n1. **Task Creation Modal**\n2. **Task Edit Modal**\n3. **Task Cards** (bell icon)\n4. **Reminder field context menu**\n\nFrom a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task.\n\n![Task edit modal](../assets/feature-task-modal-edit.png)\n\n### Quick Reminder Options\n\nCommon shortcuts are available for both due and scheduled anchors, such as:\n\n- 5 minutes before\n- 15 minutes before\n- 1 hour before\n- 1 day before\n\nQuick options appear only when the anchor date exists.\n\nThis prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately.\n\n![Task context menu](../assets/feature-task-context-menu.png)\n\n## Reminder Data Format\n\nReminders are stored in YAML frontmatter arrays.\n\nBecause reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML.\n\n### Relative Structure\n\n```yaml\nreminders:\n - id: \"rem_1678886400000_abc123xyz\"\n type: \"relative\"\n relatedTo: \"due\"\n offset: \"-PT15M\"\n description: \"Review task details\"\n```\n\n### Absolute Structure\n\n```yaml\nreminders:\n - id: \"rem_1678886400001_def456uvw\"\n type: \"absolute\"\n absoluteTime: \"2025-10-26T09:00:00\"\n description: \"Follow up with client\"\n```\n\nField meanings:\n\n- `id`: unique identifier\n- `type`: `relative` or `absolute`\n- `relatedTo`: `due` or `scheduled` (relative only)\n- `offset`: ISO 8601 duration, negative before and positive after (relative only)\n- `absoluteTime`: ISO 8601 timestamp (absolute only)\n- `description`: optional message\n\nYou typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data.\n\n## Visual Indicators\n\nTasks with reminders show a bell icon on task cards.\n\n- Solid bell indicates active reminders\n- Clicking opens quick reminder actions\n- Reminder UI shows task context (due/scheduled dates and reminder count)\n\nThese indicators are intended to make reminders discoverable in list-heavy views without opening every task.\n\n## Default Reminders\n\nDefault reminders can be configured in:\n\n`Settings -> TaskNotes -> Task Properties -> Reminders`\n\nDefaults are applied to:\n\n- Manual task creation\n- Instant conversion\n- Natural language task creation\n\nDefault reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts.\n\n![Task properties settings](../assets/settings-task-properties.png)\n\n## Technical Notes\n\n- Reminders follow iCalendar `VALARM` concepts with ISO 8601 offsets\n- The reminder property name can be customized through field mapping\n\nFor settings-level behavior (notification channels, enable/disable state), see [Features Settings](../settings/features.md).\n","aliases":["/features/reminders/"],"toc":[{"level":2,"id":"reminder-types","text":"Reminder Types"},{"level":3,"id":"relative-reminders","text":"Relative Reminders"},{"level":3,"id":"absolute-reminders","text":"Absolute Reminders"},{"level":2,"id":"adding-reminders","text":"Adding Reminders"},{"level":3,"id":"quick-reminder-options","text":"Quick Reminder Options"},{"level":2,"id":"reminder-data-format","text":"Reminder Data Format"},{"level":3,"id":"relative-structure","text":"Relative Structure"},{"level":3,"id":"absolute-structure","text":"Absolute Structure"},{"level":2,"id":"visual-indicators","text":"Visual Indicators"},{"level":2,"id":"default-reminders","text":"Default Reminders"},{"level":2,"id":"technical-notes","text":"Technical Notes"}],"html":"

TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types.

\n

The reminders system is designed to support both habit-like workflows ("always remind me 15 minutes before") and one-off commitments ("alert me exactly at this date and time"). Most users mix both styles depending on the task.

\n

Reminder Types#

\n

Relative Reminders#

\n

Relative reminders trigger from due or scheduled dates.

\n

Use relative reminders when you want reminder behavior to stay consistent even when task dates change.

\n

Examples:

\n
    \n
  • 15 minutes before due date
  • \n
  • 1 hour before scheduled date
  • \n
  • 2 days before due date
  • \n
  • 30 minutes after scheduled date
  • \n
\n

Absolute Reminders#

\n

Absolute reminders trigger at a fixed date/time.

\n

Use absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling.

\n

Examples:

\n
    \n
  • October 26, 2025 at 9:00 AM
  • \n
  • Tomorrow at 2:30 PM
  • \n
  • Next Monday at 10:00 AM
  • \n
\n

Adding Reminders#

\n

You can add reminders from:

\n
    \n
  1. Task Creation Modal
  2. \n
  3. Task Edit Modal
  4. \n
  5. Task Cards (bell icon)
  6. \n
  7. Reminder field context menu
  8. \n
\n

From a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task.

\n

\"Task

\n

Quick Reminder Options#

\n

Common shortcuts are available for both due and scheduled anchors, such as:

\n
    \n
  • 5 minutes before
  • \n
  • 15 minutes before
  • \n
  • 1 hour before
  • \n
  • 1 day before
  • \n
\n

Quick options appear only when the anchor date exists.

\n

This prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately.

\n

\"Task

\n

Reminder Data Format#

\n

Reminders are stored in YAML frontmatter arrays.

\n

Because reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML.

\n

Relative Structure#

\n
reminders:\n  - id: "rem_1678886400000_abc123xyz"\n    type: "relative"\n    relatedTo: "due"\n    offset: "-PT15M"\n    description: "Review task details"\n

Absolute Structure#

\n
reminders:\n  - id: "rem_1678886400001_def456uvw"\n    type: "absolute"\n    absoluteTime: "2025-10-26T09:00:00"\n    description: "Follow up with client"\n

Field meanings:

\n
    \n
  • id: unique identifier
  • \n
  • type: relative or absolute
  • \n
  • relatedTo: due or scheduled (relative only)
  • \n
  • offset: ISO 8601 duration, negative before and positive after (relative only)
  • \n
  • absoluteTime: ISO 8601 timestamp (absolute only)
  • \n
  • description: optional message
  • \n
\n

You typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data.

\n

Visual Indicators#

\n

Tasks with reminders show a bell icon on task cards.

\n
    \n
  • Solid bell indicates active reminders
  • \n
  • Clicking opens quick reminder actions
  • \n
  • Reminder UI shows task context (due/scheduled dates and reminder count)
  • \n
\n

These indicators are intended to make reminders discoverable in list-heavy views without opening every task.

\n

Default Reminders#

\n

Default reminders can be configured in:

\n

Settings -> TaskNotes -> Task Properties -> Reminders

\n

Defaults are applied to:

\n
    \n
  • Manual task creation
  • \n
  • Instant conversion
  • \n
  • Natural language task creation
  • \n
\n

Default reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts.

\n

\"Task

\n

Technical Notes#

\n
    \n
  • Reminders follow iCalendar VALARM concepts with ISO 8601 offsets
  • \n
  • The reminder property name can be customized through field mapping
  • \n
\n

For settings-level behavior (notification channels, enable/disable state), see Features Settings.

\n","text":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types. The reminders system is designed to support both habit-like workflows (\"always remind me 15 minutes before\") and one-off commitments (\"alert me exactly at this date and time\"). Most users mix both styles depending on the task. Reminder Types# Relative Reminders# Relative reminders trigger from due or scheduled dates. Use relative reminders when you want reminder behavior to stay consistent even when task dates change. Examples: 15 minutes before due date 1 hour before scheduled date 2 days before due date 30 minutes after scheduled date Absolute Reminders# Absolute reminders trigger at a fixed date/time. Use absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling. Examples: October 26, 2025 at 9:00 AM Tomorrow at 2:30 PM Next Monday at 10:00 AM Adding Reminders# You can add reminders from: Task Creation Modal Task Edit Modal Task Cards (bell icon) Reminder field context menu From a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task. Quick Reminder Options# Common shortcuts are available for both due and scheduled anchors, such as: 5 minutes before 15 minutes before 1 hour before 1 day before Quick options appear only when the anchor date exists. This prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately. Reminder Data Format# Reminders are stored in YAML frontmatter arrays. Because reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML. Relative Structure# reminders: - id: \"rem_1678886400000_abc123xyz\" type: \"relative\" relatedTo: \"due\" offset: \"-PT15M\" description: \"Review task details\" Absolute Structure# reminders: - id: \"rem_1678886400001_def456uvw\" type: \"absolute\" absoluteTime: \"2025-10-26T09:00:00\" description: \"Follow up with client\" Field meanings: id: unique identifier type: relative or absolute relatedTo: due or scheduled (relative only) offset: ISO 8601 duration, negative before and positive after (relative only) absoluteTime: ISO 8601 timestamp (absolute only) description: optional message You typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data. Visual Indicators# Tasks with reminders show a bell icon on task cards. Solid bell indicates active reminders Clicking opens quick reminder actions Reminder UI shows task context (due/scheduled dates and reminder count) These indicators are intended to make reminders discoverable in list-heavy views without opening every task. Default Reminders# Default reminders can be configured in: Settings -> TaskNotes -> Task Properties -> Reminders Defaults are applied to: Manual task creation Instant conversion Natural language task creation Default reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts. Technical Notes# Reminders follow iCalendar VALARM concepts with ISO 8601 offsets The reminder property name can be customized through field mapping For settings-level behavior (notification channels, enable/disable state), see Features Settings."},{"route":"/obsidian/features/task-management/","title":"Task Management","description":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/task-management.md","namespace":"obsidian","relativePath":"features/task-management.md","raw":"# Task Management\n\n\nThis page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see [Core Concepts](../core-concepts.md).\n\nUse this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end.\n\n## Creating and Editing Tasks\n\nYou can create and edit tasks in a variety of ways. The primary method is through the **Task Creation Modal**, which can be accessed via the \"Create new task\" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates.\n\n![Task creation modal](../assets/feature-task-modal-filled.png)\n\nTaskNotes keeps a storage title and a filename-safe title separate. When **Store title in filename** is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter.\n\nFor existing tasks, the **Quick actions for current task** command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month.\n\nTaskNotes also supports **Natural Language Creation**, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like \"Buy groceries tomorrow at 3pm @home #errands high priority.\"\n\nIn most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed.\n\n### Auto-Suggestions in Natural Language Input\n\nThe natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters:\n\n- **@** - Shows available contexts from existing tasks\n- **#** - Shows available tags from existing tasks\n- **+** - Shows files from your vault as project suggestions\n- **\\*** - Shows available status options (configurable trigger in Settings → Features)\n\nIn task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character.\n\n#### Project Suggestions\n\nWhen typing `+` in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files:\n\n```\nproject-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha]\nmeeting-notes [title: Weekly Team Meeting Notes]\nsimple-project\nwork-file [aliases: work, office-tasks]\n```\n\nProject suggestions search across:\n- File names (basename without extension)\n- Frontmatter titles (using your configured field mapping)\n- Frontmatter aliases\n- Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest\n\nSelecting a project suggestion inserts it as `+[[filename]]`, creating a wikilink to the file while maintaining the `+` project marker that the natural language parser recognizes.\n\n\n#### Enhanced Project Auto‑suggester (configurable cards)\n\nProject suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest.\n\n- Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key\n- Flags:\n - n or n(Label) → show the field name/label before the value\n - s → include this field in + search (in addition to defaults)\n- Literals: you can mix in fixed text or emojis between tokens\n\nExamples\n\n- \"{title|n(Title)}\" → Title: Alpha Project\n- \"🔖 {aliases|n(Aliases)}\" → 🔖 Aliases: alpha, proj-alpha\n- \"{file.path|n(Path)|s}\" → include path in + search as well as display it\n\nSearch behavior\n\n- Defaults: + search always includes file basename, title (via your field mapping), and aliases\n- |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer)\n- Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches\n\nPerformance tips\n\n- Keep rows to three or fewer for clarity and performance (the UI supports up to 3)\n- Prefer specific searchable fields with |s on large vaults\n\nDemo\n\n![Autosuggest projects with spaces](../assets/autosuggest_project_names_with_space.gif)\n\n![Enhanced project autosuggester](../assets/enhanced-project-auto-suggester.gif)\n\n\n#### Status Suggestions\n\nWhen typing the status trigger character (default `*`) in the natural language input, you'll see suggestions for all configured status options:\n\n![Status Auto-Suggestion](../assets/auto-suggest-status.gif)\n\nStatus suggestions allow quick selection of statuses when creating tasks. For example, typing `*in` shows \"In Progress\" as a suggestion if that's one of your configured statuses.\n\nClicking a task card's status indicator cycles through statuses in the order configured under **Settings → Task Properties → Status**. A status can optionally define a specific **Next status** for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked **Skip when cycling** are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps.\n\nAdditionally, you can convert any line type in your notes to TaskNotes using the **Instant Conversion** feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines.\n\n## Task Properties\n\nTasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure.\n\nThis frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets.\n\nFor property types and examples, see [Core Concepts](../core-concepts.md#yaml-frontmatter). For configuration options, see [Task Properties Settings](../settings/task-properties.md).\n\n## Projects\n\nTaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management.\n\nThis model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling.\n\n### Project Assignment\n\nTasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the \"Add Project\" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault.\n\n### Project Links\n\nProjects are stored as wikilinks in the task's frontmatter (e.g., `projects: [\"[[Project A]]\", \"[[Project B]]\"]`). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field.\n\n### Organization and Filtering\n\nTasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add `note.projects` conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization.\n\n### Project Indicators\n\nTaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance.\n\n### Subtask Creation\n\nTasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select \"Create subtask\" to create a new task automatically linked to the current project.\n\n## Dependencies\n\nTask dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects:\n\n```yaml\nblockedBy:\n - uid: \"[[Operations/Order hardware]]\"\n reltype: FINISHTOSTART\n gap: P1D\n```\n\n- `uid` references the blocking task, typically through an Obsidian wikilink.\n- `reltype` is stored with each dependency and defaults to `FINISHTOSTART` for dependencies created in the UI.\n- `gap` is optional and uses ISO 8601 duration syntax (for example `PT4H` or `P2D`).\n\nWhenever a dependency is added, TaskNotes updates the upstream note’s `blocking` list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides.\n\n### Selecting dependencies in the UI\n\n- The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries.\n- The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views.\n- Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place.\n\nThese controls currently create and manage finish-to-start style blockers. Advanced `reltype` values and `gap` data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules.\n\n![Task context menu](../assets/feature-task-context-menu.png)\n\n## Automation\n\n### Auto-Archiving\n\nTaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup.\n\nConfigure auto-archiving per status from **Settings → Task Properties → Task Statuses**. Each status card includes an **Auto-archive** toggle and a **Delay (minutes)** input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically.\n\nThe auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status.\n\nThis automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault.\n\n## File Management and Templates\n\nTaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks.\n\nThese settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds).\n\nFor configuration details, see [Task Defaults](../settings/task-defaults.md). \nFor template variables, see [Template Variables Reference](template-variables.md).\n\n## Recurring Tasks\n\nTaskNotes recurring tasks use RFC 5545 RRule syntax with `DTSTART`, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu.\n\nFor full behavior, examples, and edge cases, see [Recurring Tasks](recurring-tasks.md).\n\n## Task Reminders\n\nTask reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus.\n\nFor full setup, data format, defaults, and UI behavior, see [Task Reminders](reminders.md).\n","aliases":["/features/task-management/"],"toc":[{"level":2,"id":"creating-and-editing-tasks","text":"Creating and Editing Tasks"},{"level":3,"id":"auto-suggestions-in-natural-language-input","text":"Auto-Suggestions in Natural Language Input"},{"level":2,"id":"task-properties","text":"Task Properties"},{"level":2,"id":"projects","text":"Projects"},{"level":3,"id":"project-assignment","text":"Project Assignment"},{"level":3,"id":"project-links","text":"Project Links"},{"level":3,"id":"organization-and-filtering","text":"Organization and Filtering"},{"level":3,"id":"project-indicators","text":"Project Indicators"},{"level":3,"id":"subtask-creation","text":"Subtask Creation"},{"level":2,"id":"dependencies","text":"Dependencies"},{"level":3,"id":"selecting-dependencies-in-the-ui","text":"Selecting dependencies in the UI"},{"level":2,"id":"automation","text":"Automation"},{"level":3,"id":"auto-archiving","text":"Auto-Archiving"},{"level":2,"id":"file-management-and-templates","text":"File Management and Templates"},{"level":2,"id":"recurring-tasks","text":"Recurring Tasks"},{"level":2,"id":"task-reminders","text":"Task Reminders"}],"html":"

This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts.

\n

Use this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end.

\n

Creating and Editing Tasks#

\n

You can create and edit tasks in a variety of ways. The primary method is through the Task Creation Modal, which can be accessed via the "Create new task" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates.

\n

\"Task

\n

TaskNotes keeps a storage title and a filename-safe title separate. When Store title in filename is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter.

\n

For existing tasks, the Quick actions for current task command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month.

\n

TaskNotes also supports Natural Language Creation, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like "Buy groceries tomorrow at 3pm @home #errands high priority."

\n

In most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed.

\n

Auto-Suggestions in Natural Language Input#

\n

The natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters:

\n
    \n
  • @ - Shows available contexts from existing tasks
  • \n
  • # - Shows available tags from existing tasks
  • \n
  • + - Shows files from your vault as project suggestions
  • \n
  • * - Shows available status options (configurable trigger in Settings → Features)
  • \n
\n

In task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character.

\n

Project Suggestions#

\n

When typing + in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files:

\n
project-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha]\nmeeting-notes [title: Weekly Team Meeting Notes]\nsimple-project\nwork-file [aliases: work, office-tasks]\n

Project suggestions search across:

\n
    \n
  • File names (basename without extension)
  • \n
  • Frontmatter titles (using your configured field mapping)
  • \n
  • Frontmatter aliases
  • \n
  • Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest
  • \n
\n

Selecting a project suggestion inserts it as +[[filename]], creating a wikilink to the file while maintaining the + project marker that the natural language parser recognizes.

\n

Enhanced Project Auto‑suggester (configurable cards)#

\n

Project suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest.

\n
    \n
  • Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key
  • \n
  • Flags:
      \n
    • n or n(Label) → show the field name/label before the value
    • \n
    • s → include this field in + search (in addition to defaults)
    • \n
    \n
  • \n
  • Literals: you can mix in fixed text or emojis between tokens
  • \n
\n

Examples

\n
    \n
  • "{title|n(Title)}" → Title: Alpha Project
  • \n
  • "🔖 {aliases|n(Aliases)}" → 🔖 Aliases: alpha, proj-alpha
  • \n
  • "{file.path|n(Path)|s}" → include path in + search as well as display it
  • \n
\n

Search behavior

\n
    \n
  • Defaults: + search always includes file basename, title (via your field mapping), and aliases
  • \n
  • |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer)
  • \n
  • Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches
  • \n
\n

Performance tips

\n
    \n
  • Keep rows to three or fewer for clarity and performance (the UI supports up to 3)
  • \n
  • Prefer specific searchable fields with |s on large vaults
  • \n
\n

Demo

\n

\"Autosuggest

\n

\"Enhanced

\n

Status Suggestions#

\n

When typing the status trigger character (default *) in the natural language input, you'll see suggestions for all configured status options:

\n

\"Status

\n

Status suggestions allow quick selection of statuses when creating tasks. For example, typing *in shows "In Progress" as a suggestion if that's one of your configured statuses.

\n

Clicking a task card's status indicator cycles through statuses in the order configured under Settings → Task Properties → Status. A status can optionally define a specific Next status for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked Skip when cycling are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps.

\n

Additionally, you can convert any line type in your notes to TaskNotes using the Instant Conversion feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines.

\n

Task Properties#

\n

Tasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure.

\n

This frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets.

\n

For property types and examples, see Core Concepts. For configuration options, see Task Properties Settings.

\n

Projects#

\n

TaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management.

\n

This model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling.

\n

Project Assignment#

\n

Tasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the "Add Project" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault.

\n

Project Links#

\n

Projects are stored as wikilinks in the task's frontmatter (e.g., projects: ["[[Project A]]", "[[Project B]]"]). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field.

\n

Organization and Filtering#

\n

Tasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add note.projects conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization.

\n

Project Indicators#

\n

TaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance.

\n

Subtask Creation#

\n

Tasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select "Create subtask" to create a new task automatically linked to the current project.

\n

Dependencies#

\n

Task dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects:

\n
blockedBy:\n  - uid: "[[Operations/Order hardware]]"\n    reltype: FINISHTOSTART\n    gap: P1D\n
    \n
  • uid references the blocking task, typically through an Obsidian wikilink.
  • \n
  • reltype is stored with each dependency and defaults to FINISHTOSTART for dependencies created in the UI.
  • \n
  • gap is optional and uses ISO 8601 duration syntax (for example PT4H or P2D).
  • \n
\n

Whenever a dependency is added, TaskNotes updates the upstream note’s blocking list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides.

\n

Selecting dependencies in the UI#

\n
    \n
  • The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries.
  • \n
  • The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views.
  • \n
  • Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place.
  • \n
\n

These controls currently create and manage finish-to-start style blockers. Advanced reltype values and gap data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules.

\n

\"Task

\n

Automation#

\n

Auto-Archiving#

\n

TaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup.

\n

Configure auto-archiving per status from Settings → Task Properties → Task Statuses. Each status card includes an Auto-archive toggle and a Delay (minutes) input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically.

\n

The auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status.

\n

This automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault.

\n

File Management and Templates#

\n

TaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks.

\n

These settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds).

\n

For configuration details, see Task Defaults.
For template variables, see Template Variables Reference.

\n

Recurring Tasks#

\n

TaskNotes recurring tasks use RFC 5545 RRule syntax with DTSTART, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu.

\n

For full behavior, examples, and edge cases, see Recurring Tasks.

\n

Task Reminders#

\n

Task reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus.

\n

For full setup, data format, defaults, and UI behavior, see Task Reminders.

\n","text":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts. Use this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end. Creating and Editing Tasks# You can create and edit tasks in a variety of ways. The primary method is through the Task Creation Modal, which can be accessed via the \"Create new task\" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates. TaskNotes keeps a storage title and a filename-safe title separate. When Store title in filename is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter. For existing tasks, the Quick actions for current task command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month. TaskNotes also supports Natural Language Creation, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like \"Buy groceries tomorrow at 3pm @home #errands high priority.\" In most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed. Auto-Suggestions in Natural Language Input# The natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters: @ - Shows available contexts from existing tasks # - Shows available tags from existing tasks + - Shows files from your vault as project suggestions * - Shows available status options (configurable trigger in Settings → Features) In task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character. Project Suggestions# When typing + in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files: project-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha] meeting-notes [title: Weekly Team Meeting Notes] simple-project work-file [aliases: work, office-tasks] Project suggestions search across: File names (basename without extension) Frontmatter titles (using your configured field mapping) Frontmatter aliases Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest Selecting a project suggestion inserts it as +[[filename]], creating a wikilink to the file while maintaining the + project marker that the natural language parser recognizes. Enhanced Project Auto‑suggester (configurable cards)# Project suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest. Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key Flags: n or n(Label) → show the field name/label before the value s → include this field in + search (in addition to defaults) Literals: you can mix in fixed text or emojis between tokens Examples \"{title|n(Title)}\" → Title: Alpha Project \"🔖 {aliases|n(Aliases)}\" → 🔖 Aliases: alpha, proj-alpha \"{file.path|n(Path)|s}\" → include path in + search as well as display it Search behavior Defaults: + search always includes file basename, title (via your field mapping), and aliases |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer) Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches Performance tips Keep rows to three or fewer for clarity and performance (the UI supports up to 3) Prefer specific searchable fields with |s on large vaults Demo Status Suggestions# When typing the status trigger character (default *) in the natural language input, you'll see suggestions for all configured status options: Status suggestions allow quick selection of statuses when creating tasks. For example, typing *in shows \"In Progress\" as a suggestion if that's one of your configured statuses. Clicking a task card's status indicator cycles through statuses in the order configured under Settings → Task Properties → Status. A status can optionally define a specific Next status for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked Skip when cycling are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps. Additionally, you can convert any line type in your notes to TaskNotes using the Instant Conversion feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines. Task Properties# Tasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure. This frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets. For property types and examples, see Core Concepts. For configuration options, see Task Properties Settings. Projects# TaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management. This model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling. Project Assignment# Tasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the \"Add Project\" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault. Project Links# Projects are stored as wikilinks in the task's frontmatter (e.g., projects: [\"[[Project A]]\", \"[[Project B]]\"]). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field. Organization and Filtering# Tasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add note.projects conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization. Project Indicators# TaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance. Subtask Creation# Tasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select \"Create subtask\" to create a new task automatically linked to the current project. Dependencies# Task dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects: blockedBy: - uid: \"[[Operations/Order hardware]]\" reltype: FINISHTOSTART gap: P1D uid references the blocking task, typically through an Obsidian wikilink. reltype is stored with each dependency and defaults to FINISHTOSTART for dependencies created in the UI. gap is optional and uses ISO 8601 duration syntax (for example PT4H or P2D). Whenever a dependency is added, TaskNotes updates the upstream note’s blocking list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides. Selecting dependencies in the UI# The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries. The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views. Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place. These controls currently create and manage finish-to-start style blockers. Advanced reltype values and gap data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules. Automation# Auto-Archiving# TaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup. Configure auto-archiving per status from Settings → Task Properties → Task Statuses. Each status card includes an Auto-archive toggle and a Delay (minutes) input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically. The auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status. This automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault. File Management and Templates# TaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks. These settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds). For configuration details, see Task Defaults.For template variables, see Template Variables Reference. Recurring Tasks# TaskNotes recurring tasks use RFC 5545 RRule syntax with DTSTART, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu. For full behavior, examples, and edge cases, see Recurring Tasks. Task Reminders# Task reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus. For full setup, data format, defaults, and UI behavior, see Task Reminders."},{"route":"/obsidian/features/template-variables/","title":"Template Variables Reference","description":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced w...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/template-variables.md","namespace":"obsidian","relativePath":"features/template-variables.md","raw":"# Template Variables Reference\n\nTaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the `{{variableName}}` syntax and are replaced with actual values when content is created.\n\n## Overview\n\nTemplate variables are available in three contexts:\n\n- **Body templates** - Content templates for task and note files\n- **Folder templates** - Dynamic folder paths for file organization\n- **Filename templates** - Dynamic filename generation\n\nNot all variables are available in every context. The tables below indicate where each variable can be used.\n\n## Task Properties\n\nVariables for task-specific data.\n\n| Variable | Description | Body | Folder | Example |\n|----------|-------------|:----:|:------:|---------|\n| `{{title}}` | Task title | Yes | Yes | `My Task` |\n| `{{titleLower}}` | Title in lowercase | Yes | Yes | `my task` |\n| `{{titleUpper}}` | Title in uppercase | Yes | Yes | `MY TASK` |\n| `{{titleSnake}}` | Title in snake_case | Yes | Yes | `my_task` |\n| `{{titleKebab}}` | Title in kebab-case | Yes | Yes | `my-task` |\n| `{{titleCamel}}` | Title in camelCase | Yes | Yes | `myTask` |\n| `{{titlePascal}}` | Title in PascalCase | Yes | Yes | `MyTask` |\n| `{{priority}}` | Task priority value | Yes | Yes | `high` |\n| `{{priorityShort}}` | First character of priority (uppercase) | Yes | Yes | `H` |\n| `{{status}}` | Task status value | Yes | Yes | `active` |\n| `{{statusShort}}` | First character of status (uppercase) | Yes | Yes | `A` |\n| `{{context}}` | First context from contexts array | No | Yes | `work` |\n| `{{contexts}}` | All contexts (comma-separated in body, `/` in folder) | Yes | Yes | `work, home` or `work/home` |\n| `{{project}}` | First project from projects array | No | Yes | `ProjectA` |\n| `{{projects}}` | All projects joined by `/` | No | Yes | `ProjectA/ProjectB` |\n| `{{projectFilePath}}` | Full path of the first project, without `.md` | No | Yes | `Work/Projects/ProjectA` |\n| `{{projectFilePaths}}` | Full paths of all projects, joined by `/` | No | Yes | `Work/Alpha/Personal/Beta` |\n| `{{projectFolder}}` | Folder containing the first project note (its file path without the note's own name) | No | Yes | `Work/Projects` |\n| `{{projectFolders}}` | Folders of all projects, joined by `/` | No | Yes | `Work/Personal` |\n| `{{dueDate}}` | Task due date | Yes | Yes | `2025-01-15` |\n| `{{scheduledDate}}` | Task scheduled date | Yes | Yes | `2025-01-10` |\n\n## Body Template Only\n\nVariables available only in body templates (not folder templates).\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{details}}` | User-provided details/description | `Task description text` |\n| `{{parentNote}}` | Parent note name/path where task was created | `Projects/MyNote` |\n| `{{tags}}` | Task tags (comma-separated) | `urgent, review` |\n| `{{hashtags}}` | Task tags as space-separated hashtags | `#urgent #review` |\n| `{{timeEstimate}}` | Time estimate in minutes | `30` |\n\n## Date and Time\n\nVariables for current date and time values.\n\n| Variable | Description | Format | Example |\n|----------|-------------|--------|---------|\n| `{{date}}` | Full current date | `YYYY-MM-DD` | `2025-01-07` |\n| `{{year}}` | Current year | `YYYY` | `2025` |\n| `{{shortYear}}` | Short year | `YY` | `25` |\n| `{{month}}` | Current month | `MM` | `01` |\n| `{{day}}` | Current day | `DD` | `07` |\n| `{{monthName}}` | Full month name | - | `January` |\n| `{{monthNameShort}}` | Abbreviated month name | - | `Jan` |\n| `{{dayName}}` | Full day name | - | `Tuesday` |\n| `{{dayNameShort}}` | Abbreviated day name | - | `Tue` |\n| `{{week}}` | Week number of year | `WW` | `02` |\n| `{{quarter}}` | Quarter of year | `Q` | `1` |\n| `{{shortDate}}` | Compact date | `YYMMDD` | `250107` |\n\n### Time Variables\n\n| Variable | Description | Format | Example |\n|----------|-------------|--------|---------|\n| `{{time}}` | Current time (compact) | `HHmmss` | `143052` |\n| `{{time24}}` | 24-hour time | `HH:mm` | `14:30` |\n| `{{time12}}` | 12-hour time with AM/PM | `hh:mm a` | `02:30 PM` |\n| `{{hour}}` | Current hour (24-hour) | `HH` | `14` |\n| `{{hourPadded}}` | Hour with leading zero | `HH` | `14` |\n| `{{hour12}}` | Hour in 12-hour format | `hh` | `02` |\n| `{{minute}}` | Current minute | `mm` | `30` |\n| `{{second}}` | Current second | `ss` | `52` |\n| `{{ampm}}` | AM/PM indicator | `a` | `PM` |\n\n### Timestamps\n\n| Variable | Description | Format | Example |\n|----------|-------------|--------|---------|\n| `{{timestamp}}` | Date and time combined | `YYYY-MM-DD-HHmmss` | `2025-01-07-143052` |\n| `{{dateTime}}` | Date and time (no seconds) | `YYYY-MM-DD-HHmm` | `2025-01-07-1430` |\n| `{{unix}}` | Unix timestamp (seconds) | - | `1736264852` |\n| `{{unixMs}}` | Unix timestamp (milliseconds) | - | `1736264852000` |\n| `{{milliseconds}}` | Current milliseconds | `SSS` | `123` |\n| `{{ms}}` | Milliseconds (alias) | `SSS` | `123` |\n\n### Timezone\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{timezone}}` | Timezone offset | `+01:00` |\n| `{{timezoneShort}}` | Short timezone offset | `+0100` |\n| `{{utcOffset}}` | UTC offset | `+01:00` |\n| `{{utcOffsetShort}}` | Short UTC offset | `+0100` |\n| `{{utcZ}}` | UTC Z indicator | `Z` |\n\n### Unique Identifiers\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{zettel}}` | Zettelkasten-style ID (date + seconds since midnight in base36) | `250107abc` |\n| `{{nano}}` | Unique nano ID (timestamp + random string) | `1736264852000x7k2m` |\n\n## ICS Calendar Event Variables\n\nVariables for content created from ICS calendar events. Available when creating notes or tasks from calendar events.\n\n### Event Information\n\n| Variable | Description | Body | Folder |\n|----------|-------------|:----:|:------:|\n| `{{icsEventTitle}}` | Event title | Yes | Yes |\n| `{{icsEventTitleLower}}` | Event title lowercase | No | Yes |\n| `{{icsEventTitleUpper}}` | Event title uppercase | No | Yes |\n| `{{icsEventTitleSnake}}` | Event title in snake_case | No | Yes |\n| `{{icsEventTitleKebab}}` | Event title in kebab-case | No | Yes |\n| `{{icsEventTitleCamel}}` | Event title in camelCase | No | Yes |\n| `{{icsEventTitlePascal}}` | Event title in PascalCase | No | Yes |\n| `{{icsEventStart}}` | Event start time (ISO format) | Yes | No |\n| `{{icsEventEnd}}` | Event end time (ISO format) | Yes | No |\n| `{{icsEventLocation}}` | Event location | Yes | Yes |\n| `{{icsEventDescription}}` | Event description | Yes | Yes |\n| `{{icsEventUrl}}` | Event URL | Yes | No |\n| `{{icsEventSubscription}}` | Calendar subscription name | Yes | No |\n| `{{icsEventId}}` | Unique event identifier (UUID) | Yes | No |\n\n## Current Note Folder Variables\n\nVariables available for inline-created tasks and the default tasks folder.\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `{{currentNotePath}}` | Path to the current note's folder | `Projects/Notes` |\n| `{{currentNoteTitle}}` | Title/name of the current note | `Meeting Notes` |\n\n## Examples\n\n### Body Template\n\n```markdown\n---\ncreated: {{date}}\npriority: {{priority}}\nstatus: {{status}}\n---\n\n# {{title}}\n\n{{details}}\n\nCreated from: {{parentNote}}\nTags: {{hashtags}}\n```\n\n### Folder Template\n\nOrganize tasks by project and status:\n```\nTasks/{{project}}/{{status}}\n```\nResult: `Tasks/MyProject/active`\n\nOrganize by date hierarchy:\n```\nDaily/{{year}}/{{month}}/{{day}}\n```\nResult: `Daily/2025/01/07`\n\nOrganize ICS events by year and title:\n```\nEvents/{{year}}/{{icsEventTitleKebab}}\n```\nResult: `Events/2025/team-meeting`\n\n### Filename Template\n\nUsing Zettelkasten ID:\n```\n{{zettel}}-{{titleKebab}}\n```\nResult: `250107abc-my-task.md`\n\nUsing timestamp:\n```\n{{shortDate}}-{{title}}\n```\nResult: `250107-My Task.md`\n\n## Notes\n\n### YAML Safety\n\nWhen used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors.\n\n### Folder Path Sanitization\n\nIn folder templates, title values have filesystem-unsafe characters (`<>:\"/\\|?*`) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment.\n\n### Empty Values\n\nIf a variable references data that isn't available (e.g., `{{project}}` when no project is set), it resolves to an empty string.\n\n### Case Transformations\n\nThe case transformation variables work as follows:\n\n| Transform | Input | Output |\n|-----------|-------|--------|\n| `titleLower` | `My Task Name` | `my task name` |\n| `titleUpper` | `My Task Name` | `MY TASK NAME` |\n| `titleSnake` | `My Task Name` | `my_task_name` |\n| `titleKebab` | `My Task Name` | `my-task-name` |\n| `titleCamel` | `My Task Name` | `myTaskName` |\n| `titlePascal` | `My Task Name` | `MyTaskName` |\n","aliases":["/features/template-variables/"],"toc":[{"level":2,"id":"overview","text":"Overview"},{"level":2,"id":"task-properties","text":"Task Properties"},{"level":2,"id":"body-template-only","text":"Body Template Only"},{"level":2,"id":"date-and-time","text":"Date and Time"},{"level":3,"id":"time-variables","text":"Time Variables"},{"level":3,"id":"timestamps","text":"Timestamps"},{"level":3,"id":"timezone","text":"Timezone"},{"level":3,"id":"unique-identifiers","text":"Unique Identifiers"},{"level":2,"id":"ics-calendar-event-variables","text":"ICS Calendar Event Variables"},{"level":3,"id":"event-information","text":"Event Information"},{"level":2,"id":"current-note-folder-variables","text":"Current Note Folder Variables"},{"level":2,"id":"examples","text":"Examples"},{"level":3,"id":"body-template","text":"Body Template"},{"level":3,"id":"folder-template","text":"Folder Template"},{"level":3,"id":"filename-template","text":"Filename Template"},{"level":2,"id":"notes","text":"Notes"},{"level":3,"id":"yaml-safety","text":"YAML Safety"},{"level":3,"id":"folder-path-sanitization","text":"Folder Path Sanitization"},{"level":3,"id":"empty-values","text":"Empty Values"},{"level":3,"id":"case-transformations","text":"Case Transformations"}],"html":"

TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced with actual values when content is created.

\n

Overview#

\n

Template variables are available in three contexts:

\n
    \n
  • Body templates - Content templates for task and note files
  • \n
  • Folder templates - Dynamic folder paths for file organization
  • \n
  • Filename templates - Dynamic filename generation
  • \n
\n

Not all variables are available in every context. The tables below indicate where each variable can be used.

\n

Task Properties#

\n

Variables for task-specific data.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionBodyFolderExample
{{title}}Task titleYesYesMy Task
{{titleLower}}Title in lowercaseYesYesmy task
{{titleUpper}}Title in uppercaseYesYesMY TASK
{{titleSnake}}Title in snake_caseYesYesmy_task
{{titleKebab}}Title in kebab-caseYesYesmy-task
{{titleCamel}}Title in camelCaseYesYesmyTask
{{titlePascal}}Title in PascalCaseYesYesMyTask
{{priority}}Task priority valueYesYeshigh
{{priorityShort}}First character of priority (uppercase)YesYesH
{{status}}Task status valueYesYesactive
{{statusShort}}First character of status (uppercase)YesYesA
{{context}}First context from contexts arrayNoYeswork
{{contexts}}All contexts (comma-separated in body, / in folder)YesYeswork, home or work/home
{{project}}First project from projects arrayNoYesProjectA
{{projects}}All projects joined by /NoYesProjectA/ProjectB
{{projectFilePath}}Full path of the first project, without .mdNoYesWork/Projects/ProjectA
{{projectFilePaths}}Full paths of all projects, joined by /NoYesWork/Alpha/Personal/Beta
{{projectFolder}}Folder containing the first project note (its file path without the note's own name)NoYesWork/Projects
{{projectFolders}}Folders of all projects, joined by /NoYesWork/Personal
{{dueDate}}Task due dateYesYes2025-01-15
{{scheduledDate}}Task scheduled dateYesYes2025-01-10
\n

Body Template Only#

\n

Variables available only in body templates (not folder templates).

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{details}}User-provided details/descriptionTask description text
{{parentNote}}Parent note name/path where task was createdProjects/MyNote
{{tags}}Task tags (comma-separated)urgent, review
{{hashtags}}Task tags as space-separated hashtags#urgent #review
{{timeEstimate}}Time estimate in minutes30
\n

Date and Time#

\n

Variables for current date and time values.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionFormatExample
{{date}}Full current dateYYYY-MM-DD2025-01-07
{{year}}Current yearYYYY2025
{{shortYear}}Short yearYY25
{{month}}Current monthMM01
{{day}}Current dayDD07
{{monthName}}Full month name-January
{{monthNameShort}}Abbreviated month name-Jan
{{dayName}}Full day name-Tuesday
{{dayNameShort}}Abbreviated day name-Tue
{{week}}Week number of yearWW02
{{quarter}}Quarter of yearQ1
{{shortDate}}Compact dateYYMMDD250107
\n

Time Variables#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionFormatExample
{{time}}Current time (compact)HHmmss143052
{{time24}}24-hour timeHH:mm14:30
{{time12}}12-hour time with AM/PMhh:mm a02:30 PM
{{hour}}Current hour (24-hour)HH14
{{hourPadded}}Hour with leading zeroHH14
{{hour12}}Hour in 12-hour formathh02
{{minute}}Current minutemm30
{{second}}Current secondss52
{{ampm}}AM/PM indicatoraPM
\n

Timestamps#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionFormatExample
{{timestamp}}Date and time combinedYYYY-MM-DD-HHmmss2025-01-07-143052
{{dateTime}}Date and time (no seconds)YYYY-MM-DD-HHmm2025-01-07-1430
{{unix}}Unix timestamp (seconds)-1736264852
{{unixMs}}Unix timestamp (milliseconds)-1736264852000
{{milliseconds}}Current millisecondsSSS123
{{ms}}Milliseconds (alias)SSS123
\n

Timezone#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{timezone}}Timezone offset+01:00
{{timezoneShort}}Short timezone offset+0100
{{utcOffset}}UTC offset+01:00
{{utcOffsetShort}}Short UTC offset+0100
{{utcZ}}UTC Z indicatorZ
\n

Unique Identifiers#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{zettel}}Zettelkasten-style ID (date + seconds since midnight in base36)250107abc
{{nano}}Unique nano ID (timestamp + random string)1736264852000x7k2m
\n

ICS Calendar Event Variables#

\n

Variables for content created from ICS calendar events. Available when creating notes or tasks from calendar events.

\n

Event Information#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionBodyFolder
{{icsEventTitle}}Event titleYesYes
{{icsEventTitleLower}}Event title lowercaseNoYes
{{icsEventTitleUpper}}Event title uppercaseNoYes
{{icsEventTitleSnake}}Event title in snake_caseNoYes
{{icsEventTitleKebab}}Event title in kebab-caseNoYes
{{icsEventTitleCamel}}Event title in camelCaseNoYes
{{icsEventTitlePascal}}Event title in PascalCaseNoYes
{{icsEventStart}}Event start time (ISO format)YesNo
{{icsEventEnd}}Event end time (ISO format)YesNo
{{icsEventLocation}}Event locationYesYes
{{icsEventDescription}}Event descriptionYesYes
{{icsEventUrl}}Event URLYesNo
{{icsEventSubscription}}Calendar subscription nameYesNo
{{icsEventId}}Unique event identifier (UUID)YesNo
\n

Current Note Folder Variables#

\n

Variables available for inline-created tasks and the default tasks folder.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableDescriptionExample
{{currentNotePath}}Path to the current note's folderProjects/Notes
{{currentNoteTitle}}Title/name of the current noteMeeting Notes
\n

Examples#

\n

Body Template#

\n
---\ncreated: {{date}}\npriority: {{priority}}\nstatus: {{status}}\n---\n\n# {{title}}\n\n{{details}}\n\nCreated from: {{parentNote}}\nTags: {{hashtags}}\n

Folder Template#

\n

Organize tasks by project and status:

\n
Tasks/{{project}}/{{status}}\n

Result: Tasks/MyProject/active

\n

Organize by date hierarchy:

\n
Daily/{{year}}/{{month}}/{{day}}\n

Result: Daily/2025/01/07

\n

Organize ICS events by year and title:

\n
Events/{{year}}/{{icsEventTitleKebab}}\n

Result: Events/2025/team-meeting

\n

Filename Template#

\n

Using Zettelkasten ID:

\n
{{zettel}}-{{titleKebab}}\n

Result: 250107abc-my-task.md

\n

Using timestamp:

\n
{{shortDate}}-{{title}}\n

Result: 250107-My Task.md

\n

Notes#

\n

YAML Safety#

\n

When used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors.

\n

Folder Path Sanitization#

\n

In folder templates, title values have filesystem-unsafe characters (<>:"/\\|?*) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment.

\n

Empty Values#

\n

If a variable references data that isn't available (e.g., {{project}} when no project is set), it resolves to an empty string.

\n

Case Transformations#

\n

The case transformation variables work as follows:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TransformInputOutput
titleLowerMy Task Namemy task name
titleUpperMy Task NameMY TASK NAME
titleSnakeMy Task Namemy_task_name
titleKebabMy Task Namemy-task-name
titleCamelMy Task NamemyTaskName
titlePascalMy Task NameMyTaskName
\n","text":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced with actual values when content is created. Overview# Template variables are available in three contexts: Body templates - Content templates for task and note files Folder templates - Dynamic folder paths for file organization Filename templates - Dynamic filename generation Not all variables are available in every context. The tables below indicate where each variable can be used. Task Properties# Variables for task-specific data. Variable Description Body Folder Example {{title}} Task title Yes Yes My Task {{titleLower}} Title in lowercase Yes Yes my task {{titleUpper}} Title in uppercase Yes Yes MY TASK {{titleSnake}} Title in snake_case Yes Yes my_task {{titleKebab}} Title in kebab-case Yes Yes my-task {{titleCamel}} Title in camelCase Yes Yes myTask {{titlePascal}} Title in PascalCase Yes Yes MyTask {{priority}} Task priority value Yes Yes high {{priorityShort}} First character of priority (uppercase) Yes Yes H {{status}} Task status value Yes Yes active {{statusShort}} First character of status (uppercase) Yes Yes A {{context}} First context from contexts array No Yes work {{contexts}} All contexts (comma-separated in body, / in folder) Yes Yes work, home or work/home {{project}} First project from projects array No Yes ProjectA {{projects}} All projects joined by / No Yes ProjectA/ProjectB {{projectFilePath}} Full path of the first project, without .md No Yes Work/Projects/ProjectA {{projectFilePaths}} Full paths of all projects, joined by / No Yes Work/Alpha/Personal/Beta {{projectFolder}} Folder containing the first project note (its file path without the note's own name) No Yes Work/Projects {{projectFolders}} Folders of all projects, joined by / No Yes Work/Personal {{dueDate}} Task due date Yes Yes 2025-01-15 {{scheduledDate}} Task scheduled date Yes Yes 2025-01-10 Body Template Only# Variables available only in body templates (not folder templates). Variable Description Example {{details}} User-provided details/description Task description text {{parentNote}} Parent note name/path where task was created Projects/MyNote {{tags}} Task tags (comma-separated) urgent, review {{hashtags}} Task tags as space-separated hashtags #urgent #review {{timeEstimate}} Time estimate in minutes 30 Date and Time# Variables for current date and time values. Variable Description Format Example {{date}} Full current date YYYY-MM-DD 2025-01-07 {{year}} Current year YYYY 2025 {{shortYear}} Short year YY 25 {{month}} Current month MM 01 {{day}} Current day DD 07 {{monthName}} Full month name - January {{monthNameShort}} Abbreviated month name - Jan {{dayName}} Full day name - Tuesday {{dayNameShort}} Abbreviated day name - Tue {{week}} Week number of year WW 02 {{quarter}} Quarter of year Q 1 {{shortDate}} Compact date YYMMDD 250107 Time Variables# Variable Description Format Example {{time}} Current time (compact) HHmmss 143052 {{time24}} 24-hour time HH:mm 14:30 {{time12}} 12-hour time with AM/PM hh:mm a 02:30 PM {{hour}} Current hour (24-hour) HH 14 {{hourPadded}} Hour with leading zero HH 14 {{hour12}} Hour in 12-hour format hh 02 {{minute}} Current minute mm 30 {{second}} Current second ss 52 {{ampm}} AM/PM indicator a PM Timestamps# Variable Description Format Example {{timestamp}} Date and time combined YYYY-MM-DD-HHmmss 2025-01-07-143052 {{dateTime}} Date and time (no seconds) YYYY-MM-DD-HHmm 2025-01-07-1430 {{unix}} Unix timestamp (seconds) - 1736264852 {{unixMs}} Unix timestamp (milliseconds) - 1736264852000 {{milliseconds}} Current milliseconds SSS 123 {{ms}} Milliseconds (alias) SSS 123 Timezone# Variable Description Example {{timezone}} Timezone offset +01:00 {{timezoneShort}} Short timezone offset +0100 {{utcOffset}} UTC offset +01:00 {{utcOffsetShort}} Short UTC offset +0100 {{utcZ}} UTC Z indicator Z Unique Identifiers# Variable Description Example {{zettel}} Zettelkasten-style ID (date + seconds since midnight in base36) 250107abc {{nano}} Unique nano ID (timestamp + random string) 1736264852000x7k2m ICS Calendar Event Variables# Variables for content created from ICS calendar events. Available when creating notes or tasks from calendar events. Event Information# Variable Description Body Folder {{icsEventTitle}} Event title Yes Yes {{icsEventTitleLower}} Event title lowercase No Yes {{icsEventTitleUpper}} Event title uppercase No Yes {{icsEventTitleSnake}} Event title in snake_case No Yes {{icsEventTitleKebab}} Event title in kebab-case No Yes {{icsEventTitleCamel}} Event title in camelCase No Yes {{icsEventTitlePascal}} Event title in PascalCase No Yes {{icsEventStart}} Event start time (ISO format) Yes No {{icsEventEnd}} Event end time (ISO format) Yes No {{icsEventLocation}} Event location Yes Yes {{icsEventDescription}} Event description Yes Yes {{icsEventUrl}} Event URL Yes No {{icsEventSubscription}} Calendar subscription name Yes No {{icsEventId}} Unique event identifier (UUID) Yes No Current Note Folder Variables# Variables available for inline-created tasks and the default tasks folder. Variable Description Example {{currentNotePath}} Path to the current note's folder Projects/Notes {{currentNoteTitle}} Title/name of the current note Meeting Notes Examples# Body Template# --- created: {{date}} priority: {{priority}} status: {{status}} --- # {{title}} {{details}} Created from: {{parentNote}} Tags: {{hashtags}} Folder Template# Organize tasks by project and status: Tasks/{{project}}/{{status}} Result: Tasks/MyProject/active Organize by date hierarchy: Daily/{{year}}/{{month}}/{{day}} Result: Daily/2025/01/07 Organize ICS events by year and title: Events/{{year}}/{{icsEventTitleKebab}} Result: Events/2025/team-meeting Filename Template# Using Zettelkasten ID: {{zettel}}-{{titleKebab}} Result: 250107abc-my-task.md Using timestamp: {{shortDate}}-{{title}} Result: 250107-My Task.md Notes# YAML Safety# When used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors. Folder Path Sanitization# In folder templates, title values have filesystem-unsafe characters (<>:\"/\\|?*) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment. Empty Values# If a variable references data that isn't available (e.g., {{project}} when no project is set), it resolves to an empty string. Case Transformations# The case transformation variables work as follows: Transform Input Output titleLower My Task Name my task name titleUpper My Task Name MY TASK NAME titleSnake My Task Name my_task_name titleKebab My Task Name my-task-name titleCamel My Task Name myTaskName titlePascal My Task Name MyTaskName"},{"route":"/obsidian/features/time-management/","title":"Time Management","description":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/time-management.md","namespace":"obsidian","relativePath":"features/time-management.md","raw":"# Time Management\n\nTaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.\n\n## Time Tracking\n\nTaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the `timeEntries` array within each task's YAML frontmatter. Each time entry includes a start time and an end time.\n\nThe time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions.\n\n### Auto-Stop Time Tracking\n\nTaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management.\n\nThe auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated.\n\n**Configuration Options:** Configure these under `Settings -> TaskNotes -> Features` (Time Tracking section).\n\n- **Auto-stop tracking** - Enable or disable the automatic stopping behavior (enabled by default)\n- **Completion notification** - Show a notice when auto-stop occurs (disabled by default)\n\n**Behavior:**\n\n- Monitors all task status changes in real-time\n- Stops only the specific task that was completed (other active timers continue)\n- Preserves the recorded time data in the task's time entries\n- Works with both standard and recurring task completions\n- Functions across all task views (list, kanban, calendar, etc.)\n\nThe feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states.\n\n## Pomodoro Timer\n\nTaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer.\n\nWhen a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session.\n\n## Productivity Analytics\n\nThe **Pomodoro Stats View** provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time.\n\n![Task Statistics](../assets/feature-task-statistics.png)\n","aliases":["/features/time-management/"],"toc":[{"level":2,"id":"time-tracking","text":"Time Tracking"},{"level":3,"id":"auto-stop-time-tracking","text":"Auto-Stop Time Tracking"},{"level":2,"id":"pomodoro-timer","text":"Pomodoro Timer"},{"level":2,"id":"productivity-analytics","text":"Productivity Analytics"}],"html":"

TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.

\n

Time Tracking#

\n

TaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the timeEntries array within each task's YAML frontmatter. Each time entry includes a start time and an end time.

\n

The time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions.

\n

Auto-Stop Time Tracking#

\n

TaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management.

\n

The auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated.

\n

Configuration Options: Configure these under Settings -> TaskNotes -> Features (Time Tracking section).

\n
    \n
  • Auto-stop tracking - Enable or disable the automatic stopping behavior (enabled by default)
  • \n
  • Completion notification - Show a notice when auto-stop occurs (disabled by default)
  • \n
\n

Behavior:

\n
    \n
  • Monitors all task status changes in real-time
  • \n
  • Stops only the specific task that was completed (other active timers continue)
  • \n
  • Preserves the recorded time data in the task's time entries
  • \n
  • Works with both standard and recurring task completions
  • \n
  • Functions across all task views (list, kanban, calendar, etc.)
  • \n
\n

The feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states.

\n

Pomodoro Timer#

\n

TaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer.

\n

When a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session.

\n

Productivity Analytics#

\n

The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time.

\n

\"Task

\n","text":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer. Time Tracking# TaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the timeEntries array within each task's YAML frontmatter. Each time entry includes a start time and an end time. The time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions. Auto-Stop Time Tracking# TaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management. The auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated. Configuration Options: Configure these under Settings -> TaskNotes -> Features (Time Tracking section). Auto-stop tracking - Enable or disable the automatic stopping behavior (enabled by default) Completion notification - Show a notice when auto-stop occurs (disabled by default) Behavior: Monitors all task status changes in real-time Stops only the specific task that was completed (other active timers continue) Preserves the recorded time data in the task's time entries Works with both standard and recurring task completions Functions across all task views (list, kanban, calendar, etc.) The feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states. Pomodoro Timer# TaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer. When a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session. Productivity Analytics# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time."},{"route":"/obsidian/features/user-fields/","title":"User Fields","description":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User f...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/features/user-fields.md","namespace":"obsidian","relativePath":"features/user-fields.md","raw":"\n# User Fields\n\nTaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping.\nUser fields can store workflow-specific metadata such as owner, effort class, client, or review stage.\n\n\n## Creating User Fields\n\nUser fields are created in the TaskNotes settings, under the \"Task Properties\" tab. To create a new user field, click the \"Add new user field\" button.\nFields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views.\n\nEach user field has the following properties:\n\n- **Display Name**: The name of the field as it will be displayed in the UI.\n- **Property Name**: The name of the field as it will be stored in the frontmatter of the task note.\n- **Type**: The data type of the field. The following types are supported:\n - **Text**: A single line of text.\n - **Number**: A numeric value (supports ranges in filters and sorting).\n - **Boolean**: A true/false value stored as a checkbox in the task modal.\n - **Date**: A date.\n - **List**: A list of values.\n- **Default Value** (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type:\n - **Text**: Enter the default text value.\n - **Number**: Enter the default number.\n - **Boolean**: Toggle to set the default state (checked/unchecked).\n - **Date**: Select from presets: None, Today, Tomorrow, or Next Week.\n - **List**: Enter comma-separated default values.\n\n## Link Values\n\nUse a **Text** field for one related link, such as a pull request or specification, and a **List** field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare `https://` URLs as clickable links.\n\nFor internal note links, type `[[` in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped.\n\n## File Suggestion Filtering (Advanced)\n\nWhen using text or list type custom fields, you can configure **autosuggestion filters** to control which files appear in the autocomplete dropdown when you type `[[` in the field.\n\n![Custom field autosuggestion filters for tags, folders, and property values](../assets/custom-fields-selection-filter.webp)\n\nThis is useful when you want to limit suggestions to specific types of notes. For example:\n- An \"Assignee\" field that only suggests notes tagged with `#person`\n- A \"Project\" field that only shows notes in the `Projects/` folder\n- A \"Related Document\" field filtered by a specific frontmatter property\nFiltering narrows wikilink suggestions in large vaults.\n\n### Configuring Filters\n\nTo configure filters for a custom field:\n\n1. Go to **Settings → Task Properties → Custom User Fields**\n2. Expand the custom field card you want to configure\n3. Expand the **\"Autosuggestion filters (Advanced)\"** section\n4. Configure one or more of the following filters:\n\n#### Filter Options\n\n- **Required tags**: Only show files that have ANY of these tags (comma-separated)\n - Example: `person, team` - shows files with either `#person` OR `#team` tag\n - Supports hierarchical tags: `project/active` matches `#project/active`\n\n- **Include folders**: Only show files in these folders (comma-separated)\n - Example: `People/, Teams/` - shows files in either folder\n - Supports nested folders: `Projects/Active/` matches files in that specific folder\n\n- **Required property key**: Only show files that have this frontmatter property\n - Example: `role` - shows files with a `role:` property in frontmatter\n\n- **Required property value**: Expected value for the property (optional)\n - Example: `developer` - when combined with property key `role`, shows files with `role: developer`\n - Leave empty to match any value (just checks property exists)\n\n#### Filter Indicator\n\nWhen filters are configured, a **\"Filters On\"** badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active.\n\n### Filter Behavior\n\n- **All filters are combined with AND logic**: Files must match ALL configured filters to appear\n- **Empty filters are ignored**: If you don't configure a filter, it won't restrict results\n- **No filters = all files**: If no filters are configured, all markdown files in your vault will appear\n- **Filters only affect autocomplete**: They don't affect the actual field value or validation\nAutocomplete filtering and stored field values are handled independently.\n\n### Example Configurations\n\n#### Assignee Field (People Only)\n```\nDisplay Name: Assignee\nProperty Key: assignee\nType: List\n\nAutosuggestion filters:\n Required tags: person\n Include folders: People/\n```\n\n#### Project Field (Active Projects)\n```\nDisplay Name: Project\nProperty Key: project\nType: Text\n\nAutosuggestion filters:\n Required tags: project\n Required property key: status\n Required property value: active\n```\n\n#### Related Note (Specific Folder)\n```\nDisplay Name: Related Note\nProperty Key: related-note\nType: Text\n\nAutosuggestion filters:\n Include folders: Documentation/, Guides/\n```\n\n## Using User Fields\n\nOnce you have created a user field, it will be available in the following places:\n\n- **Task Modals**: The user field will be displayed in the task creation and edit modals.\n- **Bases Filters**: Add the field to Bases filter expressions (for example `note.effort == \"high\"`) to narrow task lists and Kanban boards.\n- **Sorting**: Use the Bases sort menu to order tasks by the user field.\n- **Grouping**: Use the Bases group menu to create swimlanes or list groupings based on the user field.\nTo verify a new field is active in workflow, add it to at least one saved view.\n\n## Frontmatter\n\nUser field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter.\n\nFor example, if you create a user field with the property name \"my_field\", the data for that field will be stored in the frontmatter as follows:\n\n```yaml\n---\nmy_field: value\n---\n```\n","aliases":["/features/user-fields/"],"toc":[{"level":2,"id":"creating-user-fields","text":"Creating User Fields"},{"level":2,"id":"link-values","text":"Link Values"},{"level":2,"id":"file-suggestion-filtering-advanced","text":"File Suggestion Filtering (Advanced)"},{"level":3,"id":"configuring-filters","text":"Configuring Filters"},{"level":3,"id":"filter-behavior","text":"Filter Behavior"},{"level":3,"id":"example-configurations","text":"Example Configurations"},{"level":2,"id":"using-user-fields","text":"Using User Fields"},{"level":2,"id":"frontmatter","text":"Frontmatter"}],"html":"

TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping.\nUser fields can store workflow-specific metadata such as owner, effort class, client, or review stage.

\n

Creating User Fields#

\n

User fields are created in the TaskNotes settings, under the "Task Properties" tab. To create a new user field, click the "Add new user field" button.\nFields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views.

\n

Each user field has the following properties:

\n
    \n
  • Display Name: The name of the field as it will be displayed in the UI.
  • \n
  • Property Name: The name of the field as it will be stored in the frontmatter of the task note.
  • \n
  • Type: The data type of the field. The following types are supported:
      \n
    • Text: A single line of text.
    • \n
    • Number: A numeric value (supports ranges in filters and sorting).
    • \n
    • Boolean: A true/false value stored as a checkbox in the task modal.
    • \n
    • Date: A date.
    • \n
    • List: A list of values.
    • \n
    \n
  • \n
  • Default Value (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type:
      \n
    • Text: Enter the default text value.
    • \n
    • Number: Enter the default number.
    • \n
    • Boolean: Toggle to set the default state (checked/unchecked).
    • \n
    • Date: Select from presets: None, Today, Tomorrow, or Next Week.
    • \n
    • List: Enter comma-separated default values.
    • \n
    \n
  • \n
\n\n

Use a Text field for one related link, such as a pull request or specification, and a List field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare https:// URLs as clickable links.

\n

For internal note links, type [[ in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped.

\n

File Suggestion Filtering (Advanced)#

\n

When using text or list type custom fields, you can configure autosuggestion filters to control which files appear in the autocomplete dropdown when you type [[ in the field.

\n

\"Custom

\n

This is useful when you want to limit suggestions to specific types of notes. For example:

\n
    \n
  • An "Assignee" field that only suggests notes tagged with #person
  • \n
  • A "Project" field that only shows notes in the Projects/ folder
  • \n
  • A "Related Document" field filtered by a specific frontmatter property\nFiltering narrows wikilink suggestions in large vaults.
  • \n
\n

Configuring Filters#

\n

To configure filters for a custom field:

\n
    \n
  1. Go to Settings → Task Properties → Custom User Fields
  2. \n
  3. Expand the custom field card you want to configure
  4. \n
  5. Expand the "Autosuggestion filters (Advanced)" section
  6. \n
  7. Configure one or more of the following filters:
  8. \n
\n

Filter Options#

\n
    \n
  • Required tags: Only show files that have ANY of these tags (comma-separated)

    \n
      \n
    • Example: person, team - shows files with either #person OR #team tag
    • \n
    • Supports hierarchical tags: project/active matches #project/active
    • \n
    \n
  • \n
  • Include folders: Only show files in these folders (comma-separated)

    \n
      \n
    • Example: People/, Teams/ - shows files in either folder
    • \n
    • Supports nested folders: Projects/Active/ matches files in that specific folder
    • \n
    \n
  • \n
  • Required property key: Only show files that have this frontmatter property

    \n
      \n
    • Example: role - shows files with a role: property in frontmatter
    • \n
    \n
  • \n
  • Required property value: Expected value for the property (optional)

    \n
      \n
    • Example: developer - when combined with property key role, shows files with role: developer
    • \n
    • Leave empty to match any value (just checks property exists)
    • \n
    \n
  • \n
\n

Filter Indicator#

\n

When filters are configured, a "Filters On" badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active.

\n

Filter Behavior#

\n
    \n
  • All filters are combined with AND logic: Files must match ALL configured filters to appear
  • \n
  • Empty filters are ignored: If you don't configure a filter, it won't restrict results
  • \n
  • No filters = all files: If no filters are configured, all markdown files in your vault will appear
  • \n
  • Filters only affect autocomplete: They don't affect the actual field value or validation\nAutocomplete filtering and stored field values are handled independently.
  • \n
\n

Example Configurations#

\n

Assignee Field (People Only)#

\n
Display Name: Assignee\nProperty Key: assignee\nType: List\n\nAutosuggestion filters:\n  Required tags: person\n  Include folders: People/\n

Project Field (Active Projects)#

\n
Display Name: Project\nProperty Key: project\nType: Text\n\nAutosuggestion filters:\n  Required tags: project\n  Required property key: status\n  Required property value: active\n

Related Note (Specific Folder)#

\n
Display Name: Related Note\nProperty Key: related-note\nType: Text\n\nAutosuggestion filters:\n  Include folders: Documentation/, Guides/\n

Using User Fields#

\n

Once you have created a user field, it will be available in the following places:

\n
    \n
  • Task Modals: The user field will be displayed in the task creation and edit modals.
  • \n
  • Bases Filters: Add the field to Bases filter expressions (for example note.effort == "high") to narrow task lists and Kanban boards.
  • \n
  • Sorting: Use the Bases sort menu to order tasks by the user field.
  • \n
  • Grouping: Use the Bases group menu to create swimlanes or list groupings based on the user field.\nTo verify a new field is active in workflow, add it to at least one saved view.
  • \n
\n

Frontmatter#

\n

User field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter.

\n

For example, if you create a user field with the property name "my_field", the data for that field will be stored in the frontmatter as follows:

\n
---\nmy_field: value\n---\n
","text":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User fields can store workflow-specific metadata such as owner, effort class, client, or review stage. Creating User Fields# User fields are created in the TaskNotes settings, under the \"Task Properties\" tab. To create a new user field, click the \"Add new user field\" button. Fields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views. Each user field has the following properties: Display Name: The name of the field as it will be displayed in the UI. Property Name: The name of the field as it will be stored in the frontmatter of the task note. Type: The data type of the field. The following types are supported: Text: A single line of text. Number: A numeric value (supports ranges in filters and sorting). Boolean: A true/false value stored as a checkbox in the task modal. Date: A date. List: A list of values. Default Value (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type: Text: Enter the default text value. Number: Enter the default number. Boolean: Toggle to set the default state (checked/unchecked). Date: Select from presets: None, Today, Tomorrow, or Next Week. List: Enter comma-separated default values. Link Values# Use a Text field for one related link, such as a pull request or specification, and a List field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare https:// URLs as clickable links. For internal note links, type [[ in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped. File Suggestion Filtering (Advanced)# When using text or list type custom fields, you can configure autosuggestion filters to control which files appear in the autocomplete dropdown when you type [[ in the field. This is useful when you want to limit suggestions to specific types of notes. For example: An \"Assignee\" field that only suggests notes tagged with #person A \"Project\" field that only shows notes in the Projects/ folder A \"Related Document\" field filtered by a specific frontmatter property Filtering narrows wikilink suggestions in large vaults. Configuring Filters# To configure filters for a custom field: Go to Settings → Task Properties → Custom User Fields Expand the custom field card you want to configure Expand the \"Autosuggestion filters (Advanced)\" section Configure one or more of the following filters: Filter Options# Required tags: Only show files that have ANY of these tags (comma-separated) Example: person, team - shows files with either #person OR #team tag Supports hierarchical tags: project/active matches #project/active Include folders: Only show files in these folders (comma-separated) Example: People/, Teams/ - shows files in either folder Supports nested folders: Projects/Active/ matches files in that specific folder Required property key: Only show files that have this frontmatter property Example: role - shows files with a role: property in frontmatter Required property value: Expected value for the property (optional) Example: developer - when combined with property key role, shows files with role: developer Leave empty to match any value (just checks property exists) Filter Indicator# When filters are configured, a \"Filters On\" badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active. Filter Behavior# All filters are combined with AND logic: Files must match ALL configured filters to appear Empty filters are ignored: If you don't configure a filter, it won't restrict results No filters = all files: If no filters are configured, all markdown files in your vault will appear Filters only affect autocomplete: They don't affect the actual field value or validation Autocomplete filtering and stored field values are handled independently. Example Configurations# Assignee Field (People Only)# Display Name: Assignee Property Key: assignee Type: List Autosuggestion filters: Required tags: person Include folders: People/ Project Field (Active Projects)# Display Name: Project Property Key: project Type: Text Autosuggestion filters: Required tags: project Required property key: status Required property value: active Related Note (Specific Folder)# Display Name: Related Note Property Key: related-note Type: Text Autosuggestion filters: Include folders: Documentation/, Guides/ Using User Fields# Once you have created a user field, it will be available in the following places: Task Modals: The user field will be displayed in the task creation and edit modals. Bases Filters: Add the field to Bases filter expressions (for example note.effort == \"high\") to narrow task lists and Kanban boards. Sorting: Use the Bases sort menu to order tasks by the user field. Grouping: Use the Bases group menu to create swimlanes or list groupings based on the user field. To verify a new field is active in workflow, add it to at least one saved view. Frontmatter# User field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter. For example, if you create a user field with the property name \"my_field\", the data for that field will be stored in the frontmatter as follows: --- my_field: value ---"},{"route":"/obsidian/getting-started/existing-vault/","title":"Adopt TaskNotes in an existing vault","description":"Adopt TaskNotes in a vault that already contains tasks, tags, and custom frontmatter without rewriting everything first.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/getting-started/existing-vault.md","namespace":"obsidian","relativePath":"getting-started/existing-vault.md","raw":"---\ndescription: Adopt TaskNotes in a vault that already contains tasks, tags, and custom frontmatter without rewriting everything first.\n---\n\n# Adopt TaskNotes in an existing vault\n\nTaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions.\n\n## 1. Back up the vault\n\nMake a complete vault backup, including the hidden `.obsidian` directory. The task notes themselves are Markdown, while TaskNotes settings live in `.obsidian/plugins/tasknotes/data.json`.\n\n## 2. Inspect a representative note\n\nChoose one existing task and record:\n\n- The property or tag that distinguishes tasks from ordinary notes\n- The property names used for title, status, priority, due date, and scheduled date\n- Whether contexts and tags are stored with or without display prefixes\n- The folder patterns that should be included or excluded\n\nCanonical frontmatter values do not include natural-language trigger characters. Store `office`, not `@office`, and `review`, not `#review`.\n\n```yaml\n---\ntype: task\nstatus: open\ncontexts:\n - office\ntags:\n - review\n---\n```\n\n## 3. Choose task identification\n\nOpen **Settings → TaskNotes → General**.\n\n- Choose **Tag** if every task contains one identifying tag, such as `task`.\n- Choose **Property** if a property/value pair identifies tasks, such as `type: task`.\n- Add archive, template, attachment, or other non-task locations to **Excluded folders**.\n\nTask identification controls indexing and every generated Base filter. Confirm it before regenerating Base files.\n\n## 4. Map properties\n\nOpen **Settings → TaskNotes → Task properties** and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both `due` and `deadline`.\n\nStart with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the [property types reference](../settings/property-types-reference.md) to check value shapes.\n\n## 5. Test one note\n\nOpen one existing note and confirm that TaskNotes recognizes it. Use **TaskNotes: Quick actions for current task** and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set.\n\nIf the note is not recognized, use the [troubleshooting decision tree](../troubleshooting.md#tasks-not-appearing-in-views).\n\n## 6. Generate views from the final mapping\n\nOpen **Settings → TaskNotes → General → Views & base files** and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping.\n\nThe update action replaces configured default Base files. Copy any customized Base to a new filename before updating it.\n\n## 7. Convert incrementally\n\nConvert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default `TaskNotes/Tasks` folder if your storage and exclusion settings already cover their location.\n","aliases":["/getting-started/existing-vault/"],"toc":[{"level":2,"id":"1-back-up-the-vault","text":"1. Back up the vault"},{"level":2,"id":"2-inspect-a-representative-note","text":"2. Inspect a representative note"},{"level":2,"id":"3-choose-task-identification","text":"3. Choose task identification"},{"level":2,"id":"4-map-properties","text":"4. Map properties"},{"level":2,"id":"5-test-one-note","text":"5. Test one note"},{"level":2,"id":"6-generate-views-from-the-final-mapping","text":"6. Generate views from the final mapping"},{"level":2,"id":"7-convert-incrementally","text":"7. Convert incrementally"}],"html":"

TaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions.

\n

1. Back up the vault#

\n

Make a complete vault backup, including the hidden .obsidian directory. The task notes themselves are Markdown, while TaskNotes settings live in .obsidian/plugins/tasknotes/data.json.

\n

2. Inspect a representative note#

\n

Choose one existing task and record:

\n
    \n
  • The property or tag that distinguishes tasks from ordinary notes
  • \n
  • The property names used for title, status, priority, due date, and scheduled date
  • \n
  • Whether contexts and tags are stored with or without display prefixes
  • \n
  • The folder patterns that should be included or excluded
  • \n
\n

Canonical frontmatter values do not include natural-language trigger characters. Store office, not @office, and review, not #review.

\n
---\ntype: task\nstatus: open\ncontexts:\n  - office\ntags:\n  - review\n---\n

3. Choose task identification#

\n

Open Settings → TaskNotes → General.

\n
    \n
  • Choose Tag if every task contains one identifying tag, such as task.
  • \n
  • Choose Property if a property/value pair identifies tasks, such as type: task.
  • \n
  • Add archive, template, attachment, or other non-task locations to Excluded folders.
  • \n
\n

Task identification controls indexing and every generated Base filter. Confirm it before regenerating Base files.

\n

4. Map properties#

\n

Open Settings → TaskNotes → Task properties and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both due and deadline.

\n

Start with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the property types reference to check value shapes.

\n

5. Test one note#

\n

Open one existing note and confirm that TaskNotes recognizes it. Use TaskNotes: Quick actions for current task and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set.

\n

If the note is not recognized, use the troubleshooting decision tree.

\n

6. Generate views from the final mapping#

\n

Open Settings → TaskNotes → General → Views & base files and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping.

\n

The update action replaces configured default Base files. Copy any customized Base to a new filename before updating it.

\n

7. Convert incrementally#

\n

Convert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default TaskNotes/Tasks folder if your storage and exclusion settings already cover their location.

\n","text":"TaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions. 1. Back up the vault# Make a complete vault backup, including the hidden .obsidian directory. The task notes themselves are Markdown, while TaskNotes settings live in .obsidian/plugins/tasknotes/data.json. 2. Inspect a representative note# Choose one existing task and record: The property or tag that distinguishes tasks from ordinary notes The property names used for title, status, priority, due date, and scheduled date Whether contexts and tags are stored with or without display prefixes The folder patterns that should be included or excluded Canonical frontmatter values do not include natural-language trigger characters. Store office, not @office, and review, not #review. --- type: task status: open contexts: - office tags: - review --- 3. Choose task identification# Open Settings → TaskNotes → General. Choose Tag if every task contains one identifying tag, such as task. Choose Property if a property/value pair identifies tasks, such as type: task. Add archive, template, attachment, or other non-task locations to Excluded folders. Task identification controls indexing and every generated Base filter. Confirm it before regenerating Base files. 4. Map properties# Open Settings → TaskNotes → Task properties and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both due and deadline. Start with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the property types reference to check value shapes. 5. Test one note# Open one existing note and confirm that TaskNotes recognizes it. Use TaskNotes: Quick actions for current task and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set. If the note is not recognized, use the troubleshooting decision tree. 6. Generate views from the final mapping# Open Settings → TaskNotes → General → Views & base files and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping. The update action replaces configured default Base files. Copy any customized Base to a new filename before updating it. 7. Convert incrementally# Convert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default TaskNotes/Tasks folder if your storage and exclusion settings already cover their location."},{"route":"/obsidian/getting-started/mobile/","title":"Obsidian mobile guide","description":"What is shared between TaskNotes desktop and mobile, and which integrations differ on mobile.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/getting-started/mobile.md","namespace":"obsidian","relativePath":"getting-started/mobile.md","raw":"---\ndescription: What is shared between TaskNotes desktop and mobile, and which integrations differ on mobile.\n---\n\n# Obsidian mobile guide\n\nTaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including `.base` files and `.obsidian/plugins/tasknotes/data.json`, when you want the same configuration on every device.\n\n## Before opening TaskNotes\n\n1. Install an Obsidian mobile version compatible with the current [TaskNotes requirement](../reference/compatibility.md).\n2. Enable the **Bases** core plugin.\n3. Confirm the TaskNotes plugin and its `data.json` have finished syncing before changing settings.\n4. Open a small default Base first and allow the initial index to finish.\n\n## Mobile differences\n\n| Area | Mobile behavior |\n| --- | --- |\n| HTTP API and MCP server | Desktop only. The HTTP API settings section is hidden on mobile. |\n| Calendar integrations | Available, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem. |\n| Settings layout | Uses the same six tabs. Desktop-only controls are omitted where they cannot run. |\n| Keyboard commands | Commands remain available in the command palette; desktop key bindings may not have a mobile equivalent. |\n| Wide views | Calendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration. |\n\n## A practical mobile setup\n\n- Keep task cards compact under **Settings → Appearance and UI**.\n- Limit visible Base columns and calendar event layers.\n- Increase remote calendar refresh intervals when mobile networking or battery use matters.\n- Use the task creation modal or command palette for predictable capture.\n- Keep HTTP automation on a desktop Obsidian instance.\n\n## If mobile stops loading tasks\n\nWait for vault sync to finish, confirm Bases is enabled, and run **TaskNotes: Refresh cache**. Then reopen the affected Base. If the problem is isolated to calendar data, enable **Disable calendar integration on mobile** and restart Obsidian before investigating the provider connection on desktop.\n","aliases":["/getting-started/mobile/"],"toc":[{"level":2,"id":"before-opening-tasknotes","text":"Before opening TaskNotes"},{"level":2,"id":"mobile-differences","text":"Mobile differences"},{"level":2,"id":"a-practical-mobile-setup","text":"A practical mobile setup"},{"level":2,"id":"if-mobile-stops-loading-tasks","text":"If mobile stops loading tasks"}],"html":"

TaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including .base files and .obsidian/plugins/tasknotes/data.json, when you want the same configuration on every device.

\n

Before opening TaskNotes#

\n
    \n
  1. Install an Obsidian mobile version compatible with the current TaskNotes requirement.
  2. \n
  3. Enable the Bases core plugin.
  4. \n
  5. Confirm the TaskNotes plugin and its data.json have finished syncing before changing settings.
  6. \n
  7. Open a small default Base first and allow the initial index to finish.
  8. \n
\n

Mobile differences#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
AreaMobile behavior
HTTP API and MCP serverDesktop only. The HTTP API settings section is hidden on mobile.
Calendar integrationsAvailable, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem.
Settings layoutUses the same six tabs. Desktop-only controls are omitted where they cannot run.
Keyboard commandsCommands remain available in the command palette; desktop key bindings may not have a mobile equivalent.
Wide viewsCalendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration.
\n

A practical mobile setup#

\n
    \n
  • Keep task cards compact under Settings → Appearance and UI.
  • \n
  • Limit visible Base columns and calendar event layers.
  • \n
  • Increase remote calendar refresh intervals when mobile networking or battery use matters.
  • \n
  • Use the task creation modal or command palette for predictable capture.
  • \n
  • Keep HTTP automation on a desktop Obsidian instance.
  • \n
\n

If mobile stops loading tasks#

\n

Wait for vault sync to finish, confirm Bases is enabled, and run TaskNotes: Refresh cache. Then reopen the affected Base. If the problem is isolated to calendar data, enable Disable calendar integration on mobile and restart Obsidian before investigating the provider connection on desktop.

\n","text":"TaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including .base files and .obsidian/plugins/tasknotes/data.json, when you want the same configuration on every device. Before opening TaskNotes# Install an Obsidian mobile version compatible with the current TaskNotes requirement. Enable the Bases core plugin. Confirm the TaskNotes plugin and its data.json have finished syncing before changing settings. Open a small default Base first and allow the initial index to finish. Mobile differences# Area Mobile behavior HTTP API and MCP server Desktop only. The HTTP API settings section is hidden on mobile. Calendar integrations Available, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem. Settings layout Uses the same six tabs. Desktop-only controls are omitted where they cannot run. Keyboard commands Commands remain available in the command palette; desktop key bindings may not have a mobile equivalent. Wide views Calendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration. A practical mobile setup# Keep task cards compact under Settings → Appearance and UI. Limit visible Base columns and calendar event layers. Increase remote calendar refresh intervals when mobile networking or battery use matters. Use the task creation modal or command palette for predictable capture. Keep HTTP automation on a desktop Obsidian instance. If mobile stops loading tasks# Wait for vault sync to finish, confirm Bases is enabled, and run TaskNotes: Refresh cache. Then reopen the affected Base. If the problem is isolated to calendar data, enable Disable calendar integration on mobile and restart Obsidian before investigating the provider connection on desktop."},{"route":"/obsidian/guides/backup-recovery/","title":"Backup, restore, and removal","description":"Back up, restore, reset, and uninstall TaskNotes while protecting task notes, views, settings, and integration data.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/guides/backup-recovery.md","namespace":"obsidian","relativePath":"guides/backup-recovery.md","raw":"---\ndescription: Back up, restore, reset, and uninstall TaskNotes while protecting task notes, views, settings, and integration data.\n---\n\n# Backup, restore, and removal\n\nTaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both.\n\n## What to back up\n\n| Data | Typical location | Why it matters |\n| --- | --- | --- |\n| Task notes | Your configured task folders | Titles, properties, details, recurrence, and time entries |\n| Base views | `TaskNotes/Views/` or custom paths | Filters, formulas, layout, and custom views |\n| Plugin settings | `.obsidian/plugins/tasknotes/data.json` | Field mapping, statuses, defaults, integrations, and view command paths |\n| Daily notes | Your daily-note folder | Pomodoro history when daily-note storage is enabled |\n| mdbase configuration | `tasknotes.yaml`, `mdbase.yaml`, or `.mdbase/` when configured | Shared collection and schema configuration |\n\nTreat `data.json` as sensitive because integration configuration can include credentials or tokens. Store backups accordingly.\n\n## Create a restorable backup\n\n1. Close Obsidian or disable TaskNotes so settings are not being written.\n2. Copy the entire vault, including hidden files.\n3. Verify the backup contains `.obsidian/plugins/tasknotes/data.json`.\n4. Keep at least one version from before a migration or bulk edit.\n\nFile-history sync is useful, but it is not a substitute for a separate tested backup.\n\n## Restore\n\n1. Close Obsidian.\n2. Restore task notes and Base files first.\n3. Restore `.obsidian/plugins/tasknotes/data.json` if you also need the previous settings.\n4. Reopen Obsidian and confirm Bases is enabled.\n5. Run **TaskNotes: Refresh cache** and open one default Base.\n\nIf provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens.\n\n## Reset configuration safely\n\nDo not delete `data.json` as a first troubleshooting step.\n\n1. Close Obsidian.\n2. Rename `data.json` to `data.json.backup-YYYY-MM-DD`.\n3. Reopen Obsidian and test with fresh defaults.\n4. Restore the backup while Obsidian is closed if the reset does not help.\n\nA reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files.\n\n## Uninstall\n\nDisabling or uninstalling TaskNotes leaves task notes and `.base` files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep.\n\nTo remove plugin settings as well, close Obsidian and remove `.obsidian/plugins/tasknotes/` after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render.\n\n## Recovery checklist\n\n- Missing tasks: restore the note files, then verify task identification and excluded folders.\n- Missing settings: restore `data.json` with Obsidian closed.\n- Broken default views: regenerate them from **General → Views & base files**.\n- Broken custom views: restore the individual `.base` files from history.\n- Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter.\n","aliases":["/guides/backup-recovery/"],"toc":[{"level":2,"id":"what-to-back-up","text":"What to back up"},{"level":2,"id":"create-a-restorable-backup","text":"Create a restorable backup"},{"level":2,"id":"restore","text":"Restore"},{"level":2,"id":"reset-configuration-safely","text":"Reset configuration safely"},{"level":2,"id":"uninstall","text":"Uninstall"},{"level":2,"id":"recovery-checklist","text":"Recovery checklist"}],"html":"

TaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both.

\n

What to back up#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
DataTypical locationWhy it matters
Task notesYour configured task foldersTitles, properties, details, recurrence, and time entries
Base viewsTaskNotes/Views/ or custom pathsFilters, formulas, layout, and custom views
Plugin settings.obsidian/plugins/tasknotes/data.jsonField mapping, statuses, defaults, integrations, and view command paths
Daily notesYour daily-note folderPomodoro history when daily-note storage is enabled
mdbase configurationtasknotes.yaml, mdbase.yaml, or .mdbase/ when configuredShared collection and schema configuration
\n

Treat data.json as sensitive because integration configuration can include credentials or tokens. Store backups accordingly.

\n

Create a restorable backup#

\n
    \n
  1. Close Obsidian or disable TaskNotes so settings are not being written.
  2. \n
  3. Copy the entire vault, including hidden files.
  4. \n
  5. Verify the backup contains .obsidian/plugins/tasknotes/data.json.
  6. \n
  7. Keep at least one version from before a migration or bulk edit.
  8. \n
\n

File-history sync is useful, but it is not a substitute for a separate tested backup.

\n

Restore#

\n
    \n
  1. Close Obsidian.
  2. \n
  3. Restore task notes and Base files first.
  4. \n
  5. Restore .obsidian/plugins/tasknotes/data.json if you also need the previous settings.
  6. \n
  7. Reopen Obsidian and confirm Bases is enabled.
  8. \n
  9. Run TaskNotes: Refresh cache and open one default Base.
  10. \n
\n

If provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens.

\n

Reset configuration safely#

\n

Do not delete data.json as a first troubleshooting step.

\n
    \n
  1. Close Obsidian.
  2. \n
  3. Rename data.json to data.json.backup-YYYY-MM-DD.
  4. \n
  5. Reopen Obsidian and test with fresh defaults.
  6. \n
  7. Restore the backup while Obsidian is closed if the reset does not help.
  8. \n
\n

A reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files.

\n

Uninstall#

\n

Disabling or uninstalling TaskNotes leaves task notes and .base files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep.

\n

To remove plugin settings as well, close Obsidian and remove .obsidian/plugins/tasknotes/ after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render.

\n

Recovery checklist#

\n
    \n
  • Missing tasks: restore the note files, then verify task identification and excluded folders.
  • \n
  • Missing settings: restore data.json with Obsidian closed.
  • \n
  • Broken default views: regenerate them from General → Views & base files.
  • \n
  • Broken custom views: restore the individual .base files from history.
  • \n
  • Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter.
  • \n
\n","text":"TaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both. What to back up# Data Typical location Why it matters Task notes Your configured task folders Titles, properties, details, recurrence, and time entries Base views TaskNotes/Views/ or custom paths Filters, formulas, layout, and custom views Plugin settings .obsidian/plugins/tasknotes/data.json Field mapping, statuses, defaults, integrations, and view command paths Daily notes Your daily-note folder Pomodoro history when daily-note storage is enabled mdbase configuration tasknotes.yaml, mdbase.yaml, or .mdbase/ when configured Shared collection and schema configuration Treat data.json as sensitive because integration configuration can include credentials or tokens. Store backups accordingly. Create a restorable backup# Close Obsidian or disable TaskNotes so settings are not being written. Copy the entire vault, including hidden files. Verify the backup contains .obsidian/plugins/tasknotes/data.json. Keep at least one version from before a migration or bulk edit. File-history sync is useful, but it is not a substitute for a separate tested backup. Restore# Close Obsidian. Restore task notes and Base files first. Restore .obsidian/plugins/tasknotes/data.json if you also need the previous settings. Reopen Obsidian and confirm Bases is enabled. Run TaskNotes: Refresh cache and open one default Base. If provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens. Reset configuration safely# Do not delete data.json as a first troubleshooting step. Close Obsidian. Rename data.json to data.json.backup-YYYY-MM-DD. Reopen Obsidian and test with fresh defaults. Restore the backup while Obsidian is closed if the reset does not help. A reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files. Uninstall# Disabling or uninstalling TaskNotes leaves task notes and .base files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep. To remove plugin settings as well, close Obsidian and remove .obsidian/plugins/tasknotes/ after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render. Recovery checklist# Missing tasks: restore the note files, then verify task identification and excluded folders. Missing settings: restore data.json with Obsidian closed. Broken default views: regenerate them from General → Views & base files. Broken custom views: restore the individual .base files from history. Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter."},{"route":"/obsidian/guides/custom-bases/","title":"Build a custom Base","description":"Create a custom Obsidian Base for TaskNotes while keeping generated defaults safe and upgradeable.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/guides/custom-bases.md","namespace":"obsidian","relativePath":"guides/custom-bases.md","raw":"---\ndescription: Create a custom Obsidian Base for TaskNotes while keeping generated defaults safe and upgradeable.\n---\n\n# Build a custom Base\n\nTaskNotes views are ordinary Obsidian `.base` files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy.\n\n## Start from a copy\n\n1. Open `TaskNotes/Views/` in the file explorer.\n2. Duplicate the closest default, such as `tasks-default.base`.\n3. Rename the copy, for example `work-tasks.base`.\n4. Open the copy and make changes with the Bases interface or source editor.\n\nAvoid editing the only copy of a generated default. **Update default base files** replaces the files configured as defaults.\n\n## Preserve task identification\n\nEvery task view needs a filter that matches the identification method in **Settings → TaskNotes → General**.\n\nFor tag identification:\n\n```yaml\nfilters:\n and:\n - file.hasTag(\"task\")\n```\n\nFor property identification:\n\n```yaml\nfilters:\n and:\n - note[\"type\"] == \"task\"\n```\n\nAlso preserve any excluded-folder conditions generated from your settings.\n\n## Add a focused view\n\nThis example starts with recognized tasks, then limits the view to the `work` context:\n\n```yaml\nfilters:\n and:\n - file.hasTag(\"task\")\n - list(contexts).contains(\"work\")\n\nviews:\n - type: tasknotesTaskList\n name: Work\n order:\n - status\n - priority\n - due\n - file.name\n sort:\n - column: due\n direction: ASC\n```\n\nUse canonical stored values in filters. Natural-language prefixes such as `@` and `#` are input syntax, not part of stored context and tag values.\n\n## Point a command at the custom Base\n\nOpen **Settings → TaskNotes → General → View commands** and change the relevant command path. Resetting that mapping returns it to the generated default path.\n\n## Upgrade safely\n\nWhen TaskNotes ships improved templates:\n\n1. Keep your custom file at its own path.\n2. Run **Update default base files**.\n3. Compare the regenerated default with your copy.\n4. Bring across only the formulas, filters, or view options you want.\n\nThe [generated template reference](../reference/default-base-templates.md) always reflects the current source and default field mapping.\n\n## Recovery\n\nIf a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time.\n","aliases":["/guides/custom-bases/"],"toc":[{"level":2,"id":"start-from-a-copy","text":"Start from a copy"},{"level":2,"id":"preserve-task-identification","text":"Preserve task identification"},{"level":2,"id":"add-a-focused-view","text":"Add a focused view"},{"level":2,"id":"point-a-command-at-the-custom-base","text":"Point a command at the custom Base"},{"level":2,"id":"upgrade-safely","text":"Upgrade safely"},{"level":2,"id":"recovery","text":"Recovery"}],"html":"

TaskNotes views are ordinary Obsidian .base files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy.

\n

Start from a copy#

\n
    \n
  1. Open TaskNotes/Views/ in the file explorer.
  2. \n
  3. Duplicate the closest default, such as tasks-default.base.
  4. \n
  5. Rename the copy, for example work-tasks.base.
  6. \n
  7. Open the copy and make changes with the Bases interface or source editor.
  8. \n
\n

Avoid editing the only copy of a generated default. Update default base files replaces the files configured as defaults.

\n

Preserve task identification#

\n

Every task view needs a filter that matches the identification method in Settings → TaskNotes → General.

\n

For tag identification:

\n
filters:\n  and:\n    - file.hasTag("task")\n

For property identification:

\n
filters:\n  and:\n    - note["type"] == "task"\n

Also preserve any excluded-folder conditions generated from your settings.

\n

Add a focused view#

\n

This example starts with recognized tasks, then limits the view to the work context:

\n
filters:\n  and:\n    - file.hasTag("task")\n    - list(contexts).contains("work")\n\nviews:\n  - type: tasknotesTaskList\n    name: Work\n    order:\n      - status\n      - priority\n      - due\n      - file.name\n    sort:\n      - column: due\n        direction: ASC\n

Use canonical stored values in filters. Natural-language prefixes such as @ and # are input syntax, not part of stored context and tag values.

\n

Point a command at the custom Base#

\n

Open Settings → TaskNotes → General → View commands and change the relevant command path. Resetting that mapping returns it to the generated default path.

\n

Upgrade safely#

\n

When TaskNotes ships improved templates:

\n
    \n
  1. Keep your custom file at its own path.
  2. \n
  3. Run Update default base files.
  4. \n
  5. Compare the regenerated default with your copy.
  6. \n
  7. Bring across only the formulas, filters, or view options you want.
  8. \n
\n

The generated template reference always reflects the current source and default field mapping.

\n

Recovery#

\n

If a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time.

\n","text":"TaskNotes views are ordinary Obsidian .base files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy. Start from a copy# Open TaskNotes/Views/ in the file explorer. Duplicate the closest default, such as tasks-default.base. Rename the copy, for example work-tasks.base. Open the copy and make changes with the Bases interface or source editor. Avoid editing the only copy of a generated default. Update default base files replaces the files configured as defaults. Preserve task identification# Every task view needs a filter that matches the identification method in Settings → TaskNotes → General. For tag identification: filters: and: - file.hasTag(\"task\") For property identification: filters: and: - note[\"type\"] == \"task\" Also preserve any excluded-folder conditions generated from your settings. Add a focused view# This example starts with recognized tasks, then limits the view to the work context: filters: and: - file.hasTag(\"task\") - list(contexts).contains(\"work\") views: - type: tasknotesTaskList name: Work order: - status - priority - due - file.name sort: - column: due direction: ASC Use canonical stored values in filters. Natural-language prefixes such as @ and # are input syntax, not part of stored context and tag values. Point a command at the custom Base# Open Settings → TaskNotes → General → View commands and change the relevant command path. Resetting that mapping returns it to the generated default path. Upgrade safely# When TaskNotes ships improved templates: Keep your custom file at its own path. Run Update default base files. Compare the regenerated default with your copy. Bring across only the formulas, filters, or view options you want. The generated template reference always reflects the current source and default field mapping. Recovery# If a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time."},{"route":"/obsidian/HTTP_API/","title":"TaskNotes HTTP API","description":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/HTTP_API.md","namespace":"obsidian","relativePath":"HTTP_API.md","raw":"# TaskNotes HTTP API\n\nThe TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.\n\n## Availability\n\n- Desktop only\n- Disabled by default\n- Started when Obsidian starts and TaskNotes API is enabled\n- Bound to loopback (`127.0.0.1`) only, not the local network\n- Browser CORS requests are allowed only from loopback origins such as\n `localhost`, `127.0.0.1`, and `[::1]`\n- Not available on mobile\n\nEnable it in `Settings -> TaskNotes -> Integrations -> HTTP API`.\n\n## Base URL\n\n`http://localhost:{PORT}`\n\nDefault port is `8080`.\n\n## Authentication\n\nAuthentication is optional.\n\n- If `apiAuthToken` is empty, all API requests are accepted.\n- If `apiAuthToken` is set, send `Authorization: Bearer `.\n- Set a token for any workflow where local browser pages, scripts, or other\n desktop apps are not fully trusted.\n\nExample:\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_TOKEN\" http://localhost:8080/api/health\n```\n\n## Response Format\n\nSuccess:\n\n```json\n{\n \"success\": true,\n \"data\": {}\n}\n```\n\nError:\n\n```json\n{\n \"success\": false,\n \"error\": \"Error message\"\n}\n```\n\n## Endpoint Index\n\n### System\n\n- `GET /api/health`\n- `GET /api/docs`\n- `GET /api/docs/ui`\n- `POST /api/nlp/parse`\n- `POST /api/nlp/create`\n\n### Tasks\n\n- `GET /api/tasks`\n- `POST /api/tasks`\n- `GET /api/tasks/:id`\n- `PUT /api/tasks/:id`\n- `DELETE /api/tasks/:id`\n- `POST /api/tasks/:id/toggle-status`\n- `POST /api/tasks/:id/archive`\n- `POST /api/tasks/:id/complete-instance`\n- `POST /api/tasks/:id/materialize-occurrence`\n- `POST /api/tasks/query`\n- `GET /api/filter-options`\n- `GET /api/stats`\n\n### Bases\n\n- `POST /api/bases/default-files/update`\n\n### Time Tracking\n\n- `POST /api/tasks/:id/time/start`\n- `POST /api/tasks/:id/time/start-with-description`\n- `POST /api/tasks/:id/time/stop`\n- `GET /api/tasks/:id/time`\n- `GET /api/time/active`\n- `GET /api/time/summary`\n\n### Pomodoro\n\n- `POST /api/pomodoro/start`\n- `POST /api/pomodoro/stop`\n- `POST /api/pomodoro/pause`\n- `POST /api/pomodoro/resume`\n- `GET /api/pomodoro/status`\n- `GET /api/pomodoro/sessions`\n- `GET /api/pomodoro/stats`\n\n### Calendars\n\n- `GET /api/calendars`\n- `GET /api/calendars/google`\n- `GET /api/calendars/microsoft`\n- `GET /api/calendars/subscriptions`\n- `GET /api/calendars/events`\n\n### Webhooks\n\n- `POST /api/webhooks`\n- `GET /api/webhooks`\n- `DELETE /api/webhooks/:id`\n- `GET /api/webhooks/deliveries`\n\nSee `docs/webhooks.md` for event and transform details.\n\n## Route Details\n\n## Health\n\n### `GET /api/health`\n\nReturns service state plus vault metadata.\n\n```bash\ncurl http://localhost:8080/api/health\n```\n\n## Tasks\n\n### `GET /api/tasks`\n\nBasic task listing with pagination only.\n\nQuery params:\n\n- `limit` (default `50`, max `200`)\n- `offset` (default `0`)\n\nImportant:\n\n- Filtering params such as `status`, `priority`, `tag`, `project`, `context`, `due_before`, `due_after`, `overdue`, `completed`, `archived`, and `sort` are rejected on this endpoint with HTTP `400`.\n- Use `POST /api/tasks/query` for filtering.\n\nExample:\n\n```bash\ncurl \"http://localhost:8080/api/tasks?limit=25&offset=0\"\n```\n\nResponse fields:\n\n- `data.tasks`\n- `data.pagination` with `total`, `offset`, `limit`, `hasMore`\n- `data.vault`\n- `data.note`\n- Task objects include configured TaskNotes user fields in `customProperties`, keyed by their frontmatter property key.\n\n### `POST /api/tasks`\n\nCreate one task.\n\nRequired:\n\n- `title`\n\nCommon optional fields:\n\n- `details`, `status`, `priority`, `due`, `scheduled`\n- `tags`, `contexts`, `projects`\n- `recurrence`, `recurrence_anchor`, `timeEstimate`, `reminders`\n- `blockedBy`\n\n`blockedBy` accepts an array of dependency objects:\n\n- `uid`: link or identifier for the blocking task, such as `[[Project setup]]`\n- `reltype`: one of `FINISHTOSTART`, `FINISHTOFINISH`, `STARTTOSTART`, or `STARTTOFINISH`\n- `gap`: optional ISO 8601 duration, such as `P1D`\n\n`blocking` is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' `blockedBy` fields.\n\n```bash\ncurl -X POST http://localhost:8080/api/tasks \\\n -H \"Content-Type: application/json\" \\\n -d '{\"title\":\"Review docs\",\"priority\":\"high\",\"blockedBy\":[{\"uid\":\"[[Draft docs]]\",\"reltype\":\"FINISHTOSTART\"}]}'\n```\n\nReturns HTTP `201` with created task data.\n\n### `GET /api/tasks/:id`\n\nGet one task by path id.\n\n- `:id` must be URL-encoded task path.\n- Single-task reads include the task body in `details`.\n- Configured TaskNotes user fields are returned in `customProperties`, keyed by their frontmatter property key.\n\n```bash\ncurl \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\"\n```\n\n### `PUT /api/tasks/:id`\n\nUpdate task with partial payload.\n\nConfigured TaskNotes user fields can be updated either by their frontmatter property key or via `customProperties`.\n\n```bash\ncurl -X PUT \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"status\":\"in-progress\"}'\n```\n\n### `DELETE /api/tasks/:id`\n\nDelete task file.\n\n### `POST /api/tasks/:id/toggle-status`\n\nToggle task status via configured workflow.\n\n### `POST /api/tasks/:id/archive`\n\nToggle archive state.\n\n### `POST /api/tasks/:id/complete-instance`\n\nComplete recurring instance.\n\nRequest body:\n\n- Optional `date` (ISO string). If omitted, uses current date context.\n\nWhen the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to **Create next after completion** and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual `complete_instances` entry.\n\n### `POST /api/tasks/:id/materialize-occurrence`\n\nCreate or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date.\n\nRequest body:\n\n- Required `date` (ISO date string, for example `2026-06-01`)\n\n### `POST /api/tasks/query`\n\nAdvanced filtering.\n\nRequest body is a `FilterQuery` object. `FilterQuery` is still the supported advanced query shape for the HTTP API.\n\nThe root object is a group with:\n\n- `type: \"group\"`\n- `id`\n- `conjunction: \"and\" | \"or\"`\n- `children` (conditions or groups)\n\nOptional top-level query options:\n\n- `sortKey`, `sortDirection`\n- `groupKey`, `subgroupKey`\n\nExample:\n\n```json\n{\n \"type\": \"group\",\n \"id\": \"root\",\n \"conjunction\": \"and\",\n \"children\": [\n {\n \"type\": \"condition\",\n \"id\": \"c1\",\n \"property\": \"status\",\n \"operator\": \"is\",\n \"value\": \"open\"\n }\n ],\n \"sortKey\": \"due\",\n \"sortDirection\": \"asc\"\n}\n```\n\nFilter tasks by context:\n\n```json\n{\n \"type\": \"group\",\n \"id\": \"root\",\n \"conjunction\": \"and\",\n \"children\": [\n {\n \"type\": \"condition\",\n \"id\": \"context\",\n \"property\": \"contexts\",\n \"operator\": \"contains\",\n \"value\": \"@office\"\n }\n ],\n \"sortKey\": \"due\",\n \"sortDirection\": \"asc\"\n}\n```\n\nFilter active, unarchived tasks, similar to the default available-task view:\n\n```json\n{\n \"type\": \"group\",\n \"id\": \"root\",\n \"conjunction\": \"and\",\n \"children\": [\n {\n \"type\": \"condition\",\n \"id\": \"not-archived\",\n \"property\": \"archived\",\n \"operator\": \"is-not-checked\"\n },\n {\n \"type\": \"condition\",\n \"id\": \"not-completed\",\n \"property\": \"status.isCompleted\",\n \"operator\": \"is-not-checked\"\n }\n ],\n \"sortKey\": \"due\",\n \"sortDirection\": \"asc\",\n \"groupKey\": \"none\"\n}\n```\n\nCondition fields:\n\n- `type`: `\"condition\"`\n- `id`: any stable string for your client\n- `property`: a task property, such as `title`, `status`, `priority`, `tags`, `contexts`, `projects`, `blockedBy`, `blocking`, `due`, `scheduled`, `completedDate`, `dateCreated`, `dateModified`, `archived`, `hasSubtasks`, `dependencies.isBlocked`, `dependencies.isBlocking`, `timeEstimate`, `recurrence`, or `status.isCompleted`\n- `operator`: one of `is`, `is-not`, `contains`, `does-not-contain`, `is-before`, `is-after`, `is-on-or-before`, `is-on-or-after`, `is-empty`, `is-not-empty`, `is-checked`, `is-not-checked`, `is-greater-than`, `is-less-than`, `is-greater-than-or-equal`, or `is-less-than-or-equal`\n- `value`: required for comparison operators, omitted for empty/checked operators\n\nFor user-defined fields, use `property: \"user:\"`.\n\nResponse:\n\n- `data.tasks`\n- `data.total`\n- `data.filtered`\n- `data.vault`\n\n### `GET /api/filter-options`\n\nReturns filter options for UI builders.\n\n### `GET /api/stats`\n\nReturns summary counts:\n\n- `total`, `completed`, `active`, `overdue`, `archived`, `withTimeTracking`\n\n## Bases\n\n### `POST /api/bases/default-files/update`\n\nOverwrite the configured default TaskNotes `.base` files with templates generated from the current TaskNotes settings. This is the same write operation as **Settings -> TaskNotes -> Views & base files -> Update files** and replaces manual edits in those configured default files.\n\n```bash\ncurl -X POST http://localhost:8080/api/bases/default-files/update\n```\n\nResponse fields:\n\n- `data.created`: default files created because they were missing\n- `data.updated`: existing default files overwritten with current templates\n- `data.skipped`: configured default files skipped\n\n## Time Tracking\n\n### `POST /api/tasks/:id/time/start`\n\nStarts a new active time entry for that task.\n\n### `POST /api/tasks/:id/time/start-with-description`\n\nStarts time tracking and writes `description` on the new active entry.\n\nRequest body:\n\n```json\n{\n \"description\": \"Implementation\"\n}\n```\n\n### `POST /api/tasks/:id/time/stop`\n\nStops active time entry for that task.\n\n### `GET /api/tasks/:id/time`\n\nReturns per-task time summary and entries.\n\n### `GET /api/time/active`\n\nReturns currently active sessions across tasks.\n\nImportant:\n\n- Multiple active sessions can exist across different tasks.\n\n### `GET /api/time/summary`\n\nReturns aggregate time summary.\n\nQuery params:\n\n- `period` (for example `today`, `week`, `month`, `all`)\n- `from` (ISO date)\n- `to` (ISO date)\n\nExample:\n\n```bash\ncurl \"http://localhost:8080/api/time/summary?period=week\"\n```\n\n## Pomodoro\n\n### `POST /api/pomodoro/start`\n\nStarts a session.\n\nOptional request fields:\n\n- `taskId` (URL path of task)\n- `duration` (number)\n\n### `POST /api/pomodoro/stop`\n\nStops and resets current session.\n\n### `POST /api/pomodoro/pause`\n\nPauses running session.\n\n### `POST /api/pomodoro/resume`\n\nResumes paused session.\n\n### `GET /api/pomodoro/status`\n\nReturns current state plus computed totals (`totalPomodoros`, `currentStreak`, `totalMinutesToday`).\n\n### `GET /api/pomodoro/sessions`\n\nReturns history.\n\nQuery params:\n\n- `limit`\n- `date` (`YYYY-MM-DD`)\n\n### `GET /api/pomodoro/stats`\n\nReturns stats for today or provided date.\n\nQuery params:\n\n- `date` (`YYYY-MM-DD`)\n\n## Calendars\n\n### `GET /api/calendars`\n\nReturns provider connectivity overview and subscription counts.\n\n### `GET /api/calendars/google`\n\nReturns Google provider details.\n\n- If disconnected, returns `{ \"connected\": false }`.\n\n### `GET /api/calendars/microsoft`\n\nReturns Microsoft provider details.\n\n- If disconnected, returns `{ \"connected\": false }`.\n\n### `GET /api/calendars/subscriptions`\n\nReturns ICS subscriptions with runtime fields such as `lastFetched` and `lastError`.\n\n### `GET /api/calendars/events`\n\nReturns merged event list from connected providers and ICS subscriptions.\n\nQuery params:\n\n- `start` (ISO date/datetime)\n- `end` (ISO date/datetime)\n\nResponse includes:\n\n- `events`\n- `total`\n- `sources` (counts by provider)\n\n## Webhooks\n\n### `POST /api/webhooks`\n\nRegisters webhook.\n\nRequired fields:\n\n- `url`\n- `events` (non-empty array)\n\nOptional fields:\n\n- `id`\n- `secret`\n- `active`\n- `transformFile`\n- `corsHeaders`\n\n### `GET /api/webhooks`\n\nLists registered webhooks. Stored secrets are not returned.\n\n### `DELETE /api/webhooks/:id`\n\nDeletes webhook.\n\n### `GET /api/webhooks/deliveries`\n\nReturns last 100 delivery records.\n\n## OpenAPI Docs\n\n### `GET /api/docs`\n\nReturns OpenAPI JSON generated from registered controllers.\n\n### `GET /api/docs/ui`\n\nReturns Swagger UI.\n\n## Errors\n\nCommon status codes:\n\n- `400` invalid request or invalid state\n- `401` missing/invalid bearer token (when auth token is configured)\n- `404` missing task/webhook/resource\n- `500` internal error\n\n## Security Notes\n\nCurrent behavior:\n\n- CORS allows all origins (`*`).\n- Transport is HTTP only (no TLS).\n- Node server is started with `server.listen(port)` and does not explicitly bind to `127.0.0.1`.\n\nPractical guidance:\n\n- Set an auth token.\n- Treat API port as sensitive and keep it firewalled.\n- If you expose this port outside localhost, route through a trusted reverse proxy and TLS.\n\n## Troubleshooting\n\n### API unavailable\n\n1. Confirm API is enabled in settings.\n2. Confirm Obsidian is running.\n3. Confirm selected port is free.\n4. Reload plugin or restart Obsidian after changing API enable/port.\n\n### `401 Authentication required`\n\n1. Check token value.\n2. Check `Bearer ` prefix.\n3. Remove whitespace around token.\n\n### Unexpected task list behavior\n\nIf you pass filters to `GET /api/tasks`, the endpoint returns `400` by design. Use `POST /api/tasks/query`.\n","aliases":["/HTTP_API/"],"toc":[{"level":2,"id":"availability","text":"Availability"},{"level":2,"id":"base-url","text":"Base URL"},{"level":2,"id":"authentication","text":"Authentication"},{"level":2,"id":"response-format","text":"Response Format"},{"level":2,"id":"endpoint-index","text":"Endpoint Index"},{"level":3,"id":"system","text":"System"},{"level":3,"id":"tasks","text":"Tasks"},{"level":3,"id":"bases","text":"Bases"},{"level":3,"id":"time-tracking","text":"Time Tracking"},{"level":3,"id":"pomodoro","text":"Pomodoro"},{"level":3,"id":"calendars","text":"Calendars"},{"level":3,"id":"webhooks","text":"Webhooks"},{"level":2,"id":"route-details","text":"Route Details"},{"level":2,"id":"health","text":"Health"},{"level":3,"id":"get-apihealth","text":"GET /api/health"},{"level":2,"id":"tasks-2","text":"Tasks"},{"level":3,"id":"get-apitasks","text":"GET /api/tasks"},{"level":3,"id":"post-apitasks","text":"POST /api/tasks"},{"level":3,"id":"get-apitasksid","text":"GET /api/tasks/:id"},{"level":3,"id":"put-apitasksid","text":"PUT /api/tasks/:id"},{"level":3,"id":"delete-apitasksid","text":"DELETE /api/tasks/:id"},{"level":3,"id":"post-apitasksidtoggle-status","text":"POST /api/tasks/:id/toggle-status"},{"level":3,"id":"post-apitasksidarchive","text":"POST /api/tasks/:id/archive"},{"level":3,"id":"post-apitasksidcomplete-instance","text":"POST /api/tasks/:id/complete-instance"},{"level":3,"id":"post-apitasksidmaterialize-occurrence","text":"POST /api/tasks/:id/materialize-occurrence"},{"level":3,"id":"post-apitasksquery","text":"POST /api/tasks/query"},{"level":3,"id":"get-apifilter-options","text":"GET /api/filter-options"},{"level":3,"id":"get-apistats","text":"GET /api/stats"},{"level":2,"id":"bases-2","text":"Bases"},{"level":3,"id":"post-apibasesdefault-filesupdate","text":"POST /api/bases/default-files/update"},{"level":2,"id":"time-tracking-2","text":"Time Tracking"},{"level":3,"id":"post-apitasksidtimestart","text":"POST /api/tasks/:id/time/start"},{"level":3,"id":"post-apitasksidtimestart-with-description","text":"POST /api/tasks/:id/time/start-with-description"},{"level":3,"id":"post-apitasksidtimestop","text":"POST /api/tasks/:id/time/stop"},{"level":3,"id":"get-apitasksidtime","text":"GET /api/tasks/:id/time"},{"level":3,"id":"get-apitimeactive","text":"GET /api/time/active"},{"level":3,"id":"get-apitimesummary","text":"GET /api/time/summary"},{"level":2,"id":"pomodoro-2","text":"Pomodoro"},{"level":3,"id":"post-apipomodorostart","text":"POST /api/pomodoro/start"},{"level":3,"id":"post-apipomodorostop","text":"POST /api/pomodoro/stop"},{"level":3,"id":"post-apipomodoropause","text":"POST /api/pomodoro/pause"},{"level":3,"id":"post-apipomodororesume","text":"POST /api/pomodoro/resume"},{"level":3,"id":"get-apipomodorostatus","text":"GET /api/pomodoro/status"},{"level":3,"id":"get-apipomodorosessions","text":"GET /api/pomodoro/sessions"},{"level":3,"id":"get-apipomodorostats","text":"GET /api/pomodoro/stats"},{"level":2,"id":"calendars-2","text":"Calendars"},{"level":3,"id":"get-apicalendars","text":"GET /api/calendars"},{"level":3,"id":"get-apicalendarsgoogle","text":"GET /api/calendars/google"},{"level":3,"id":"get-apicalendarsmicrosoft","text":"GET /api/calendars/microsoft"},{"level":3,"id":"get-apicalendarssubscriptions","text":"GET /api/calendars/subscriptions"},{"level":3,"id":"get-apicalendarsevents","text":"GET /api/calendars/events"},{"level":2,"id":"webhooks-2","text":"Webhooks"},{"level":3,"id":"post-apiwebhooks","text":"POST /api/webhooks"},{"level":3,"id":"get-apiwebhooks","text":"GET /api/webhooks"},{"level":3,"id":"delete-apiwebhooksid","text":"DELETE /api/webhooks/:id"},{"level":3,"id":"get-apiwebhooksdeliveries","text":"GET /api/webhooks/deliveries"},{"level":2,"id":"openapi-docs","text":"OpenAPI Docs"},{"level":3,"id":"get-apidocs","text":"GET /api/docs"},{"level":3,"id":"get-apidocsui","text":"GET /api/docs/ui"},{"level":2,"id":"errors","text":"Errors"},{"level":2,"id":"security-notes","text":"Security Notes"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"api-unavailable","text":"API unavailable"},{"level":3,"id":"401-authentication-required","text":"401 Authentication required"},{"level":3,"id":"unexpected-task-list-behavior","text":"Unexpected task list behavior"}],"html":"

The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.

\n

Availability#

\n
    \n
  • Desktop only
  • \n
  • Disabled by default
  • \n
  • Started when Obsidian starts and TaskNotes API is enabled
  • \n
  • Bound to loopback (127.0.0.1) only, not the local network
  • \n
  • Browser CORS requests are allowed only from loopback origins such as\nlocalhost, 127.0.0.1, and [::1]
  • \n
  • Not available on mobile
  • \n
\n

Enable it in Settings -> TaskNotes -> Integrations -> HTTP API.

\n

Base URL#

\n

http://localhost:{PORT}

\n

Default port is 8080.

\n

Authentication#

\n

Authentication is optional.

\n
    \n
  • If apiAuthToken is empty, all API requests are accepted.
  • \n
  • If apiAuthToken is set, send Authorization: Bearer <token>.
  • \n
  • Set a token for any workflow where local browser pages, scripts, or other\ndesktop apps are not fully trusted.
  • \n
\n

Example:

\n
curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:8080/api/health\n

Response Format#

\n

Success:

\n
{\n  "success": true,\n  "data": {}\n}\n

Error:

\n
{\n  "success": false,\n  "error": "Error message"\n}\n

Endpoint Index#

\n

System#

\n
    \n
  • GET /api/health
  • \n
  • GET /api/docs
  • \n
  • GET /api/docs/ui
  • \n
  • POST /api/nlp/parse
  • \n
  • POST /api/nlp/create
  • \n
\n

Tasks#

\n
    \n
  • GET /api/tasks
  • \n
  • POST /api/tasks
  • \n
  • GET /api/tasks/:id
  • \n
  • PUT /api/tasks/:id
  • \n
  • DELETE /api/tasks/:id
  • \n
  • POST /api/tasks/:id/toggle-status
  • \n
  • POST /api/tasks/:id/archive
  • \n
  • POST /api/tasks/:id/complete-instance
  • \n
  • POST /api/tasks/:id/materialize-occurrence
  • \n
  • POST /api/tasks/query
  • \n
  • GET /api/filter-options
  • \n
  • GET /api/stats
  • \n
\n

Bases#

\n
    \n
  • POST /api/bases/default-files/update
  • \n
\n

Time Tracking#

\n
    \n
  • POST /api/tasks/:id/time/start
  • \n
  • POST /api/tasks/:id/time/start-with-description
  • \n
  • POST /api/tasks/:id/time/stop
  • \n
  • GET /api/tasks/:id/time
  • \n
  • GET /api/time/active
  • \n
  • GET /api/time/summary
  • \n
\n

Pomodoro#

\n
    \n
  • POST /api/pomodoro/start
  • \n
  • POST /api/pomodoro/stop
  • \n
  • POST /api/pomodoro/pause
  • \n
  • POST /api/pomodoro/resume
  • \n
  • GET /api/pomodoro/status
  • \n
  • GET /api/pomodoro/sessions
  • \n
  • GET /api/pomodoro/stats
  • \n
\n

Calendars#

\n
    \n
  • GET /api/calendars
  • \n
  • GET /api/calendars/google
  • \n
  • GET /api/calendars/microsoft
  • \n
  • GET /api/calendars/subscriptions
  • \n
  • GET /api/calendars/events
  • \n
\n

Webhooks#

\n
    \n
  • POST /api/webhooks
  • \n
  • GET /api/webhooks
  • \n
  • DELETE /api/webhooks/:id
  • \n
  • GET /api/webhooks/deliveries
  • \n
\n

See docs/webhooks.md for event and transform details.

\n

Route Details#

\n

Health#

\n

GET /api/health#

\n

Returns service state plus vault metadata.

\n
curl http://localhost:8080/api/health\n

Tasks#

\n

GET /api/tasks#

\n

Basic task listing with pagination only.

\n

Query params:

\n
    \n
  • limit (default 50, max 200)
  • \n
  • offset (default 0)
  • \n
\n

Important:

\n
    \n
  • Filtering params such as status, priority, tag, project, context, due_before, due_after, overdue, completed, archived, and sort are rejected on this endpoint with HTTP 400.
  • \n
  • Use POST /api/tasks/query for filtering.
  • \n
\n

Example:

\n
curl "http://localhost:8080/api/tasks?limit=25&offset=0"\n

Response fields:

\n
    \n
  • data.tasks
  • \n
  • data.pagination with total, offset, limit, hasMore
  • \n
  • data.vault
  • \n
  • data.note
  • \n
  • Task objects include configured TaskNotes user fields in customProperties, keyed by their frontmatter property key.
  • \n
\n

POST /api/tasks#

\n

Create one task.

\n

Required:

\n
    \n
  • title
  • \n
\n

Common optional fields:

\n
    \n
  • details, status, priority, due, scheduled
  • \n
  • tags, contexts, projects
  • \n
  • recurrence, recurrence_anchor, timeEstimate, reminders
  • \n
  • blockedBy
  • \n
\n

blockedBy accepts an array of dependency objects:

\n
    \n
  • uid: link or identifier for the blocking task, such as [[Project setup]]
  • \n
  • reltype: one of FINISHTOSTART, FINISHTOFINISH, STARTTOSTART, or STARTTOFINISH
  • \n
  • gap: optional ISO 8601 duration, such as P1D
  • \n
\n

blocking is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' blockedBy fields.

\n
curl -X POST http://localhost:8080/api/tasks \\\n  -H "Content-Type: application/json" \\\n  -d '{"title":"Review docs","priority":"high","blockedBy":[{"uid":"[[Draft docs]]","reltype":"FINISHTOSTART"}]}'\n

Returns HTTP 201 with created task data.

\n

GET /api/tasks/:id#

\n

Get one task by path id.

\n
    \n
  • :id must be URL-encoded task path.
  • \n
  • Single-task reads include the task body in details.
  • \n
  • Configured TaskNotes user fields are returned in customProperties, keyed by their frontmatter property key.
  • \n
\n
curl "http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md"\n

PUT /api/tasks/:id#

\n

Update task with partial payload.

\n

Configured TaskNotes user fields can be updated either by their frontmatter property key or via customProperties.

\n
curl -X PUT "http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md" \\\n  -H "Content-Type: application/json" \\\n  -d '{"status":"in-progress"}'\n

DELETE /api/tasks/:id#

\n

Delete task file.

\n

POST /api/tasks/:id/toggle-status#

\n

Toggle task status via configured workflow.

\n

POST /api/tasks/:id/archive#

\n

Toggle archive state.

\n

POST /api/tasks/:id/complete-instance#

\n

Complete recurring instance.

\n

Request body:

\n
    \n
  • Optional date (ISO string). If omitted, uses current date context.
  • \n
\n

When the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to Create next after completion and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual complete_instances entry.

\n

POST /api/tasks/:id/materialize-occurrence#

\n

Create or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date.

\n

Request body:

\n
    \n
  • Required date (ISO date string, for example 2026-06-01)
  • \n
\n

POST /api/tasks/query#

\n

Advanced filtering.

\n

Request body is a FilterQuery object. FilterQuery is still the supported advanced query shape for the HTTP API.

\n

The root object is a group with:

\n
    \n
  • type: "group"
  • \n
  • id
  • \n
  • conjunction: "and" | "or"
  • \n
  • children (conditions or groups)
  • \n
\n

Optional top-level query options:

\n
    \n
  • sortKey, sortDirection
  • \n
  • groupKey, subgroupKey
  • \n
\n

Example:

\n
{\n  "type": "group",\n  "id": "root",\n  "conjunction": "and",\n  "children": [\n    {\n      "type": "condition",\n      "id": "c1",\n      "property": "status",\n      "operator": "is",\n      "value": "open"\n    }\n  ],\n  "sortKey": "due",\n  "sortDirection": "asc"\n}\n

Filter tasks by context:

\n
{\n  "type": "group",\n  "id": "root",\n  "conjunction": "and",\n  "children": [\n    {\n      "type": "condition",\n      "id": "context",\n      "property": "contexts",\n      "operator": "contains",\n      "value": "@office"\n    }\n  ],\n  "sortKey": "due",\n  "sortDirection": "asc"\n}\n

Filter active, unarchived tasks, similar to the default available-task view:

\n
{\n  "type": "group",\n  "id": "root",\n  "conjunction": "and",\n  "children": [\n    {\n      "type": "condition",\n      "id": "not-archived",\n      "property": "archived",\n      "operator": "is-not-checked"\n    },\n    {\n      "type": "condition",\n      "id": "not-completed",\n      "property": "status.isCompleted",\n      "operator": "is-not-checked"\n    }\n  ],\n  "sortKey": "due",\n  "sortDirection": "asc",\n  "groupKey": "none"\n}\n

Condition fields:

\n
    \n
  • type: "condition"
  • \n
  • id: any stable string for your client
  • \n
  • property: a task property, such as title, status, priority, tags, contexts, projects, blockedBy, blocking, due, scheduled, completedDate, dateCreated, dateModified, archived, hasSubtasks, dependencies.isBlocked, dependencies.isBlocking, timeEstimate, recurrence, or status.isCompleted
  • \n
  • operator: one of is, is-not, contains, does-not-contain, is-before, is-after, is-on-or-before, is-on-or-after, is-empty, is-not-empty, is-checked, is-not-checked, is-greater-than, is-less-than, is-greater-than-or-equal, or is-less-than-or-equal
  • \n
  • value: required for comparison operators, omitted for empty/checked operators
  • \n
\n

For user-defined fields, use property: "user:<fieldId>".

\n

Response:

\n
    \n
  • data.tasks
  • \n
  • data.total
  • \n
  • data.filtered
  • \n
  • data.vault
  • \n
\n

GET /api/filter-options#

\n

Returns filter options for UI builders.

\n

GET /api/stats#

\n

Returns summary counts:

\n
    \n
  • total, completed, active, overdue, archived, withTimeTracking
  • \n
\n

Bases#

\n

POST /api/bases/default-files/update#

\n

Overwrite the configured default TaskNotes .base files with templates generated from the current TaskNotes settings. This is the same write operation as Settings -> TaskNotes -> Views & base files -> Update files and replaces manual edits in those configured default files.

\n
curl -X POST http://localhost:8080/api/bases/default-files/update\n

Response fields:

\n
    \n
  • data.created: default files created because they were missing
  • \n
  • data.updated: existing default files overwritten with current templates
  • \n
  • data.skipped: configured default files skipped
  • \n
\n

Time Tracking#

\n

POST /api/tasks/:id/time/start#

\n

Starts a new active time entry for that task.

\n

POST /api/tasks/:id/time/start-with-description#

\n

Starts time tracking and writes description on the new active entry.

\n

Request body:

\n
{\n  "description": "Implementation"\n}\n

POST /api/tasks/:id/time/stop#

\n

Stops active time entry for that task.

\n

GET /api/tasks/:id/time#

\n

Returns per-task time summary and entries.

\n

GET /api/time/active#

\n

Returns currently active sessions across tasks.

\n

Important:

\n
    \n
  • Multiple active sessions can exist across different tasks.
  • \n
\n

GET /api/time/summary#

\n

Returns aggregate time summary.

\n

Query params:

\n
    \n
  • period (for example today, week, month, all)
  • \n
  • from (ISO date)
  • \n
  • to (ISO date)
  • \n
\n

Example:

\n
curl "http://localhost:8080/api/time/summary?period=week"\n

Pomodoro#

\n

POST /api/pomodoro/start#

\n

Starts a session.

\n

Optional request fields:

\n
    \n
  • taskId (URL path of task)
  • \n
  • duration (number)
  • \n
\n

POST /api/pomodoro/stop#

\n

Stops and resets current session.

\n

POST /api/pomodoro/pause#

\n

Pauses running session.

\n

POST /api/pomodoro/resume#

\n

Resumes paused session.

\n

GET /api/pomodoro/status#

\n

Returns current state plus computed totals (totalPomodoros, currentStreak, totalMinutesToday).

\n

GET /api/pomodoro/sessions#

\n

Returns history.

\n

Query params:

\n
    \n
  • limit
  • \n
  • date (YYYY-MM-DD)
  • \n
\n

GET /api/pomodoro/stats#

\n

Returns stats for today or provided date.

\n

Query params:

\n
    \n
  • date (YYYY-MM-DD)
  • \n
\n

Calendars#

\n

GET /api/calendars#

\n

Returns provider connectivity overview and subscription counts.

\n

GET /api/calendars/google#

\n

Returns Google provider details.

\n
    \n
  • If disconnected, returns { "connected": false }.
  • \n
\n

GET /api/calendars/microsoft#

\n

Returns Microsoft provider details.

\n
    \n
  • If disconnected, returns { "connected": false }.
  • \n
\n

GET /api/calendars/subscriptions#

\n

Returns ICS subscriptions with runtime fields such as lastFetched and lastError.

\n

GET /api/calendars/events#

\n

Returns merged event list from connected providers and ICS subscriptions.

\n

Query params:

\n
    \n
  • start (ISO date/datetime)
  • \n
  • end (ISO date/datetime)
  • \n
\n

Response includes:

\n
    \n
  • events
  • \n
  • total
  • \n
  • sources (counts by provider)
  • \n
\n

Webhooks#

\n

POST /api/webhooks#

\n

Registers webhook.

\n

Required fields:

\n
    \n
  • url
  • \n
  • events (non-empty array)
  • \n
\n

Optional fields:

\n
    \n
  • id
  • \n
  • secret
  • \n
  • active
  • \n
  • transformFile
  • \n
  • corsHeaders
  • \n
\n

GET /api/webhooks#

\n

Lists registered webhooks. Stored secrets are not returned.

\n

DELETE /api/webhooks/:id#

\n

Deletes webhook.

\n

GET /api/webhooks/deliveries#

\n

Returns last 100 delivery records.

\n

OpenAPI Docs#

\n

GET /api/docs#

\n

Returns OpenAPI JSON generated from registered controllers.

\n

GET /api/docs/ui#

\n

Returns Swagger UI.

\n

Errors#

\n

Common status codes:

\n
    \n
  • 400 invalid request or invalid state
  • \n
  • 401 missing/invalid bearer token (when auth token is configured)
  • \n
  • 404 missing task/webhook/resource
  • \n
  • 500 internal error
  • \n
\n

Security Notes#

\n

Current behavior:

\n
    \n
  • CORS allows all origins (*).
  • \n
  • Transport is HTTP only (no TLS).
  • \n
  • Node server is started with server.listen(port) and does not explicitly bind to 127.0.0.1.
  • \n
\n

Practical guidance:

\n
    \n
  • Set an auth token.
  • \n
  • Treat API port as sensitive and keep it firewalled.
  • \n
  • If you expose this port outside localhost, route through a trusted reverse proxy and TLS.
  • \n
\n

Troubleshooting#

\n

API unavailable#

\n
    \n
  1. Confirm API is enabled in settings.
  2. \n
  3. Confirm Obsidian is running.
  4. \n
  5. Confirm selected port is free.
  6. \n
  7. Reload plugin or restart Obsidian after changing API enable/port.
  8. \n
\n

401 Authentication required#

\n
    \n
  1. Check token value.
  2. \n
  3. Check Bearer prefix.
  4. \n
  5. Remove whitespace around token.
  6. \n
\n

Unexpected task list behavior#

\n

If you pass filters to GET /api/tasks, the endpoint returns 400 by design. Use POST /api/tasks/query.

\n","text":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing. Availability# Desktop only Disabled by default Started when Obsidian starts and TaskNotes API is enabled Bound to loopback (127.0.0.1) only, not the local network Browser CORS requests are allowed only from loopback origins such as localhost, 127.0.0.1, and [::1] Not available on mobile Enable it in Settings -> TaskNotes -> Integrations -> HTTP API. Base URL# http://localhost:{PORT} Default port is 8080. Authentication# Authentication is optional. If apiAuthToken is empty, all API requests are accepted. If apiAuthToken is set, send Authorization: Bearer . Set a token for any workflow where local browser pages, scripts, or other desktop apps are not fully trusted. Example: curl -H \"Authorization: Bearer YOUR_TOKEN\" http://localhost:8080/api/health Response Format# Success: { \"success\": true, \"data\": {} } Error: { \"success\": false, \"error\": \"Error message\" } Endpoint Index# System# GET /api/health GET /api/docs GET /api/docs/ui POST /api/nlp/parse POST /api/nlp/create Tasks# GET /api/tasks POST /api/tasks GET /api/tasks/:id PUT /api/tasks/:id DELETE /api/tasks/:id POST /api/tasks/:id/toggle-status POST /api/tasks/:id/archive POST /api/tasks/:id/complete-instance POST /api/tasks/:id/materialize-occurrence POST /api/tasks/query GET /api/filter-options GET /api/stats Bases# POST /api/bases/default-files/update Time Tracking# POST /api/tasks/:id/time/start POST /api/tasks/:id/time/start-with-description POST /api/tasks/:id/time/stop GET /api/tasks/:id/time GET /api/time/active GET /api/time/summary Pomodoro# POST /api/pomodoro/start POST /api/pomodoro/stop POST /api/pomodoro/pause POST /api/pomodoro/resume GET /api/pomodoro/status GET /api/pomodoro/sessions GET /api/pomodoro/stats Calendars# GET /api/calendars GET /api/calendars/google GET /api/calendars/microsoft GET /api/calendars/subscriptions GET /api/calendars/events Webhooks# POST /api/webhooks GET /api/webhooks DELETE /api/webhooks/:id GET /api/webhooks/deliveries See docs/webhooks.md for event and transform details. Route Details# Health# GET /api/health# Returns service state plus vault metadata. curl http://localhost:8080/api/health Tasks# GET /api/tasks# Basic task listing with pagination only. Query params: limit (default 50, max 200) offset (default 0) Important: Filtering params such as status, priority, tag, project, context, due_before, due_after, overdue, completed, archived, and sort are rejected on this endpoint with HTTP 400. Use POST /api/tasks/query for filtering. Example: curl \"http://localhost:8080/api/tasks?limit=25&offset=0\" Response fields: data.tasks data.pagination with total, offset, limit, hasMore data.vault data.note Task objects include configured TaskNotes user fields in customProperties, keyed by their frontmatter property key. POST /api/tasks# Create one task. Required: title Common optional fields: details, status, priority, due, scheduled tags, contexts, projects recurrence, recurrence_anchor, timeEstimate, reminders blockedBy blockedBy accepts an array of dependency objects: uid: link or identifier for the blocking task, such as [[Project setup]] reltype: one of FINISHTOSTART, FINISHTOFINISH, STARTTOSTART, or STARTTOFINISH gap: optional ISO 8601 duration, such as P1D blocking is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' blockedBy fields. curl -X POST http://localhost:8080/api/tasks \\ -H \"Content-Type: application/json\" \\ -d '{\"title\":\"Review docs\",\"priority\":\"high\",\"blockedBy\":[{\"uid\":\"[[Draft docs]]\",\"reltype\":\"FINISHTOSTART\"}]}' Returns HTTP 201 with created task data. GET /api/tasks/:id# Get one task by path id. :id must be URL-encoded task path. Single-task reads include the task body in details. Configured TaskNotes user fields are returned in customProperties, keyed by their frontmatter property key. curl \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" PUT /api/tasks/:id# Update task with partial payload. Configured TaskNotes user fields can be updated either by their frontmatter property key or via customProperties. curl -X PUT \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" \\ -H \"Content-Type: application/json\" \\ -d '{\"status\":\"in-progress\"}' DELETE /api/tasks/:id# Delete task file. POST /api/tasks/:id/toggle-status# Toggle task status via configured workflow. POST /api/tasks/:id/archive# Toggle archive state. POST /api/tasks/:id/complete-instance# Complete recurring instance. Request body: Optional date (ISO string). If omitted, uses current date context. When the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to Create next after completion and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual complete_instances entry. POST /api/tasks/:id/materialize-occurrence# Create or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date. Request body: Required date (ISO date string, for example 2026-06-01) POST /api/tasks/query# Advanced filtering. Request body is a FilterQuery object. FilterQuery is still the supported advanced query shape for the HTTP API. The root object is a group with: type: \"group\" id conjunction: \"and\" | \"or\" children (conditions or groups) Optional top-level query options: sortKey, sortDirection groupKey, subgroupKey Example: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"c1\", \"property\": \"status\", \"operator\": \"is\", \"value\": \"open\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter tasks by context: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"context\", \"property\": \"contexts\", \"operator\": \"contains\", \"value\": \"@office\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter active, unarchived tasks, similar to the default available-task view: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"not-archived\", \"property\": \"archived\", \"operator\": \"is-not-checked\" }, { \"type\": \"condition\", \"id\": \"not-completed\", \"property\": \"status.isCompleted\", \"operator\": \"is-not-checked\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\", \"groupKey\": \"none\" } Condition fields: type: \"condition\" id: any stable string for your client property: a task property, such as title, status, priority, tags, contexts, projects, blockedBy, blocking, due, scheduled, completedDate, dateCreated, dateModified, archived, hasSubtasks, dependencies.isBlocked, dependencies.isBlocking, timeEstimate, recurrence, or status.isCompleted operator: one of is, is-not, contains, does-not-contain, is-before, is-after, is-on-or-before, is-on-or-after, is-empty, is-not-empty, is-checked, is-not-checked, is-greater-than, is-less-than, is-greater-than-or-equal, or is-less-than-or-equal value: required for comparison operators, omitted for empty/checked operators For user-defined fields, use property: \"user:\". Response: data.tasks data.total data.filtered data.vault GET /api/filter-options# Returns filter options for UI builders. GET /api/stats# Returns summary counts: total, completed, active, overdue, archived, withTimeTracking Bases# POST /api/bases/default-files/update# Overwrite the configured default TaskNotes .base files with templates generated from the current TaskNotes settings. This is the same write operation as Settings -> TaskNotes -> Views & base files -> Update files and replaces manual edits in those configured default files. curl -X POST http://localhost:8080/api/bases/default-files/update Response fields: data.created: default files created because they were missing data.updated: existing default files overwritten with current templates data.skipped: configured default files skipped Time Tracking# POST /api/tasks/:id/time/start# Starts a new active time entry for that task. POST /api/tasks/:id/time/start-with-description# Starts time tracking and writes description on the new active entry. Request body: { \"description\": \"Implementation\" } POST /api/tasks/:id/time/stop# Stops active time entry for that task. GET /api/tasks/:id/time# Returns per-task time summary and entries. GET /api/time/active# Returns currently active sessions across tasks. Important: Multiple active sessions can exist across different tasks. GET /api/time/summary# Returns aggregate time summary. Query params: period (for example today, week, month, all) from (ISO date) to (ISO date) Example: curl \"http://localhost:8080/api/time/summary?period=week\" Pomodoro# POST /api/pomodoro/start# Starts a session. Optional request fields: taskId (URL path of task) duration (number) POST /api/pomodoro/stop# Stops and resets current session. POST /api/pomodoro/pause# Pauses running session. POST /api/pomodoro/resume# Resumes paused session. GET /api/pomodoro/status# Returns current state plus computed totals (totalPomodoros, currentStreak, totalMinutesToday). GET /api/pomodoro/sessions# Returns history. Query params: limit date (YYYY-MM-DD) GET /api/pomodoro/stats# Returns stats for today or provided date. Query params: date (YYYY-MM-DD) Calendars# GET /api/calendars# Returns provider connectivity overview and subscription counts. GET /api/calendars/google# Returns Google provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/microsoft# Returns Microsoft provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/subscriptions# Returns ICS subscriptions with runtime fields such as lastFetched and lastError. GET /api/calendars/events# Returns merged event list from connected providers and ICS subscriptions. Query params: start (ISO date/datetime) end (ISO date/datetime) Response includes: events total sources (counts by provider) Webhooks# POST /api/webhooks# Registers webhook. Required fields: url events (non-empty array) Optional fields: id secret active transformFile corsHeaders GET /api/webhooks# Lists registered webhooks. Stored secrets are not returned. DELETE /api/webhooks/:id# Deletes webhook. GET /api/webhooks/deliveries# Returns last 100 delivery records. OpenAPI Docs# GET /api/docs# Returns OpenAPI JSON generated from registered controllers. GET /api/docs/ui# Returns Swagger UI. Errors# Common status codes: 400 invalid request or invalid state 401 missing/invalid bearer token (when auth token is configured) 404 missing task/webhook/resource 500 internal error Security Notes# Current behavior: CORS allows all origins (*). Transport is HTTP only (no TLS). Node server is started with server.listen(port) and does not explicitly bind to 127.0.0.1. Practical guidance: Set an auth token. Treat API port as sensitive and keep it firewalled. If you expose this port outside localhost, route through a trusted reverse proxy and TLS. Troubleshooting# API unavailable# Confirm API is enabled in settings. Confirm Obsidian is running. Confirm selected port is free. Reload plugin or restart Obsidian after changing API enable/port. 401 Authentication required# Check token value. Check Bearer prefix. Remove whitespace around token. Unexpected task list behavior# If you pass filters to GET /api/tasks, the endpoint returns 400 by design. Use POST /api/tasks/query."},{"route":"/obsidian/javascript-api/","title":"TaskNotes JavaScript Runtime API","description":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/javascript-api.md","namespace":"obsidian","relativePath":"javascript-api.md","raw":"# TaskNotes JavaScript Runtime API\n\nTaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n```\n\nThis API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI.\n\nThis is separate from the [HTTP API](HTTP_API.md). The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app.\n\nFor user-facing extensions built on this API, see [Companion Plugins](companion-plugins.md). For a concrete automation companion plugin, see [TaskNotes Workflows](companion-plugins/tasknotes-workflows.md).\n\nThe TypeScript contract lives in `src/api/runtime-api.ts`. It is intentionally small and type-focused so it can later become a standalone `@tasknotes/runtime-api` package for companion plugins.\n\n## Version and Capabilities\n\nCheck the API version and capabilities before using methods that may not exist in older TaskNotes versions:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n\nif (!api || api.apiVersion !== 1 || !api.hasCapability(\"tasks.write\")) {\n\tthrow new Error(\"This workflow requires TaskNotes runtime API v1 task writes\");\n}\n```\n\nCurrent capabilities:\n\n- `model.read`\n- `model.validate`\n- `catalog.read`\n- `extensions.read`\n- `extensions.register`\n- `tasks.read`\n- `tasks.write`\n- `tasks.delete`\n- `tasks.move`\n- `tasks.events`\n- `relationships.read`\n- `events.list`\n- `time.read`\n- `time.write`\n- `time.summary`\n- `pomodoro.read`\n- `pomodoro.write`\n- `pomodoro.events`\n- `recurring.write`\n- `recurring.materialize`\n- `recurring.events`\n- `settings.snapshot`\n- `bases.write`\n- `nlp.parse`\n- `ui.task-menu`\n- `query.tasks`\n- `query.validate`\n- `query.explain`\n- `query.filter-options`\n- `stats.tasks`\n- `system.health`\n- `lifecycle.events`\n- `errors.typed`\n\n## Namespaces\n\nPrefer the namespaced API for new code:\n\n```javascript\nawait api.tasks.update(\"Tasks/example.md\", { status: \"active\" });\nconst subtasks = await api.relationships.subtasks(\"Tasks/example.md\");\nawait api.time.start(\"Tasks/example.md\", { description: \"Deep work\" });\nawait api.pomodoro.start({ taskPath: \"Tasks/example.md\", duration: 25 });\n```\n\nThe older flat methods, such as `api.getTask(path)` and `api.parseNaturalLanguage(text)`, remain available as compatibility aliases.\n\n## Extension Registry\n\nCompanion plugins can publish their own runtime API namespace through `api.extensions`. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object.\n\n```javascript\nconst tasknotes = this.app.plugins.getPlugin(\"tasknotes\");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability(\"extensions.register\")) {\n\treturn;\n}\n\nconst handle = api.extensions.register({\n\tid: this.manifest.id,\n\tnamespace: \"tasknotes-workflows\",\n\tdisplayName: \"TaskNotes Workflows\",\n\tversion: this.manifest.version,\n\tcapabilities: [\"tasknotes-workflows.run\", \"tasknotes-workflows.events\"],\n\tapi: {\n\t\trunWorkflow: async (workflowId, input) => {\n\t\t\t// companion plugin implementation\n\t\t},\n\t},\n});\n\nthis.register(() => handle.unregister());\n```\n\nOther plugins can discover and consume extension namespaces:\n\n```javascript\nconst workflows = api.extensions.get(\"tasknotes-workflows\");\n\nif (api.hasCapability(\"tasknotes-workflows.run\")) {\n\tawait workflows.runWorkflow(\"start-timer-on-active\", { taskPath: \"Tasks/example.md\" });\n}\n```\n\nExtension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions.\n\n## Companion Plugin Access\n\nCompanion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry:\n\n```javascript\nconst tasknotes = this.app.plugins.getPlugin(\"tasknotes\");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability(\"tasks.events\")) {\n\treturn;\n}\n\nthis.registerEvent(\n\tapi.events.on(\"task.status.changed\", (event) => {\n\t\tconsole.log(event.taskPath, event.changes.status);\n\t})\n);\n```\n\nIf TaskNotes is disabled or has not loaded yet, `api` will be unavailable. Companion plugins should handle that case and retry after plugin load if needed.\n\n## TypeScript\n\nUse the exported runtime contract for type safety:\n\n```typescript\nimport type { TaskNotesRuntimeApiV1 } from \"tasknotes/src/api/runtime-api\";\n\ntype TaskNotesPluginInstance = {\n\tapi?: TaskNotesRuntimeApiV1;\n};\n\nconst tasknotes = app.plugins.getPlugin(\"tasknotes\") as TaskNotesPluginInstance | null;\nconst api = tasknotes?.api;\n\nif (api?.apiVersion === 1 && api.hasCapability(\"tasks.write\")) {\n\tawait api.tasks.setStatus(\"Tasks/example.md\", \"active\");\n}\n```\n\nTaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete.\n\n## Model\n\nThe runtime API exposes a small model namespace backed by `@tasknotes/model`:\n\n```javascript\nconst info = api.model.info();\nconst config = api.model.config();\nconst validation = api.model.validateTask(task);\n```\n\n| Method | Description |\n| -------------------------------- | ------------------------------------------------------------------------------------------------ |\n| `api.model.info()` | Returns the model package name, TaskNotes spec version, and runtime API version. |\n| `api.model.config()` | Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings. |\n| `api.model.validateTask(task)` | Validates a partial or complete task against the shared model schema and TaskNotes status rules. |\n| `api.model.validatePatch(patch)` | Validates a task patch before passing it to a runtime task mutation. |\n\n## Catalog\n\nUse `api.catalog` to build companion-plugin editors without hardcoding TaskNotes values:\n\n```javascript\nconst statuses = api.catalog.statuses();\nconst writableFields = api.catalog.writableFields();\nconst operators = api.catalog.filterOperators();\n```\n\n| Method | Description |\n| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------- |\n| `api.catalog.statuses()` | Returns configured TaskNotes status definitions. |\n| `api.catalog.priorities()` | Returns configured TaskNotes priority definitions. |\n| `api.catalog.userFields()` | Returns configured user-defined field mappings. |\n| `api.catalog.fields()` | Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available. |\n| `api.catalog.writableFields()` | Returns only fields that runtime task mutations may write. |\n| `api.catalog.filterProperties()` | Returns canonical query fields, aliases, value types, and supported operators. |\n| `api.catalog.filterOperators()` | Returns canonical query operators, labels, value requirements, and accepted aliases. |\n| `api.catalog.relationships()` | Returns relationship categories supported by `api.relationships`. |\n| `api.catalog.dependencyRelTypes()` | Returns dependency relationship types accepted by `api.tasks.addDependency`. |\n| `api.catalog.events()` | Returns the same runtime event catalogue as `api.events.list()`. |\n\n## Tasks\n\nAll paths are vault-relative Markdown file paths.\n\n| Method | Description |\n| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |\n| `api.tasks.get(path)` | Returns a task by path, or `null` when no task is cached at that path. |\n| `api.tasks.list(query?)` | Returns all tasks, or tasks matching a runtime task query. Prefer `api.query.tasks()` when count and grouping metadata matters. |\n| `api.tasks.create(taskData, context?)` | Creates a task using the normal TaskNotes creation service. |\n| `api.tasks.update(path, patch, context?)` | Updates one or more task fields using the normal TaskNotes update service. |\n| `api.tasks.delete(path, context?)` | Deletes the task file through TaskNotes' delete service. |\n| `api.tasks.complete(path, options?, context?)` | Marks a task complete. |\n| `api.tasks.uncomplete(path, options?, context?)` | Moves a completed task back to a non-completed status. |\n| `api.tasks.setStatus(path, status, context?)` | Sets task status. |\n| `api.tasks.setPriority(path, priority, context?)` | Sets task priority. |\n| `api.tasks.setDue(path, date, context?)` / `clearDue(path, context?)` | Sets or clears due date. |\n| `api.tasks.setScheduled(path, date, context?)` / `clearScheduled(path, context?)` | Sets or clears scheduled date. |\n| `api.tasks.archive(path, archived, context?)` | Archives or unarchives a task, including archive-folder movement when configured. |\n| `api.tasks.move(path, targetFolder, context?)` | Moves the task note and refuses to overwrite an existing file. |\n| `api.tasks.addTag/removeTag` | Mutates task tags. |\n| `api.tasks.addProject/removeProject` | Mutates project links. |\n| `api.tasks.addContext/removeContext` | Mutates contexts. |\n| `api.tasks.setReminders/addReminder/removeReminder` | Mutates reminders. |\n| `api.tasks.addDependency/removeDependency` | Mutates blocking dependencies stored in `blockedBy`. |\n\nExample:\n\n```javascript\nconst task = await api.tasks.create(\n\t{\n\t\ttitle: \"Review automation design\",\n\t\tstatus: \"open\",\n\t\tpriority: \"normal\",\n\t\tscheduled: \"2026-06-01\",\n\t\ttags: [\"tasknotes\"],\n\t},\n\t{\n\t\tsource: \"my-companion-plugin\",\n\t\tcorrelationId: crypto.randomUUID(),\n\t\treason: \"manual workflow command\",\n\t}\n);\n\nawait api.tasks.complete(task.path);\n```\n\n## Relationships\n\nRelationship methods resolve TaskNotes' project-as-parent links and `blockedBy` dependencies into task records where possible.\n\n| Method | Description |\n| -------------------------------------- | -------------------------------------------------------------------------- |\n| `api.relationships.parents(path)` | Returns parent tasks referenced from the task's projects. |\n| `api.relationships.subtasks(path)` | Returns tasks that reference this task as a project. |\n| `api.relationships.dependencies(path)` | Returns `blockedBy` dependencies with resolved task data when available. |\n| `api.relationships.blocking(path)` | Returns tasks that are blocked by this task. |\n| `api.relationships.all(path)` | Returns the task plus parents, subtasks, dependencies, and blocking tasks. |\n\nExample:\n\n```javascript\nconst relationships = await api.relationships.all(\"Tasks/example.md\");\n\nfor (const subtask of relationships.subtasks) {\n\tawait api.tasks.setPriority(subtask.path, relationships.task.priority);\n}\n```\n\n## Time Tracking\n\n| Method | Description |\n| -------------------------------------------------- | -------------------------------------------------------------------- |\n| `api.time.start(path, options?, context?)` | Starts time tracking and returns the updated task. |\n| `api.time.stop(path, context?)` | Stops the active time entry and returns the updated task. |\n| `api.time.active()` | Returns active time entries with task, path, entry, and entry index. |\n| `api.time.summary(options?)` | Returns aggregate time totals, top tasks, projects, and tags. |\n| `api.time.task(path)` | Returns one task's time summary and normalized time entries. |\n| `api.time.append(path, entry, context?)` | Appends a time entry. |\n| `api.time.deleteEntry(path, entryIndex, context?)` | Deletes a time entry through TaskNotes' service. |\n\n## Query, Stats, And System\n\nThe query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state.\n\n```javascript\nconst result = await api.query.tasks({\n\twhere: {\n\t\tall: [\n\t\t\t{ field: \"task.status\", op: \"eq\", value: \"active\" },\n\t\t\t{ field: \"task.due\", op: \"lte\", value: { fn: \"today\" } },\n\t\t],\n\t},\n\tsort: [{ field: \"task.due\", direction: \"asc\" }],\n\tgroup: [{ field: \"task.status\" }],\n\tlimit: 25,\n\tscope: {\n\t\tincludeArchived: false,\n\t\tfolders: [\"Tasks\"],\n\t},\n});\n```\n\nRuntime query fields are canonical IDs such as `task.status`, `task.priority`, `task.due`, `task.projects`, `task.isBlocked`, `file.path`, and `user.`. `api.catalog.filterProperties()` returns the complete queryable field catalog, including aliases such as `status` and `user:`.\n\nCanonical operators are `eq`, `ne`, `contains`, `notContains`, `in`, `notIn`, `exists`, `missing`, `lt`, `lte`, `gt`, `gte`, `isTrue`, and `isFalse`. Legacy operator aliases such as `is`, `is-not`, `is-on-or-before`, and `is-not-empty` are accepted and normalized.\n\n`api.query.tasks()` returns explicit count semantics:\n\n- `total`: tasks in scope before filtering\n- `matched`: tasks matching `where` before `offset` and `limit`\n- `returned`: tasks returned after `offset` and `limit`\n- `tasks`: returned task records\n- `groups`: optional group details with task paths\n- `query`: the normalized canonical query\n- `warnings`: non-fatal normalization notes\n\n| Method | Description |\n| ---------------------------- | -------------------------------------------------------------------------------------------------- |\n| `api.query.tasks(query?)` | Validates, normalizes, and executes a runtime task query. |\n| `api.query.validate(query)` | Validates a query without executing it. |\n| `api.query.normalize(query)` | Returns the canonical normalized query, or throws a typed `invalid_input` API error. |\n| `api.query.explain(query)` | Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run. |\n| `api.query.filterOptions()` | Returns available statuses, priorities, contexts, projects, tags, folders, and user properties. |\n| `api.stats.tasks(query?)` | Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals. |\n| `api.system.health()` | Returns runtime status, API version, capabilities, vault identity, and task count. |\n\nTaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract.\n\n## Task Menu UI\n\nCompanion plugins can reuse the standard TaskNotes task context menu through `api.ui.taskMenu`. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals.\n\nThis surface is only available inside Obsidian. It is not exposed through the HTTP API.\n\n| Method | Description |\n| ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |\n| `api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? })` | Shows the standard TaskNotes task context menu at a mouse event. |\n| `api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... })` | Shows the standard TaskNotes task context menu anchored to an element. |\n| `api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... })` | Adds the standard TaskNotes task context menu items to an existing Obsidian `Menu` so plugins can extend it. |\n\nAll methods resolve `taskPath` through the TaskNotes task cache and throw a typed `task_not_found` error when the path does not point to a cached task.\n\n`targetDate` defaults to today and is used by date-sensitive recurring-task menu items. `onUpdate` is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. `promoteOccurrenceControls` moves recurring-instance controls to the top of the menu.\n\nExample context menu:\n\n```javascript\nnodeEl.addEventListener(\"contextmenu\", async (event) => {\n\tevent.preventDefault();\n\n\tawait api.ui.taskMenu.show({\n\t\ttaskPath: task.path,\n\t\tevent,\n\t\tonUpdate: () => refreshGraph(),\n\t});\n});\n```\n\nExample composed menu:\n\n```javascript\nconst menu = new Menu();\n\nawait api.ui.taskMenu.populate(menu, {\n\ttaskPath: task.path,\n\tonUpdate: () => refreshGraph(),\n});\n\nmenu.addSeparator();\nmenu.addItem((item) =>\n\titem\n\t\t.setTitle(\"Focus in graph\")\n\t\t.setIcon(\"network\")\n\t\t.onClick(() => selectGraphNode(task.path))\n);\n\nmenu.showAtMouseEvent(event);\n```\n\n## Pomodoro\n\n| Method | Description |\n| ----------------------------------------------- | --------------------------------------------- |\n| `api.pomodoro.status()` | Returns current Pomodoro state. |\n| `api.pomodoro.start(options?, context?)` | Starts a Pomodoro session. |\n| `api.pomodoro.stop(context?)` | Stops and resets the active Pomodoro session. |\n| `api.pomodoro.pause(context?)` | Pauses the current session. |\n| `api.pomodoro.resume(context?)` | Resumes a paused session. |\n| `api.pomodoro.assignTask(pathOrNull, context?)` | Assigns or clears the current session task. |\n| `api.pomodoro.sessions(options?)` | Returns Pomodoro session history. |\n| `api.pomodoro.stats(date?)` | Returns Pomodoro stats for a date or today. |\n\n## Recurring Tasks\n\n| Method | Description |\n| ------------------------------------------------------------- | ---------------------------------------------------- |\n| `api.recurring.toggleCompleteInstance(path, date?, context?)` | Toggles completion for a recurring task instance. |\n| `api.recurring.toggleSkippedInstance(path, date?, context?)` | Toggles skipped state for a recurring task instance. |\n| `api.recurring.materializeOccurrence(path, date, context?)` | Creates or returns an occurrence note for a recurring task date. |\n\n## Natural Language Parser\n\n```javascript\nconst parsed = api.nlp.parse(\"Write draft friday 2pm #writing @desk\");\n```\n\n`api.parseNaturalLanguage(text)` remains as a compatibility alias. Parsing does not create or modify task files.\n\nSee [NLP API](nlp-api.md) for HTTP endpoint details and parser behavior.\n\n## Settings Snapshot\n\n```javascript\nconst settings = api.settings.snapshot();\nconsole.log(settings.defaultTaskStatus);\n```\n\nThe returned object is a snapshot. Mutating it does not change TaskNotes settings. `api.getSettingsSnapshot()` remains available as a compatibility alias.\n\n## Bases\n\n`api.bases.updateDefaultFiles()` regenerates the configured default TaskNotes `.base` files from the current TaskNotes settings and returns the created, updated, and skipped file paths.\n\n```javascript\nconst result = await api.bases.updateDefaultFiles();\nconsole.log(result.updated);\n```\n\n## Mutation Context\n\nMutating methods accept an optional context object:\n\n```javascript\n{\n source: \"tasknotes-workflows\",\n correlationId: \"run-2026-06-01T09-00-00\",\n reason: \"status changed to active\"\n}\n```\n\nTaskNotes attaches this context to normalized events emitted during the mutation. Use it to make workflow runs debuggable, connect multiple API calls to one run, and prevent companion plugins from responding to their own writes.\n\n## Events\n\nSubscribe with `api.events.on(eventName, handler)` and unsubscribe with `api.events.off(ref)`. In an Obsidian plugin, pass the returned `EventRef` to `this.registerEvent(ref)`.\n\nUse `api.events.list()` to discover the event catalogue for companion-plugin UIs:\n\n```javascript\nconst events = api.events.list();\n// [{ name: \"task.status.changed\", label: \"Task status changed\", category: \"task\", ... }]\n```\n\nTask events:\n\n- `task.created`\n- `task.updated`\n- `task.deleted`\n- `task.moved`\n- `task.status.changed`\n- `task.completed`\n- `task.uncompleted`\n- `task.archived`\n- `task.unarchived`\n- `task.scheduled.changed`\n- `task.due.changed`\n- `task.priority.changed`\n- `task.tags.changed`\n- `task.contexts.changed`\n- `task.projects.changed`\n- `task.reminders.changed`\n- `task.dependencies.changed`\n- `task.recurrence.changed`\n\nTime, Pomodoro, and recurring events:\n\n- `time.started`\n- `time.stopped`\n- `pomodoro.started`\n- `pomodoro.completed`\n- `pomodoro.interrupted`\n- `recurring.instance.completed`\n- `recurring.instance.skipped`\n\nSpecific events are emitted in addition to `task.updated`. For example, changing a task from `open` to `done` emits `task.updated`, `task.status.changed`, and `task.completed`.\n\nEvent payloads have this shape:\n\n```javascript\n{\n event: \"task.status.changed\",\n timestamp: \"2026-06-01T09:00:00.000Z\",\n taskPath: \"Tasks/Review automation design.md\",\n task: { /* current task */ },\n before: { /* task before change */ },\n after: { /* task after change */ },\n deletedTask: undefined,\n changes: {\n status: {\n before: \"open\",\n after: \"done\"\n }\n },\n data: undefined,\n context: {\n source: \"tasknotes-workflows\",\n correlationId: \"run-2026-06-01T09-00-00\",\n reason: \"status changed to done\"\n },\n source: \"tasknotes-workflows\",\n correlationId: \"run-2026-06-01T09-00-00\",\n reason: \"status changed to done\",\n rawEvent: \"task-updated\"\n}\n```\n\nEvents caused outside the runtime API may not include `context`, `source`, `correlationId`, or `reason`.\n\nExample automation-style listener:\n\n```javascript\nconst source = \"my-workflow-plugin\";\n\nthis.registerEvent(\n\tapi.events.on(\"task.status.changed\", async (event) => {\n\t\tif (event.source === source) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.after?.status !== \"active\") {\n\t\t\treturn;\n\t\t}\n\n\t\tawait api.time.start(event.after.path, undefined, {\n\t\t\tsource,\n\t\t\tcorrelationId: event.correlationId ?? crypto.randomUUID(),\n\t\t\treason: \"status changed to active\",\n\t\t});\n\t})\n);\n```\n\n## Lifecycle\n\nUse `api.lifecycle` to coordinate companion plugin startup, reload, and cache-sensitive UI state:\n\n```javascript\nawait api.lifecycle.ready();\n\nthis.registerEvent(\n\tapi.lifecycle.on(\"settings.changed\", () => {\n\t\trefreshCompanionCatalogs();\n\t})\n);\n```\n\nLifecycle events:\n\n- `ready`\n- `layout.ready`\n- `settings.changed`\n- `cache.changed`\n- `cache.rebuilt`\n- `extension.registered`\n- `extension.unregistered`\n- `unloading`\n\n`api.lifecycle.list()` returns labels, descriptions, and categories for these events.\n\n## Error Handling\n\nAPI methods throw `TaskNotesApiError` for invalid input or failed operations that the runtime API can classify. The error object includes:\n\n- `name`: always `TaskNotesApiError`\n- `code`: a stable machine-readable code\n- `message`: a human-readable message for logs\n- `status`: an HTTP-style status code for tools that mirror runtime calls over HTTP or MCP\n- `details`: optional structured context such as the task path, extension namespace, or invalid status\n\nCommon examples:\n\n- The task path is empty or invalid.\n- No task exists at the requested path.\n- A target move folder already contains a file with the same name.\n- `complete` is called with a status that is not configured as completed.\n\nCurrent error codes:\n\n- `invalid_input`\n- `invalid_task_path`\n- `invalid_status`\n- `task_not_found`\n- `task_file_not_found`\n- `file_already_exists`\n- `extension_invalid`\n- `extension_namespace_reserved`\n- `extension_namespace_conflict`\n- `extension_not_registered`\n- `operation_failed`\n\nUse `api.errors` when workflow engines or background listeners need consistent result objects instead of thrown exceptions:\n\n```javascript\nconst result = await api.errors.toResult(() =>\n\tapi.tasks.complete(\"Tasks/example.md\", { status: \"done\" })\n);\n\nif (!result.ok) {\n\tconsole.warn(result.error.code, result.error.details);\n\treturn;\n}\n\nconsole.log(result.value.path);\n```\n\n`api.errors.normalize(error)` converts unknown thrown values into a `TaskNotesApiError` payload. Unknown JavaScript errors use `operation_failed` with status `500`.\n","aliases":["/javascript-api/"],"toc":[{"level":2,"id":"version-and-capabilities","text":"Version and Capabilities"},{"level":2,"id":"namespaces","text":"Namespaces"},{"level":2,"id":"extension-registry","text":"Extension Registry"},{"level":2,"id":"companion-plugin-access","text":"Companion Plugin Access"},{"level":2,"id":"typescript","text":"TypeScript"},{"level":2,"id":"model","text":"Model"},{"level":2,"id":"catalog","text":"Catalog"},{"level":2,"id":"tasks","text":"Tasks"},{"level":2,"id":"relationships","text":"Relationships"},{"level":2,"id":"time-tracking","text":"Time Tracking"},{"level":2,"id":"query-stats-and-system","text":"Query, Stats, And System"},{"level":2,"id":"task-menu-ui","text":"Task Menu UI"},{"level":2,"id":"pomodoro","text":"Pomodoro"},{"level":2,"id":"recurring-tasks","text":"Recurring Tasks"},{"level":2,"id":"natural-language-parser","text":"Natural Language Parser"},{"level":2,"id":"settings-snapshot","text":"Settings Snapshot"},{"level":2,"id":"bases","text":"Bases"},{"level":2,"id":"mutation-context","text":"Mutation Context"},{"level":2,"id":"events","text":"Events"},{"level":2,"id":"lifecycle","text":"Lifecycle"},{"level":2,"id":"error-handling","text":"Error Handling"}],"html":"

TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n

This API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI.

\n

This is separate from the HTTP API. The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app.

\n

For user-facing extensions built on this API, see Companion Plugins. For a concrete automation companion plugin, see TaskNotes Workflows.

\n

The TypeScript contract lives in src/api/runtime-api.ts. It is intentionally small and type-focused so it can later become a standalone @tasknotes/runtime-api package for companion plugins.

\n

Version and Capabilities#

\n

Check the API version and capabilities before using methods that may not exist in older TaskNotes versions:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst api = tasknotes?.api;\n\nif (!api || api.apiVersion !== 1 || !api.hasCapability("tasks.write")) {\n    throw new Error("This workflow requires TaskNotes runtime API v1 task writes");\n}\n

Current capabilities:

\n
    \n
  • model.read
  • \n
  • model.validate
  • \n
  • catalog.read
  • \n
  • extensions.read
  • \n
  • extensions.register
  • \n
  • tasks.read
  • \n
  • tasks.write
  • \n
  • tasks.delete
  • \n
  • tasks.move
  • \n
  • tasks.events
  • \n
  • relationships.read
  • \n
  • events.list
  • \n
  • time.read
  • \n
  • time.write
  • \n
  • time.summary
  • \n
  • pomodoro.read
  • \n
  • pomodoro.write
  • \n
  • pomodoro.events
  • \n
  • recurring.write
  • \n
  • recurring.materialize
  • \n
  • recurring.events
  • \n
  • settings.snapshot
  • \n
  • bases.write
  • \n
  • nlp.parse
  • \n
  • ui.task-menu
  • \n
  • query.tasks
  • \n
  • query.validate
  • \n
  • query.explain
  • \n
  • query.filter-options
  • \n
  • stats.tasks
  • \n
  • system.health
  • \n
  • lifecycle.events
  • \n
  • errors.typed
  • \n
\n

Namespaces#

\n

Prefer the namespaced API for new code:

\n
await api.tasks.update("Tasks/example.md", { status: "active" });\nconst subtasks = await api.relationships.subtasks("Tasks/example.md");\nawait api.time.start("Tasks/example.md", { description: "Deep work" });\nawait api.pomodoro.start({ taskPath: "Tasks/example.md", duration: 25 });\n

The older flat methods, such as api.getTask(path) and api.parseNaturalLanguage(text), remain available as compatibility aliases.

\n

Extension Registry#

\n

Companion plugins can publish their own runtime API namespace through api.extensions. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object.

\n
const tasknotes = this.app.plugins.getPlugin("tasknotes");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability("extensions.register")) {\n    return;\n}\n\nconst handle = api.extensions.register({\n    id: this.manifest.id,\n    namespace: "tasknotes-workflows",\n    displayName: "TaskNotes Workflows",\n    version: this.manifest.version,\n    capabilities: ["tasknotes-workflows.run", "tasknotes-workflows.events"],\n    api: {\n        runWorkflow: async (workflowId, input) => {\n            // companion plugin implementation\n        },\n    },\n});\n\nthis.register(() => handle.unregister());\n

Other plugins can discover and consume extension namespaces:

\n
const workflows = api.extensions.get("tasknotes-workflows");\n\nif (api.hasCapability("tasknotes-workflows.run")) {\n    await workflows.runWorkflow("start-timer-on-active", { taskPath: "Tasks/example.md" });\n}\n

Extension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions.

\n

Companion Plugin Access#

\n

Companion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry:

\n
const tasknotes = this.app.plugins.getPlugin("tasknotes");\nconst api = tasknotes?.api;\n\nif (!api?.hasCapability("tasks.events")) {\n    return;\n}\n\nthis.registerEvent(\n    api.events.on("task.status.changed", (event) => {\n        console.log(event.taskPath, event.changes.status);\n    })\n);\n

If TaskNotes is disabled or has not loaded yet, api will be unavailable. Companion plugins should handle that case and retry after plugin load if needed.

\n

TypeScript#

\n

Use the exported runtime contract for type safety:

\n
import type { TaskNotesRuntimeApiV1 } from "tasknotes/src/api/runtime-api";\n\ntype TaskNotesPluginInstance = {\n    api?: TaskNotesRuntimeApiV1;\n};\n\nconst tasknotes = app.plugins.getPlugin("tasknotes") as TaskNotesPluginInstance | null;\nconst api = tasknotes?.api;\n\nif (api?.apiVersion === 1 && api.hasCapability("tasks.write")) {\n    await api.tasks.setStatus("Tasks/example.md", "active");\n}\n

TaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete.

\n

Model#

\n

The runtime API exposes a small model namespace backed by @tasknotes/model:

\n
const info = api.model.info();\nconst config = api.model.config();\nconst validation = api.model.validateTask(task);\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.model.info()Returns the model package name, TaskNotes spec version, and runtime API version.
api.model.config()Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings.
api.model.validateTask(task)Validates a partial or complete task against the shared model schema and TaskNotes status rules.
api.model.validatePatch(patch)Validates a task patch before passing it to a runtime task mutation.
\n

Catalog#

\n

Use api.catalog to build companion-plugin editors without hardcoding TaskNotes values:

\n
const statuses = api.catalog.statuses();\nconst writableFields = api.catalog.writableFields();\nconst operators = api.catalog.filterOperators();\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.catalog.statuses()Returns configured TaskNotes status definitions.
api.catalog.priorities()Returns configured TaskNotes priority definitions.
api.catalog.userFields()Returns configured user-defined field mappings.
api.catalog.fields()Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available.
api.catalog.writableFields()Returns only fields that runtime task mutations may write.
api.catalog.filterProperties()Returns canonical query fields, aliases, value types, and supported operators.
api.catalog.filterOperators()Returns canonical query operators, labels, value requirements, and accepted aliases.
api.catalog.relationships()Returns relationship categories supported by api.relationships.
api.catalog.dependencyRelTypes()Returns dependency relationship types accepted by api.tasks.addDependency.
api.catalog.events()Returns the same runtime event catalogue as api.events.list().
\n

Tasks#

\n

All paths are vault-relative Markdown file paths.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.tasks.get(path)Returns a task by path, or null when no task is cached at that path.
api.tasks.list(query?)Returns all tasks, or tasks matching a runtime task query. Prefer api.query.tasks() when count and grouping metadata matters.
api.tasks.create(taskData, context?)Creates a task using the normal TaskNotes creation service.
api.tasks.update(path, patch, context?)Updates one or more task fields using the normal TaskNotes update service.
api.tasks.delete(path, context?)Deletes the task file through TaskNotes' delete service.
api.tasks.complete(path, options?, context?)Marks a task complete.
api.tasks.uncomplete(path, options?, context?)Moves a completed task back to a non-completed status.
api.tasks.setStatus(path, status, context?)Sets task status.
api.tasks.setPriority(path, priority, context?)Sets task priority.
api.tasks.setDue(path, date, context?) / clearDue(path, context?)Sets or clears due date.
api.tasks.setScheduled(path, date, context?) / clearScheduled(path, context?)Sets or clears scheduled date.
api.tasks.archive(path, archived, context?)Archives or unarchives a task, including archive-folder movement when configured.
api.tasks.move(path, targetFolder, context?)Moves the task note and refuses to overwrite an existing file.
api.tasks.addTag/removeTagMutates task tags.
api.tasks.addProject/removeProjectMutates project links.
api.tasks.addContext/removeContextMutates contexts.
api.tasks.setReminders/addReminder/removeReminderMutates reminders.
api.tasks.addDependency/removeDependencyMutates blocking dependencies stored in blockedBy.
\n

Example:

\n
const task = await api.tasks.create(\n    {\n        title: "Review automation design",\n        status: "open",\n        priority: "normal",\n        scheduled: "2026-06-01",\n        tags: ["tasknotes"],\n    },\n    {\n        source: "my-companion-plugin",\n        correlationId: crypto.randomUUID(),\n        reason: "manual workflow command",\n    }\n);\n\nawait api.tasks.complete(task.path);\n

Relationships#

\n

Relationship methods resolve TaskNotes' project-as-parent links and blockedBy dependencies into task records where possible.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.relationships.parents(path)Returns parent tasks referenced from the task's projects.
api.relationships.subtasks(path)Returns tasks that reference this task as a project.
api.relationships.dependencies(path)Returns blockedBy dependencies with resolved task data when available.
api.relationships.blocking(path)Returns tasks that are blocked by this task.
api.relationships.all(path)Returns the task plus parents, subtasks, dependencies, and blocking tasks.
\n

Example:

\n
const relationships = await api.relationships.all("Tasks/example.md");\n\nfor (const subtask of relationships.subtasks) {\n    await api.tasks.setPriority(subtask.path, relationships.task.priority);\n}\n

Time Tracking#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.time.start(path, options?, context?)Starts time tracking and returns the updated task.
api.time.stop(path, context?)Stops the active time entry and returns the updated task.
api.time.active()Returns active time entries with task, path, entry, and entry index.
api.time.summary(options?)Returns aggregate time totals, top tasks, projects, and tags.
api.time.task(path)Returns one task's time summary and normalized time entries.
api.time.append(path, entry, context?)Appends a time entry.
api.time.deleteEntry(path, entryIndex, context?)Deletes a time entry through TaskNotes' service.
\n

Query, Stats, And System#

\n

The query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state.

\n
const result = await api.query.tasks({\n    where: {\n        all: [\n            { field: "task.status", op: "eq", value: "active" },\n            { field: "task.due", op: "lte", value: { fn: "today" } },\n        ],\n    },\n    sort: [{ field: "task.due", direction: "asc" }],\n    group: [{ field: "task.status" }],\n    limit: 25,\n    scope: {\n        includeArchived: false,\n        folders: ["Tasks"],\n    },\n});\n

Runtime query fields are canonical IDs such as task.status, task.priority, task.due, task.projects, task.isBlocked, file.path, and user.<id-or-key>. api.catalog.filterProperties() returns the complete queryable field catalog, including aliases such as status and user:<id>.

\n

Canonical operators are eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Legacy operator aliases such as is, is-not, is-on-or-before, and is-not-empty are accepted and normalized.

\n

api.query.tasks() returns explicit count semantics:

\n
    \n
  • total: tasks in scope before filtering
  • \n
  • matched: tasks matching where before offset and limit
  • \n
  • returned: tasks returned after offset and limit
  • \n
  • tasks: returned task records
  • \n
  • groups: optional group details with task paths
  • \n
  • query: the normalized canonical query
  • \n
  • warnings: non-fatal normalization notes
  • \n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.query.tasks(query?)Validates, normalizes, and executes a runtime task query.
api.query.validate(query)Validates a query without executing it.
api.query.normalize(query)Returns the canonical normalized query, or throws a typed invalid_input API error.
api.query.explain(query)Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run.
api.query.filterOptions()Returns available statuses, priorities, contexts, projects, tags, folders, and user properties.
api.stats.tasks(query?)Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals.
api.system.health()Returns runtime status, API version, capabilities, vault identity, and task count.
\n

TaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract.

\n

Task Menu UI#

\n

Companion plugins can reuse the standard TaskNotes task context menu through api.ui.taskMenu. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals.

\n

This surface is only available inside Obsidian. It is not exposed through the HTTP API.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? })Shows the standard TaskNotes task context menu at a mouse event.
api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... })Shows the standard TaskNotes task context menu anchored to an element.
api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... })Adds the standard TaskNotes task context menu items to an existing Obsidian Menu so plugins can extend it.
\n

All methods resolve taskPath through the TaskNotes task cache and throw a typed task_not_found error when the path does not point to a cached task.

\n

targetDate defaults to today and is used by date-sensitive recurring-task menu items. onUpdate is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. promoteOccurrenceControls moves recurring-instance controls to the top of the menu.

\n

Example context menu:

\n
nodeEl.addEventListener("contextmenu", async (event) => {\n    event.preventDefault();\n\n    await api.ui.taskMenu.show({\n        taskPath: task.path,\n        event,\n        onUpdate: () => refreshGraph(),\n    });\n});\n

Example composed menu:

\n
const menu = new Menu();\n\nawait api.ui.taskMenu.populate(menu, {\n    taskPath: task.path,\n    onUpdate: () => refreshGraph(),\n});\n\nmenu.addSeparator();\nmenu.addItem((item) =>\n    item\n        .setTitle("Focus in graph")\n        .setIcon("network")\n        .onClick(() => selectGraphNode(task.path))\n);\n\nmenu.showAtMouseEvent(event);\n

Pomodoro#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.pomodoro.status()Returns current Pomodoro state.
api.pomodoro.start(options?, context?)Starts a Pomodoro session.
api.pomodoro.stop(context?)Stops and resets the active Pomodoro session.
api.pomodoro.pause(context?)Pauses the current session.
api.pomodoro.resume(context?)Resumes a paused session.
api.pomodoro.assignTask(pathOrNull, context?)Assigns or clears the current session task.
api.pomodoro.sessions(options?)Returns Pomodoro session history.
api.pomodoro.stats(date?)Returns Pomodoro stats for a date or today.
\n

Recurring Tasks#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodDescription
api.recurring.toggleCompleteInstance(path, date?, context?)Toggles completion for a recurring task instance.
api.recurring.toggleSkippedInstance(path, date?, context?)Toggles skipped state for a recurring task instance.
api.recurring.materializeOccurrence(path, date, context?)Creates or returns an occurrence note for a recurring task date.
\n

Natural Language Parser#

\n
const parsed = api.nlp.parse("Write draft friday 2pm #writing @desk");\n

api.parseNaturalLanguage(text) remains as a compatibility alias. Parsing does not create or modify task files.

\n

See NLP API for HTTP endpoint details and parser behavior.

\n

Settings Snapshot#

\n
const settings = api.settings.snapshot();\nconsole.log(settings.defaultTaskStatus);\n

The returned object is a snapshot. Mutating it does not change TaskNotes settings. api.getSettingsSnapshot() remains available as a compatibility alias.

\n

Bases#

\n

api.bases.updateDefaultFiles() regenerates the configured default TaskNotes .base files from the current TaskNotes settings and returns the created, updated, and skipped file paths.

\n
const result = await api.bases.updateDefaultFiles();\nconsole.log(result.updated);\n

Mutation Context#

\n

Mutating methods accept an optional context object:

\n
{\n  source: "tasknotes-workflows",\n  correlationId: "run-2026-06-01T09-00-00",\n  reason: "status changed to active"\n}\n

TaskNotes attaches this context to normalized events emitted during the mutation. Use it to make workflow runs debuggable, connect multiple API calls to one run, and prevent companion plugins from responding to their own writes.

\n

Events#

\n

Subscribe with api.events.on(eventName, handler) and unsubscribe with api.events.off(ref). In an Obsidian plugin, pass the returned EventRef to this.registerEvent(ref).

\n

Use api.events.list() to discover the event catalogue for companion-plugin UIs:

\n
const events = api.events.list();\n// [{ name: "task.status.changed", label: "Task status changed", category: "task", ... }]\n

Task events:

\n
    \n
  • task.created
  • \n
  • task.updated
  • \n
  • task.deleted
  • \n
  • task.moved
  • \n
  • task.status.changed
  • \n
  • task.completed
  • \n
  • task.uncompleted
  • \n
  • task.archived
  • \n
  • task.unarchived
  • \n
  • task.scheduled.changed
  • \n
  • task.due.changed
  • \n
  • task.priority.changed
  • \n
  • task.tags.changed
  • \n
  • task.contexts.changed
  • \n
  • task.projects.changed
  • \n
  • task.reminders.changed
  • \n
  • task.dependencies.changed
  • \n
  • task.recurrence.changed
  • \n
\n

Time, Pomodoro, and recurring events:

\n
    \n
  • time.started
  • \n
  • time.stopped
  • \n
  • pomodoro.started
  • \n
  • pomodoro.completed
  • \n
  • pomodoro.interrupted
  • \n
  • recurring.instance.completed
  • \n
  • recurring.instance.skipped
  • \n
\n

Specific events are emitted in addition to task.updated. For example, changing a task from open to done emits task.updated, task.status.changed, and task.completed.

\n

Event payloads have this shape:

\n
{\n  event: "task.status.changed",\n  timestamp: "2026-06-01T09:00:00.000Z",\n  taskPath: "Tasks/Review automation design.md",\n  task: { /* current task */ },\n  before: { /* task before change */ },\n  after: { /* task after change */ },\n  deletedTask: undefined,\n  changes: {\n    status: {\n      before: "open",\n      after: "done"\n    }\n  },\n  data: undefined,\n  context: {\n    source: "tasknotes-workflows",\n    correlationId: "run-2026-06-01T09-00-00",\n    reason: "status changed to done"\n  },\n  source: "tasknotes-workflows",\n  correlationId: "run-2026-06-01T09-00-00",\n  reason: "status changed to done",\n  rawEvent: "task-updated"\n}\n

Events caused outside the runtime API may not include context, source, correlationId, or reason.

\n

Example automation-style listener:

\n
const source = "my-workflow-plugin";\n\nthis.registerEvent(\n    api.events.on("task.status.changed", async (event) => {\n        if (event.source === source) {\n            return;\n        }\n\n        if (event.after?.status !== "active") {\n            return;\n        }\n\n        await api.time.start(event.after.path, undefined, {\n            source,\n            correlationId: event.correlationId ?? crypto.randomUUID(),\n            reason: "status changed to active",\n        });\n    })\n);\n

Lifecycle#

\n

Use api.lifecycle to coordinate companion plugin startup, reload, and cache-sensitive UI state:

\n
await api.lifecycle.ready();\n\nthis.registerEvent(\n    api.lifecycle.on("settings.changed", () => {\n        refreshCompanionCatalogs();\n    })\n);\n

Lifecycle events:

\n
    \n
  • ready
  • \n
  • layout.ready
  • \n
  • settings.changed
  • \n
  • cache.changed
  • \n
  • cache.rebuilt
  • \n
  • extension.registered
  • \n
  • extension.unregistered
  • \n
  • unloading
  • \n
\n

api.lifecycle.list() returns labels, descriptions, and categories for these events.

\n

Error Handling#

\n

API methods throw TaskNotesApiError for invalid input or failed operations that the runtime API can classify. The error object includes:

\n
    \n
  • name: always TaskNotesApiError
  • \n
  • code: a stable machine-readable code
  • \n
  • message: a human-readable message for logs
  • \n
  • status: an HTTP-style status code for tools that mirror runtime calls over HTTP or MCP
  • \n
  • details: optional structured context such as the task path, extension namespace, or invalid status
  • \n
\n

Common examples:

\n
    \n
  • The task path is empty or invalid.
  • \n
  • No task exists at the requested path.
  • \n
  • A target move folder already contains a file with the same name.
  • \n
  • complete is called with a status that is not configured as completed.
  • \n
\n

Current error codes:

\n
    \n
  • invalid_input
  • \n
  • invalid_task_path
  • \n
  • invalid_status
  • \n
  • task_not_found
  • \n
  • task_file_not_found
  • \n
  • file_already_exists
  • \n
  • extension_invalid
  • \n
  • extension_namespace_reserved
  • \n
  • extension_namespace_conflict
  • \n
  • extension_not_registered
  • \n
  • operation_failed
  • \n
\n

Use api.errors when workflow engines or background listeners need consistent result objects instead of thrown exceptions:

\n
const result = await api.errors.toResult(() =>\n    api.tasks.complete("Tasks/example.md", { status: "done" })\n);\n\nif (!result.ok) {\n    console.warn(result.error.code, result.error.details);\n    return;\n}\n\nconsole.log(result.value.path);\n

api.errors.normalize(error) converts unknown thrown values into a TaskNotesApiError payload. Unknown JavaScript errors use operation_failed with status 500.

\n","text":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; This API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI. This is separate from the HTTP API. The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app. For user-facing extensions built on this API, see Companion Plugins. For a concrete automation companion plugin, see TaskNotes Workflows. The TypeScript contract lives in src/api/runtime-api.ts. It is intentionally small and type-focused so it can later become a standalone @tasknotes/runtime-api package for companion plugins. Version and Capabilities# Check the API version and capabilities before using methods that may not exist in older TaskNotes versions: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; if (!api || api.apiVersion !== 1 || !api.hasCapability(\"tasks.write\")) { throw new Error(\"This workflow requires TaskNotes runtime API v1 task writes\"); } Current capabilities: model.read model.validate catalog.read extensions.read extensions.register tasks.read tasks.write tasks.delete tasks.move tasks.events relationships.read events.list time.read time.write time.summary pomodoro.read pomodoro.write pomodoro.events recurring.write recurring.materialize recurring.events settings.snapshot bases.write nlp.parse ui.task-menu query.tasks query.validate query.explain query.filter-options stats.tasks system.health lifecycle.events errors.typed Namespaces# Prefer the namespaced API for new code: await api.tasks.update(\"Tasks/example.md\", { status: \"active\" }); const subtasks = await api.relationships.subtasks(\"Tasks/example.md\"); await api.time.start(\"Tasks/example.md\", { description: \"Deep work\" }); await api.pomodoro.start({ taskPath: \"Tasks/example.md\", duration: 25 }); The older flat methods, such as api.getTask(path) and api.parseNaturalLanguage(text), remain available as compatibility aliases. Extension Registry# Companion plugins can publish their own runtime API namespace through api.extensions. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object. const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"extensions.register\")) { return; } const handle = api.extensions.register({ id: this.manifest.id, namespace: \"tasknotes-workflows\", displayName: \"TaskNotes Workflows\", version: this.manifest.version, capabilities: [\"tasknotes-workflows.run\", \"tasknotes-workflows.events\"], api: { runWorkflow: async (workflowId, input) => { // companion plugin implementation }, }, }); this.register(() => handle.unregister()); Other plugins can discover and consume extension namespaces: const workflows = api.extensions.get(\"tasknotes-workflows\"); if (api.hasCapability(\"tasknotes-workflows.run\")) { await workflows.runWorkflow(\"start-timer-on-active\", { taskPath: \"Tasks/example.md\" }); } Extension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions. Companion Plugin Access# Companion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry: const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"tasks.events\")) { return; } this.registerEvent( api.events.on(\"task.status.changed\", (event) => { console.log(event.taskPath, event.changes.status); }) ); If TaskNotes is disabled or has not loaded yet, api will be unavailable. Companion plugins should handle that case and retry after plugin load if needed. TypeScript# Use the exported runtime contract for type safety: import type { TaskNotesRuntimeApiV1 } from \"tasknotes/src/api/runtime-api\"; type TaskNotesPluginInstance = { api?: TaskNotesRuntimeApiV1; }; const tasknotes = app.plugins.getPlugin(\"tasknotes\") as TaskNotesPluginInstance | null; const api = tasknotes?.api; if (api?.apiVersion === 1 && api.hasCapability(\"tasks.write\")) { await api.tasks.setStatus(\"Tasks/example.md\", \"active\"); } TaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete. Model# The runtime API exposes a small model namespace backed by @tasknotes/model: const info = api.model.info(); const config = api.model.config(); const validation = api.model.validateTask(task); Method Description api.model.info() Returns the model package name, TaskNotes spec version, and runtime API version. api.model.config() Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings. api.model.validateTask(task) Validates a partial or complete task against the shared model schema and TaskNotes status rules. api.model.validatePatch(patch) Validates a task patch before passing it to a runtime task mutation. Catalog# Use api.catalog to build companion-plugin editors without hardcoding TaskNotes values: const statuses = api.catalog.statuses(); const writableFields = api.catalog.writableFields(); const operators = api.catalog.filterOperators(); Method Description api.catalog.statuses() Returns configured TaskNotes status definitions. api.catalog.priorities() Returns configured TaskNotes priority definitions. api.catalog.userFields() Returns configured user-defined field mappings. api.catalog.fields() Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available. api.catalog.writableFields() Returns only fields that runtime task mutations may write. api.catalog.filterProperties() Returns canonical query fields, aliases, value types, and supported operators. api.catalog.filterOperators() Returns canonical query operators, labels, value requirements, and accepted aliases. api.catalog.relationships() Returns relationship categories supported by api.relationships. api.catalog.dependencyRelTypes() Returns dependency relationship types accepted by api.tasks.addDependency. api.catalog.events() Returns the same runtime event catalogue as api.events.list(). Tasks# All paths are vault-relative Markdown file paths. Method Description api.tasks.get(path) Returns a task by path, or null when no task is cached at that path. api.tasks.list(query?) Returns all tasks, or tasks matching a runtime task query. Prefer api.query.tasks() when count and grouping metadata matters. api.tasks.create(taskData, context?) Creates a task using the normal TaskNotes creation service. api.tasks.update(path, patch, context?) Updates one or more task fields using the normal TaskNotes update service. api.tasks.delete(path, context?) Deletes the task file through TaskNotes' delete service. api.tasks.complete(path, options?, context?) Marks a task complete. api.tasks.uncomplete(path, options?, context?) Moves a completed task back to a non-completed status. api.tasks.setStatus(path, status, context?) Sets task status. api.tasks.setPriority(path, priority, context?) Sets task priority. api.tasks.setDue(path, date, context?) / clearDue(path, context?) Sets or clears due date. api.tasks.setScheduled(path, date, context?) / clearScheduled(path, context?) Sets or clears scheduled date. api.tasks.archive(path, archived, context?) Archives or unarchives a task, including archive-folder movement when configured. api.tasks.move(path, targetFolder, context?) Moves the task note and refuses to overwrite an existing file. api.tasks.addTag/removeTag Mutates task tags. api.tasks.addProject/removeProject Mutates project links. api.tasks.addContext/removeContext Mutates contexts. api.tasks.setReminders/addReminder/removeReminder Mutates reminders. api.tasks.addDependency/removeDependency Mutates blocking dependencies stored in blockedBy. Example: const task = await api.tasks.create( { title: \"Review automation design\", status: \"open\", priority: \"normal\", scheduled: \"2026-06-01\", tags: [\"tasknotes\"], }, { source: \"my-companion-plugin\", correlationId: crypto.randomUUID(), reason: \"manual workflow command\", } ); await api.tasks.complete(task.path); Relationships# Relationship methods resolve TaskNotes' project-as-parent links and blockedBy dependencies into task records where possible. Method Description api.relationships.parents(path) Returns parent tasks referenced from the task's projects. api.relationships.subtasks(path) Returns tasks that reference this task as a project. api.relationships.dependencies(path) Returns blockedBy dependencies with resolved task data when available. api.relationships.blocking(path) Returns tasks that are blocked by this task. api.relationships.all(path) Returns the task plus parents, subtasks, dependencies, and blocking tasks. Example: const relationships = await api.relationships.all(\"Tasks/example.md\"); for (const subtask of relationships.subtasks) { await api.tasks.setPriority(subtask.path, relationships.task.priority); } Time Tracking# Method Description api.time.start(path, options?, context?) Starts time tracking and returns the updated task. api.time.stop(path, context?) Stops the active time entry and returns the updated task. api.time.active() Returns active time entries with task, path, entry, and entry index. api.time.summary(options?) Returns aggregate time totals, top tasks, projects, and tags. api.time.task(path) Returns one task's time summary and normalized time entries. api.time.append(path, entry, context?) Appends a time entry. api.time.deleteEntry(path, entryIndex, context?) Deletes a time entry through TaskNotes' service. Query, Stats, And System# The query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state. const result = await api.query.tasks({ where: { all: [ { field: \"task.status\", op: \"eq\", value: \"active\" }, { field: \"task.due\", op: \"lte\", value: { fn: \"today\" } }, ], }, sort: [{ field: \"task.due\", direction: \"asc\" }], group: [{ field: \"task.status\" }], limit: 25, scope: { includeArchived: false, folders: [\"Tasks\"], }, }); Runtime query fields are canonical IDs such as task.status, task.priority, task.due, task.projects, task.isBlocked, file.path, and user.. api.catalog.filterProperties() returns the complete queryable field catalog, including aliases such as status and user:. Canonical operators are eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Legacy operator aliases such as is, is-not, is-on-or-before, and is-not-empty are accepted and normalized. api.query.tasks() returns explicit count semantics: total: tasks in scope before filtering matched: tasks matching where before offset and limit returned: tasks returned after offset and limit tasks: returned task records groups: optional group details with task paths query: the normalized canonical query warnings: non-fatal normalization notes Method Description api.query.tasks(query?) Validates, normalizes, and executes a runtime task query. api.query.validate(query) Validates a query without executing it. api.query.normalize(query) Returns the canonical normalized query, or throws a typed invalid_input API error. api.query.explain(query) Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run. api.query.filterOptions() Returns available statuses, priorities, contexts, projects, tags, folders, and user properties. api.stats.tasks(query?) Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals. api.system.health() Returns runtime status, API version, capabilities, vault identity, and task count. TaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract. Task Menu UI# Companion plugins can reuse the standard TaskNotes task context menu through api.ui.taskMenu. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals. This surface is only available inside Obsidian. It is not exposed through the HTTP API. Method Description api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? }) Shows the standard TaskNotes task context menu at a mouse event. api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... }) Shows the standard TaskNotes task context menu anchored to an element. api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... }) Adds the standard TaskNotes task context menu items to an existing Obsidian Menu so plugins can extend it. All methods resolve taskPath through the TaskNotes task cache and throw a typed task_not_found error when the path does not point to a cached task. targetDate defaults to today and is used by date-sensitive recurring-task menu items. onUpdate is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. promoteOccurrenceControls moves recurring-instance controls to the top of the menu. Example context menu: nodeEl.addEventListener(\"contextmenu\", async (event) => { event.preventDefault(); await api.ui.taskMenu.show({ taskPath: task.path, event, onUpdate: () => refreshGraph(), }); }); Example composed menu: const menu = new Menu(); await api.ui.taskMenu.populate(menu, { taskPath: task.path, onUpdate: () => refreshGraph(), }); menu.addSeparator(); menu.addItem((item) => item .setTitle(\"Focus in graph\") .setIcon(\"network\") .onClick(() => selectGraphNode(task.path)) ); menu.showAtMouseEvent(event); Pomodoro# Method Description api.pomodoro.status() Returns current Pomodoro state. api.pomodoro.start(options?, context?) Starts a Pomodoro session. api.pomodoro.stop(context?) Stops and resets the active Pomodoro session. api.pomodoro.pause(context?) Pauses the current session. api.pomodoro.resume(context?) Resumes a paused session. api.pomodoro.assignTask(pathOrNull, context?) Assigns or clears the current session task. api.pomodoro.sessions(options?) Returns Pomodoro session history. api.pomodoro.stats(date?) Returns Pomodoro stats for a date or today. Recurring Tasks# Method Description api.recurring.toggleCompleteInstance(path, date?, context?) Toggles completion for a recurring task instance. api.recurring.toggleSkippedInstance(path, date?, context?) Toggles skipped state for a recurring task instance. api.recurring.materializeOccurrence(path, date, context?) Creates or returns an occurrence note for a recurring task date. Natural Language Parser# const parsed = api.nlp.parse(\"Write draft friday 2pm #writing @desk\"); api.parseNaturalLanguage(text) remains as a compatibility alias. Parsing does not create or modify task files. See NLP API for HTTP endpoint details and parser behavior. Settings Snapshot# const settings = api.settings.snapshot(); console.log(settings.defaultTaskStatus); The returned object is a snapshot. Mutating it does not change TaskNotes settings. api.getSettingsSnapshot() remains available as a compatibility alias. Bases# api.bases.updateDefaultFiles() regenerates the configured default TaskNotes .base files from the current TaskNotes settings and returns the created, updated, and skipped file paths. const result = await api.bases.updateDefaultFiles(); console.log(result.updated); Mutation Context# Mutating methods accept an optional context object: { source: \"tasknotes-workflows\", correlationId: \"run-2026-06-01T09-00-00\", reason: \"status chang"},{"route":"/obsidian/mdbase-tasknotes-cli/","title":"mdbase-tasknotes CLI","description":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-c...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/mdbase-tasknotes-cli.md","namespace":"obsidian","relativePath":"mdbase-tasknotes-cli.md","raw":"# mdbase-tasknotes CLI\n\n[mdbase-tasknotes](https://github.com/callumalpass/mdbase-tasknotes) (`mtn`) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses [mdbase](https://mdbase.dev) to read and write task files and [tasknotes-nlp-core](https://github.com/callumalpass/tasknotes-nlp-core) for natural language parsing.\n\n\n## When to use this vs TaskNotes Obsidian CLI\n\nIf you are looking for the built-in `obsidian tasknotes:*` commands exposed by the plugin itself, see [TaskNotes Obsidian CLI](obsidian-cli.md).\n\nTaskNotes ships with [tasknotes-cli](https://github.com/callumalpass/tasknotes-cli) (`tn`), which communicates with the Obsidian plugin over its HTTP API. `mdbase-tasknotes` operates directly on the markdown files instead.\n\n| | `tn` (tasknotes-cli) | `mtn` (mdbase-tasknotes) |\n|---|---|---|\n| **Requires Obsidian** | Yes — plugin must be running with API enabled | No |\n| **Operates on** | HTTP API | Markdown files directly via mdbase |\n| **Use when** | Obsidian is open and you want live sync | Obsidian is closed, on a server, or in scripts |\n| **Time tracking** | Via plugin API | Via frontmatter `timeEntries` |\n| **Task creation** | NLP via API | NLP via bundled `tasknotes-nlp-core` |\n| **Install** | `npm install -g tasknotes-cli` | `npm install -g mdbase-tasknotes` |\n\nUse `mtn` when:\n\n- Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines)\n- You want to manage tasks from the terminal without any background process\n- You're scripting task creation or querying in shell workflows\n- You're on a machine where Obsidian isn't installed\n\nBoth tools read and write the same task files, so they can be used interchangeably on the same vault.\n\n## Install\n\n```\nnpm install -g mdbase-tasknotes\n```\n\n## Setup\n\n### Using an existing TaskNotes vault\n\nIf you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point `mtn` at your vault root:\n\n```bash\nmtn config --set collectionPath=/path/to/your/vault\n```\n\nThe plugin generates `mdbase.yaml` and `_types/task.md` automatically — `mtn` reads these to understand your task schema, including your custom statuses and priorities.\n\n### Creating a standalone collection\n\nTo create a new collection without Obsidian:\n\n```bash\nmtn init ~/tasks\nmtn config --set collectionPath=~/tasks\n```\n\nThis generates `mdbase.yaml`, `_types/task.md`, and a `tasks/` folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent).\n\n## Creating tasks\n\nCreate tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically:\n\n```bash\nmtn create \"Buy groceries tomorrow #shopping @errands\"\nmtn create \"Write quarterly report due friday #work +quarterly-review\"\nmtn create \"Call dentist high priority @phone\"\nmtn create \"Water plants every monday #home\"\n```\n\n### Supported patterns\n\n| Pattern | Example | Extracted as |\n|---|---|---|\n| `#tag` | `#shopping` | Tag |\n| `@context` | `@errands` | Context |\n| `+project` | `+quarterly-review` | Project (stored as wikilink) |\n| Date words | `tomorrow`, `friday`, `next week` | Due date |\n| Priority words | `high priority`, `urgent` | Priority |\n| Recurrence | `every day`, `weekly`, `every monday` | Recurrence rule |\n| Estimate | `~30m`, `~2h` | Time estimate |\n\nThe NLP parser reads your collection's status and priority enum values from `_types/task.md`, so any custom values you define there are automatically recognized.\n\n## Querying tasks\n\n### List tasks\n\n```bash\n# Default: open tasks ordered by due date\nmtn list\n\n# Filter by status, priority, or tag\nmtn list --status in-progress\nmtn list --priority high\nmtn list --tag work\n\n# Show overdue tasks\nmtn list --overdue\n\n# Raw mdbase where expression\nmtn list --where 'due < \"2026-03-01\" && priority == \"urgent\"'\n\n# JSON output for scripting\nmtn list --json\n```\n\n### Show task detail\n\n```bash\nmtn show \"Buy groceries\"\nmtn show tasks/Buy\\ groceries.md\n```\n\nTasks can be referenced by title or file path. Title matching tries exact match first, then substring.\n\n### Search\n\nFull-text search across titles, body content, tags, contexts, and projects:\n\n```bash\nmtn search quarterly\n```\n\n## Updating tasks\n\n### Complete a task\n\n```bash\nmtn complete \"Buy groceries\"\n```\n\nSets status to `done` and records the completion date.\n\n### Update fields\n\n```bash\nmtn update \"Write report\" --status in-progress\nmtn update \"Write report\" --priority urgent --due 2026-03-01\nmtn update \"Write report\" --add-tag important --remove-tag draft\nmtn update \"Write report\" --add-context office\n```\n\n### Archive and delete\n\n```bash\nmtn archive \"Write report\" # Adds \"archive\" tag\nmtn delete \"Old task\" # Checks for backlinks first\nmtn delete \"Old task\" --force # Skip backlink check\n```\n\n## Time tracking\n\nTrack time spent on tasks via the `timeEntries` frontmatter field — the same format TaskNotes uses.\n\n```bash\n# Start a timer\nmtn timer start \"Write report\"\nmtn timer start \"Write report\" -d \"Drafting introduction\"\n\n# Check active timers\nmtn timer status\n\n# Stop the running timer\nmtn timer stop\n\n# View time log\nmtn timer log\nmtn timer log --period today\nmtn timer log --period week\nmtn timer log --from 2026-02-01 --to 2026-02-28\n```\n\n## Projects and statistics\n\n### Projects\n\n```bash\n# List all projects\nmtn projects list\nmtn projects list --stats # With completion percentages\n\n# Show tasks for a project\nmtn projects show quarterly-review\n```\n\n### Statistics\n\n```bash\nmtn stats\n```\n\nShows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked.\n\n## Interactive mode\n\nLaunch a REPL with live NLP preview that updates as you type:\n\n```bash\nmtn interactive\n# or\nmtn i\n```\n\nType a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task.\n\n## Configuration\n\nConfiguration is stored at `~/.config/mdbase-tasknotes/config.json`.\n\n```bash\nmtn config --list # Show all settings\nmtn config --set collectionPath=/path/to/vault # Set collection path\nmtn config --get collectionPath # Get a setting\n```\n\n### Collection path resolution\n\nThe collection path is resolved in order:\n\n1. `--path` / `-p` flag on any command\n2. `MDBASE_TASKNOTES_PATH` environment variable\n3. `collectionPath` in config file\n4. Current working directory\n\n## Command reference\n\n| Command | Alias | Description |\n|---|---|---|\n| `mtn init [path]` | | Initialize a new collection |\n| `mtn create ` | | Create a task from natural language |\n| `mtn list [options]` | `ls` | List tasks with filters |\n| `mtn show ` | | Show full task detail |\n| `mtn complete ` | `done` | Mark task as completed |\n| `mtn update [options]` | | Update task fields |\n| `mtn delete ` | `rm` | Delete a task |\n| `mtn archive ` | | Add archive tag |\n| `mtn search ` | | Full-text search |\n| `mtn timer start ` | | Start time tracking |\n| `mtn timer stop` | | Stop running timer |\n| `mtn timer status` | | Show active timers |\n| `mtn timer log` | | Show time entry log |\n| `mtn projects list` | | List projects |\n| `mtn projects show ` | | Show project tasks |\n| `mtn stats` | | Show task statistics |\n| `mtn interactive` | `i` | Interactive REPL |\n| `mtn config [options]` | | Manage configuration |\n","aliases":["/mdbase-tasknotes-cli/"],"toc":[{"level":2,"id":"when-to-use-this-vs-tasknotes-obsidian-cli","text":"When to use this vs TaskNotes Obsidian CLI"},{"level":2,"id":"install","text":"Install"},{"level":2,"id":"setup","text":"Setup"},{"level":3,"id":"using-an-existing-tasknotes-vault","text":"Using an existing TaskNotes vault"},{"level":3,"id":"creating-a-standalone-collection","text":"Creating a standalone collection"},{"level":2,"id":"creating-tasks","text":"Creating tasks"},{"level":3,"id":"supported-patterns","text":"Supported patterns"},{"level":2,"id":"querying-tasks","text":"Querying tasks"},{"level":3,"id":"list-tasks","text":"List tasks"},{"level":3,"id":"show-task-detail","text":"Show task detail"},{"level":3,"id":"search","text":"Search"},{"level":2,"id":"updating-tasks","text":"Updating tasks"},{"level":3,"id":"complete-a-task","text":"Complete a task"},{"level":3,"id":"update-fields","text":"Update fields"},{"level":3,"id":"archive-and-delete","text":"Archive and delete"},{"level":2,"id":"time-tracking","text":"Time tracking"},{"level":2,"id":"projects-and-statistics","text":"Projects and statistics"},{"level":3,"id":"projects","text":"Projects"},{"level":3,"id":"statistics","text":"Statistics"},{"level":2,"id":"interactive-mode","text":"Interactive mode"},{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"collection-path-resolution","text":"Collection path resolution"},{"level":2,"id":"command-reference","text":"Command reference"}],"html":"

mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-core for natural language parsing.

\n

When to use this vs TaskNotes Obsidian CLI#

\n

If you are looking for the built-in obsidian tasknotes:* commands exposed by the plugin itself, see TaskNotes Obsidian CLI.

\n

TaskNotes ships with tasknotes-cli (tn), which communicates with the Obsidian plugin over its HTTP API. mdbase-tasknotes operates directly on the markdown files instead.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
tn (tasknotes-cli)mtn (mdbase-tasknotes)
Requires ObsidianYes — plugin must be running with API enabledNo
Operates onHTTP APIMarkdown files directly via mdbase
Use whenObsidian is open and you want live syncObsidian is closed, on a server, or in scripts
Time trackingVia plugin APIVia frontmatter timeEntries
Task creationNLP via APINLP via bundled tasknotes-nlp-core
Installnpm install -g tasknotes-clinpm install -g mdbase-tasknotes
\n

Use mtn when:

\n
    \n
  • Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines)
  • \n
  • You want to manage tasks from the terminal without any background process
  • \n
  • You're scripting task creation or querying in shell workflows
  • \n
  • You're on a machine where Obsidian isn't installed
  • \n
\n

Both tools read and write the same task files, so they can be used interchangeably on the same vault.

\n

Install#

\n
npm install -g mdbase-tasknotes\n

Setup#

\n

Using an existing TaskNotes vault#

\n

If you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point mtn at your vault root:

\n
mtn config --set collectionPath=/path/to/your/vault\n

The plugin generates mdbase.yaml and _types/task.md automatically — mtn reads these to understand your task schema, including your custom statuses and priorities.

\n

Creating a standalone collection#

\n

To create a new collection without Obsidian:

\n
mtn init ~/tasks\nmtn config --set collectionPath=~/tasks\n

This generates mdbase.yaml, _types/task.md, and a tasks/ folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent).

\n

Creating tasks#

\n

Create tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically:

\n
mtn create "Buy groceries tomorrow #shopping @errands"\nmtn create "Write quarterly report due friday #work +quarterly-review"\nmtn create "Call dentist high priority @phone"\nmtn create "Water plants every monday #home"\n

Supported patterns#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PatternExampleExtracted as
#tag#shoppingTag
@context@errandsContext
+project+quarterly-reviewProject (stored as wikilink)
Date wordstomorrow, friday, next weekDue date
Priority wordshigh priority, urgentPriority
Recurrenceevery day, weekly, every mondayRecurrence rule
Estimate~30m, ~2hTime estimate
\n

The NLP parser reads your collection's status and priority enum values from _types/task.md, so any custom values you define there are automatically recognized.

\n

Querying tasks#

\n

List tasks#

\n
# Default: open tasks ordered by due date\nmtn list\n\n# Filter by status, priority, or tag\nmtn list --status in-progress\nmtn list --priority high\nmtn list --tag work\n\n# Show overdue tasks\nmtn list --overdue\n\n# Raw mdbase where expression\nmtn list --where 'due < "2026-03-01" && priority == "urgent"'\n\n# JSON output for scripting\nmtn list --json\n

Show task detail#

\n
mtn show "Buy groceries"\nmtn show tasks/Buy\\ groceries.md\n

Tasks can be referenced by title or file path. Title matching tries exact match first, then substring.

\n

Search#

\n

Full-text search across titles, body content, tags, contexts, and projects:

\n
mtn search quarterly\n

Updating tasks#

\n

Complete a task#

\n
mtn complete "Buy groceries"\n

Sets status to done and records the completion date.

\n

Update fields#

\n
mtn update "Write report" --status in-progress\nmtn update "Write report" --priority urgent --due 2026-03-01\nmtn update "Write report" --add-tag important --remove-tag draft\nmtn update "Write report" --add-context office\n

Archive and delete#

\n
mtn archive "Write report"     # Adds "archive" tag\nmtn delete "Old task"           # Checks for backlinks first\nmtn delete "Old task" --force   # Skip backlink check\n

Time tracking#

\n

Track time spent on tasks via the timeEntries frontmatter field — the same format TaskNotes uses.

\n
# Start a timer\nmtn timer start "Write report"\nmtn timer start "Write report" -d "Drafting introduction"\n\n# Check active timers\nmtn timer status\n\n# Stop the running timer\nmtn timer stop\n\n# View time log\nmtn timer log\nmtn timer log --period today\nmtn timer log --period week\nmtn timer log --from 2026-02-01 --to 2026-02-28\n

Projects and statistics#

\n

Projects#

\n
# List all projects\nmtn projects list\nmtn projects list --stats    # With completion percentages\n\n# Show tasks for a project\nmtn projects show quarterly-review\n

Statistics#

\n
mtn stats\n

Shows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked.

\n

Interactive mode#

\n

Launch a REPL with live NLP preview that updates as you type:

\n
mtn interactive\n# or\nmtn i\n

Type a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task.

\n

Configuration#

\n

Configuration is stored at ~/.config/mdbase-tasknotes/config.json.

\n
mtn config --list                              # Show all settings\nmtn config --set collectionPath=/path/to/vault  # Set collection path\nmtn config --get collectionPath                 # Get a setting\n

Collection path resolution#

\n

The collection path is resolved in order:

\n
    \n
  1. --path / -p flag on any command
  2. \n
  3. MDBASE_TASKNOTES_PATH environment variable
  4. \n
  5. collectionPath in config file
  6. \n
  7. Current working directory
  8. \n
\n

Command reference#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandAliasDescription
mtn init [path]Initialize a new collection
mtn create <text...>Create a task from natural language
mtn list [options]lsList tasks with filters
mtn show <task>Show full task detail
mtn complete <task>doneMark task as completed
mtn update <task> [options]Update task fields
mtn delete <task>rmDelete a task
mtn archive <task>Add archive tag
mtn search <query>Full-text search
mtn timer start <task>Start time tracking
mtn timer stopStop running timer
mtn timer statusShow active timers
mtn timer logShow time entry log
mtn projects listList projects
mtn projects show <name>Show project tasks
mtn statsShow task statistics
mtn interactiveiInteractive REPL
mtn config [options]Manage configuration
\n","text":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-core for natural language parsing. When to use this vs TaskNotes Obsidian CLI# If you are looking for the built-in obsidian tasknotes:* commands exposed by the plugin itself, see TaskNotes Obsidian CLI. TaskNotes ships with tasknotes-cli (tn), which communicates with the Obsidian plugin over its HTTP API. mdbase-tasknotes operates directly on the markdown files instead. tn (tasknotes-cli) mtn (mdbase-tasknotes) Requires Obsidian Yes — plugin must be running with API enabled No Operates on HTTP API Markdown files directly via mdbase Use when Obsidian is open and you want live sync Obsidian is closed, on a server, or in scripts Time tracking Via plugin API Via frontmatter timeEntries Task creation NLP via API NLP via bundled tasknotes-nlp-core Install npm install -g tasknotes-cli npm install -g mdbase-tasknotes Use mtn when: Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines) You want to manage tasks from the terminal without any background process You're scripting task creation or querying in shell workflows You're on a machine where Obsidian isn't installed Both tools read and write the same task files, so they can be used interchangeably on the same vault. Install# npm install -g mdbase-tasknotes Setup# Using an existing TaskNotes vault# If you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point mtn at your vault root: mtn config --set collectionPath=/path/to/your/vault The plugin generates mdbase.yaml and _types/task.md automatically — mtn reads these to understand your task schema, including your custom statuses and priorities. Creating a standalone collection# To create a new collection without Obsidian: mtn init ~/tasks mtn config --set collectionPath=~/tasks This generates mdbase.yaml, _types/task.md, and a tasks/ folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent). Creating tasks# Create tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically: mtn create \"Buy groceries tomorrow #shopping @errands\" mtn create \"Write quarterly report due friday #work +quarterly-review\" mtn create \"Call dentist high priority @phone\" mtn create \"Water plants every monday #home\" Supported patterns# Pattern Example Extracted as #tag #shopping Tag @context @errands Context +project +quarterly-review Project (stored as wikilink) Date words tomorrow, friday, next week Due date Priority words high priority, urgent Priority Recurrence every day, weekly, every monday Recurrence rule Estimate ~30m, ~2h Time estimate The NLP parser reads your collection's status and priority enum values from _types/task.md, so any custom values you define there are automatically recognized. Querying tasks# List tasks# # Default: open tasks ordered by due date mtn list # Filter by status, priority, or tag mtn list --status in-progress mtn list --priority high mtn list --tag work # Show overdue tasks mtn list --overdue # Raw mdbase where expression mtn list --where 'due < \"2026-03-01\" && priority == \"urgent\"' # JSON output for scripting mtn list --json Show task detail# mtn show \"Buy groceries\" mtn show tasks/Buy\\ groceries.md Tasks can be referenced by title or file path. Title matching tries exact match first, then substring. Search# Full-text search across titles, body content, tags, contexts, and projects: mtn search quarterly Updating tasks# Complete a task# mtn complete \"Buy groceries\" Sets status to done and records the completion date. Update fields# mtn update \"Write report\" --status in-progress mtn update \"Write report\" --priority urgent --due 2026-03-01 mtn update \"Write report\" --add-tag important --remove-tag draft mtn update \"Write report\" --add-context office Archive and delete# mtn archive \"Write report\" # Adds \"archive\" tag mtn delete \"Old task\" # Checks for backlinks first mtn delete \"Old task\" --force # Skip backlink check Time tracking# Track time spent on tasks via the timeEntries frontmatter field — the same format TaskNotes uses. # Start a timer mtn timer start \"Write report\" mtn timer start \"Write report\" -d \"Drafting introduction\" # Check active timers mtn timer status # Stop the running timer mtn timer stop # View time log mtn timer log mtn timer log --period today mtn timer log --period week mtn timer log --from 2026-02-01 --to 2026-02-28 Projects and statistics# Projects# # List all projects mtn projects list mtn projects list --stats # With completion percentages # Show tasks for a project mtn projects show quarterly-review Statistics# mtn stats Shows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked. Interactive mode# Launch a REPL with live NLP preview that updates as you type: mtn interactive # or mtn i Type a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task. Configuration# Configuration is stored at ~/.config/mdbase-tasknotes/config.json. mtn config --list # Show all settings mtn config --set collectionPath=/path/to/vault # Set collection path mtn config --get collectionPath # Get a setting Collection path resolution# The collection path is resolved in order: --path / -p flag on any command MDBASE_TASKNOTES_PATH environment variable collectionPath in config file Current working directory Command reference# Command Alias Description mtn init [path] Initialize a new collection mtn create Create a task from natural language mtn list [options] ls List tasks with filters mtn show Show full task detail mtn complete done Mark task as completed mtn update [options] Update task fields mtn delete rm Delete a task mtn archive Add archive tag mtn search Full-text search mtn timer start Start time tracking mtn timer stop Stop running timer mtn timer status Show active timers mtn timer log Show time entry log mtn projects list List projects mtn projects show Show project tasks mtn stats Show task statistics mtn interactive i Interactive REPL mtn config [options] Manage configuration"},{"route":"/obsidian/migration-v3-to-v4/","title":"Migrating from v3 to v4","description":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/migration-v3-to-v4.md","namespace":"obsidian","relativePath":"migration-v3-to-v4.md","raw":"# Migrating from v3 to v4\n\nTaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.\n\n!!! warning \"Back up before migrating\"\n Back up the complete vault, including the hidden `.obsidian` directory, before changing views or plugin data.\n\n## Requirements\n\n- **Obsidian 1.10.1 or later** for early TaskNotes v4 releases\n- **Obsidian 1.12.2 or later** for the current TaskNotes 4.12.3 release\n- **Bases core plugin enabled** (Settings → Core Plugins → Bases)\n\n## What Changed\n\n### Views are Now Bases Files\n\nAll task views (Task List, Kanban, Calendar, Agenda) are now `.base` files stored in `TaskNotes/Views/`. This replaces the custom view system in v3.\n\n| v3 | v4 |\n|----|-----|\n| Views stored in plugin settings | Views stored as `.base` files |\n| Custom filter UI | Bases filter syntax |\n| Saved views in settings | Default views are separate files; exported v3 saved views share one multi-view file |\n\n### Automatic Migration on First Launch\n\nWhen you first open TaskNotes v4:\n\n1. Default `.base` files are created in `TaskNotes/Views/`\n2. Ribbon icons and commands now open these `.base` files\n3. Your existing task files are unchanged\n\n### Converting Saved Filter Views\n\nIf you had saved filter views in v3, you can export them to one `.base` file:\n\n1. Go to **Settings → TaskNotes → General → Views & base files**.\n2. Find **Export v3 saved views to Bases**.\n3. Run the export.\n4. TaskNotes creates `TaskNotes/Views/all-saved-views.base` with one Base view for each saved v3 view.\n\nThis is a one-way conversion. The original saved views remain in settings until you delete them.\n\n## Breaking Changes\n\n### View Configuration\n\nv3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment.\n\n**v3 Filter Example:**\n```\nstatus: in-progress\npriority: high\n```\n\n**v4 Bases Syntax:**\n```yaml\nfilters:\n and:\n - status == \"in-progress\"\n - priority == \"high\"\n```\n\nSee the [Obsidian Bases documentation](https://help.obsidian.md/Bases/Introduction+to+Bases) for filter syntax details.\n\n### Minimum Obsidian Version\n\nEarly v4 releases required Obsidian 1.10.1. The current release requirement is generated on the [version compatibility](reference/compatibility.md) page. Use the manifest requirement for the exact TaskNotes version you install.\n\n## New Features in v4\n\n### OAuth Calendar Integration\n\nv4 adds Google Calendar and Microsoft Outlook integration:\n\n- View external calendar events alongside tasks\n- Drag events to reschedule (syncs back to calendar provider)\n- Events sync every 15 minutes\n\nSee [Calendar Setup](calendar-setup.md) for configuration.\n\n### Kanban Swimlanes\n\nThe Kanban view now supports horizontal swimlane grouping:\n\n```yaml\nviews:\n - type: tasknotesKanban\n groupBy:\n property: status\n config:\n swimLane: priority\n```\n\n### Time Entry Editor\n\nA dedicated modal for managing time entries:\n\n- Alt-drag on calendar to create time entries\n- View total tracked time per task\n- Edit and delete time entries\n\n## Troubleshooting\n\n### Views Not Loading\n\n1. Verify Bases core plugin is enabled (Settings → Core Plugins)\n2. Check that `.base` files exist in `TaskNotes/Views/`\n3. Restart Obsidian\n\n### Missing Saved Views After Upgrade\n\nSaved views from v3 are preserved in settings. Use **Export v3 saved views to Bases** in **Settings → TaskNotes → General → Views & base files** to create the multi-view `.base` file.\n\n### Filter Syntax Errors\n\nBases uses different filter syntax than v3. Common issues:\n\n| Problem | Solution |\n|---------|----------|\n| `status: done` | Use `status == \"done\"` |\n| Multiple conditions | Wrap in `and:` or `or:` block |\n| Date comparisons | Use `date(due) < today()` |\n\n### Downgrading to v3\n\nMigration is one-way. If you need to downgrade:\n\n1. Uninstall TaskNotes v4\n2. Install TaskNotes v3 from releases\n3. Reconfigure your saved views manually\n\nYour task files are unaffected—only view configurations change.\n\n## View Templates\n\nFor complete `.base` file examples, see [Default Base Templates](views/default-base-templates.md).\n","aliases":["/migration-v3-to-v4/"],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"what-changed","text":"What Changed"},{"level":3,"id":"views-are-now-bases-files","text":"Views are Now Bases Files"},{"level":3,"id":"automatic-migration-on-first-launch","text":"Automatic Migration on First Launch"},{"level":3,"id":"converting-saved-filter-views","text":"Converting Saved Filter Views"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"},{"level":3,"id":"view-configuration","text":"View Configuration"},{"level":3,"id":"minimum-obsidian-version","text":"Minimum Obsidian Version"},{"level":2,"id":"new-features-in-v4","text":"New Features in v4"},{"level":3,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"kanban-swimlanes","text":"Kanban Swimlanes"},{"level":3,"id":"time-entry-editor","text":"Time Entry Editor"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"views-not-loading","text":"Views Not Loading"},{"level":3,"id":"missing-saved-views-after-upgrade","text":"Missing Saved Views After Upgrade"},{"level":3,"id":"filter-syntax-errors","text":"Filter Syntax Errors"},{"level":3,"id":"downgrading-to-v3","text":"Downgrading to v3"},{"level":2,"id":"view-templates","text":"View Templates"}],"html":"

TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.

\n\n

Requirements#

\n
    \n
  • Obsidian 1.10.1 or later for early TaskNotes v4 releases
  • \n
  • Obsidian 1.12.2 or later for the current TaskNotes 4.12.3 release
  • \n
  • Bases core plugin enabled (Settings → Core Plugins → Bases)
  • \n
\n

What Changed#

\n

Views are Now Bases Files#

\n

All task views (Task List, Kanban, Calendar, Agenda) are now .base files stored in TaskNotes/Views/. This replaces the custom view system in v3.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
v3v4
Views stored in plugin settingsViews stored as .base files
Custom filter UIBases filter syntax
Saved views in settingsDefault views are separate files; exported v3 saved views share one multi-view file
\n

Automatic Migration on First Launch#

\n

When you first open TaskNotes v4:

\n
    \n
  1. Default .base files are created in TaskNotes/Views/
  2. \n
  3. Ribbon icons and commands now open these .base files
  4. \n
  5. Your existing task files are unchanged
  6. \n
\n

Converting Saved Filter Views#

\n

If you had saved filter views in v3, you can export them to one .base file:

\n
    \n
  1. Go to Settings → TaskNotes → General → Views & base files.
  2. \n
  3. Find Export v3 saved views to Bases.
  4. \n
  5. Run the export.
  6. \n
  7. TaskNotes creates TaskNotes/Views/all-saved-views.base with one Base view for each saved v3 view.
  8. \n
\n

This is a one-way conversion. The original saved views remain in settings until you delete them.

\n

Breaking Changes#

\n

View Configuration#

\n

v3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment.

\n

v3 Filter Example:

\n
status: in-progress\npriority: high\n

v4 Bases Syntax:

\n
filters:\n  and:\n    - status == "in-progress"\n    - priority == "high"\n

See the Obsidian Bases documentation for filter syntax details.

\n

Minimum Obsidian Version#

\n

Early v4 releases required Obsidian 1.10.1. The current release requirement is generated on the version compatibility page. Use the manifest requirement for the exact TaskNotes version you install.

\n

New Features in v4#

\n

OAuth Calendar Integration#

\n

v4 adds Google Calendar and Microsoft Outlook integration:

\n
    \n
  • View external calendar events alongside tasks
  • \n
  • Drag events to reschedule (syncs back to calendar provider)
  • \n
  • Events sync every 15 minutes
  • \n
\n

See Calendar Setup for configuration.

\n

Kanban Swimlanes#

\n

The Kanban view now supports horizontal swimlane grouping:

\n
views:\n  - type: tasknotesKanban\n    groupBy:\n      property: status\n    config:\n      swimLane: priority\n

Time Entry Editor#

\n

A dedicated modal for managing time entries:

\n
    \n
  • Alt-drag on calendar to create time entries
  • \n
  • View total tracked time per task
  • \n
  • Edit and delete time entries
  • \n
\n

Troubleshooting#

\n

Views Not Loading#

\n
    \n
  1. Verify Bases core plugin is enabled (Settings → Core Plugins)
  2. \n
  3. Check that .base files exist in TaskNotes/Views/
  4. \n
  5. Restart Obsidian
  6. \n
\n

Missing Saved Views After Upgrade#

\n

Saved views from v3 are preserved in settings. Use Export v3 saved views to Bases in Settings → TaskNotes → General → Views & base files to create the multi-view .base file.

\n

Filter Syntax Errors#

\n

Bases uses different filter syntax than v3. Common issues:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ProblemSolution
status: doneUse status == "done"
Multiple conditionsWrap in and: or or: block
Date comparisonsUse date(due) < today()
\n

Downgrading to v3#

\n

Migration is one-way. If you need to downgrade:

\n
    \n
  1. Uninstall TaskNotes v4
  2. \n
  3. Install TaskNotes v3 from releases
  4. \n
  5. Reconfigure your saved views manually
  6. \n
\n

Your task files are unaffected—only view configurations change.

\n

View Templates#

\n

For complete .base file examples, see Default Base Templates.

\n","text":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup. Back up before migratingBack up the complete vault, including the hidden .obsidian directory, before changing views or plugin data. Requirements# Obsidian 1.10.1 or later for early TaskNotes v4 releases Obsidian 1.12.2 or later for the current TaskNotes 4.12.3 release Bases core plugin enabled (Settings → Core Plugins → Bases) What Changed# Views are Now Bases Files# All task views (Task List, Kanban, Calendar, Agenda) are now .base files stored in TaskNotes/Views/. This replaces the custom view system in v3. v3 v4 Views stored in plugin settings Views stored as .base files Custom filter UI Bases filter syntax Saved views in settings Default views are separate files; exported v3 saved views share one multi-view file Automatic Migration on First Launch# When you first open TaskNotes v4: Default .base files are created in TaskNotes/Views/ Ribbon icons and commands now open these .base files Your existing task files are unchanged Converting Saved Filter Views# If you had saved filter views in v3, you can export them to one .base file: Go to Settings → TaskNotes → General → Views & base files. Find Export v3 saved views to Bases. Run the export. TaskNotes creates TaskNotes/Views/all-saved-views.base with one Base view for each saved v3 view. This is a one-way conversion. The original saved views remain in settings until you delete them. Breaking Changes# View Configuration# v3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment. v3 Filter Example: status: in-progress priority: high v4 Bases Syntax: filters: and: - status == \"in-progress\" - priority == \"high\" See the Obsidian Bases documentation for filter syntax details. Minimum Obsidian Version# Early v4 releases required Obsidian 1.10.1. The current release requirement is generated on the version compatibility page. Use the manifest requirement for the exact TaskNotes version you install. New Features in v4# OAuth Calendar Integration# v4 adds Google Calendar and Microsoft Outlook integration: View external calendar events alongside tasks Drag events to reschedule (syncs back to calendar provider) Events sync every 15 minutes See Calendar Setup for configuration. Kanban Swimlanes# The Kanban view now supports horizontal swimlane grouping: views: - type: tasknotesKanban groupBy: property: status config: swimLane: priority Time Entry Editor# A dedicated modal for managing time entries: Alt-drag on calendar to create time entries View total tracked time per task Edit and delete time entries Troubleshooting# Views Not Loading# Verify Bases core plugin is enabled (Settings → Core Plugins) Check that .base files exist in TaskNotes/Views/ Restart Obsidian Missing Saved Views After Upgrade# Saved views from v3 are preserved in settings. Use Export v3 saved views to Bases in Settings → TaskNotes → General → Views & base files to create the multi-view .base file. Filter Syntax Errors# Bases uses different filter syntax than v3. Common issues: Problem Solution status: done Use status == \"done\" Multiple conditions Wrap in and: or or: block Date comparisons Use date(due) < today() Downgrading to v3# Migration is one-way. If you need to downgrade: Uninstall TaskNotes v4 Install TaskNotes v3 from releases Reconfigure your saved views manually Your task files are unaffected—only view configurations change. View Templates# For complete .base file examples, see Default Base Templates."},{"route":"/obsidian/nlp-api/","title":"TaskNotes NLP API","description":"The NLP API parses natural-language task text and optionally creates a task.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/nlp-api.md","namespace":"obsidian","relativePath":"nlp-api.md","raw":"# TaskNotes NLP API\n\nThe NLP API parses natural-language task text and optionally creates a task.\n\nIn-vault scripts can also call the parser directly from the loaded plugin:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage(\"Review PR tomorrow #code @work\");\n```\n\nFor the full in-process API exposed at `tasknotes.api`, including task updates, time tracking, settings snapshots, and events, see [TaskNotes JavaScript API](javascript-api.md).\n\n## Endpoints\n\n- `POST /api/nlp/parse`\n- `POST /api/nlp/create`\n\nBoth endpoints require a JSON body with `text`.\n\n## Request Format\n\n```json\n{\n \"text\": \"Review PR #123 tomorrow high priority @work\"\n}\n```\n\nNotes:\n\n- `text` is required and must be a string.\n- Per-request `locale` is not currently supported.\n- Parser language comes from TaskNotes settings (`nlpLanguage`).\n\n## `POST /api/nlp/parse`\n\nParses text and returns two objects:\n\n- `parsed`: direct parser output\n- `taskData`: normalized task payload that would be used for creation\n\nExample response (shape):\n\n```json\n{\n \"success\": true,\n \"data\": {\n \"parsed\": {\n \"title\": \"Review PR\",\n \"tags\": [\"123\"],\n \"contexts\": [\"work\"],\n \"projects\": [],\n \"priority\": \"high\",\n \"status\": null,\n \"dueDate\": \"2026-02-22\",\n \"scheduledDate\": null,\n \"dueTime\": null,\n \"scheduledTime\": null,\n \"recurrence\": null,\n \"estimate\": null,\n \"isCompleted\": false\n },\n \"taskData\": {\n \"title\": \"Review PR\",\n \"priority\": \"high\",\n \"status\": \"open\",\n \"tags\": [\"123\"],\n \"contexts\": [\"work\"],\n \"due\": \"2026-02-22\",\n \"dateCreated\": \"2026-02-22T09:00:00.000Z\",\n \"dateModified\": \"2026-02-22T09:00:00.000Z\"\n }\n }\n}\n```\n\nIf parser does not detect status, `taskData.status` falls back to your configured default task status. Parsed due and scheduled date-times in `taskData` use the same `YYYY-MM-DDTHH:mm` format as created tasks, and NLP trigger values for user-defined fields are returned under `customFrontmatter`.\n\n## `POST /api/nlp/create`\n\nParses text and creates a task in one call.\n\nReturns HTTP `201` on success.\n\nExample:\n\n```bash\ncurl -X POST http://localhost:8080/api/nlp/create \\\n -H \"Content-Type: application/json\" \\\n -d '{\"text\":\"Call mom due friday 2pm #personal\"}'\n```\n\nResponse fields:\n\n- `data.task` (created task)\n- `data.parsed` (parser output)\n\n## What the Parser Extracts\n\nThe parser can extract:\n\n- Dates and times (`tomorrow`, `friday 2pm`, ISO dates)\n- Priority terms (`high priority`, `urgent`, symbol patterns)\n- Status terms (mapped to your configured statuses)\n- Tags (`#tag`)\n- Contexts (`@context`)\n- Projects (`+project`)\n- Time estimates (`2h`, `30min`, `estimate 45m`)\n- Recurrence (`daily`, `weekly`, `every monday`)\n\nExact parsing behavior depends on your TaskNotes NLP settings and trigger configuration.\n\n## In-Vault Parser Method\n\nTemplater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly:\n\n```javascript\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage(\"Write draft friday 2pm #writing @desk\");\n```\n\n`parseNaturalLanguage(text)` returns the same parser output shape as `data.parsed` from `POST /api/nlp/parse`. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale.\n\nThis method only parses text. It does not create or modify task files.\n\nFor task creation and updates from in-vault scripts or companion plugins, use the broader [TaskNotes JavaScript API](javascript-api.md).\n\nExample Templater use:\n\n```javascript\n<%*\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst text = await tp.system.prompt(\"Task\");\nconst parsed = tasknotes.api.parseNaturalLanguage(text);\ntR += `title: ${parsed.title}`;\n%>\n```\n\n## Error Responses\n\nCommon errors:\n\n- `400`: missing/invalid `text`\n- `401`: auth required (if API token is enabled)\n- `500`: parse/processing error\n\nError shape:\n\n```json\n{\n \"success\": false,\n \"error\": \"Text field is required and must be a string\"\n}\n```\n\n## Client Examples\n\n### JavaScript\n\n```javascript\nasync function parseTask(text) {\n const response = await fetch(\"http://localhost:8080/api/nlp/parse\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ text })\n });\n return response.json();\n}\n\nasync function createTaskFromText(text) {\n const response = await fetch(\"http://localhost:8080/api/nlp/create\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ text })\n });\n return response.json();\n}\n```\n\n### Python\n\n```python\nimport requests\n\n\ndef parse_task(text):\n response = requests.post(\n \"http://localhost:8080/api/nlp/parse\",\n json={\"text\": text},\n )\n return response.json()\n\n\ndef create_task_from_text(text):\n response = requests.post(\n \"http://localhost:8080/api/nlp/create\",\n json={\"text\": text},\n )\n return response.json()\n```\n\n## Authentication\n\nIf API auth token is enabled, include bearer token:\n\n```http\nAuthorization: Bearer YOUR_TOKEN\n```\n","aliases":["/nlp-api/"],"toc":[{"level":2,"id":"endpoints","text":"Endpoints"},{"level":2,"id":"request-format","text":"Request Format"},{"level":2,"id":"post-apinlpparse","text":"POST /api/nlp/parse"},{"level":2,"id":"post-apinlpcreate","text":"POST /api/nlp/create"},{"level":2,"id":"what-the-parser-extracts","text":"What the Parser Extracts"},{"level":2,"id":"in-vault-parser-method","text":"In-Vault Parser Method"},{"level":2,"id":"error-responses","text":"Error Responses"},{"level":2,"id":"client-examples","text":"Client Examples"},{"level":3,"id":"javascript","text":"JavaScript"},{"level":3,"id":"python","text":"Python"},{"level":2,"id":"authentication","text":"Authentication"}],"html":"

The NLP API parses natural-language task text and optionally creates a task.

\n

In-vault scripts can also call the parser directly from the loaded plugin:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage("Review PR tomorrow #code @work");\n

For the full in-process API exposed at tasknotes.api, including task updates, time tracking, settings snapshots, and events, see TaskNotes JavaScript API.

\n

Endpoints#

\n
    \n
  • POST /api/nlp/parse
  • \n
  • POST /api/nlp/create
  • \n
\n

Both endpoints require a JSON body with text.

\n

Request Format#

\n
{\n  "text": "Review PR #123 tomorrow high priority @work"\n}\n

Notes:

\n
    \n
  • text is required and must be a string.
  • \n
  • Per-request locale is not currently supported.
  • \n
  • Parser language comes from TaskNotes settings (nlpLanguage).
  • \n
\n

POST /api/nlp/parse#

\n

Parses text and returns two objects:

\n
    \n
  • parsed: direct parser output
  • \n
  • taskData: normalized task payload that would be used for creation
  • \n
\n

Example response (shape):

\n
{\n  "success": true,\n  "data": {\n    "parsed": {\n      "title": "Review PR",\n      "tags": ["123"],\n      "contexts": ["work"],\n      "projects": [],\n      "priority": "high",\n      "status": null,\n      "dueDate": "2026-02-22",\n      "scheduledDate": null,\n      "dueTime": null,\n      "scheduledTime": null,\n      "recurrence": null,\n      "estimate": null,\n      "isCompleted": false\n    },\n    "taskData": {\n      "title": "Review PR",\n      "priority": "high",\n      "status": "open",\n      "tags": ["123"],\n      "contexts": ["work"],\n      "due": "2026-02-22",\n      "dateCreated": "2026-02-22T09:00:00.000Z",\n      "dateModified": "2026-02-22T09:00:00.000Z"\n    }\n  }\n}\n

If parser does not detect status, taskData.status falls back to your configured default task status. Parsed due and scheduled date-times in taskData use the same YYYY-MM-DDTHH:mm format as created tasks, and NLP trigger values for user-defined fields are returned under customFrontmatter.

\n

POST /api/nlp/create#

\n

Parses text and creates a task in one call.

\n

Returns HTTP 201 on success.

\n

Example:

\n
curl -X POST http://localhost:8080/api/nlp/create \\\n  -H "Content-Type: application/json" \\\n  -d '{"text":"Call mom due friday 2pm #personal"}'\n

Response fields:

\n
    \n
  • data.task (created task)
  • \n
  • data.parsed (parser output)
  • \n
\n

What the Parser Extracts#

\n

The parser can extract:

\n
    \n
  • Dates and times (tomorrow, friday 2pm, ISO dates)
  • \n
  • Priority terms (high priority, urgent, symbol patterns)
  • \n
  • Status terms (mapped to your configured statuses)
  • \n
  • Tags (#tag)
  • \n
  • Contexts (@context)
  • \n
  • Projects (+project)
  • \n
  • Time estimates (2h, 30min, estimate 45m)
  • \n
  • Recurrence (daily, weekly, every monday)
  • \n
\n

Exact parsing behavior depends on your TaskNotes NLP settings and trigger configuration.

\n

In-Vault Parser Method#

\n

Templater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly:

\n
const tasknotes = app.plugins.plugins.tasknotes;\nconst parsed = tasknotes.api.parseNaturalLanguage("Write draft friday 2pm #writing @desk");\n

parseNaturalLanguage(text) returns the same parser output shape as data.parsed from POST /api/nlp/parse. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale.

\n

This method only parses text. It does not create or modify task files.

\n

For task creation and updates from in-vault scripts or companion plugins, use the broader TaskNotes JavaScript API.

\n

Example Templater use:

\n
<%*\nconst tasknotes = app.plugins.plugins.tasknotes;\nconst text = await tp.system.prompt("Task");\nconst parsed = tasknotes.api.parseNaturalLanguage(text);\ntR += `title: ${parsed.title}`;\n%>\n

Error Responses#

\n

Common errors:

\n
    \n
  • 400: missing/invalid text
  • \n
  • 401: auth required (if API token is enabled)
  • \n
  • 500: parse/processing error
  • \n
\n

Error shape:

\n
{\n  "success": false,\n  "error": "Text field is required and must be a string"\n}\n

Client Examples#

\n

JavaScript#

\n
async function parseTask(text) {\n  const response = await fetch("http://localhost:8080/api/nlp/parse", {\n    method: "POST",\n    headers: { "Content-Type": "application/json" },\n    body: JSON.stringify({ text })\n  });\n  return response.json();\n}\n\nasync function createTaskFromText(text) {\n  const response = await fetch("http://localhost:8080/api/nlp/create", {\n    method: "POST",\n    headers: { "Content-Type": "application/json" },\n    body: JSON.stringify({ text })\n  });\n  return response.json();\n}\n

Python#

\n
import requests\n\n\ndef parse_task(text):\n    response = requests.post(\n        "http://localhost:8080/api/nlp/parse",\n        json={"text": text},\n    )\n    return response.json()\n\n\ndef create_task_from_text(text):\n    response = requests.post(\n        "http://localhost:8080/api/nlp/create",\n        json={"text": text},\n    )\n    return response.json()\n

Authentication#

\n

If API auth token is enabled, include bearer token:

\n
Authorization: Bearer YOUR_TOKEN\n
","text":"The NLP API parses natural-language task text and optionally creates a task. In-vault scripts can also call the parser directly from the loaded plugin: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Review PR tomorrow #code @work\"); For the full in-process API exposed at tasknotes.api, including task updates, time tracking, settings snapshots, and events, see TaskNotes JavaScript API. Endpoints# POST /api/nlp/parse POST /api/nlp/create Both endpoints require a JSON body with text. Request Format# { \"text\": \"Review PR #123 tomorrow high priority @work\" } Notes: text is required and must be a string. Per-request locale is not currently supported. Parser language comes from TaskNotes settings (nlpLanguage). POST /api/nlp/parse# Parses text and returns two objects: parsed: direct parser output taskData: normalized task payload that would be used for creation Example response (shape): { \"success\": true, \"data\": { \"parsed\": { \"title\": \"Review PR\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"projects\": [], \"priority\": \"high\", \"status\": null, \"dueDate\": \"2026-02-22\", \"scheduledDate\": null, \"dueTime\": null, \"scheduledTime\": null, \"recurrence\": null, \"estimate\": null, \"isCompleted\": false }, \"taskData\": { \"title\": \"Review PR\", \"priority\": \"high\", \"status\": \"open\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"due\": \"2026-02-22\", \"dateCreated\": \"2026-02-22T09:00:00.000Z\", \"dateModified\": \"2026-02-22T09:00:00.000Z\" } } } If parser does not detect status, taskData.status falls back to your configured default task status. Parsed due and scheduled date-times in taskData use the same YYYY-MM-DDTHH:mm format as created tasks, and NLP trigger values for user-defined fields are returned under customFrontmatter. POST /api/nlp/create# Parses text and creates a task in one call. Returns HTTP 201 on success. Example: curl -X POST http://localhost:8080/api/nlp/create \\ -H \"Content-Type: application/json\" \\ -d '{\"text\":\"Call mom due friday 2pm #personal\"}' Response fields: data.task (created task) data.parsed (parser output) What the Parser Extracts# The parser can extract: Dates and times (tomorrow, friday 2pm, ISO dates) Priority terms (high priority, urgent, symbol patterns) Status terms (mapped to your configured statuses) Tags (#tag) Contexts (@context) Projects (+project) Time estimates (2h, 30min, estimate 45m) Recurrence (daily, weekly, every monday) Exact parsing behavior depends on your TaskNotes NLP settings and trigger configuration. In-Vault Parser Method# Templater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Write draft friday 2pm #writing @desk\"); parseNaturalLanguage(text) returns the same parser output shape as data.parsed from POST /api/nlp/parse. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale. This method only parses text. It does not create or modify task files. For task creation and updates from in-vault scripts or companion plugins, use the broader TaskNotes JavaScript API. Example Templater use: <%* const tasknotes = app.plugins.plugins.tasknotes; const text = await tp.system.prompt(\"Task\"); const parsed = tasknotes.api.parseNaturalLanguage(text); tR += `title: ${parsed.title}`; %> Error Responses# Common errors: 400: missing/invalid text 401: auth required (if API token is enabled) 500: parse/processing error Error shape: { \"success\": false, \"error\": \"Text field is required and must be a string\" } Client Examples# JavaScript# async function parseTask(text) { const response = await fetch(\"http://localhost:8080/api/nlp/parse\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } async function createTaskFromText(text) { const response = await fetch(\"http://localhost:8080/api/nlp/create\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } Python# import requests def parse_task(text): response = requests.post( \"http://localhost:8080/api/nlp/parse\", json={\"text\": text}, ) return response.json() def create_task_from_text(text): response = requests.post( \"http://localhost:8080/api/nlp/create\", json={\"text\": text}, ) return response.json() Authentication# If API auth token is enabled, include bearer token: Authorization: Bearer YOUR_TOKEN"},{"route":"/obsidian/obsidian-cli/","title":"TaskNotes Obsidian CLI","description":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/obsidian-cli.md","namespace":"obsidian","relativePath":"obsidian-cli.md","raw":"# TaskNotes Obsidian CLI\n\nTaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API.\n\nUse this page for the built-in `obsidian ...` commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see [mdbase-tasknotes CLI](mdbase-tasknotes-cli.md).\n\n## Requirements\n\n- Obsidian desktop `1.12.2` or newer\n- TaskNotes installed and enabled in the target vault\n- Obsidian running when you invoke the CLI\n\nThe Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass `vault=` explicitly instead of relying on the default vault.\n\n## Discovering commands\n\nList available TaskNotes commands:\n\n```bash\nobsidian help | rg 'tasknotes:'\n```\n\nYou should see:\n\n- `tasknotes:capture`\n- `tasknotes:start-time`\n- `tasknotes:stop-time`\n- `tasknotes:time-status`\n- `tasknotes:pomodoro`\n\n## `tasknotes:capture`\n\nCreate a task from free text, explicit flags, or both.\n\n```bash\nobsidian tasknotes:capture vault=test text=\"Review PR tomorrow #work @desk\"\n```\n\nBy default, `text=` is parsed with TaskNotes NLP. Explicit flags override parsed values.\n\n### Literal title mode\n\nUse `literal` when you want the text treated as an exact title instead of being parsed.\n\n```bash\nobsidian tasknotes:capture vault=test text=\"Fix parser edge case\" literal\n```\n\n### Explicit fields\n\nSupported override flags:\n\n- `title`\n- `details`\n- `status`\n- `priority`\n- `due`\n- `scheduled`\n- `tags`\n- `contexts`\n- `projects`\n- `recurrence`\n- `recurrence-anchor`\n- `reminders`\n- `estimate`\n\nExample:\n\n```bash\nobsidian tasknotes:capture vault=test \\\n text=\"Write release notes tomorrow #docs\" \\\n priority=high \\\n status=in-progress \\\n reminders='due:-PT1H'\n```\n\n### Reminder format\n\n`reminders=` accepts either:\n\n- a semicolon-separated shorthand such as `due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00`\n- a JSON array in the same shape TaskNotes stores internally\n\n### Recurrence anchor\n\nUse `recurrence-anchor=scheduled` or `recurrence-anchor=completion` to control how recurring tasks advance.\n\n## `tasknotes:start-time`\n\nStart time tracking for a task.\n\nYou can target a task by:\n\n- `path`\n- exact `title`\n- fuzzy `query`\n\nExamples:\n\n```bash\nobsidian tasknotes:start-time vault=test title=\"Write release notes\"\nobsidian tasknotes:start-time vault=test query=\"release notes\" description=\"Drafting first pass\"\nobsidian tasknotes:start-time vault=test path=\"TaskNotes/Write release notes.md\"\n```\n\n## `tasknotes:stop-time`\n\nStop time tracking for a task.\n\nExamples:\n\n```bash\nobsidian tasknotes:stop-time vault=test title=\"Write release notes\"\nobsidian tasknotes:stop-time vault=test path=\"TaskNotes/Write release notes.md\"\n```\n\nIf you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous.\n\n## `tasknotes:time-status`\n\nShow time-tracking status for either:\n\n- all active sessions\n- one resolved task\n\nExamples:\n\n```bash\nobsidian tasknotes:time-status vault=test\nobsidian tasknotes:time-status vault=test title=\"Write release notes\"\nobsidian tasknotes:time-status vault=test path=\"TaskNotes/Write release notes.md\"\n```\n\nWhen a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault.\n\n## `tasknotes:pomodoro`\n\nControl Pomodoro state from the CLI.\n\nSupported actions:\n\n- `status`\n- `start`\n- `pause`\n- `resume`\n- `stop`\n- `short-break`\n- `long-break`\n\n### Inspect state\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=status\n```\n\n### Start a work session\n\nYou can start a Pomodoro with or without a linked task.\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=start duration=25\nobsidian tasknotes:pomodoro vault=test action=start title=\"Write release notes\" duration=25\n```\n\nTask lookup for `action=start` supports the same selectors as time tracking:\n\n- `path`\n- exact `title`\n- fuzzy `query`\n\n### Pause, resume, and stop\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=pause\nobsidian tasknotes:pomodoro vault=test action=resume\nobsidian tasknotes:pomodoro vault=test action=stop\n```\n\n### Breaks\n\n```bash\nobsidian tasknotes:pomodoro vault=test action=short-break\nobsidian tasknotes:pomodoro vault=test action=long-break\n```\n\n## Choosing between CLI surfaces\n\nUse the built-in Obsidian CLI when:\n\n- Obsidian is already open\n- you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state\n- you are scripting on the same machine as the running vault\n\nUse [mdbase-tasknotes CLI](mdbase-tasknotes-cli.md) when:\n\n- Obsidian is not running\n- you need headless/server workflows\n- you want direct file-level automation over a task collection\n\n## Notes\n\n- `path` is the most reliable task selector for automation.\n- Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up.\n- These commands are desktop-only because they depend on the Obsidian desktop CLI.\n","aliases":["/obsidian-cli/"],"toc":[{"level":2,"id":"requirements","text":"Requirements"},{"level":2,"id":"discovering-commands","text":"Discovering commands"},{"level":2,"id":"tasknotescapture","text":"tasknotes:capture"},{"level":3,"id":"literal-title-mode","text":"Literal title mode"},{"level":3,"id":"explicit-fields","text":"Explicit fields"},{"level":3,"id":"reminder-format","text":"Reminder format"},{"level":3,"id":"recurrence-anchor","text":"Recurrence anchor"},{"level":2,"id":"tasknotesstart-time","text":"tasknotes:start-time"},{"level":2,"id":"tasknotesstop-time","text":"tasknotes:stop-time"},{"level":2,"id":"tasknotestime-status","text":"tasknotes:time-status"},{"level":2,"id":"tasknotespomodoro","text":"tasknotes:pomodoro"},{"level":3,"id":"inspect-state","text":"Inspect state"},{"level":3,"id":"start-a-work-session","text":"Start a work session"},{"level":3,"id":"pause-resume-and-stop","text":"Pause, resume, and stop"},{"level":3,"id":"breaks","text":"Breaks"},{"level":2,"id":"choosing-between-cli-surfaces","text":"Choosing between CLI surfaces"},{"level":2,"id":"notes","text":"Notes"}],"html":"

TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API.

\n

Use this page for the built-in obsidian ... commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see mdbase-tasknotes CLI.

\n

Requirements#

\n
    \n
  • Obsidian desktop 1.12.2 or newer
  • \n
  • TaskNotes installed and enabled in the target vault
  • \n
  • Obsidian running when you invoke the CLI
  • \n
\n

The Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass vault=<name> explicitly instead of relying on the default vault.

\n

Discovering commands#

\n

List available TaskNotes commands:

\n
obsidian help | rg 'tasknotes:'\n

You should see:

\n
    \n
  • tasknotes:capture
  • \n
  • tasknotes:start-time
  • \n
  • tasknotes:stop-time
  • \n
  • tasknotes:time-status
  • \n
  • tasknotes:pomodoro
  • \n
\n

tasknotes:capture#

\n

Create a task from free text, explicit flags, or both.

\n
obsidian tasknotes:capture vault=test text="Review PR tomorrow #work @desk"\n

By default, text= is parsed with TaskNotes NLP. Explicit flags override parsed values.

\n

Literal title mode#

\n

Use literal when you want the text treated as an exact title instead of being parsed.

\n
obsidian tasknotes:capture vault=test text="Fix parser edge case" literal\n

Explicit fields#

\n

Supported override flags:

\n
    \n
  • title
  • \n
  • details
  • \n
  • status
  • \n
  • priority
  • \n
  • due
  • \n
  • scheduled
  • \n
  • tags
  • \n
  • contexts
  • \n
  • projects
  • \n
  • recurrence
  • \n
  • recurrence-anchor
  • \n
  • reminders
  • \n
  • estimate
  • \n
\n

Example:

\n
obsidian tasknotes:capture vault=test \\\n  text="Write release notes tomorrow #docs" \\\n  priority=high \\\n  status=in-progress \\\n  reminders='due:-PT1H'\n

Reminder format#

\n

reminders= accepts either:

\n
    \n
  • a semicolon-separated shorthand such as due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00
  • \n
  • a JSON array in the same shape TaskNotes stores internally
  • \n
\n

Recurrence anchor#

\n

Use recurrence-anchor=scheduled or recurrence-anchor=completion to control how recurring tasks advance.

\n

tasknotes:start-time#

\n

Start time tracking for a task.

\n

You can target a task by:

\n
    \n
  • path
  • \n
  • exact title
  • \n
  • fuzzy query
  • \n
\n

Examples:

\n
obsidian tasknotes:start-time vault=test title="Write release notes"\nobsidian tasknotes:start-time vault=test query="release notes" description="Drafting first pass"\nobsidian tasknotes:start-time vault=test path="TaskNotes/Write release notes.md"\n

tasknotes:stop-time#

\n

Stop time tracking for a task.

\n

Examples:

\n
obsidian tasknotes:stop-time vault=test title="Write release notes"\nobsidian tasknotes:stop-time vault=test path="TaskNotes/Write release notes.md"\n

If you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous.

\n

tasknotes:time-status#

\n

Show time-tracking status for either:

\n
    \n
  • all active sessions
  • \n
  • one resolved task
  • \n
\n

Examples:

\n
obsidian tasknotes:time-status vault=test\nobsidian tasknotes:time-status vault=test title="Write release notes"\nobsidian tasknotes:time-status vault=test path="TaskNotes/Write release notes.md"\n

When a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault.

\n

tasknotes:pomodoro#

\n

Control Pomodoro state from the CLI.

\n

Supported actions:

\n
    \n
  • status
  • \n
  • start
  • \n
  • pause
  • \n
  • resume
  • \n
  • stop
  • \n
  • short-break
  • \n
  • long-break
  • \n
\n

Inspect state#

\n
obsidian tasknotes:pomodoro vault=test action=status\n

Start a work session#

\n

You can start a Pomodoro with or without a linked task.

\n
obsidian tasknotes:pomodoro vault=test action=start duration=25\nobsidian tasknotes:pomodoro vault=test action=start title="Write release notes" duration=25\n

Task lookup for action=start supports the same selectors as time tracking:

\n
    \n
  • path
  • \n
  • exact title
  • \n
  • fuzzy query
  • \n
\n

Pause, resume, and stop#

\n
obsidian tasknotes:pomodoro vault=test action=pause\nobsidian tasknotes:pomodoro vault=test action=resume\nobsidian tasknotes:pomodoro vault=test action=stop\n

Breaks#

\n
obsidian tasknotes:pomodoro vault=test action=short-break\nobsidian tasknotes:pomodoro vault=test action=long-break\n

Choosing between CLI surfaces#

\n

Use the built-in Obsidian CLI when:

\n
    \n
  • Obsidian is already open
  • \n
  • you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state
  • \n
  • you are scripting on the same machine as the running vault
  • \n
\n

Use mdbase-tasknotes CLI when:

\n
    \n
  • Obsidian is not running
  • \n
  • you need headless/server workflows
  • \n
  • you want direct file-level automation over a task collection
  • \n
\n

Notes#

\n
    \n
  • path is the most reliable task selector for automation.
  • \n
  • Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up.
  • \n
  • These commands are desktop-only because they depend on the Obsidian desktop CLI.
  • \n
\n","text":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API. Use this page for the built-in obsidian ... commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see mdbase-tasknotes CLI. Requirements# Obsidian desktop 1.12.2 or newer TaskNotes installed and enabled in the target vault Obsidian running when you invoke the CLI The Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass vault= explicitly instead of relying on the default vault. Discovering commands# List available TaskNotes commands: obsidian help | rg 'tasknotes:' You should see: tasknotes:capture tasknotes:start-time tasknotes:stop-time tasknotes:time-status tasknotes:pomodoro tasknotes:capture# Create a task from free text, explicit flags, or both. obsidian tasknotes:capture vault=test text=\"Review PR tomorrow #work @desk\" By default, text= is parsed with TaskNotes NLP. Explicit flags override parsed values. Literal title mode# Use literal when you want the text treated as an exact title instead of being parsed. obsidian tasknotes:capture vault=test text=\"Fix parser edge case\" literal Explicit fields# Supported override flags: title details status priority due scheduled tags contexts projects recurrence recurrence-anchor reminders estimate Example: obsidian tasknotes:capture vault=test \\ text=\"Write release notes tomorrow #docs\" \\ priority=high \\ status=in-progress \\ reminders='due:-PT1H' Reminder format# reminders= accepts either: a semicolon-separated shorthand such as due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00 a JSON array in the same shape TaskNotes stores internally Recurrence anchor# Use recurrence-anchor=scheduled or recurrence-anchor=completion to control how recurring tasks advance. tasknotes:start-time# Start time tracking for a task. You can target a task by: path exact title fuzzy query Examples: obsidian tasknotes:start-time vault=test title=\"Write release notes\" obsidian tasknotes:start-time vault=test query=\"release notes\" description=\"Drafting first pass\" obsidian tasknotes:start-time vault=test path=\"TaskNotes/Write release notes.md\" tasknotes:stop-time# Stop time tracking for a task. Examples: obsidian tasknotes:stop-time vault=test title=\"Write release notes\" obsidian tasknotes:stop-time vault=test path=\"TaskNotes/Write release notes.md\" If you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous. tasknotes:time-status# Show time-tracking status for either: all active sessions one resolved task Examples: obsidian tasknotes:time-status vault=test obsidian tasknotes:time-status vault=test title=\"Write release notes\" obsidian tasknotes:time-status vault=test path=\"TaskNotes/Write release notes.md\" When a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault. tasknotes:pomodoro# Control Pomodoro state from the CLI. Supported actions: status start pause resume stop short-break long-break Inspect state# obsidian tasknotes:pomodoro vault=test action=status Start a work session# You can start a Pomodoro with or without a linked task. obsidian tasknotes:pomodoro vault=test action=start duration=25 obsidian tasknotes:pomodoro vault=test action=start title=\"Write release notes\" duration=25 Task lookup for action=start supports the same selectors as time tracking: path exact title fuzzy query Pause, resume, and stop# obsidian tasknotes:pomodoro vault=test action=pause obsidian tasknotes:pomodoro vault=test action=resume obsidian tasknotes:pomodoro vault=test action=stop Breaks# obsidian tasknotes:pomodoro vault=test action=short-break obsidian tasknotes:pomodoro vault=test action=long-break Choosing between CLI surfaces# Use the built-in Obsidian CLI when: Obsidian is already open you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state you are scripting on the same machine as the running vault Use mdbase-tasknotes CLI when: Obsidian is not running you need headless/server workflows you want direct file-level automation over a task collection Notes# path is the most reliable task selector for automation. Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up. These commands are desktop-only because they depend on the Obsidian desktop CLI."},{"route":"/obsidian/reference/commands/","title":"Command reference","description":"Every TaskNotes command registered with Obsidian, generated from the plugin command definitions.","product":"obsidian","platforms":[],"version":"4.12.3","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/commands.md","raw":"---\ntitle: \"Command reference\"\ndescription: \"Every TaskNotes command registered with Obsidian, generated from the plugin command definitions.\"\ngenerated: true\nsource: [\"src/commands/taskNotesCommands.ts\",\"src/i18n/resources/en.ts\"]\n---\n# Command reference\n\nThis page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian.\n\n| Command | ID | Available in |\n| --- | --- | --- |\n| Open mini calendar view | `open-calendar-view` | Global |\n| Open calendar view | `open-advanced-calendar-view` | Global |\n| Open tasks view | `open-tasks-view` | Global |\n| Open agenda view | `open-agenda-view` | Global |\n| Open Pomodoro timer | `open-pomodoro-view` | Global |\n| Open Kanban board | `open-kanban-view` | Global |\n| Update default base files | `update-default-base-files` | Global |\n| Open Pomodoro statistics | `open-pomodoro-stats` | Global |\n| Open task & project statistics | `open-statistics` | Global |\n| Create new task | `create-new-task` | Global |\n| Convert current note to task | `convert-current-note-to-task` | Global |\n| Convert checkbox task to TaskNote | `convert-to-tasknote` | Editor |\n| Convert all tasks in note | `batch-convert-all-tasks` | Editor |\n| Insert tasknote link | `insert-tasknote-link` | Editor |\n| Create new inline task | `create-inline-task` | Editor |\n| Quick actions for current task | `quick-actions-current-task` | Global |\n| Quick actions for task under cursor | `quick-actions-task-under-cursor` | Editor |\n| Edit current task | `edit-current-task` | Global |\n| Cycle current task status | `cycle-current-task-status` | Global |\n| Cycle current task priority | `cycle-current-task-priority` | Global |\n| Add project to current task | `add-project-to-current-task` | Global |\n| Add subtask to current note | `add-subtask-to-current-note` | Global |\n| Go to today's note | `go-to-today` | Global |\n| Start Pomodoro timer | `start-pomodoro` | Global |\n| Stop Pomodoro timer | `stop-pomodoro` | Global |\n| Pause/resume Pomodoro timer | `pause-pomodoro` | Global |\n| Refresh cache | `refresh-cache` | Global |\n| Export all tasks as ICS file | `export-all-tasks-ics` | Global |\n| Sync all tasks to Google Calendar | `sync-all-tasks-google-calendar` | Global |\n| Sync current task to Google Calendar | `sync-current-task-google-calendar` | Global |\n| View release notes | `view-release-notes` | Global |\n| Start time tracking (select task) | `start-time-tracking-with-selector` | Global |\n| Edit time entries (select task) | `edit-time-entries` | Global |\n| Create or open task | `create-or-open-task` | Global |\n| Create or open task and start time tracking | `create-or-open-task-with-time-tracking` | Global |\n| Postpone overdue scheduled tasks to today | `rollover-overdue-scheduled-tasks` | Global |\n\n_Generated from 36 registered commands._\n","aliases":["/reference/commands/","/reference/commands/"],"toc":[],"html":"

This page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandIDAvailable in
Open mini calendar viewopen-calendar-viewGlobal
Open calendar viewopen-advanced-calendar-viewGlobal
Open tasks viewopen-tasks-viewGlobal
Open agenda viewopen-agenda-viewGlobal
Open Pomodoro timeropen-pomodoro-viewGlobal
Open Kanban boardopen-kanban-viewGlobal
Update default base filesupdate-default-base-filesGlobal
Open Pomodoro statisticsopen-pomodoro-statsGlobal
Open task & project statisticsopen-statisticsGlobal
Create new taskcreate-new-taskGlobal
Convert current note to taskconvert-current-note-to-taskGlobal
Convert checkbox task to TaskNoteconvert-to-tasknoteEditor
Convert all tasks in notebatch-convert-all-tasksEditor
Insert tasknote linkinsert-tasknote-linkEditor
Create new inline taskcreate-inline-taskEditor
Quick actions for current taskquick-actions-current-taskGlobal
Quick actions for task under cursorquick-actions-task-under-cursorEditor
Edit current taskedit-current-taskGlobal
Cycle current task statuscycle-current-task-statusGlobal
Cycle current task prioritycycle-current-task-priorityGlobal
Add project to current taskadd-project-to-current-taskGlobal
Add subtask to current noteadd-subtask-to-current-noteGlobal
Go to today's notego-to-todayGlobal
Start Pomodoro timerstart-pomodoroGlobal
Stop Pomodoro timerstop-pomodoroGlobal
Pause/resume Pomodoro timerpause-pomodoroGlobal
Refresh cacherefresh-cacheGlobal
Export all tasks as ICS fileexport-all-tasks-icsGlobal
Sync all tasks to Google Calendarsync-all-tasks-google-calendarGlobal
Sync current task to Google Calendarsync-current-task-google-calendarGlobal
View release notesview-release-notesGlobal
Start time tracking (select task)start-time-tracking-with-selectorGlobal
Edit time entries (select task)edit-time-entriesGlobal
Create or open taskcreate-or-open-taskGlobal
Create or open task and start time trackingcreate-or-open-task-with-time-trackingGlobal
Postpone overdue scheduled tasks to todayrollover-overdue-scheduled-tasksGlobal
\n

Generated from 36 registered commands.

\n","text":"This page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian. Command ID Available in Open mini calendar view open-calendar-view Global Open calendar view open-advanced-calendar-view Global Open tasks view open-tasks-view Global Open agenda view open-agenda-view Global Open Pomodoro timer open-pomodoro-view Global Open Kanban board open-kanban-view Global Update default base files update-default-base-files Global Open Pomodoro statistics open-pomodoro-stats Global Open task & project statistics open-statistics Global Create new task create-new-task Global Convert current note to task convert-current-note-to-task Global Convert checkbox task to TaskNote convert-to-tasknote Editor Convert all tasks in note batch-convert-all-tasks Editor Insert tasknote link insert-tasknote-link Editor Create new inline task create-inline-task Editor Quick actions for current task quick-actions-current-task Global Quick actions for task under cursor quick-actions-task-under-cursor Editor Edit current task edit-current-task Global Cycle current task status cycle-current-task-status Global Cycle current task priority cycle-current-task-priority Global Add project to current task add-project-to-current-task Global Add subtask to current note add-subtask-to-current-note Global Go to today's note go-to-today Global Start Pomodoro timer start-pomodoro Global Stop Pomodoro timer stop-pomodoro Global Pause/resume Pomodoro timer pause-pomodoro Global Refresh cache refresh-cache Global Export all tasks as ICS file export-all-tasks-ics Global Sync all tasks to Google Calendar sync-all-tasks-google-calendar Global Sync current task to Google Calendar sync-current-task-google-calendar Global View release notes view-release-notes Global Start time tracking (select task) start-time-tracking-with-selector Global Edit time entries (select task) edit-time-entries Global Create or open task create-or-open-task Global Create or open task and start time tracking create-or-open-task-with-time-tracking Global Postpone overdue scheduled tasks to today rollover-overdue-scheduled-tasks Global Generated from 36 registered commands."},{"route":"/obsidian/reference/compatibility/","title":"Version compatibility","description":"Current TaskNotes and Obsidian compatibility requirements, generated from the plugin manifest.","product":"obsidian","platforms":[],"version":"4.12.3","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/compatibility.md","raw":"---\ntitle: \"Version compatibility\"\ndescription: \"Current TaskNotes and Obsidian compatibility requirements, generated from the plugin manifest.\"\ngenerated: true\nsource: [\"manifest.json\",\"versions.json\"]\n---\n# Version compatibility\n\n## Current release\n\n| Item | Value |\n| --- | --- |\n| TaskNotes | `4.12.3` |\n| Minimum Obsidian version | `1.12.2` |\n| Desktop only | No |\n| Bases core plugin | Required |\n\nThe minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult `versions.json` or the relevant [release note](/releases/) when maintaining an older installation.\n","aliases":["/reference/compatibility/","/reference/compatibility/"],"toc":[{"level":2,"id":"current-release","text":"Current release"}],"html":"

Current release#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ItemValue
TaskNotes4.12.3
Minimum Obsidian version1.12.2
Desktop onlyNo
Bases core pluginRequired
\n

The minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult versions.json or the relevant release note when maintaining an older installation.

\n","text":"Current release# Item Value TaskNotes 4.12.3 Minimum Obsidian version 1.12.2 Desktop only No Bases core plugin Required The minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult versions.json or the relevant release note when maintaining an older installation."},{"route":"/obsidian/reference/default-base-templates/","title":"Generated default Base templates","description":"Exact default Obsidian Base files generated by the current TaskNotes source and default settings.","product":"obsidian","platforms":[],"version":"4.12.3","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/default-base-templates.md","raw":"---\ntitle: \"Generated default Base templates\"\ndescription: \"Exact default Obsidian Base files generated by the current TaskNotes source and default settings.\"\ngenerated: true\nsource: [\"src/templates/defaultBasesFiles.ts\",\"src/settings/defaults.ts\",\"src/core/FieldMapper.ts\"]\n---\n# Generated default Base templates\n\nThese are the exact templates TaskNotes 4.12.3 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ.\n\nRegenerating with **Update files** overwrites configured default Base files. Copy a customized file to a new path before updating it.\n\n## mini-calendar-default.base\n\nCommand/template ID: `open-calendar-view`\n\n```yaml\n# Mini Calendar\n# Generated with your TaskNotes settings\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesMiniCalendar\n name: \"Due\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - property: due\n direction: ASC\n dateProperty: due\n - type: tasknotesMiniCalendar\n name: \"Scheduled\"\n order: []\n dateProperty: scheduled\n - type: tasknotesMiniCalendar\n name: \"Created\"\n dateProperty: file.ctime\n - type: tasknotesMiniCalendar\n name: \"Modified\"\n dateProperty: file.mtime\n```\n\n## kanban-default.base\n\nCommand/template ID: `open-kanban-view`\n\n```yaml\n# Kanban Board\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesKanban\n name: \"Kanban Board\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: status\n direction: ASC\n config:\n columnWidth: 280\n hideEmptyColumns: false\n```\n\n## tasks-default.base\n\nCommand/template ID: `open-tasks-view`\n\n```yaml\n# All Tasks\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesTaskList\n name: \"Manual Order\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: status\n direction: ASC\n - type: tasknotesTaskList\n name: \"All Tasks\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: due\n direction: ASC\n - type: tasknotesTaskList\n name: \"Not Blocked\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Not blocked by any incomplete tasks\n - or:\n # No blocking dependencies at all\n - blockedBy.isEmpty()\n # All blocking tasks are completed (filter returns only incomplete, then check if empty)\n - 'list(blockedBy).filter(file(if(value.isType(\"object\"), value.uid, value)).properties.status != \"done\").isEmpty()'\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"Today\"\n filters:\n and:\n # Incomplete tasks (handles both recurring and non-recurring)\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Due or scheduled today\n - or:\n - and:\n - due.isEmpty() == false\n - date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")\n - and:\n - scheduled.isEmpty() == false\n - date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"Overdue\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Due or scheduled in the past\n - or:\n - and:\n - due.isEmpty() == false\n - date(due) < today()\n - and:\n - scheduled.isEmpty() == false\n - date(scheduled) < today()\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"This Week\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # Due or scheduled this week\n - or:\n - and:\n - due.isEmpty() == false\n - date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\")\n - date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")\n - and:\n - scheduled.isEmpty() == false\n - date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\")\n - date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: formula.urgencyScore\n direction: DESC\n - type: tasknotesTaskList\n name: \"Unscheduled\"\n filters:\n and:\n # Incomplete tasks\n - or:\n # Non-recurring task that's not in any completed status\n - and:\n - recurrence.isEmpty()\n - status != \"done\"\n # Recurring task where today is not in complete_instances\n - and:\n - recurrence.isEmpty() == false\n - complete_instances.map(date(value).format(\"YYYY-MM-DD\")).contains(today().format(\"YYYY-MM-DD\")) != true\n # No due date and no scheduled date\n - date(due).isEmpty()\n - date(scheduled).isEmpty()\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: status\n direction: ASC\n```\n\n## calendar-default.base\n\nCommand/template ID: `open-advanced-calendar-view`\n\n```yaml\n# Calendar\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesCalendar\n name: \"Calendar\"\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n options:\n showScheduled: true\n showDue: true\n showRecurring: true\n showTimeEntries: true\n showTimeblocks: true\n showPropertyBasedEvents: true\n createDailyNotesFromDateLinks: true\n calendarView: \"timeGridWeek\"\n customDayCount: 3\n firstDay: 1\n```\n\n## agenda-default.base\n\nCommand/template ID: `open-agenda-view`\n\n```yaml\n# Agenda\n\nfilters:\n and:\n - file.hasTag(\"task\")\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nproperties:\n formula.dueIn:\n displayName: Due in\n\n\nviews:\n - type: tasknotesCalendar\n name: \"Agenda\"\n order:\n - status\n - priority\n - due\n - formula.dueIn\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n options:\n showPropertyBasedEvents: false\n showOverdueOnToday: true\n createDailyNotesFromDateLinks: true\n calendarView: \"listWeek\"\n startDateProperty: file.ctime\n listDayCount: 7\n titleProperty: file.basename\n```\n\n## pomodoro-stats.base\n\nCommand/template ID: `pomodoro-stats-base`\n\n```yaml\n# Pomodoro statistics\n# Generated with your TaskNotes settings\n# Requires Pomodoro data storage to be set to Daily notes.\n\nfilters:\n and:\n - file.hasProperty(\"pomodoros\")\n - list(note[\"pomodoros\"]).filter(value.startTime).isEmpty() == false\n\nformulas:\n pomodoroDate: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.startTime).map(date(value.startTime).format(\"YYYY-MM-DD\")).unique().join(\", \"), file.basename)'\n pomodoroMonth: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.startTime).map(date(value.startTime).format(\"YYYY-MM\")).unique().join(\", \"), \"\")'\n completedPomos: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\" && value.completed == true).length, 0)'\n attemptedPomos: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\").length, 0)'\n interruptedPomos: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\" && value.completed == false).length, 0)'\n focusMinutes: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"work\" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)'\n focusTime: 'if(formula.focusMinutes >= 60, (formula.focusMinutes / 60).floor() + \"h \" + (formula.focusMinutes % 60).round() + \"m\", formula.focusMinutes + \"m\")'\n completionRate: 'if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round() + \"%\", \"0%\")'\n shortBreaks: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"short-break\").length, 0)'\n longBreaks: 'if(note[\"pomodoros\"], list(note[\"pomodoros\"]).filter(value.type == \"long-break\").length, 0)'\n\nproperties:\n formula.pomodoroDate:\n displayName: Date\n formula.pomodoroMonth:\n displayName: Month\n formula.completedPomos:\n displayName: Completed\n formula.attemptedPomos:\n displayName: Attempted\n formula.interruptedPomos:\n displayName: Interrupted\n formula.focusMinutes:\n displayName: Focus minutes\n formula.focusTime:\n displayName: Focus time\n formula.completionRate:\n displayName: Completion\n formula.shortBreaks:\n displayName: Short breaks\n formula.longBreaks:\n displayName: Long breaks\n\nviews:\n - type: table\n name: \"Daily\"\n order:\n - formula.pomodoroDate\n - formula.completedPomos\n - formula.focusTime\n - formula.attemptedPomos\n - formula.completionRate\n - formula.interruptedPomos\n - formula.shortBreaks\n - formula.longBreaks\n - file.name\n sort:\n - column: formula.pomodoroDate\n direction: DESC\n - type: table\n name: \"Monthly\"\n groupBy:\n property: formula.pomodoroMonth\n direction: DESC\n order:\n - formula.pomodoroDate\n - formula.completedPomos\n - formula.focusMinutes\n - formula.focusTime\n - formula.attemptedPomos\n - formula.completionRate\n - formula.interruptedPomos\n - formula.shortBreaks\n - formula.longBreaks\n - file.name\n summaries:\n formula.completedPomos: Sum\n formula.focusMinutes: Sum\n formula.attemptedPomos: Sum\n formula.interruptedPomos: Sum\n formula.shortBreaks: Sum\n formula.longBreaks: Sum\n sort:\n - column: formula.pomodoroDate\n direction: DESC\n```\n\n## relationships.base\n\nCommand/template ID: `relationships`\n\n```yaml\n# Relationships\n# This view shows all relationships for the current file\n# Dynamically shows/hides tabs based on available data\n\nformulas:\n priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))'\n daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))'\n daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"'\n isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")'\n isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")'\n isRecurring: 'recurrence && !recurrence.isEmpty()'\n hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")'\n dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")'\n scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")'\n scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")'\n dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))'\n timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))'\n ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))'\n createdMonth: 'file.ctime.format(\"YYYY-MM\")'\n modifiedMonth: 'file.mtime.format(\"YYYY-MM\")'\n priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))'\n projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))'\n contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))'\n trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))'\n nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))'\n isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))'\n nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))'\n nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))'\n nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))'\n urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))'\n timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")'\n dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))'\n\nviews:\n - type: tasknotesKanban\n name: \"Subtasks\"\n filters:\n and:\n - file.hasTag(\"task\")\n - file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, \"$1\").replace(/%20/g, \" \")).asLink()).contains(this.file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: status\n direction: ASC\n - type: tasknotesTaskList\n name: \"Occurrences\"\n filters:\n and:\n - file.hasTag(\"task\")\n - file.hasLink(this.file) && note.recurrence_parent && file(note.recurrence_parent.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, \"$1\").replace(/%20/g, \" \")).asLink() == this.file.asLink()\n order:\n - status\n - priority\n - due\n - scheduled\n - occurrence_date\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: occurrence_date\n direction: ASC\n - type: tasknotesTaskList\n name: \"Projects\"\n filters:\n and:\n - list(this.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, \"$1\").replace(/%20/g, \" \")).asLink()).contains(file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n - type: tasknotesTaskList\n name: \"Blocked By\"\n filters:\n and:\n - file.hasTag(\"task\")\n - list(this.note.blockedBy).map(file(if(value.isType(\"object\"), value.uid, value)).asLink()).contains(file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n - type: tasknotesKanban\n name: \"Blocking\"\n filters:\n and:\n - file.hasTag(\"task\")\n - list(note.blockedBy).map(file(if(value.isType(\"object\"), value.uid, value)).asLink()).contains(this.file.asLink())\n order:\n - status\n - priority\n - due\n - scheduled\n - projects\n - contexts\n - file.tags\n - blockedBy\n - file.name\n - recurrence\n - complete_instances\n - file.tasks\n sort:\n - column: tasknotes_manual_order\n direction: DESC\n groupBy:\n property: status\n direction: ASC\n```\n","aliases":["/reference/default-base-templates/","/reference/default-base-templates/"],"toc":[{"level":2,"id":"mini-calendar-defaultbase","text":"mini-calendar-default.base"},{"level":2,"id":"kanban-defaultbase","text":"kanban-default.base"},{"level":2,"id":"tasks-defaultbase","text":"tasks-default.base"},{"level":2,"id":"calendar-defaultbase","text":"calendar-default.base"},{"level":2,"id":"agenda-defaultbase","text":"agenda-default.base"},{"level":2,"id":"pomodoro-statsbase","text":"pomodoro-stats.base"},{"level":2,"id":"relationshipsbase","text":"relationships.base"}],"html":"

These are the exact templates TaskNotes 4.12.3 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ.

\n

Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it.

\n

mini-calendar-default.base#

\n

Command/template ID: open-calendar-view

\n
# Mini Calendar\n# Generated with your TaskNotes settings\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesMiniCalendar\n    name: "Due"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - property: due\n        direction: ASC\n    dateProperty: due\n  - type: tasknotesMiniCalendar\n    name: "Scheduled"\n    order: []\n    dateProperty: scheduled\n  - type: tasknotesMiniCalendar\n    name: "Created"\n    dateProperty: file.ctime\n  - type: tasknotesMiniCalendar\n    name: "Modified"\n    dateProperty: file.mtime\n

kanban-default.base#

\n

Command/template ID: open-kanban-view

\n
# Kanban Board\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesKanban\n    name: "Kanban Board"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: status\n      direction: ASC\n    config:\n      columnWidth: 280\n      hideEmptyColumns: false\n

tasks-default.base#

\n

Command/template ID: open-tasks-view

\n
# All Tasks\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesTaskList\n    name: "Manual Order"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: status\n      direction: ASC\n  - type: tasknotesTaskList\n    name: "All Tasks"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: due\n        direction: ASC\n  - type: tasknotesTaskList\n    name: "Not Blocked"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Not blocked by any incomplete tasks\n        - or:\n          # No blocking dependencies at all\n          - blockedBy.isEmpty()\n          # All blocking tasks are completed (filter returns only incomplete, then check if empty)\n          - 'list(blockedBy).filter(file(if(value.isType("object"), value.uid, value)).properties.status != "done").isEmpty()'\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "Today"\n    filters:\n      and:\n        # Incomplete tasks (handles both recurring and non-recurring)\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Due or scheduled today\n        - or:\n          - and:\n            - due.isEmpty() == false\n            - date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")\n          - and:\n            - scheduled.isEmpty() == false\n            - date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "Overdue"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Due or scheduled in the past\n        - or:\n          - and:\n            - due.isEmpty() == false\n            - date(due) < today()\n          - and:\n            - scheduled.isEmpty() == false\n            - date(scheduled) < today()\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "This Week"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # Due or scheduled this week\n        - or:\n          - and:\n            - due.isEmpty() == false\n            - date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")\n            - date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")\n          - and:\n            - scheduled.isEmpty() == false\n            - date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")\n            - date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: formula.urgencyScore\n        direction: DESC\n  - type: tasknotesTaskList\n    name: "Unscheduled"\n    filters:\n      and:\n        # Incomplete tasks\n        - or:\n          # Non-recurring task that's not in any completed status\n          - and:\n            - recurrence.isEmpty()\n            - status != "done"\n          # Recurring task where today is not in complete_instances\n          - and:\n            - recurrence.isEmpty() == false\n            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true\n        # No due date and no scheduled date\n        - date(due).isEmpty()\n        - date(scheduled).isEmpty()\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: status\n        direction: ASC\n

calendar-default.base#

\n

Command/template ID: open-advanced-calendar-view

\n
# Calendar\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesCalendar\n    name: "Calendar"\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    options:\n      showScheduled: true\n      showDue: true\n      showRecurring: true\n      showTimeEntries: true\n      showTimeblocks: true\n      showPropertyBasedEvents: true\n      createDailyNotesFromDateLinks: true\n      calendarView: "timeGridWeek"\n      customDayCount: 3\n      firstDay: 1\n

agenda-default.base#

\n

Command/template ID: open-agenda-view

\n
# Agenda\n\nfilters:\n  and:\n    - file.hasTag("task")\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nproperties:\n  formula.dueIn:\n    displayName: Due in\n\n\nviews:\n  - type: tasknotesCalendar\n    name: "Agenda"\n    order:\n      - status\n      - priority\n      - due\n      - formula.dueIn\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    options:\n      showPropertyBasedEvents: false\n      showOverdueOnToday: true\n      createDailyNotesFromDateLinks: true\n    calendarView: "listWeek"\n    startDateProperty: file.ctime\n    listDayCount: 7\n    titleProperty: file.basename\n

pomodoro-stats.base#

\n

Command/template ID: pomodoro-stats-base

\n
# Pomodoro statistics\n# Generated with your TaskNotes settings\n# Requires Pomodoro data storage to be set to Daily notes.\n\nfilters:\n  and:\n    - file.hasProperty("pomodoros")\n    - list(note["pomodoros"]).filter(value.startTime).isEmpty() == false\n\nformulas:\n  pomodoroDate: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM-DD")).unique().join(", "), file.basename)'\n  pomodoroMonth: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM")).unique().join(", "), "")'\n  completedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).length, 0)'\n  attemptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work").length, 0)'\n  interruptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == false).length, 0)'\n  focusMinutes: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)'\n  focusTime: 'if(formula.focusMinutes >= 60, (formula.focusMinutes / 60).floor() + "h " + (formula.focusMinutes % 60).round() + "m", formula.focusMinutes + "m")'\n  completionRate: 'if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round() + "%", "0%")'\n  shortBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "short-break").length, 0)'\n  longBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "long-break").length, 0)'\n\nproperties:\n  formula.pomodoroDate:\n    displayName: Date\n  formula.pomodoroMonth:\n    displayName: Month\n  formula.completedPomos:\n    displayName: Completed\n  formula.attemptedPomos:\n    displayName: Attempted\n  formula.interruptedPomos:\n    displayName: Interrupted\n  formula.focusMinutes:\n    displayName: Focus minutes\n  formula.focusTime:\n    displayName: Focus time\n  formula.completionRate:\n    displayName: Completion\n  formula.shortBreaks:\n    displayName: Short breaks\n  formula.longBreaks:\n    displayName: Long breaks\n\nviews:\n  - type: table\n    name: "Daily"\n    order:\n      - formula.pomodoroDate\n      - formula.completedPomos\n      - formula.focusTime\n      - formula.attemptedPomos\n      - formula.completionRate\n      - formula.interruptedPomos\n      - formula.shortBreaks\n      - formula.longBreaks\n      - file.name\n    sort:\n      - column: formula.pomodoroDate\n        direction: DESC\n  - type: table\n    name: "Monthly"\n    groupBy:\n      property: formula.pomodoroMonth\n      direction: DESC\n    order:\n      - formula.pomodoroDate\n      - formula.completedPomos\n      - formula.focusMinutes\n      - formula.focusTime\n      - formula.attemptedPomos\n      - formula.completionRate\n      - formula.interruptedPomos\n      - formula.shortBreaks\n      - formula.longBreaks\n      - file.name\n    summaries:\n      formula.completedPomos: Sum\n      formula.focusMinutes: Sum\n      formula.attemptedPomos: Sum\n      formula.interruptedPomos: Sum\n      formula.shortBreaks: Sum\n      formula.longBreaks: Sum\n    sort:\n      - column: formula.pomodoroDate\n        direction: DESC\n

relationships.base#

\n

Command/template ID: relationships

\n
# Relationships\n# This view shows all relationships for the current file\n# Dynamically shows/hides tabs based on available data\n\nformulas:\n  priorityWeight: 'if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))'\n  daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)'\n  dueIn: 'if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today", if(formula.daysUntilDue == 1, "1 day", if(formula.daysUntilDue > 1, formula.daysUntilDue + " days", if(formula.daysUntilDue == -1, "1 day overdue", formula.daysUntilDue * -1 + " days overdue")))))'\n  daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)'\n  daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()'\n  daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()'\n  isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != "done"'\n  isDueToday: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isDueThisWeek: '(due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")'\n  isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")'\n  isRecurring: 'recurrence && !recurrence.isEmpty()'\n  hasTimeEstimate: 'timeEstimate && timeEstimate > 0'\n  timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)'\n  efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)'\n  timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)'\n  dueMonth: 'if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")'\n  dueWeek: 'if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")'\n  scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not scheduled")'\n  scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "Not scheduled")'\n  dueDateCategory: 'if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))'\n  timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))'\n  ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))'\n  createdMonth: 'file.ctime.format("YYYY-MM")'\n  modifiedMonth: 'file.mtime.format("YYYY-MM")'\n  priorityCategory: 'if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))'\n  projectCount: 'if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))'\n  contextCount: 'if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))'\n  trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))'\n  nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))'\n  daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))'\n  hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)'\n  isToday: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))'\n  isThisWeek: '((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"))'\n  nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")), "This week", "Later")))))'\n  nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false), date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "No date")))'\n  nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"), "No date")))'\n  urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))'\n  timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")'\n  dueDateDisplay: 'if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") == (today() - "1 day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM D")))))))'\n\nviews:\n  - type: tasknotesKanban\n    name: "Subtasks"\n    filters:\n      and:\n        - file.hasTag("task")\n        - file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(this.file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: status\n      direction: ASC\n  - type: tasknotesTaskList\n    name: "Occurrences"\n    filters:\n      and:\n        - file.hasTag("task")\n        - file.hasLink(this.file) && note.recurrence_parent && file(note.recurrence_parent.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, "$1").replace(/%20/g, " ")).asLink() == this.file.asLink()\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - occurrence_date\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: occurrence_date\n        direction: ASC\n  - type: tasknotesTaskList\n    name: "Projects"\n    filters:\n      and:\n        - list(this.projects).map(file(value.replace(/^\\[[^\\]]+\\]\\((.*)\\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n  - type: tasknotesTaskList\n    name: "Blocked By"\n    filters:\n      and:\n        - file.hasTag("task")\n        - list(this.note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n  - type: tasknotesKanban\n    name: "Blocking"\n    filters:\n      and:\n        - file.hasTag("task")\n        - list(note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(this.file.asLink())\n    order:\n      - status\n      - priority\n      - due\n      - scheduled\n      - projects\n      - contexts\n      - file.tags\n      - blockedBy\n      - file.name\n      - recurrence\n      - complete_instances\n      - file.tasks\n    sort:\n      - column: tasknotes_manual_order\n        direction: DESC\n    groupBy:\n      property: status\n      direction: ASC\n
","text":"These are the exact templates TaskNotes 4.12.3 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ. Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it. mini-calendar-default.base# Command/template ID: open-calendar-view # Mini Calendar # Generated with your TaskNotes settings filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))' nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))' nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))' urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))' timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")' dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))' views: - type: tasknotesMiniCalendar name: \"Due\" order: - status - priority - due - scheduled - projects - contexts - file.tags - blockedBy - file.name - recurrence - complete_instances - file.tasks sort: - property: due direction: ASC dateProperty: due - type: tasknotesMiniCalendar name: \"Scheduled\" order: [] dateProperty: scheduled - type: tasknotesMiniCalendar name: \"Created\" dateProperty: file.ctime - type: tasknotesMiniCalendar name: \"Modified\" dateProperty: file.mtime kanban-default.base# Command/template ID: open-kanban-view # Kanban Board filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).fo"},{"route":"/obsidian/reference/http-routes/","title":"HTTP route index","description":"Implemented TaskNotes HTTP API routes generated from controller decorators.","product":"obsidian","platforms":[],"version":"4.12.3","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/http-routes.md","raw":"---\ntitle: \"HTTP route index\"\ndescription: \"Implemented TaskNotes HTTP API routes generated from controller decorators.\"\ngenerated: true\nsource: [\"src/api/*Controller.ts\",\"docs/HTTP_API.md\",\"docs/nlp-api.md\"]\n---\n# HTTP route index\n\nThis index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative [HTTP API guide](/HTTP_API/) or [NLP API guide](/nlp-api/).\n\n| Method | Path | Controller |\n| --- | --- | --- |\n| `POST` | `/api/bases/default-files/update` | `BasesController` |\n| `GET` | `/api/calendars` | `CalendarsController` |\n| `GET` | `/api/calendars/events` | `CalendarsController` |\n| `GET` | `/api/calendars/google` | `CalendarsController` |\n| `GET` | `/api/calendars/microsoft` | `CalendarsController` |\n| `GET` | `/api/calendars/subscriptions` | `CalendarsController` |\n| `GET` | `/api/docs` | `SystemController` |\n| `GET` | `/api/docs/ui` | `SystemController` |\n| `GET` | `/api/filter-options` | `TasksController` |\n| `GET` | `/api/health` | `SystemController` |\n| `POST` | `/api/nlp/create` | `SystemController` |\n| `POST` | `/api/nlp/parse` | `SystemController` |\n| `POST` | `/api/pomodoro/pause` | `PomodoroController` |\n| `POST` | `/api/pomodoro/resume` | `PomodoroController` |\n| `GET` | `/api/pomodoro/sessions` | `PomodoroController` |\n| `POST` | `/api/pomodoro/start` | `PomodoroController` |\n| `GET` | `/api/pomodoro/stats` | `PomodoroController` |\n| `GET` | `/api/pomodoro/status` | `PomodoroController` |\n| `POST` | `/api/pomodoro/stop` | `PomodoroController` |\n| `GET` | `/api/stats` | `TasksController` |\n| `GET` | `/api/tasks` | `TasksController` |\n| `POST` | `/api/tasks` | `TasksController` |\n| `DELETE` | `/api/tasks/:id` | `TasksController` |\n| `GET` | `/api/tasks/:id` | `TasksController` |\n| `PUT` | `/api/tasks/:id` | `TasksController` |\n| `POST` | `/api/tasks/:id/archive` | `TasksController` |\n| `POST` | `/api/tasks/:id/complete-instance` | `TasksController` |\n| `POST` | `/api/tasks/:id/materialize-occurrence` | `TasksController` |\n| `GET` | `/api/tasks/:id/time` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/time/start` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/time/start-with-description` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/time/stop` | `TimeTrackingController` |\n| `POST` | `/api/tasks/:id/toggle-status` | `TasksController` |\n| `POST` | `/api/tasks/query` | `TasksController` |\n| `GET` | `/api/time/active` | `TimeTrackingController` |\n| `GET` | `/api/time/summary` | `TimeTrackingController` |\n| `GET` | `/api/webhooks` | `WebhookController` |\n| `POST` | `/api/webhooks` | `WebhookController` |\n| `DELETE` | `/api/webhooks/:id` | `WebhookController` |\n| `GET` | `/api/webhooks/deliveries` | `WebhookController` |\n\n_Generated from 40 implemented routes._\n","aliases":["/reference/http-routes/","/reference/http-routes/"],"toc":[],"html":"

This index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative HTTP API guide or NLP API guide.

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
MethodPathController
POST/api/bases/default-files/updateBasesController
GET/api/calendarsCalendarsController
GET/api/calendars/eventsCalendarsController
GET/api/calendars/googleCalendarsController
GET/api/calendars/microsoftCalendarsController
GET/api/calendars/subscriptionsCalendarsController
GET/api/docsSystemController
GET/api/docs/uiSystemController
GET/api/filter-optionsTasksController
GET/api/healthSystemController
POST/api/nlp/createSystemController
POST/api/nlp/parseSystemController
POST/api/pomodoro/pausePomodoroController
POST/api/pomodoro/resumePomodoroController
GET/api/pomodoro/sessionsPomodoroController
POST/api/pomodoro/startPomodoroController
GET/api/pomodoro/statsPomodoroController
GET/api/pomodoro/statusPomodoroController
POST/api/pomodoro/stopPomodoroController
GET/api/statsTasksController
GET/api/tasksTasksController
POST/api/tasksTasksController
DELETE/api/tasks/:idTasksController
GET/api/tasks/:idTasksController
PUT/api/tasks/:idTasksController
POST/api/tasks/:id/archiveTasksController
POST/api/tasks/:id/complete-instanceTasksController
POST/api/tasks/:id/materialize-occurrenceTasksController
GET/api/tasks/:id/timeTimeTrackingController
POST/api/tasks/:id/time/startTimeTrackingController
POST/api/tasks/:id/time/start-with-descriptionTimeTrackingController
POST/api/tasks/:id/time/stopTimeTrackingController
POST/api/tasks/:id/toggle-statusTasksController
POST/api/tasks/queryTasksController
GET/api/time/activeTimeTrackingController
GET/api/time/summaryTimeTrackingController
GET/api/webhooksWebhookController
POST/api/webhooksWebhookController
DELETE/api/webhooks/:idWebhookController
GET/api/webhooks/deliveriesWebhookController
\n

Generated from 40 implemented routes.

\n","text":"This index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative HTTP API guide or NLP API guide. Method Path Controller POST /api/bases/default-files/update BasesController GET /api/calendars CalendarsController GET /api/calendars/events CalendarsController GET /api/calendars/google CalendarsController GET /api/calendars/microsoft CalendarsController GET /api/calendars/subscriptions CalendarsController GET /api/docs SystemController GET /api/docs/ui SystemController GET /api/filter-options TasksController GET /api/health SystemController POST /api/nlp/create SystemController POST /api/nlp/parse SystemController POST /api/pomodoro/pause PomodoroController POST /api/pomodoro/resume PomodoroController GET /api/pomodoro/sessions PomodoroController POST /api/pomodoro/start PomodoroController GET /api/pomodoro/stats PomodoroController GET /api/pomodoro/status PomodoroController POST /api/pomodoro/stop PomodoroController GET /api/stats TasksController GET /api/tasks TasksController POST /api/tasks TasksController DELETE /api/tasks/:id TasksController GET /api/tasks/:id TasksController PUT /api/tasks/:id TasksController POST /api/tasks/:id/archive TasksController POST /api/tasks/:id/complete-instance TasksController POST /api/tasks/:id/materialize-occurrence TasksController GET /api/tasks/:id/time TimeTrackingController POST /api/tasks/:id/time/start TimeTrackingController POST /api/tasks/:id/time/start-with-description TimeTrackingController POST /api/tasks/:id/time/stop TimeTrackingController POST /api/tasks/:id/toggle-status TasksController POST /api/tasks/query TasksController GET /api/time/active TimeTrackingController GET /api/time/summary TimeTrackingController GET /api/webhooks WebhookController POST /api/webhooks WebhookController DELETE /api/webhooks/:id WebhookController GET /api/webhooks/deliveries WebhookController Generated from 40 implemented routes."},{"route":"/obsidian/reference/settings-source/","title":"Settings source reference","description":"The six TaskNotes settings tabs, their controls, and the complete default settings snapshot generated from source.","product":"obsidian","platforms":[],"version":"4.12.3","generated":true,"noIndex":false,"hideToc":false,"source":"tasknotes:docs-builder/src/generated-pages.js","namespace":"obsidian","relativePath":"reference/settings-source.md","raw":"---\ntitle: \"Settings source reference\"\ndescription: \"The six TaskNotes settings tabs, their controls, and the complete default settings snapshot generated from source.\"\ngenerated: true\nsource: [\"src/settings/TaskNotesSettingTab.ts\",\"src/settings/tabs/*.ts\",\"src/settings/defaults.ts\",\"src/i18n/resources/en.ts\"]\n---\n# Settings source reference\n\nTaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation.\n\n## General\n\nSource: `src/settings/tabs/generalTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Default tasks folder | Default location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD. |\n| Folder for inline-created tasks | Folder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note. |\n| Move archived tasks to folder | Automatically move archived tasks to an archive folder |\n| Archive folder | Folder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc. |\n| Identify tasks by | Choose whether to identify tasks by tag or by a frontmatter property |\n| Task tag | Tag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters. |\n| Hide identification tags in task cards | When enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays |\n| Hidden tag scope | Choose whether hiding identification tags also hides nested tags. |\n| Task property name | The frontmatter property name (e.g., \"category\") |\n| Task property value | The value that identifies a note as a task (e.g., \"task\") |\n| Auto-create default files | Automatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated. |\n| Create default files | Create the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten. |\n| Update default files | Overwrite the configured default .base files with templates generated from your current TaskNotes settings. |\n| Export v3 saved views to Bases | Convert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system. |\n| Excluded folders | Comma-separated list of folders to exclude from task indexing and project suggestions |\n| UI language | Select the language used for TaskNotes interface text |\n| Use Markdown links in frontmatter | Generate markdown links (`[text](path)`) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly. |\n| Show release notes after update | Automatically open release notes when TaskNotes is updated to a new version |\n| Check for new releases on startup | Check GitHub once when TaskNotes starts and show a notice when a newer compatible release is available |\n| View release notes | See what's new in the latest version of TaskNotes |\n\n## Task properties\n\nSource: `src/settings/tabs/taskPropertiesTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| No static controls detected | This tab is assembled dynamically. |\n\n## Modal fields\n\nSource: `src/settings/tabs/modalFieldsTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| No static controls detected | This tab is assembled dynamically. |\n\n## Appearance & UI\n\nSource: `src/settings/tabs/appearanceTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Default visible properties | Choose which properties appear on task cards by default. |\n| Time format | Display time in 12-hour or 24-hour format throughout the plugin |\n| Default view | The calendar view shown when opening the calendar tab |\n| Custom view day count | Number of days to show in custom multi-day view |\n| First day of week | Which day should be the first column in week views |\n| Show weekends | Display weekends in calendar views |\n| Show week numbers | Display week numbers in calendar views |\n| Show today highlight | Highlight the current day in calendar views |\n| Show current time indicator | Display a line showing the current time in timeline views |\n| Selection mirror | Show a visual preview while dragging to select time ranges |\n| Calendar locale | Calendar locale for date formatting and calendar system (e.g., \"en\", \"fa\" for Farsi/Persian, \"de\" for German). Leave empty to auto-detect from browser. |\n| Show scheduled tasks | Display tasks with scheduled dates by default |\n| Show due dates | Display task due dates by default |\n| Show due dates when scheduled | Display due dates even for tasks that already have scheduled dates |\n| Show time entries | Display completed time tracking entries by default |\n| Show recurring tasks | Display recurring task instances by default |\n| Show ICS events | Display events from ICS subscriptions by default |\n| Time slot duration | Duration of each time slot in timeline views |\n| Start time | Earliest time shown in timeline views (HH:MM format) |\n| End time | Latest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM. |\n| Initial scroll time | Time to scroll to when opening timeline views (HH:MM format) |\n| Event minimum height | Minimum height for events in timeline views (pixels) |\n| Show tracked tasks in status bar | Display currently tracked tasks in Obsidian's status bar |\n| Show relationships widget | Display a widget showing all relationships for the current note (subtasks, projects, dependencies) |\n| Relationships position | Where to position the relationships widget |\n| Show task card in note | Display a task card widget at the top of task notes showing the task details and actions |\n| Strike through completed task titles | Draw a line through completed task card titles. Turn off to keep completed tasks easier to read |\n| Show expandable subtasks | Allow expanding/collapsing subtask sections in task cards |\n| Expand subtasks by default | Show project subtasks expanded when task cards are rendered |\n| Subtask chevron position | Position of expand/collapse chevrons in task cards |\n| Views button alignment | Alignment of the views/filters button in the task interface |\n| Single-click action | Action performed when single-clicking a task card |\n| Double-click action | Action performed when double-clicking a task card |\n\n## Features\n\nSource: `src/settings/tabs/featuresTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Task link overlay | Show interactive overlays when hovering over task links |\n| Disable overlay for aliased links | Do not show the task widget if the link contains an alias (e.g. [[Task\\|Alias]]). |\n| Show convert button next to checkboxes | Display an inline button next to Markdown checkboxes that converts them to TaskNotes |\n| Keep checkbox when converting | Leave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link |\n| Enable natural language task input | Parse due dates, priorities, and contexts from natural language when creating tasks |\n| Default to scheduled | When NLP detects a date without context, treat it as scheduled rather than due |\n| NLP language | Language for natural language processing patterns and date parsing |\n| Open task after creation | Choose whether the task creation modal opens the new task note after saving. |\n| Use body template | Use a template file for task body content |\n| Body template file | Path to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc. |\n| Use occurrence note template | Use a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template |\n| Occurrence note template file | Path to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback. |\n| Template variables: | See the setting in Obsidian for contextual details. |\n| Use task defaults on instant convert | Apply default task settings when converting text to tasks instantly |\n| Work duration | Duration of work intervals in minutes |\n| Short break duration | Duration of short breaks in minutes |\n| Long break duration | Duration of long breaks in minutes |\n| Long break interval | Number of work sessions before a long break |\n| Auto-start breaks | Automatically start break timers after work sessions |\n| Auto-start work | Automatically start work sessions after breaks |\n| Pomodoro notifications | Show notifications when Pomodoro sessions end |\n| Show Pomodoro in status bar | Display the active Pomodoro countdown in Obsidian's status bar |\n| Sound enabled | Play sound when Pomodoro sessions end |\n| Sound volume | Volume for Pomodoro sounds (0-100) |\n| Pomodoro data storage | Configure where Pomodoro session data is stored and how it's managed. |\n| Mobile sidebar | Where to open the Pomodoro timer on mobile devices |\n| Enable notifications | Enable task reminder notifications |\n| Notification type | Type of notifications to show |\n| Send test reminder | Send a test reminder using the current notification type and sound settings. |\n| Notification sound | Play a sound when task reminders trigger |\n| Sound volume | Volume for task reminder sounds (0-100) |\n| Preview notification sound | Play the configured task reminder sound |\n| Hide completed tasks from overdue | Exclude completed tasks from overdue task calculations |\n| Disable note indexing | Disable automatic indexing of note content for better performance |\n| Suggestion debounce | Delay in milliseconds before showing suggestions |\n| Auto-stop time tracking | Automatically stop time tracking when a task is marked complete |\n| Time tracking stop notification | Show notification when time tracking is automatically stopped |\n| Maintain due date offset in recurring tasks | Keep the offset between due date and scheduled date when recurring tasks are completed |\n| Reset checkboxes on recurrence | Reset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled |\n| Enable timeblocking | Enable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu. |\n| Show timeblocks | Display timeblocks from daily notes by default |\n| Default timeblock color | The default color used when creating new timeblocks |\n| Enable debug logging | Log detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting. |\n\n## Integrations\n\nSource: `src/settings/tabs/integrationsTab.ts`\n\n| Setting | Purpose |\n| --- | --- |\n| Generate mdbase type definitions | See the setting in Obsidian for contextual details. |\n| Disable calendar integrations on mobile | Skip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged. |\n| Calendar integrations are disabled on this mobile device | See the setting in Obsidian for contextual details. |\n| Enable task export | When enabled, tasks with dates will be automatically synced to Google Calendar as events. |\n| Target calendar | See the setting in Obsidian for contextual details. |\n| Sync trigger | Which task date should trigger calendar event creation. |\n| Create as all-day events | When enabled, tasks are created as all-day events. When disabled, uses time estimate for duration. |\n| Default event duration | Duration in minutes for timed events (used when task has no time estimate). |\n| Event title template | Template for event titles. Available variables: {{title}}, {{status}}, {{priority}} |\n| Include task details in description | Add task metadata (priority, status, tags, etc.) to the event description. |\n| Include Obsidian link | Add a link back to the task in Obsidian in the event description. |\n| Default reminder | Add popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440. |\n| Automatic sync behavior | See the setting in Obsidian for contextual details. |\n| Sync on task create | Automatically create calendar event when a new task is created. |\n| Sync on task update | Automatically update calendar event when a task is modified. |\n| Sync on task complete | Update calendar event when a task is completed (adds checkmark to title). |\n| Delete event on task delete | Remove calendar event when the corresponding task is deleted. |\n| Manual sync actions | See the setting in Obsidian for contextual details. |\n| Sync all tasks | Sync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet. |\n| Unlink all tasks | Remove all task-event links without deleting calendar events. |\n| Default note template | Path to template file for notes created from ICS events |\n| Default note folder | Folder for notes created from ICS events |\n| ICS note filename format | How filenames are generated for notes created from ICS events |\n| Custom ICS filename template | Template for custom ICS event filenames |\n| Use ICS event end time as task due date | When enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time. |\n| Recurring event related notes | Choose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance. |\n| Add calendar subscription | Add a new calendar subscription from ICS/iCal URL or local file |\n| New calendar | See the setting in Obsidian for contextual details. |\n| Refresh all subscriptions | Manually refresh all enabled calendar subscriptions |\n| Enable automatic export | Automatically keep an ICS file updated with all your tasks |\n| Export file path | Path where the ICS file will be saved (relative to vault root) |\n| Update interval (between 5 and 1440 minutes) | How often to update the export file |\n| Use task duration for event length | When enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines. |\n| Exclude completed tasks | When enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings. |\n| Exclude archived tasks | When enabled, archived tasks are omitted from ICS exports. |\n| Require due date | When enabled, only tasks with a due date are included in ICS exports. |\n| Require scheduled date | When enabled, only tasks with a scheduled date are included in ICS exports. |\n| Export now | Manually trigger an immediate export |\n| Export status: | See the setting in Obsidian for contextual details. |\n| Enable HTTP API | Start local HTTP server for API access |\n| API port | Port number for the HTTP API server |\n| API authentication token | Token required for API authentication (leave empty for no auth) |\n| Enable MCP server | Expose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled. |\n| Add webhook | Register a new webhook endpoint |\n\n## Complete default settings snapshot\n\nThe following JSON is generated from `DEFAULT_SETTINGS`. Empty strings and disabled flags are intentional defaults.\n\n```json\n{\n \"tasksFolder\": \"TaskNotes/Tasks\",\n \"moveArchivedTasks\": false,\n \"archiveFolder\": \"TaskNotes/Archive\",\n \"taskTag\": \"task\",\n \"taskIdentificationMethod\": \"tag\",\n \"hideIdentifyingTagsInCards\": false,\n \"hideIdentifyingTagsMode\": \"all\",\n \"taskPropertyName\": \"\",\n \"taskPropertyValue\": \"\",\n \"excludedFolders\": \"\",\n \"defaultTaskPriority\": \"normal\",\n \"defaultTaskStatus\": \"open\",\n \"taskOrgFiltersCollapsed\": false,\n \"taskFilenameFormat\": \"zettel\",\n \"storeTitleInFilename\": true,\n \"customFilenameTemplate\": \"{{title}}\",\n \"occurrenceFilenameTemplate\": \"\",\n \"occurrenceFilenameTemplateProperty\": \"occurrenceFilenameTemplate\",\n \"taskCreationDefaults\": {\n \"defaultContexts\": \"\",\n \"defaultTags\": \"\",\n \"defaultProjects\": \"\",\n \"useParentNoteForTaskCreation\": false,\n \"useParentNoteAsProject\": false,\n \"useParentHeaderAsProject\": false,\n \"inheritParentTaskProperties\": false,\n \"defaultTimeEstimate\": 0,\n \"defaultRecurrence\": \"none\",\n \"defaultDueDate\": \"none\",\n \"defaultDueTime\": \"none\",\n \"defaultScheduledDate\": \"today\",\n \"defaultScheduledTime\": \"none\",\n \"bodyTemplate\": \"\",\n \"useBodyTemplate\": false,\n \"occurrenceBodyTemplate\": \"\",\n \"useOccurrenceBodyTemplate\": false,\n \"defaultReminders\": []\n },\n \"openTaskAfterCreation\": \"none\",\n \"calendarViewSettings\": {\n \"defaultView\": \"dayGridMonth\",\n \"customDayCount\": 3,\n \"slotDuration\": \"00:30:00\",\n \"slotMinTime\": \"00:00:00\",\n \"slotMaxTime\": \"24:00:00\",\n \"scrollTime\": \"08:00:00\",\n \"firstDay\": 1,\n \"timeFormat\": \"24\",\n \"showWeekends\": true,\n \"locale\": \"\",\n \"defaultShowScheduled\": true,\n \"defaultShowDue\": true,\n \"defaultShowDueWhenScheduled\": true,\n \"defaultShowScheduledToDueSpan\": false,\n \"defaultShowTimeEntries\": false,\n \"defaultShowRecurring\": true,\n \"defaultShowICSEvents\": true,\n \"enableTimeblocking\": false,\n \"defaultShowTimeblocks\": true,\n \"defaultTimeblockColor\": \"#6366f1\",\n \"timeblockAttachmentSearchOrder\": \"name-asc\",\n \"nowIndicator\": true,\n \"selectMirror\": true,\n \"weekNumbers\": false,\n \"showTodayHighlight\": true,\n \"eventMinHeight\": 15,\n \"slotEventOverlap\": true,\n \"eventMaxStack\": null,\n \"dayMaxEvents\": true,\n \"dayMaxEventRows\": false\n },\n \"pomodoroWorkDuration\": 25,\n \"pomodoroShortBreakDuration\": 5,\n \"pomodoroLongBreakDuration\": 15,\n \"pomodoroLongBreakInterval\": 4,\n \"pomodoroAutoStartBreaks\": true,\n \"pomodoroAutoStartWork\": false,\n \"pomodoroNotifications\": true,\n \"pomodoroSoundEnabled\": true,\n \"pomodoroSoundVolume\": 50,\n \"pomodoroStorageLocation\": \"plugin\",\n \"pomodoroMobileSidebar\": \"tab\",\n \"showPomodoroInStatusBar\": true,\n \"enableTaskLinkOverlay\": true,\n \"disableOverlayOnAlias\": false,\n \"enableInstantTaskConvert\": true,\n \"useDefaultsOnInstantConvert\": true,\n \"preserveCheckboxOnConvert\": false,\n \"taskModalTabMovesFocus\": true,\n \"enableNaturalLanguageInput\": true,\n \"nlpDefaultToScheduled\": true,\n \"nlpLanguage\": \"en\",\n \"uiLanguage\": \"system\",\n \"statusSuggestionTrigger\": \"*\",\n \"nlpTriggers\": {\n \"triggers\": [\n {\n \"propertyId\": \"tags\",\n \"trigger\": \"#\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"contexts\",\n \"trigger\": \"@\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"projects\",\n \"trigger\": \"+\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"status\",\n \"trigger\": \"*\",\n \"enabled\": true\n },\n {\n \"propertyId\": \"priority\",\n \"trigger\": \"!\",\n \"enabled\": false\n }\n ]\n },\n \"singleClickAction\": \"edit\",\n \"doubleClickAction\": \"openNote\",\n \"projectAutosuggest\": {\n \"enableFuzzy\": false,\n \"rows\": [\n \"{title|n(Title)}\",\n \"{aliases|n(Aliases)}\",\n \"{file.path|n(Path)}\"\n ],\n \"showAdvanced\": false,\n \"requiredTags\": [],\n \"includeFolders\": [],\n \"propertyKey\": \"\",\n \"propertyValue\": \"\"\n },\n \"inlineTaskConvertFolder\": \"{{currentNotePath}}\",\n \"disableNoteIndexing\": false,\n \"suggestionDebounceMs\": 0,\n \"fieldMapping\": {\n \"title\": \"title\",\n \"status\": \"status\",\n \"priority\": \"priority\",\n \"due\": \"due\",\n \"scheduled\": \"scheduled\",\n \"contexts\": \"contexts\",\n \"projects\": \"projects\",\n \"attachments\": \"attachments\",\n \"timeEstimate\": \"timeEstimate\",\n \"completedDate\": \"completedDate\",\n \"dateCreated\": \"dateCreated\",\n \"dateModified\": \"dateModified\",\n \"recurrence\": \"recurrence\",\n \"recurrenceAnchor\": \"recurrence_anchor\",\n \"recurrenceParent\": \"recurrence_parent\",\n \"occurrenceDate\": \"occurrence_date\",\n \"occurrenceMaterialization\": \"occurrence_materialization\",\n \"occurrenceNextTrigger\": \"occurrence_next_trigger\",\n \"occurrenceTemplate\": \"occurrence_template\",\n \"occurrencePastHorizon\": \"occurrence_past_horizon\",\n \"occurrenceFutureHorizon\": \"occurrence_future_horizon\",\n \"archiveTag\": \"archived\",\n \"timeEntries\": \"timeEntries\",\n \"completeInstances\": \"complete_instances\",\n \"skippedInstances\": \"skipped_instances\",\n \"blockedBy\": \"blockedBy\",\n \"pomodoros\": \"pomodoros\",\n \"icsEventId\": \"icsEventId\",\n \"icsEventTag\": \"ics_event\",\n \"googleCalendarEventId\": \"googleCalendarEventId\",\n \"googleCalendarExceptionEventId\": \"googleCalendarExceptionEventId\",\n \"googleCalendarExceptionOriginalScheduled\": \"googleCalendarExceptionOriginalScheduled\",\n \"googleCalendarMovedOriginalDates\": \"googleCalendarMovedOriginalDates\",\n \"reminders\": \"reminders\",\n \"sortOrder\": \"tasknotes_manual_order\"\n },\n \"customStatuses\": [\n {\n \"id\": \"none\",\n \"value\": \"none\",\n \"label\": \"None\",\n \"color\": \"#cccccc\",\n \"isCompleted\": false,\n \"excludeFromCycle\": false,\n \"order\": 0,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n },\n {\n \"id\": \"open\",\n \"value\": \"open\",\n \"label\": \"Open\",\n \"color\": \"#808080\",\n \"isCompleted\": false,\n \"excludeFromCycle\": false,\n \"order\": 1,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n },\n {\n \"id\": \"in-progress\",\n \"value\": \"in-progress\",\n \"label\": \"In progress\",\n \"color\": \"#0066cc\",\n \"isCompleted\": false,\n \"excludeFromCycle\": false,\n \"order\": 2,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n },\n {\n \"id\": \"done\",\n \"value\": \"done\",\n \"label\": \"Done\",\n \"color\": \"#00aa00\",\n \"isCompleted\": true,\n \"excludeFromCycle\": false,\n \"order\": 3,\n \"autoArchive\": false,\n \"autoArchiveDelay\": 5\n }\n ],\n \"customPriorities\": [\n {\n \"id\": \"none\",\n \"value\": \"none\",\n \"label\": \"None\",\n \"color\": \"#cccccc\",\n \"weight\": 0\n },\n {\n \"id\": \"low\",\n \"value\": \"low\",\n \"label\": \"Low\",\n \"color\": \"#00aa00\",\n \"weight\": 1\n },\n {\n \"id\": \"normal\",\n \"value\": \"normal\",\n \"label\": \"Normal\",\n \"color\": \"#ffaa00\",\n \"weight\": 2\n },\n {\n \"id\": \"high\",\n \"value\": \"high\",\n \"label\": \"High\",\n \"color\": \"#ff0000\",\n \"weight\": 3\n }\n ],\n \"recurrenceMigrated\": false,\n \"showReleaseNotesOnUpdate\": true,\n \"checkForUpdatesOnStartup\": true,\n \"starterNoteCreated\": false,\n \"showTrackedTasksInStatusBar\": false,\n \"autoStopTimeTrackingOnComplete\": true,\n \"autoStopTimeTrackingNotification\": false,\n \"showRelationships\": true,\n \"relationshipsPosition\": \"bottom\",\n \"showTaskCardInNote\": true,\n \"showCompletedTaskStrikethrough\": true,\n \"showExpandableSubtasks\": true,\n \"expandSubtasksByDefault\": false,\n \"subtaskChevronPosition\": \"right\",\n \"viewsButtonAlignment\": \"right\",\n \"hideCompletedFromOverdue\": true,\n \"icsIntegration\": {\n \"defaultNoteTemplate\": \"\",\n \"defaultNoteFolder\": \"\",\n \"icsNoteFilenameFormat\": \"title\",\n \"customICSNoteFilenameTemplate\": \"{title}\",\n \"enableAutoExport\": false,\n \"autoExportPath\": \"tasknotes-calendar.ics\",\n \"autoExportInterval\": 60,\n \"useDurationForExport\": false,\n \"excludeArchivedFromExport\": false,\n \"excludeCompletedFromExport\": false,\n \"requireDueDateForExport\": false,\n \"requireScheduledDateForExport\": false,\n \"useICSEndAsDue\": false,\n \"recurringEventRelatedNotesMode\": \"series\"\n },\n \"savedViews\": [],\n \"enableNotifications\": true,\n \"notificationType\": \"system\",\n \"notificationSoundEnabled\": false,\n \"notificationSoundVolume\": 50,\n \"enableAPI\": false,\n \"apiPort\": 8080,\n \"apiAuthToken\": \"\",\n \"enableMCP\": false,\n \"webhooks\": [],\n \"userFields\": [],\n \"enableModalSplitLayout\": true,\n \"defaultVisibleProperties\": [\n \"status\",\n \"priority\",\n \"due\",\n \"scheduled\",\n \"projects\",\n \"contexts\",\n \"tags\",\n \"blocked\",\n \"blocking\"\n ],\n \"inlineVisibleProperties\": [\n \"status\",\n \"priority\",\n \"due\",\n \"scheduled\",\n \"recurrence\"\n ],\n \"enableBases\": true,\n \"enableMdbaseSpec\": false,\n \"autoCreateDefaultBasesFiles\": true,\n \"commandFileMapping\": {\n \"open-calendar-view\": \"TaskNotes/Views/mini-calendar-default.base\",\n \"open-kanban-view\": \"TaskNotes/Views/kanban-default.base\",\n \"open-tasks-view\": \"TaskNotes/Views/tasks-default.base\",\n \"open-advanced-calendar-view\": \"TaskNotes/Views/calendar-default.base\",\n \"open-agenda-view\": \"TaskNotes/Views/agenda-default.base\",\n \"pomodoro-stats-base\": \"TaskNotes/Views/pomodoro-stats.base\",\n \"relationships\": \"TaskNotes/Views/relationships.base\"\n },\n \"maintainDueDateOffsetInRecurring\": false,\n \"resetCheckboxesOnRecurrence\": false,\n \"useFrontmatterMarkdownLinks\": false,\n \"enableGoogleCalendar\": false,\n \"enableMicrosoftCalendar\": false,\n \"disableCalendarOnMobile\": false,\n \"enabledGoogleCalendars\": [],\n \"googleCalendarSyncTokens\": {},\n \"enabledMicrosoftCalendars\": [],\n \"microsoftCalendarSyncTokens\": {},\n \"googleCalendarExport\": {\n \"enabled\": false,\n \"targetCalendarId\": \"\",\n \"syncOnTaskCreate\": true,\n \"syncOnTaskUpdate\": true,\n \"syncOnTaskComplete\": true,\n \"syncOnTaskDelete\": true,\n \"eventTitleTemplate\": \"{{title}}\",\n \"includeDescription\": true,\n \"eventColorId\": null,\n \"syncTrigger\": \"scheduled\",\n \"createAsAllDay\": true,\n \"defaultEventDuration\": 60,\n \"includeObsidianLink\": true,\n \"defaultReminderMinutes\": null\n },\n \"enableDebugLogging\": false\n}\n```\n","aliases":["/reference/settings-source/","/reference/settings-source/"],"toc":[{"level":2,"id":"general","text":"General"},{"level":2,"id":"task-properties","text":"Task properties"},{"level":2,"id":"modal-fields","text":"Modal fields"},{"level":2,"id":"appearance-ui","text":"Appearance & UI"},{"level":2,"id":"features","text":"Features"},{"level":2,"id":"integrations","text":"Integrations"},{"level":2,"id":"complete-default-settings-snapshot","text":"Complete default settings snapshot"}],"html":"

TaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation.

\n

General#

\n

Source: src/settings/tabs/generalTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Default tasks folderDefault location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD.
Folder for inline-created tasksFolder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note.
Move archived tasks to folderAutomatically move archived tasks to an archive folder
Archive folderFolder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc.
Identify tasks byChoose whether to identify tasks by tag or by a frontmatter property
Task tagTag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters.
Hide identification tags in task cardsWhen enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays
Hidden tag scopeChoose whether hiding identification tags also hides nested tags.
Task property nameThe frontmatter property name (e.g., "category")
Task property valueThe value that identifies a note as a task (e.g., "task")
Auto-create default filesAutomatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated.
Create default filesCreate the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten.
Update default filesOverwrite the configured default .base files with templates generated from your current TaskNotes settings.
Export v3 saved views to BasesConvert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system.
Excluded foldersComma-separated list of folders to exclude from task indexing and project suggestions
UI languageSelect the language used for TaskNotes interface text
Use Markdown links in frontmatterGenerate markdown links ([text](path)) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly.
Show release notes after updateAutomatically open release notes when TaskNotes is updated to a new version
Check for new releases on startupCheck GitHub once when TaskNotes starts and show a notice when a newer compatible release is available
View release notesSee what's new in the latest version of TaskNotes
\n

Task properties#

\n

Source: src/settings/tabs/taskPropertiesTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
No static controls detectedThis tab is assembled dynamically.
\n

Modal fields#

\n

Source: src/settings/tabs/modalFieldsTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
No static controls detectedThis tab is assembled dynamically.
\n

Appearance & UI#

\n

Source: src/settings/tabs/appearanceTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Default visible propertiesChoose which properties appear on task cards by default.
Time formatDisplay time in 12-hour or 24-hour format throughout the plugin
Default viewThe calendar view shown when opening the calendar tab
Custom view day countNumber of days to show in custom multi-day view
First day of weekWhich day should be the first column in week views
Show weekendsDisplay weekends in calendar views
Show week numbersDisplay week numbers in calendar views
Show today highlightHighlight the current day in calendar views
Show current time indicatorDisplay a line showing the current time in timeline views
Selection mirrorShow a visual preview while dragging to select time ranges
Calendar localeCalendar locale for date formatting and calendar system (e.g., "en", "fa" for Farsi/Persian, "de" for German). Leave empty to auto-detect from browser.
Show scheduled tasksDisplay tasks with scheduled dates by default
Show due datesDisplay task due dates by default
Show due dates when scheduledDisplay due dates even for tasks that already have scheduled dates
Show time entriesDisplay completed time tracking entries by default
Show recurring tasksDisplay recurring task instances by default
Show ICS eventsDisplay events from ICS subscriptions by default
Time slot durationDuration of each time slot in timeline views
Start timeEarliest time shown in timeline views (HH:MM format)
End timeLatest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM.
Initial scroll timeTime to scroll to when opening timeline views (HH:MM format)
Event minimum heightMinimum height for events in timeline views (pixels)
Show tracked tasks in status barDisplay currently tracked tasks in Obsidian's status bar
Show relationships widgetDisplay a widget showing all relationships for the current note (subtasks, projects, dependencies)
Relationships positionWhere to position the relationships widget
Show task card in noteDisplay a task card widget at the top of task notes showing the task details and actions
Strike through completed task titlesDraw a line through completed task card titles. Turn off to keep completed tasks easier to read
Show expandable subtasksAllow expanding/collapsing subtask sections in task cards
Expand subtasks by defaultShow project subtasks expanded when task cards are rendered
Subtask chevron positionPosition of expand/collapse chevrons in task cards
Views button alignmentAlignment of the views/filters button in the task interface
Single-click actionAction performed when single-clicking a task card
Double-click actionAction performed when double-clicking a task card
\n

Features#

\n

Source: src/settings/tabs/featuresTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Task link overlayShow interactive overlays when hovering over task links
Disable overlay for aliased linksDo not show the task widget if the link contains an alias (e.g. [[Task|Alias]]).
Show convert button next to checkboxesDisplay an inline button next to Markdown checkboxes that converts them to TaskNotes
Keep checkbox when convertingLeave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link
Enable natural language task inputParse due dates, priorities, and contexts from natural language when creating tasks
Default to scheduledWhen NLP detects a date without context, treat it as scheduled rather than due
NLP languageLanguage for natural language processing patterns and date parsing
Open task after creationChoose whether the task creation modal opens the new task note after saving.
Use body templateUse a template file for task body content
Body template filePath to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc.
Use occurrence note templateUse a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template
Occurrence note template filePath to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback.
Template variables:See the setting in Obsidian for contextual details.
Use task defaults on instant convertApply default task settings when converting text to tasks instantly
Work durationDuration of work intervals in minutes
Short break durationDuration of short breaks in minutes
Long break durationDuration of long breaks in minutes
Long break intervalNumber of work sessions before a long break
Auto-start breaksAutomatically start break timers after work sessions
Auto-start workAutomatically start work sessions after breaks
Pomodoro notificationsShow notifications when Pomodoro sessions end
Show Pomodoro in status barDisplay the active Pomodoro countdown in Obsidian's status bar
Sound enabledPlay sound when Pomodoro sessions end
Sound volumeVolume for Pomodoro sounds (0-100)
Pomodoro data storageConfigure where Pomodoro session data is stored and how it's managed.
Mobile sidebarWhere to open the Pomodoro timer on mobile devices
Enable notificationsEnable task reminder notifications
Notification typeType of notifications to show
Send test reminderSend a test reminder using the current notification type and sound settings.
Notification soundPlay a sound when task reminders trigger
Sound volumeVolume for task reminder sounds (0-100)
Preview notification soundPlay the configured task reminder sound
Hide completed tasks from overdueExclude completed tasks from overdue task calculations
Disable note indexingDisable automatic indexing of note content for better performance
Suggestion debounceDelay in milliseconds before showing suggestions
Auto-stop time trackingAutomatically stop time tracking when a task is marked complete
Time tracking stop notificationShow notification when time tracking is automatically stopped
Maintain due date offset in recurring tasksKeep the offset between due date and scheduled date when recurring tasks are completed
Reset checkboxes on recurrenceReset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled
Enable timeblockingEnable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu.
Show timeblocksDisplay timeblocks from daily notes by default
Default timeblock colorThe default color used when creating new timeblocks
Enable debug loggingLog detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting.
\n

Integrations#

\n

Source: src/settings/tabs/integrationsTab.ts

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
SettingPurpose
Generate mdbase type definitionsSee the setting in Obsidian for contextual details.
Disable calendar integrations on mobileSkip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged.
Calendar integrations are disabled on this mobile deviceSee the setting in Obsidian for contextual details.
Enable task exportWhen enabled, tasks with dates will be automatically synced to Google Calendar as events.
Target calendarSee the setting in Obsidian for contextual details.
Sync triggerWhich task date should trigger calendar event creation.
Create as all-day eventsWhen enabled, tasks are created as all-day events. When disabled, uses time estimate for duration.
Default event durationDuration in minutes for timed events (used when task has no time estimate).
Event title templateTemplate for event titles. Available variables: {{title}}, {{status}}, {{priority}}
Include task details in descriptionAdd task metadata (priority, status, tags, etc.) to the event description.
Include Obsidian linkAdd a link back to the task in Obsidian in the event description.
Default reminderAdd popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440.
Automatic sync behaviorSee the setting in Obsidian for contextual details.
Sync on task createAutomatically create calendar event when a new task is created.
Sync on task updateAutomatically update calendar event when a task is modified.
Sync on task completeUpdate calendar event when a task is completed (adds checkmark to title).
Delete event on task deleteRemove calendar event when the corresponding task is deleted.
Manual sync actionsSee the setting in Obsidian for contextual details.
Sync all tasksSync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet.
Unlink all tasksRemove all task-event links without deleting calendar events.
Default note templatePath to template file for notes created from ICS events
Default note folderFolder for notes created from ICS events
ICS note filename formatHow filenames are generated for notes created from ICS events
Custom ICS filename templateTemplate for custom ICS event filenames
Use ICS event end time as task due dateWhen enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time.
Recurring event related notesChoose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance.
Add calendar subscriptionAdd a new calendar subscription from ICS/iCal URL or local file
New calendarSee the setting in Obsidian for contextual details.
Refresh all subscriptionsManually refresh all enabled calendar subscriptions
Enable automatic exportAutomatically keep an ICS file updated with all your tasks
Export file pathPath where the ICS file will be saved (relative to vault root)
Update interval (between 5 and 1440 minutes)How often to update the export file
Use task duration for event lengthWhen enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines.
Exclude completed tasksWhen enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings.
Exclude archived tasksWhen enabled, archived tasks are omitted from ICS exports.
Require due dateWhen enabled, only tasks with a due date are included in ICS exports.
Require scheduled dateWhen enabled, only tasks with a scheduled date are included in ICS exports.
Export nowManually trigger an immediate export
Export status:See the setting in Obsidian for contextual details.
Enable HTTP APIStart local HTTP server for API access
API portPort number for the HTTP API server
API authentication tokenToken required for API authentication (leave empty for no auth)
Enable MCP serverExpose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled.
Add webhookRegister a new webhook endpoint
\n

Complete default settings snapshot#

\n

The following JSON is generated from DEFAULT_SETTINGS. Empty strings and disabled flags are intentional defaults.

\n
{\n  "tasksFolder": "TaskNotes/Tasks",\n  "moveArchivedTasks": false,\n  "archiveFolder": "TaskNotes/Archive",\n  "taskTag": "task",\n  "taskIdentificationMethod": "tag",\n  "hideIdentifyingTagsInCards": false,\n  "hideIdentifyingTagsMode": "all",\n  "taskPropertyName": "",\n  "taskPropertyValue": "",\n  "excludedFolders": "",\n  "defaultTaskPriority": "normal",\n  "defaultTaskStatus": "open",\n  "taskOrgFiltersCollapsed": false,\n  "taskFilenameFormat": "zettel",\n  "storeTitleInFilename": true,\n  "customFilenameTemplate": "{{title}}",\n  "occurrenceFilenameTemplate": "",\n  "occurrenceFilenameTemplateProperty": "occurrenceFilenameTemplate",\n  "taskCreationDefaults": {\n    "defaultContexts": "",\n    "defaultTags": "",\n    "defaultProjects": "",\n    "useParentNoteForTaskCreation": false,\n    "useParentNoteAsProject": false,\n    "useParentHeaderAsProject": false,\n    "inheritParentTaskProperties": false,\n    "defaultTimeEstimate": 0,\n    "defaultRecurrence": "none",\n    "defaultDueDate": "none",\n    "defaultDueTime": "none",\n    "defaultScheduledDate": "today",\n    "defaultScheduledTime": "none",\n    "bodyTemplate": "",\n    "useBodyTemplate": false,\n    "occurrenceBodyTemplate": "",\n    "useOccurrenceBodyTemplate": false,\n    "defaultReminders": []\n  },\n  "openTaskAfterCreation": "none",\n  "calendarViewSettings": {\n    "defaultView": "dayGridMonth",\n    "customDayCount": 3,\n    "slotDuration": "00:30:00",\n    "slotMinTime": "00:00:00",\n    "slotMaxTime": "24:00:00",\n    "scrollTime": "08:00:00",\n    "firstDay": 1,\n    "timeFormat": "24",\n    "showWeekends": true,\n    "locale": "",\n    "defaultShowScheduled": true,\n    "defaultShowDue": true,\n    "defaultShowDueWhenScheduled": true,\n    "defaultShowScheduledToDueSpan": false,\n    "defaultShowTimeEntries": false,\n    "defaultShowRecurring": true,\n    "defaultShowICSEvents": true,\n    "enableTimeblocking": false,\n    "defaultShowTimeblocks": true,\n    "defaultTimeblockColor": "#6366f1",\n    "timeblockAttachmentSearchOrder": "name-asc",\n    "nowIndicator": true,\n    "selectMirror": true,\n    "weekNumbers": false,\n    "showTodayHighlight": true,\n    "eventMinHeight": 15,\n    "slotEventOverlap": true,\n    "eventMaxStack": null,\n    "dayMaxEvents": true,\n    "dayMaxEventRows": false\n  },\n  "pomodoroWorkDuration": 25,\n  "pomodoroShortBreakDuration": 5,\n  "pomodoroLongBreakDuration": 15,\n  "pomodoroLongBreakInterval": 4,\n  "pomodoroAutoStartBreaks": true,\n  "pomodoroAutoStartWork": false,\n  "pomodoroNotifications": true,\n  "pomodoroSoundEnabled": true,\n  "pomodoroSoundVolume": 50,\n  "pomodoroStorageLocation": "plugin",\n  "pomodoroMobileSidebar": "tab",\n  "showPomodoroInStatusBar": true,\n  "enableTaskLinkOverlay": true,\n  "disableOverlayOnAlias": false,\n  "enableInstantTaskConvert": true,\n  "useDefaultsOnInstantConvert": true,\n  "preserveCheckboxOnConvert": false,\n  "taskModalTabMovesFocus": true,\n  "enableNaturalLanguageInput": true,\n  "nlpDefaultToScheduled": true,\n  "nlpLanguage": "en",\n  "uiLanguage": "system",\n  "statusSuggestionTrigger": "*",\n  "nlpTriggers": {\n    "triggers": [\n      {\n        "propertyId": "tags",\n        "trigger": "#",\n        "enabled": true\n      },\n      {\n        "propertyId": "contexts",\n        "trigger": "@",\n        "enabled": true\n      },\n      {\n        "propertyId": "projects",\n        "trigger": "+",\n        "enabled": true\n      },\n      {\n        "propertyId": "status",\n        "trigger": "*",\n        "enabled": true\n      },\n      {\n        "propertyId": "priority",\n        "trigger": "!",\n        "enabled": false\n      }\n    ]\n  },\n  "singleClickAction": "edit",\n  "doubleClickAction": "openNote",\n  "projectAutosuggest": {\n    "enableFuzzy": false,\n    "rows": [\n      "{title|n(Title)}",\n      "{aliases|n(Aliases)}",\n      "{file.path|n(Path)}"\n    ],\n    "showAdvanced": false,\n    "requiredTags": [],\n    "includeFolders": [],\n    "propertyKey": "",\n    "propertyValue": ""\n  },\n  "inlineTaskConvertFolder": "{{currentNotePath}}",\n  "disableNoteIndexing": false,\n  "suggestionDebounceMs": 0,\n  "fieldMapping": {\n    "title": "title",\n    "status": "status",\n    "priority": "priority",\n    "due": "due",\n    "scheduled": "scheduled",\n    "contexts": "contexts",\n    "projects": "projects",\n    "attachments": "attachments",\n    "timeEstimate": "timeEstimate",\n    "completedDate": "completedDate",\n    "dateCreated": "dateCreated",\n    "dateModified": "dateModified",\n    "recurrence": "recurrence",\n    "recurrenceAnchor": "recurrence_anchor",\n    "recurrenceParent": "recurrence_parent",\n    "occurrenceDate": "occurrence_date",\n    "occurrenceMaterialization": "occurrence_materialization",\n    "occurrenceNextTrigger": "occurrence_next_trigger",\n    "occurrenceTemplate": "occurrence_template",\n    "occurrencePastHorizon": "occurrence_past_horizon",\n    "occurrenceFutureHorizon": "occurrence_future_horizon",\n    "archiveTag": "archived",\n    "timeEntries": "timeEntries",\n    "completeInstances": "complete_instances",\n    "skippedInstances": "skipped_instances",\n    "blockedBy": "blockedBy",\n    "pomodoros": "pomodoros",\n    "icsEventId": "icsEventId",\n    "icsEventTag": "ics_event",\n    "googleCalendarEventId": "googleCalendarEventId",\n    "googleCalendarExceptionEventId": "googleCalendarExceptionEventId",\n    "googleCalendarExceptionOriginalScheduled": "googleCalendarExceptionOriginalScheduled",\n    "googleCalendarMovedOriginalDates": "googleCalendarMovedOriginalDates",\n    "reminders": "reminders",\n    "sortOrder": "tasknotes_manual_order"\n  },\n  "customStatuses": [\n    {\n      "id": "none",\n      "value": "none",\n      "label": "None",\n      "color": "#cccccc",\n      "isCompleted": false,\n      "excludeFromCycle": false,\n      "order": 0,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    },\n    {\n      "id": "open",\n      "value": "open",\n      "label": "Open",\n      "color": "#808080",\n      "isCompleted": false,\n      "excludeFromCycle": false,\n      "order": 1,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    },\n    {\n      "id": "in-progress",\n      "value": "in-progress",\n      "label": "In progress",\n      "color": "#0066cc",\n      "isCompleted": false,\n      "excludeFromCycle": false,\n      "order": 2,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    },\n    {\n      "id": "done",\n      "value": "done",\n      "label": "Done",\n      "color": "#00aa00",\n      "isCompleted": true,\n      "excludeFromCycle": false,\n      "order": 3,\n      "autoArchive": false,\n      "autoArchiveDelay": 5\n    }\n  ],\n  "customPriorities": [\n    {\n      "id": "none",\n      "value": "none",\n      "label": "None",\n      "color": "#cccccc",\n      "weight": 0\n    },\n    {\n      "id": "low",\n      "value": "low",\n      "label": "Low",\n      "color": "#00aa00",\n      "weight": 1\n    },\n    {\n      "id": "normal",\n      "value": "normal",\n      "label": "Normal",\n      "color": "#ffaa00",\n      "weight": 2\n    },\n    {\n      "id": "high",\n      "value": "high",\n      "label": "High",\n      "color": "#ff0000",\n      "weight": 3\n    }\n  ],\n  "recurrenceMigrated": false,\n  "showReleaseNotesOnUpdate": true,\n  "checkForUpdatesOnStartup": true,\n  "starterNoteCreated": false,\n  "showTrackedTasksInStatusBar": false,\n  "autoStopTimeTrackingOnComplete": true,\n  "autoStopTimeTrackingNotification": false,\n  "showRelationships": true,\n  "relationshipsPosition": "bottom",\n  "showTaskCardInNote": true,\n  "showCompletedTaskStrikethrough": true,\n  "showExpandableSubtasks": true,\n  "expandSubtasksByDefault": false,\n  "subtaskChevronPosition": "right",\n  "viewsButtonAlignment": "right",\n  "hideCompletedFromOverdue": true,\n  "icsIntegration": {\n    "defaultNoteTemplate": "",\n    "defaultNoteFolder": "",\n    "icsNoteFilenameFormat": "title",\n    "customICSNoteFilenameTemplate": "{title}",\n    "enableAutoExport": false,\n    "autoExportPath": "tasknotes-calendar.ics",\n    "autoExportInterval": 60,\n    "useDurationForExport": false,\n    "excludeArchivedFromExport": false,\n    "excludeCompletedFromExport": false,\n    "requireDueDateForExport": false,\n    "requireScheduledDateForExport": false,\n    "useICSEndAsDue": false,\n    "recurringEventRelatedNotesMode": "series"\n  },\n  "savedViews": [],\n  "enableNotifications": true,\n  "notificationType": "system",\n  "notificationSoundEnabled": false,\n  "notificationSoundVolume": 50,\n  "enableAPI": false,\n  "apiPort": 8080,\n  "apiAuthToken": "",\n  "enableMCP": false,\n  "webhooks": [],\n  "userFields": [],\n  "enableModalSplitLayout": true,\n  "defaultVisibleProperties": [\n    "status",\n    "priority",\n    "due",\n    "scheduled",\n    "projects",\n    "contexts",\n    "tags",\n    "blocked",\n    "blocking"\n  ],\n  "inlineVisibleProperties": [\n    "status",\n    "priority",\n    "due",\n    "scheduled",\n    "recurrence"\n  ],\n  "enableBases": true,\n  "enableMdbaseSpec": false,\n  "autoCreateDefaultBasesFiles": true,\n  "commandFileMapping": {\n    "open-calendar-view": "TaskNotes/Views/mini-calendar-default.base",\n    "open-kanban-view": "TaskNotes/Views/kanban-default.base",\n    "open-tasks-view": "TaskNotes/Views/tasks-default.base",\n    "open-advanced-calendar-view": "TaskNotes/Views/calendar-default.base",\n    "open-agenda-view": "TaskNotes/Views/agenda-default.base",\n    "pomodoro-stats-base": "TaskNotes/Views/pomodoro-stats.base",\n    "relationships": "TaskNotes/Views/relationships.base"\n  },\n  "maintainDueDateOffsetInRecurring": false,\n  "resetCheckboxesOnRecurrence": false,\n  "useFrontmatterMarkdownLinks": false,\n  "enableGoogleCalendar": false,\n  "enableMicrosoftCalendar": false,\n  "disableCalendarOnMobile": false,\n  "enabledGoogleCalendars": [],\n  "googleCalendarSyncTokens": {},\n  "enabledMicrosoftCalendars": [],\n  "microsoftCalendarSyncTokens": {},\n  "googleCalendarExport": {\n    "enabled": false,\n    "targetCalendarId": "",\n    "syncOnTaskCreate": true,\n    "syncOnTaskUpdate": true,\n    "syncOnTaskComplete": true,\n    "syncOnTaskDelete": true,\n    "eventTitleTemplate": "{{title}}",\n    "includeDescription": true,\n    "eventColorId": null,\n    "syncTrigger": "scheduled",\n    "createAsAllDay": true,\n    "defaultEventDuration": 60,\n    "includeObsidianLink": true,\n    "defaultReminderMinutes": null\n  },\n  "enableDebugLogging": false\n}\n
","text":"TaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation. General# Source: src/settings/tabs/generalTab.ts Setting Purpose Default tasks folder Default location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD. Folder for inline-created tasks Folder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note. Move archived tasks to folder Automatically move archived tasks to an archive folder Archive folder Folder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc. Identify tasks by Choose whether to identify tasks by tag or by a frontmatter property Task tag Tag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters. Hide identification tags in task cards When enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays Hidden tag scope Choose whether hiding identification tags also hides nested tags. Task property name The frontmatter property name (e.g., \"category\") Task property value The value that identifies a note as a task (e.g., \"task\") Auto-create default files Automatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated. Create default files Create the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten. Update default files Overwrite the configured default .base files with templates generated from your current TaskNotes settings. Export v3 saved views to Bases Convert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system. Excluded folders Comma-separated list of folders to exclude from task indexing and project suggestions UI language Select the language used for TaskNotes interface text Use Markdown links in frontmatter Generate markdown links ([text](path)) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly. Show release notes after update Automatically open release notes when TaskNotes is updated to a new version Check for new releases on startup Check GitHub once when TaskNotes starts and show a notice when a newer compatible release is available View release notes See what's new in the latest version of TaskNotes Task properties# Source: src/settings/tabs/taskPropertiesTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Modal fields# Source: src/settings/tabs/modalFieldsTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Appearance & UI# Source: src/settings/tabs/appearanceTab.ts Setting Purpose Default visible properties Choose which properties appear on task cards by default. Time format Display time in 12-hour or 24-hour format throughout the plugin Default view The calendar view shown when opening the calendar tab Custom view day count Number of days to show in custom multi-day view First day of week Which day should be the first column in week views Show weekends Display weekends in calendar views Show week numbers Display week numbers in calendar views Show today highlight Highlight the current day in calendar views Show current time indicator Display a line showing the current time in timeline views Selection mirror Show a visual preview while dragging to select time ranges Calendar locale Calendar locale for date formatting and calendar system (e.g., \"en\", \"fa\" for Farsi/Persian, \"de\" for German). Leave empty to auto-detect from browser. Show scheduled tasks Display tasks with scheduled dates by default Show due dates Display task due dates by default Show due dates when scheduled Display due dates even for tasks that already have scheduled dates Show time entries Display completed time tracking entries by default Show recurring tasks Display recurring task instances by default Show ICS events Display events from ICS subscriptions by default Time slot duration Duration of each time slot in timeline views Start time Earliest time shown in timeline views (HH:MM format) End time Latest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM. Initial scroll time Time to scroll to when opening timeline views (HH:MM format) Event minimum height Minimum height for events in timeline views (pixels) Show tracked tasks in status bar Display currently tracked tasks in Obsidian's status bar Show relationships widget Display a widget showing all relationships for the current note (subtasks, projects, dependencies) Relationships position Where to position the relationships widget Show task card in note Display a task card widget at the top of task notes showing the task details and actions Strike through completed task titles Draw a line through completed task card titles. Turn off to keep completed tasks easier to read Show expandable subtasks Allow expanding/collapsing subtask sections in task cards Expand subtasks by default Show project subtasks expanded when task cards are rendered Subtask chevron position Position of expand/collapse chevrons in task cards Views button alignment Alignment of the views/filters button in the task interface Single-click action Action performed when single-clicking a task card Double-click action Action performed when double-clicking a task card Features# Source: src/settings/tabs/featuresTab.ts Setting Purpose Task link overlay Show interactive overlays when hovering over task links Disable overlay for aliased links Do not show the task widget if the link contains an alias (e.g. [[Task|Alias]]). Show convert button next to checkboxes Display an inline button next to Markdown checkboxes that converts them to TaskNotes Keep checkbox when converting Leave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link Enable natural language task input Parse due dates, priorities, and contexts from natural language when creating tasks Default to scheduled When NLP detects a date without context, treat it as scheduled rather than due NLP language Language for natural language processing patterns and date parsing Open task after creation Choose whether the task creation modal opens the new task note after saving. Use body template Use a template file for task body content Body template file Path to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc. Use occurrence note template Use a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template Occurrence note template file Path to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback. Template variables: See the setting in Obsidian for contextual details. Use task defaults on instant convert Apply default task settings when converting text to tasks instantly Work duration Duration of work intervals in minutes Short break duration Duration of short breaks in minutes Long break duration Duration of long breaks in minutes Long break interval Number of work sessions before a long break Auto-start breaks Automatically start break timers after work sessions Auto-start work Automatically start work sessions after breaks Pomodoro notifications Show notifications when Pomodoro sessions end Show Pomodoro in status bar Display the active Pomodoro countdown in Obsidian's status bar Sound enabled Play sound when Pomodoro sessions end Sound volume Volume for Pomodoro sounds (0-100) Pomodoro data storage Configure where Pomodoro session data is stored and how it's managed. Mobile sidebar Where to open the Pomodoro timer on mobile devices Enable notifications Enable task reminder notifications Notification type Type of notifications to show Send test reminder Send a test reminder using the current notification type and sound settings. Notification sound Play a sound when task reminders trigger Sound volume Volume for task reminder sounds (0-100) Preview notification sound Play the configured task reminder sound Hide completed tasks from overdue Exclude completed tasks from overdue task calculations Disable note indexing Disable automatic indexing of note content for better performance Suggestion debounce Delay in milliseconds before showing suggestions Auto-stop time tracking Automatically stop time tracking when a task is marked complete Time tracking stop notification Show notification when time tracking is automatically stopped Maintain due date offset in recurring tasks Keep the offset between due date and scheduled date when recurring tasks are completed Reset checkboxes on recurrence Reset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled Enable timeblocking Enable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu. Show timeblocks Display timeblocks from daily notes by default Default timeblock color The default color used when creating new timeblocks Enable debug logging Log detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting. Integrations# Source: src/settings/tabs/integrationsTab.ts Setting Purpose Generate mdbase type definitions See the setting in Obsidian for contextual details. Disable calendar integrations on mobile Skip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged. Calendar integrations are disabled on this mobile device See the setting in Obsidian for contextual details. Enable task export When enabled, tasks with dates will be automatically synced to Google Calendar as events. Target calendar See the setting in Obsidian for contextual details. Sync trigger Which task date should trigger calendar event creation. Create as all-day events When enabled, tasks are created as all-day events. When disabled, uses time estimate for duration. Default event duration Duration in minutes for timed events (used when task has no time estimate). Event title template Template for event titles. Available variables: {{title}}, {{status}}, {{priority}} Include task details in description Add task metadata (priority, status, tags, etc.) to the event description. Include Obsidian link Add a link back to the task in Obsidian in the event description. Default reminder Add popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440. Automatic sync behavior See the setting in Obsidian for contextual details. Sync on task create Automatically create calendar event when a new task is created. Sync on task update Automatically update calendar event when a task is modified. Sync on task complete Update calendar event when a task is completed (adds checkmark to title). Delete event on task delete Remove calendar event when the corresponding task is deleted. Manual sync actions See the setting in Obsidian for contextual details. Sync all tasks Sync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet. Unlink all tasks Remove all task-event links without deleting calendar events. Default note template Path to template file for notes created from ICS events Default note folder Folder for notes created from ICS events ICS note filename format How filenames are generated for notes created from ICS events Custom ICS filename template Template for custom ICS event filenames Use ICS event end time as task due date When enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time. Recurring event related notes Choose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance. Add calendar subscription Add a new calendar subscription from ICS/iCal URL or local file New calendar See the setting in Obsidian for contextual details. Refresh all subscriptions Manually refresh all enabled calendar subscriptions Enable automatic export Automatically keep an ICS file updated with all your tasks Export file path Path where the ICS file will be saved (relative to vault root) Update interval (between 5 and 1440 minutes) How often to update the export file Use task duration for event length When enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines. Exclude completed tasks When enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings. Exclude archived tasks When enabled, archived tasks are omitted from ICS exports. Require due date When enabled, only tasks with a due date are included in ICS exports. Require scheduled date When enabled, only tasks with a scheduled date are included in ICS exports. Export now Manually trigger an immediate export Export status: See the setting in Obsidian for contextual details. Enable HTTP API Start local HTTP server for API access API port Port number for the HTTP API server API authentication token Token required for API authentication (leave empty for no auth) Enable MCP server Expose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled. Add webhook Register a new webhook endpoint Complete default settings snapshot# The following JSON is generated from DEFAULT_SETTINGS. Empty strings and disabled flags are intentional defaults. { \"tasksFolder\": \"TaskNotes/Tasks\", \"moveArchivedTasks\": false, \"archiveFolder\": \"TaskNotes/Archive\", \"taskTag\": \"task\", \"taskIdentificationMethod\": \"tag\", \"hideIdentifyingTagsInCards\": false, \"hideIdentifyingTagsMode\": \"all\", \"taskPropertyName\": \"\", \"taskPropertyValue\": \"\", \"excludedFolders\": \"\", \"defaultTaskPriority\": \"normal\", \"defaultTaskStatus\": \"open\", \"taskOrgFiltersCollapsed\": false, \"taskFilenameFormat\": \"zettel\", \"storeTitleInFilename\": true, \"customFilenameTemplate\": \"{{title}}\", \"occurrenceFilenameTemplate\": \"\", \"occurrenceFilenameTemplateProperty\": \"occurrenceFilenameTemplate\", \"taskCreationDefaults\": { \"defaultContexts\": \"\", \"defaultTags\": \"\", \"defaultProjects\": \"\", \"useParentNoteForTaskCreation\": false, \"useParentNoteAsProject\": false, \"useParentHeaderAsProject\": false, \"inheritParentTaskProperties\": false, \"defaultTimeEstimate\": 0, \"defaultRecurrence\": \"none\", \"defaultDueDate\": \"none\", \"defaultDueTime\": \"none\", \"defaultScheduledDate\": \"today\", \"defaultScheduledTime\": \"none\", \"bodyTemplate\": \"\", \"useBodyTemplate\": false, \"occurrenceBodyTemplate\": \"\", \"useOccurrenceBodyTemplate\": false, \"defaultReminders\": [] }, \"openTaskAfterCreation\": \"none\", \"calendarViewSettings\": { \"defaultView\": \"dayGridMonth\", \"customDayCount\": 3, \"slotDuration\": \"00:30:00\", \"slotMinTime\": \"00:00:00\", \"slotMaxTime\": \"24:00:00\", \"scrollTime\": \"08:00:00\", \"firstDay\": 1, \"timeFormat\": \"24\", \"showWeekends\": true, \"locale\": \"\", \"defaultShowSchedu"},{"route":"/obsidian/releases/","title":"Release Notes","description":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases.md","namespace":"obsidian","relativePath":"releases.md","raw":"# Release Notes\n\nWelcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.\n\n## Latest Releases\n\n### Version 4.x (Current)\n\n- [4.12.3](releases/4.12.3.md)\n- [4.12.2](releases/4.12.2.md)\n- [4.12.1](releases/4.12.1.md)\n- [4.12.0](releases/4.12.0.md)\n- [4.11.1](releases/4.11.1.md)\n- [4.11.0](releases/4.11.0.md)\n- [4.10.2](releases/4.10.2.md)\n- [4.10.1](releases/4.10.1.md)\n- [4.10.0](releases/4.10.0.md)\n- [4.9.2](releases/4.9.2.md)\n- [4.9.1](releases/4.9.1.md)\n- [4.9.0](releases/4.9.0.md)\n- [4.8.1](releases/4.8.1.md)\n- [4.8.0](releases/4.8.0.md)\n- [4.7.2](releases/4.7.2.md)\n- [4.7.1](releases/4.7.1.md)\n- [4.7.0](releases/4.7.0.md)\n- [4.6.0](releases/4.6.0.md)\n- [4.5.3](releases/4.5.3.md)\n- [4.5.2](releases/4.5.2.md)\n- [4.5.1](releases/4.5.1.md)\n- [4.5.0](releases/4.5.0.md)\n- [4.4.0](releases/4.4.0.md)\n- [4.3.3](releases/4.3.3.md)\n- [4.3.2](releases/4.3.2.md)\n- [4.3.1](releases/4.3.1.md)\n- [4.3.0](releases/4.3.0.md)\n- [4.2.1](releases/4.2.1.md)\n- [4.2.0](releases/4.2.0.md)\n- [4.1.3](releases/4.1.3.md)\n- [4.1.2](releases/4.1.2.md)\n- [4.1.1](releases/4.1.1.md)\n- [4.1.0](releases/4.1.0.md)\n- [4.0.5](releases/4.0.5.md)\n- [4.0.4](releases/4.0.4.md)\n- [4.0.3](releases/4.0.3.md)\n- [4.0.2](releases/4.0.2.md)\n- [4.0.1](releases/4.0.1.md)\n- [4.0.0-beta.3](releases/4.0.0-beta.3.md)\n- [4.0.0-beta.2](releases/4.0.0-beta.2.md)\n- [4.0.0-beta.1](releases/4.0.0-beta.1.md)\n- [4.0.0-beta.0](releases/4.0.0-beta.0.md)\n\n### Version 3.x\n\n- [3.25.6](releases/3.25.6.md)\n- [3.25.4](releases/3.25.4.md)\n- [3.25.3](releases/3.25.3.md)\n- [3.25.2](releases/3.25.2.md)\n- [3.25.1](releases/3.25.1.md)\n- [3.25.0](releases/3.25.0.md)\n- [3.24.6](releases/3.24.6.md)\n- [3.24.5](releases/3.24.5.md)\n- [3.24.4](releases/3.24.4.md)\n- [3.24.3](releases/3.24.3.md)\n- [3.24.2](releases/3.24.2.md)\n- [3.24.1](releases/3.24.1.md)\n- [3.24.0](releases/3.24.0.md)\n- [3.23.4](releases/3.23.4.md)\n- [3.23.3](releases/3.23.3.md)\n- [3.23.2](releases/3.23.2.md)\n- [3.23.1](releases/3.23.1.md)\n- [3.23.0](releases/3.23.0.md)\n- [3.22.1](releases/3.22.1.md)\n- [3.22.0](releases/3.22.0.md)\n- [3.21.0](releases/3.21.0.md)\n- [3.20.1](releases/3.20.1.md)\n- [3.20.0](releases/3.20.0.md)\n- [3.19.1](releases/3.19.1.md)\n- [3.19.0](releases/3.19.0.md)\n- [3.18.2](releases/3.18.2.md)\n- [3.18.1](releases/3.18.1.md)\n- [3.18.0](releases/3.18.0.md)\n- [3.17.1](releases/3.17.1.md)\n- [3.17.0](releases/3.17.0.md)\n- [3.16.4](releases/3.16.4.md)\n- [3.16.3](releases/3.16.3.md)\n- [3.16.2](releases/3.16.2.md)\n- [3.16.1](releases/3.16.1.md)\n- [3.16.0](releases/3.16.0.md)\n- [3.15.1](releases/3.15.1.md)\n- [3.15.0](releases/3.15.0.md)\n- [3.14.0](releases/3.14.0.md)\n- [3.13.4](releases/3.13.4.md)\n- [3.13.3](releases/3.13.3.md)\n- [3.13.2](releases/3.13.2.md)\n- [3.13.1](releases/3.13.1.md)\n- [3.13.0](releases/3.13.0.md)\n- [3.12.2](releases/3.12.2.md)\n- [3.12.1](releases/3.12.1.md)\n- [3.12.0](releases/3.12.0.md)\n- [3.11.2](releases/3.11.2.md)\n- [3.11.1](releases/3.11.1.md)\n- [3.11.0](releases/3.11.0.md)\n- [3.10.0](releases/3.10.0.md)\n- [3.9.1](releases/3.9.1.md)\n- [3.9.0](releases/3.9.0.md)\n- [3.8.7](releases/3.8.7.md)\n- [3.8.6](releases/3.8.6.md)\n- [3.8.5](releases/3.8.5.md)\n- [3.8.1](releases/3.8.1.md)\n- [3.7.1](releases/3.7.1.md)\n- [3.7.0](releases/3.7.0.md)\n- [3.6.0](releases/3.6.0.md)\n- [3.5.1](releases/3.5.1.md)\n- [3.4.2](releases/3.4.2.md)\n- [3.4.1](releases/3.4.1.md)\n- [3.4.0](releases/3.4.0.md)\n- [3.3.0](releases/3.3.0.md)\n- [3.1.1](releases/3.1.1.md)\n- [3.1.0](releases/3.1.0.md)\n- [3.0.1](releases/3.0.1.md)\n- [3.0.0](releases/3.0.0.md)\n\n### Version 2.x\n\n- [2.2.3](releases/2.2.3.md)\n- [2.2.2](releases/2.2.2.md)\n- [2.2.1](releases/2.2.1.md)\n- [2.2.0](releases/2.2.0.md)\n- [2.1.0](releases/2.1.0.md)\n- [2.0.4](releases/2.0.4.md)\n- [2.0.3](releases/2.0.3.md)\n- [2.0.2](releases/2.0.2.md)\n- [2.0.1](releases/2.0.1.md)\n- [2.0.0](releases/2.0.0.md)\n\n### Version 1.x\n\n- [1.2.0](releases/1.2.0.md)\n- [1.1.0](releases/1.1.0.md)\n- [1.0.0](releases/1.0.0.md)\n\n### Early Versions (0.x)\n\n- [0.8.0](releases/0.8.0.md)\n- [0.7.0](releases/0.7.0.md)\n- [0.6.3](releases/0.6.3.md)\n- [0.6.2](releases/0.6.2.md)\n- [0.6.1](releases/0.6.1.md)\n- [0.6.0](releases/0.6.0.md)\n- [0.4.2](releases/0.4.2.md)\n- [0.4.1](releases/0.4.1.md)\n- [0.4.0](releases/0.4.0.md)\n- [0.3.0](releases/0.3.0.md)\n- [0.2.4](releases/0.2.4.md)\n- [0.2.3](releases/0.2.3.md)\n- [0.2.2](releases/0.2.2.md)\n\n## Getting Updates\n\nTo update TaskNotes:\n1. Open Obsidian\n2. Go to Settings → Community Plugins\n3. Find TaskNotes and click \"Update\"\n4. Restart Obsidian if prompted\n\n## Feedback\n\nFound a bug or have a feature request? Please:\n\n- Check existing [GitHub Issues](https://github.com/callumalpass/tasknotes/issues)\n- Create a new issue with details\n","aliases":["/releases/","/releases/"],"toc":[{"level":2,"id":"latest-releases","text":"Latest Releases"},{"level":3,"id":"version-4x-current","text":"Version 4.x (Current)"},{"level":3,"id":"version-3x","text":"Version 3.x"},{"level":3,"id":"version-2x","text":"Version 2.x"},{"level":3,"id":"version-1x","text":"Version 1.x"},{"level":3,"id":"early-versions-0x","text":"Early Versions (0.x)"},{"level":2,"id":"getting-updates","text":"Getting Updates"},{"level":2,"id":"feedback","text":"Feedback"}],"html":"

Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.

\n

Latest Releases#

\n

Version 4.x (Current)#

\n\n

Version 3.x#

\n\n

Version 2.x#

\n\n

Version 1.x#

\n\n

Early Versions (0.x)#

\n\n

Getting Updates#

\n

To update TaskNotes:

\n
    \n
  1. Open Obsidian
  2. \n
  3. Go to Settings → Community Plugins
  4. \n
  5. Find TaskNotes and click "Update"
  6. \n
  7. Restart Obsidian if prompted
  8. \n
\n

Feedback#

\n

Found a bug or have a feature request? Please:

\n
    \n
  • Check existing GitHub Issues
  • \n
  • Create a new issue with details
  • \n
\n","text":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements. Latest Releases# Version 4.x (Current)# 4.12.3 4.12.2 4.12.1 4.12.0 4.11.1 4.11.0 4.10.2 4.10.1 4.10.0 4.9.2 4.9.1 4.9.0 4.8.1 4.8.0 4.7.2 4.7.1 4.7.0 4.6.0 4.5.3 4.5.2 4.5.1 4.5.0 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.1 4.2.0 4.1.3 4.1.2 4.1.1 4.1.0 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0-beta.3 4.0.0-beta.2 4.0.0-beta.1 4.0.0-beta.0 Version 3.x# 3.25.6 3.25.4 3.25.3 3.25.2 3.25.1 3.25.0 3.24.6 3.24.5 3.24.4 3.24.3 3.24.2 3.24.1 3.24.0 3.23.4 3.23.3 3.23.2 3.23.1 3.23.0 3.22.1 3.22.0 3.21.0 3.20.1 3.20.0 3.19.1 3.19.0 3.18.2 3.18.1 3.18.0 3.17.1 3.17.0 3.16.4 3.16.3 3.16.2 3.16.1 3.16.0 3.15.1 3.15.0 3.14.0 3.13.4 3.13.3 3.13.2 3.13.1 3.13.0 3.12.2 3.12.1 3.12.0 3.11.2 3.11.1 3.11.0 3.10.0 3.9.1 3.9.0 3.8.7 3.8.6 3.8.5 3.8.1 3.7.1 3.7.0 3.6.0 3.5.1 3.4.2 3.4.1 3.4.0 3.3.0 3.1.1 3.1.0 3.0.1 3.0.0 Version 2.x# 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 Version 1.x# 1.2.0 1.1.0 1.0.0 Early Versions (0.x)# 0.8.0 0.7.0 0.6.3 0.6.2 0.6.1 0.6.0 0.4.2 0.4.1 0.4.0 0.3.0 0.2.4 0.2.3 0.2.2 Getting Updates# To update TaskNotes: Open Obsidian Go to Settings → Community Plugins Find TaskNotes and click \"Update\" Restart Obsidian if prompted Feedback# Found a bug or have a feature request? Please: Check existing GitHub Issues Create a new issue with details"},{"route":"/obsidian/releases/0.2.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.2.2.md","namespace":"obsidian","relativePath":"releases/0.2.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2\n","aliases":["/releases/0.2.2/","/releases/0.2.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2"},{"route":"/obsidian/releases/0.2.3/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.2.3.md","namespace":"obsidian","relativePath":"releases/0.2.3.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3\n","aliases":["/releases/0.2.3/","/releases/0.2.3/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3"},{"route":"/obsidian/releases/0.2.4/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.2.4.md","namespace":"obsidian","relativePath":"releases/0.2.4.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4\n","aliases":["/releases/0.2.4/","/releases/0.2.4/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4"},{"route":"/obsidian/releases/0.3.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.3.0.md","namespace":"obsidian","relativePath":"releases/0.3.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0\n","aliases":["/releases/0.3.0/","/releases/0.3.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0"},{"route":"/obsidian/releases/0.4.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.4.0.md","namespace":"obsidian","relativePath":"releases/0.4.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0\n","aliases":["/releases/0.4.0/","/releases/0.4.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0"},{"route":"/obsidian/releases/0.4.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.4.1.md","namespace":"obsidian","relativePath":"releases/0.4.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1\n","aliases":["/releases/0.4.1/","/releases/0.4.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1"},{"route":"/obsidian/releases/0.4.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.4.2.md","namespace":"obsidian","relativePath":"releases/0.4.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2\n","aliases":["/releases/0.4.2/","/releases/0.4.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2"},{"route":"/obsidian/releases/0.6.0/","title":"Untitled","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.0.md","namespace":"obsidian","relativePath":"releases/0.6.0.md","raw":"\n","aliases":["/releases/0.6.0/","/releases/0.6.0/"],"toc":[],"html":"","text":""},{"route":"/obsidian/releases/0.6.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.1.md","namespace":"obsidian","relativePath":"releases/0.6.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1\n","aliases":["/releases/0.6.1/","/releases/0.6.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1"},{"route":"/obsidian/releases/0.6.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.2.md","namespace":"obsidian","relativePath":"releases/0.6.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2\n","aliases":["/releases/0.6.2/","/releases/0.6.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2"},{"route":"/obsidian/releases/0.6.3/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.6.3.md","namespace":"obsidian","relativePath":"releases/0.6.3.md","raw":"**Full Changelog**: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3\n","aliases":["/releases/0.6.3/","/releases/0.6.3/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3

\n","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3"},{"route":"/obsidian/releases/0.7.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.7.0.md","namespace":"obsidian","relativePath":"releases/0.7.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0\n","aliases":["/releases/0.7.0/","/releases/0.7.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0"},{"route":"/obsidian/releases/0.8.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/0.8.0.md","namespace":"obsidian","relativePath":"releases/0.8.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0\n","aliases":["/releases/0.8.0/","/releases/0.8.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0"},{"route":"/obsidian/releases/1.0.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/1.0.0.md","namespace":"obsidian","relativePath":"releases/1.0.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0\n","aliases":["/releases/1.0.0/","/releases/1.0.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0"},{"route":"/obsidian/releases/1.1.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/1.1.0.md","namespace":"obsidian","relativePath":"releases/1.1.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0\n","aliases":["/releases/1.1.0/","/releases/1.1.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0"},{"route":"/obsidian/releases/1.2.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/1.2.0.md","namespace":"obsidian","relativePath":"releases/1.2.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0\n","aliases":["/releases/1.2.0/","/releases/1.2.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0"},{"route":"/obsidian/releases/2.0.0/","title":"Untitled","description":"TaskNotes 2.0.0 - Major Feature Release","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.0.md","namespace":"obsidian","relativePath":"releases/2.0.0.md","raw":"TaskNotes 2.0.0 - Major Feature Release\n\nMajor New Features:\n\n**Kanban Board View**\n\n- Visual task management with drag-and-drop functionality\n- Dynamic grouping by status, priority, or context\n- Search filtering across all columns\n- Real-time updates and collapsible columns\n\n**Enhanced Pomodoro System**\n\n- SVG progress circle with refined visual timer\n- Persistent session history and statistics tracking\n- Dedicated Pomodoro Statistics view with completion metrics\n- Enhanced UI with improved controls and display\n\n**Advanced Task Filtering & Grouping**\n\n- Unified filtering system with search, status, context, priority filters\n- Date range filtering with overdue task support\n- Flexible grouping options (status, priority, context, due date)\n- Performance-optimized filtering using cache indexes\n\n**Enhanced Recurring Tasks**\n\n- Visual distinction with special styling and indicators\n- Per-date completion tracking with smart UI controls\n- Context menus filtered to prevent status conflicts\n- Clear completion status display for selected dates\n\nUI/UX Improvements:\n\n**Task Management**\n\n- Enhanced task edit modal with improved form layout\n- Context menu (right-click) for quick property changes\n- Autocomplete for contexts and tags in task forms\n- Optimistic UI updates for better responsiveness\n\n**View Enhancements**\n\n- Agenda view with improved layout and timeline organization\n- Enhanced note cards with consistent styling across views\n- Improved calendar integration with better visual indicators\n- Unified card styling system across all views\n\n**Performance & Reliability**\n\n- Migrated to unified CacheManager from legacy FileIndexer\n- DOM reconciliation system for efficient UI updates\n- Enhanced async handling and error management\n- Improved cache update handling and race condition prevention\n\nAdditional Improvements:\n\n- Enhanced due date modal with better styling\n- Improved time tracking UX with visual feedback\n- Better task archival feedback and UI consistency\n- Refined keyboard navigation and accessibility\n- Updated README with comprehensive feature documentation\n\nBug Fixes:\n\n- Fixed 'No due date' group positioning in task list\n- Resolved various UI spacing and alignment issues\n- Improved handling of edge cases in recurring task logic\n- Enhanced stability of cache operations and file handling\n\nThis major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions.\n","aliases":["/releases/2.0.0/","/releases/2.0.0/"],"toc":[],"html":"

TaskNotes 2.0.0 - Major Feature Release

\n

Major New Features:

\n

Kanban Board View

\n
    \n
  • Visual task management with drag-and-drop functionality
  • \n
  • Dynamic grouping by status, priority, or context
  • \n
  • Search filtering across all columns
  • \n
  • Real-time updates and collapsible columns
  • \n
\n

Enhanced Pomodoro System

\n
    \n
  • SVG progress circle with refined visual timer
  • \n
  • Persistent session history and statistics tracking
  • \n
  • Dedicated Pomodoro Statistics view with completion metrics
  • \n
  • Enhanced UI with improved controls and display
  • \n
\n

Advanced Task Filtering & Grouping

\n
    \n
  • Unified filtering system with search, status, context, priority filters
  • \n
  • Date range filtering with overdue task support
  • \n
  • Flexible grouping options (status, priority, context, due date)
  • \n
  • Performance-optimized filtering using cache indexes
  • \n
\n

Enhanced Recurring Tasks

\n
    \n
  • Visual distinction with special styling and indicators
  • \n
  • Per-date completion tracking with smart UI controls
  • \n
  • Context menus filtered to prevent status conflicts
  • \n
  • Clear completion status display for selected dates
  • \n
\n

UI/UX Improvements:

\n

Task Management

\n
    \n
  • Enhanced task edit modal with improved form layout
  • \n
  • Context menu (right-click) for quick property changes
  • \n
  • Autocomplete for contexts and tags in task forms
  • \n
  • Optimistic UI updates for better responsiveness
  • \n
\n

View Enhancements

\n
    \n
  • Agenda view with improved layout and timeline organization
  • \n
  • Enhanced note cards with consistent styling across views
  • \n
  • Improved calendar integration with better visual indicators
  • \n
  • Unified card styling system across all views
  • \n
\n

Performance & Reliability

\n
    \n
  • Migrated to unified CacheManager from legacy FileIndexer
  • \n
  • DOM reconciliation system for efficient UI updates
  • \n
  • Enhanced async handling and error management
  • \n
  • Improved cache update handling and race condition prevention
  • \n
\n

Additional Improvements:

\n
    \n
  • Enhanced due date modal with better styling
  • \n
  • Improved time tracking UX with visual feedback
  • \n
  • Better task archival feedback and UI consistency
  • \n
  • Refined keyboard navigation and accessibility
  • \n
  • Updated README with comprehensive feature documentation
  • \n
\n

Bug Fixes:

\n
    \n
  • Fixed 'No due date' group positioning in task list
  • \n
  • Resolved various UI spacing and alignment issues
  • \n
  • Improved handling of edge cases in recurring task logic
  • \n
  • Enhanced stability of cache operations and file handling
  • \n
\n

This major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions.

\n","text":"TaskNotes 2.0.0 - Major Feature Release Major New Features: Kanban Board View Visual task management with drag-and-drop functionality Dynamic grouping by status, priority, or context Search filtering across all columns Real-time updates and collapsible columns Enhanced Pomodoro System SVG progress circle with refined visual timer Persistent session history and statistics tracking Dedicated Pomodoro Statistics view with completion metrics Enhanced UI with improved controls and display Advanced Task Filtering & Grouping Unified filtering system with search, status, context, priority filters Date range filtering with overdue task support Flexible grouping options (status, priority, context, due date) Performance-optimized filtering using cache indexes Enhanced Recurring Tasks Visual distinction with special styling and indicators Per-date completion tracking with smart UI controls Context menus filtered to prevent status conflicts Clear completion status display for selected dates UI/UX Improvements: Task Management Enhanced task edit modal with improved form layout Context menu (right-click) for quick property changes Autocomplete for contexts and tags in task forms Optimistic UI updates for better responsiveness View Enhancements Agenda view with improved layout and timeline organization Enhanced note cards with consistent styling across views Improved calendar integration with better visual indicators Unified card styling system across all views Performance & Reliability Migrated to unified CacheManager from legacy FileIndexer DOM reconciliation system for efficient UI updates Enhanced async handling and error management Improved cache update handling and race condition prevention Additional Improvements: Enhanced due date modal with better styling Improved time tracking UX with visual feedback Better task archival feedback and UI consistency Refined keyboard navigation and accessibility Updated README with comprehensive feature documentation Bug Fixes: Fixed 'No due date' group positioning in task list Resolved various UI spacing and alignment issues Improved handling of edge cases in recurring task logic Enhanced stability of cache operations and file handling This major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions."},{"route":"/obsidian/releases/2.0.1/","title":"Untitled","description":"Bug Fixes and Enhancements:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.1.md","namespace":"obsidian","relativePath":"releases/2.0.1.md","raw":" ## TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements\r\n\r\n Bug Fixes and Enhancements:\r\n\r\n Recurring Task Improvements:\r\n - Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.)\r\n - Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern\r\n - Enhanced recurring task visual styling with distinctive indicators and backgrounds\r\n - Smart context menus for recurring tasks that prevent conflicting status changes\r\n - Fixed recurrence values not loading properly in task edit modal\r\n\r\n Task Filtering and Grouping:\r\n - Improved 'No due date' group positioning to appear at bottom of task list\r\n - Enhanced FilterService with target date awareness for intelligent recurring task grouping\r\n - Fixed cache integration issues where recurrence changes didn't trigger proper view updates\r\n - All views now properly refresh and regroup tasks when recurrence properties change\r\n\r\n UI and Data Consistency:\r\n - Fixed data format mismatch between stored abbreviations and UI display for day names\r\n - Improved task edit modal to properly convert between storage format and UI format\r\n - Enhanced cache workflow integration for seamless task property updates\r\n - Better synchronization between task edits and view refreshes\r\n\r\n Technical Improvements:\r\n - Added conversion helper methods for consistent day name handling\r\n - Enhanced cache manager with proper recurring task support\r\n - Improved event emission and handling for task updates\r\n - Better error handling and data validation in task modals\r\n\r\n This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving\r\n the overall user experience.\r\n\r\n","aliases":["/releases/2.0.1/","/releases/2.0.1/"],"toc":[{"level":2,"id":"tasknotes-201-recurring-tasks-and-filtering-improvements","text":"TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements"}],"html":"

TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements#

\n

Bug Fixes and Enhancements:

\n

Recurring Task Improvements:

\n
    \n
  • Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.)
  • \n
  • Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern
  • \n
  • Enhanced recurring task visual styling with distinctive indicators and backgrounds
  • \n
  • Smart context menus for recurring tasks that prevent conflicting status changes
  • \n
  • Fixed recurrence values not loading properly in task edit modal
  • \n
\n

Task Filtering and Grouping:

\n
    \n
  • Improved 'No due date' group positioning to appear at bottom of task list
  • \n
  • Enhanced FilterService with target date awareness for intelligent recurring task grouping
  • \n
  • Fixed cache integration issues where recurrence changes didn't trigger proper view updates
  • \n
  • All views now properly refresh and regroup tasks when recurrence properties change
  • \n
\n

UI and Data Consistency:

\n
    \n
  • Fixed data format mismatch between stored abbreviations and UI display for day names
  • \n
  • Improved task edit modal to properly convert between storage format and UI format
  • \n
  • Enhanced cache workflow integration for seamless task property updates
  • \n
  • Better synchronization between task edits and view refreshes
  • \n
\n

Technical Improvements:

\n
    \n
  • Added conversion helper methods for consistent day name handling
  • \n
  • Enhanced cache manager with proper recurring task support
  • \n
  • Improved event emission and handling for task updates
  • \n
  • Better error handling and data validation in task modals
  • \n
\n

This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving\n the overall user experience.

\n","text":"TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements# Bug Fixes and Enhancements: Recurring Task Improvements: Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.) Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern Enhanced recurring task visual styling with distinctive indicators and backgrounds Smart context menus for recurring tasks that prevent conflicting status changes Fixed recurrence values not loading properly in task edit modal Task Filtering and Grouping: Improved 'No due date' group positioning to appear at bottom of task list Enhanced FilterService with target date awareness for intelligent recurring task grouping Fixed cache integration issues where recurrence changes didn't trigger proper view updates All views now properly refresh and regroup tasks when recurrence properties change UI and Data Consistency: Fixed data format mismatch between stored abbreviations and UI display for day names Improved task edit modal to properly convert between storage format and UI format Enhanced cache workflow integration for seamless task property updates Better synchronization between task edits and view refreshes Technical Improvements: Added conversion helper methods for consistent day name handling Enhanced cache manager with proper recurring task support Improved event emission and handling for task updates Better error handling and data validation in task modals This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving the overall user experience."},{"route":"/obsidian/releases/2.0.2/","title":"Untitled","description":"Bug Fixes:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.2.md","namespace":"obsidian","relativePath":"releases/2.0.2.md","raw":"## TaskNotes v2.0.2\r\n\r\nBug Fixes:\r\n- Fixed recurring tasks without due dates not appearing in agenda view\r\n- Recurring tasks now properly show on their scheduled days in agenda view\r\n\r\nSettings Improvements:\r\n- Enhanced Priorities settings tab with comprehensive usability improvements\r\n- Added detailed descriptions, help sections, and column headers\r\n- Added input validation and better visual organization\r\n- Matches the improved usability of the Statuses settings tab\r\n\r\nTechnical Details:\r\n- Modified FilterService date range filtering to properly handle recurring tasks without due dates\r\n- Added logic to check if recurring tasks should appear on any date within the specified range\r\n- Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations\r\n- Maintains full backward compatibility for all existing functionality\n","aliases":["/releases/2.0.2/","/releases/2.0.2/"],"toc":[{"level":2,"id":"tasknotes-v202","text":"TaskNotes v2.0.2"}],"html":"

TaskNotes v2.0.2#

\n

Bug Fixes:

\n
    \n
  • Fixed recurring tasks without due dates not appearing in agenda view
  • \n
  • Recurring tasks now properly show on their scheduled days in agenda view
  • \n
\n

Settings Improvements:

\n
    \n
  • Enhanced Priorities settings tab with comprehensive usability improvements
  • \n
  • Added detailed descriptions, help sections, and column headers
  • \n
  • Added input validation and better visual organization
  • \n
  • Matches the improved usability of the Statuses settings tab
  • \n
\n

Technical Details:

\n
    \n
  • Modified FilterService date range filtering to properly handle recurring tasks without due dates
  • \n
  • Added logic to check if recurring tasks should appear on any date within the specified range
  • \n
  • Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations
  • \n
  • Maintains full backward compatibility for all existing functionality
  • \n
\n","text":"TaskNotes v2.0.2# Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Settings Improvements: Enhanced Priorities settings tab with comprehensive usability improvements Added detailed descriptions, help sections, and column headers Added input validation and better visual organization Matches the improved usability of the Statuses settings tab Technical Details: Modified FilterService date range filtering to properly handle recurring tasks without due dates Added logic to check if recurring tasks should appear on any date within the specified range Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations Maintains full backward compatibility for all existing functionality"},{"route":"/obsidian/releases/2.0.3/","title":"Untitled","description":"Bug Fixes:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.3.md","namespace":"obsidian","relativePath":"releases/2.0.3.md","raw":"\r\nBug Fixes:\r\n- Fixed recurring tasks without due dates not appearing in agenda view\r\n- Recurring tasks now properly show on their scheduled days in agenda view\r\n\r\nCommand Improvements:\r\n- Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout)\r\n- Removed popout window commands for cleaner command palette\r\n- Added 'Refresh TaskNotes cache' command for troubleshooting\r\n- Simplified ribbon icons to focus on core functionality\r\n\r\nTechnical Details:\r\n- Enhanced FilterService initial task set logic to include recurring tasks without due dates\r\n- Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion\r\n- Added async processing with batched performance optimizations\r\n- Maintained backward compatibility and existing performance characteristics\r\n- Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries\r\n\r\nThe agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days.\n","aliases":["/releases/2.0.3/","/releases/2.0.3/"],"toc":[],"html":"

Bug Fixes:

\n
    \n
  • Fixed recurring tasks without due dates not appearing in agenda view
  • \n
  • Recurring tasks now properly show on their scheduled days in agenda view
  • \n
\n

Command Improvements:

\n
    \n
  • Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout)
  • \n
  • Removed popout window commands for cleaner command palette
  • \n
  • Added 'Refresh TaskNotes cache' command for troubleshooting
  • \n
  • Simplified ribbon icons to focus on core functionality
  • \n
\n

Technical Details:

\n
    \n
  • Enhanced FilterService initial task set logic to include recurring tasks without due dates
  • \n
  • Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion
  • \n
  • Added async processing with batched performance optimizations
  • \n
  • Maintained backward compatibility and existing performance characteristics
  • \n
  • Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries
  • \n
\n

The agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days.

\n","text":"Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Command Improvements: Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout) Removed popout window commands for cleaner command palette Added 'Refresh TaskNotes cache' command for troubleshooting Simplified ribbon icons to focus on core functionality Technical Details: Enhanced FilterService initial task set logic to include recurring tasks without due dates Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion Added async processing with batched performance optimizations Maintained backward compatibility and existing performance characteristics Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries The agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days."},{"route":"/obsidian/releases/2.0.4/","title":"TaskNotes v2.0.4","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.0.4.md","namespace":"obsidian","relativePath":"releases/2.0.4.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4\r\n\r\n# TaskNotes v2.0.4\r\n\r\n- Allow multiple statuses to be filtered for at the same time, bringing\r\nstatus filtering in line with context and priority filtering\r\n- Fix flickering during kanban drag and drop\n","aliases":["/releases/2.0.4/","/releases/2.0.4/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4

\n
    \n
  • Allow multiple statuses to be filtered for at the same time, bringing\nstatus filtering in line with context and priority filtering
  • \n
  • Fix flickering during kanban drag and drop
  • \n
\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4 Allow multiple statuses to be filtered for at the same time, bringing status filtering in line with context and priority filtering Fix flickering during kanban drag and drop"},{"route":"/obsidian/releases/2.1.0/","title":"TaskNotes v2.1.0 - Major Feature Release","description":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.1.0.md","namespace":"obsidian","relativePath":"releases/2.1.0.md","raw":"# TaskNotes v2.1.0 - Major Feature Release\r\n\r\nThis release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.\r\n\r\n## NEW FEATURES:\r\n\r\n**Instant Task Conversion**\r\n- One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons\r\n- Streamlined workflow for transforming simple tasks into structured task files\r\n- Configurable via settings to enable/disable the feature\r\n\r\n**Interactive Task Link Overlays**\r\n- Live task previews displayed on wikilinks in live preview mode\r\n- Hover and click interactions for editing tasks without leaving the current note\r\n- Context menus and inline task information display\r\n- Smart detection of task-related wikilinks with automatic enhancement\r\n\r\n**Enhanced Date Handling**\r\n- Improved overdue task detection that considers both due and scheduled dates\r\n- Better date consistency across all views and components\r\n- Expanded field mapping support for time tracking and completion data\r\n\r\n## IMPROVEMENTS:\r\n\r\n**Performance & Reliability**\r\n- Comprehensive resource cleanup to prevent memory leaks\r\n- Enhanced error handling with better user feedback\r\n- Performance optimizations in calendar view and task rendering\r\n- Improved DOM reconciliation and widget management\r\n\r\n**Accessibility & UX**\r\n- Enhanced accessibility with ARIA attributes and keyboard navigation\r\n- Consistent BEM CSS naming across all components\r\n- Better input validation and security measures\r\n- Improved visual consistency throughout the interface\r\n\r\n**Technical Enhancements**\r\n- Fixed deprecated Obsidian API usage for better compatibility\r\n- Standardized date handling using date-fns library\r\n- Configurable pomodoro field mapping\r\n- Better separation of concerns in component architecture\r\n\r\nThis release maintains full backward compatibility while adding new features that enhance the daily task management workflow.\n","aliases":["/releases/2.1.0/","/releases/2.1.0/"],"toc":[{"level":2,"id":"new-features","text":"NEW FEATURES:"},{"level":2,"id":"improvements","text":"IMPROVEMENTS:"}],"html":"

This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.

\n

NEW FEATURES:#

\n

Instant Task Conversion

\n
    \n
  • One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons
  • \n
  • Streamlined workflow for transforming simple tasks into structured task files
  • \n
  • Configurable via settings to enable/disable the feature
  • \n
\n

Interactive Task Link Overlays

\n
    \n
  • Live task previews displayed on wikilinks in live preview mode
  • \n
  • Hover and click interactions for editing tasks without leaving the current note
  • \n
  • Context menus and inline task information display
  • \n
  • Smart detection of task-related wikilinks with automatic enhancement
  • \n
\n

Enhanced Date Handling

\n
    \n
  • Improved overdue task detection that considers both due and scheduled dates
  • \n
  • Better date consistency across all views and components
  • \n
  • Expanded field mapping support for time tracking and completion data
  • \n
\n

IMPROVEMENTS:#

\n

Performance & Reliability

\n
    \n
  • Comprehensive resource cleanup to prevent memory leaks
  • \n
  • Enhanced error handling with better user feedback
  • \n
  • Performance optimizations in calendar view and task rendering
  • \n
  • Improved DOM reconciliation and widget management
  • \n
\n

Accessibility & UX

\n
    \n
  • Enhanced accessibility with ARIA attributes and keyboard navigation
  • \n
  • Consistent BEM CSS naming across all components
  • \n
  • Better input validation and security measures
  • \n
  • Improved visual consistency throughout the interface
  • \n
\n

Technical Enhancements

\n
    \n
  • Fixed deprecated Obsidian API usage for better compatibility
  • \n
  • Standardized date handling using date-fns library
  • \n
  • Configurable pomodoro field mapping
  • \n
  • Better separation of concerns in component architecture
  • \n
\n

This release maintains full backward compatibility while adding new features that enhance the daily task management workflow.

\n","text":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience. NEW FEATURES:# Instant Task Conversion One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons Streamlined workflow for transforming simple tasks into structured task files Configurable via settings to enable/disable the feature Interactive Task Link Overlays Live task previews displayed on wikilinks in live preview mode Hover and click interactions for editing tasks without leaving the current note Context menus and inline task information display Smart detection of task-related wikilinks with automatic enhancement Enhanced Date Handling Improved overdue task detection that considers both due and scheduled dates Better date consistency across all views and components Expanded field mapping support for time tracking and completion data IMPROVEMENTS:# Performance & Reliability Comprehensive resource cleanup to prevent memory leaks Enhanced error handling with better user feedback Performance optimizations in calendar view and task rendering Improved DOM reconciliation and widget management Accessibility & UX Enhanced accessibility with ARIA attributes and keyboard navigation Consistent BEM CSS naming across all components Better input validation and security measures Improved visual consistency throughout the interface Technical Enhancements Fixed deprecated Obsidian API usage for better compatibility Standardized date handling using date-fns library Configurable pomodoro field mapping Better separation of concerns in component architecture This release maintains full backward compatibility while adding new features that enhance the daily task management workflow."},{"route":"/obsidian/releases/2.2.0/","title":"TaskNotes v2.2.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.0.md","namespace":"obsidian","relativePath":"releases/2.2.0.md","raw":"# TaskNotes v2.2.0\r\n\r\n## Major Features\r\n\r\n- Task Deletion: Added task deletion functionality with confirmation modal and proper event handling\r\n- Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data\r\n- Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic\r\n\r\n## Core Improvements\r\n\r\n- Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase\r\n- Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture\r\n- Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks\r\n- Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy\r\n\r\n## UI/UX Enhancements\r\n\r\n- Visual Consistency: Updated font sizes and UI element widths for better readability\r\n- Pomodoro Button Styling: Enhanced button styles with consistent visual feedback\r\n- Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles\r\n\r\n## Technical Improvements\r\n\r\n- Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling\r\n- ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset\r\n- Performance Optimizations: Various refactoring improvements for better code maintainability and performance\r\n\r\n","aliases":["/releases/2.2.0/","/releases/2.2.0/"],"toc":[{"level":2,"id":"major-features","text":"Major Features"},{"level":2,"id":"core-improvements","text":"Core Improvements"},{"level":2,"id":"uiux-enhancements","text":"UI/UX Enhancements"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"}],"html":"

Major Features#

\n
    \n
  • Task Deletion: Added task deletion functionality with confirmation modal and proper event handling
  • \n
  • Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data
  • \n
  • Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic
  • \n
\n

Core Improvements#

\n
    \n
  • Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase
  • \n
  • Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture
  • \n
  • Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks
  • \n
  • Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy
  • \n
\n

UI/UX Enhancements#

\n
    \n
  • Visual Consistency: Updated font sizes and UI element widths for better readability
  • \n
  • Pomodoro Button Styling: Enhanced button styles with consistent visual feedback
  • \n
  • Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles
  • \n
\n

Technical Improvements#

\n
    \n
  • Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling
  • \n
  • ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset
  • \n
  • Performance Optimizations: Various refactoring improvements for better code maintainability and performance
  • \n
\n","text":"Major Features# Task Deletion: Added task deletion functionality with confirmation modal and proper event handling Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic Core Improvements# Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy UI/UX Enhancements# Visual Consistency: Updated font sizes and UI element widths for better readability Pomodoro Button Styling: Enhanced button styles with consistent visual feedback Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles Technical Improvements# Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset Performance Optimizations: Various refactoring improvements for better code maintainability and performance"},{"route":"/obsidian/releases/2.2.1/","title":"Untitled","description":"Fix #22 and #24","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.1.md","namespace":"obsidian","relativePath":"releases/2.2.1.md","raw":"Fix #22 and #24 \n","aliases":["/releases/2.2.1/","/releases/2.2.1/"],"toc":[],"html":"

Fix #22 and #24

\n","text":"Fix #22 and #24"},{"route":"/obsidian/releases/2.2.2/","title":"Untitled","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.2.md","namespace":"obsidian","relativePath":"releases/2.2.2.md","raw":"\n","aliases":["/releases/2.2.2/","/releases/2.2.2/"],"toc":[],"html":"","text":""},{"route":"/obsidian/releases/2.2.3/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/2.2.3.md","namespace":"obsidian","relativePath":"releases/2.2.3.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3\n","aliases":["/releases/2.2.3/","/releases/2.2.3/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3"},{"route":"/obsidian/releases/3.0.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.0.0.md","namespace":"obsidian","relativePath":"releases/3.0.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0\n","aliases":["/releases/3.0.0/","/releases/3.0.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0"},{"route":"/obsidian/releases/3.0.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.0.1.md","namespace":"obsidian","relativePath":"releases/3.0.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1\n","aliases":["/releases/3.0.1/","/releases/3.0.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1"},{"route":"/obsidian/releases/3.1.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.1.0.md","namespace":"obsidian","relativePath":"releases/3.1.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0\n","aliases":["/releases/3.1.0/","/releases/3.1.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0"},{"route":"/obsidian/releases/3.1.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.1.1.md","namespace":"obsidian","relativePath":"releases/3.1.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1\n","aliases":["/releases/3.1.1/","/releases/3.1.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1"},{"route":"/obsidian/releases/3.10.0/","title":"Release Notes: 3.10.0","description":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.10.0.md","namespace":"obsidian","relativePath":"releases/3.10.0.md","raw":"# Release Notes: 3.10.0\r\n\r\n This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.\r\n\r\n## New Features\r\n\r\n### Option to Store Task Title in Filename\r\n\r\nA new setting, storeTitleInFilename, is available under \"Task Filenames\" in the settings tab. This feature changes how task titles are stored.\r\n\r\n**Implementation Details:**\r\n\r\n- When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter.\r\n- For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks.\r\n- When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity.\r\n- Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom).\r\n- This setting is disabled by default.\r\n\r\n### Status Bar Component for Tracked Tasks\r\n\r\nA new UI component has been added to the app's status bar to display tasks with active time-tracking sessions.\r\n\r\n**Functionality:**\r\n\r\n- When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip.\r\n- When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks.\r\n- The status bar item is hidden when no tasks are being tracked.\r\n- This feature is controlled by the \"Show tracked tasks in status bar\" setting and is disabled by default.\r\n\r\n### Customizable First Day of Week for Mini Calendar\r\n\r\nThe mini calendar view now respects the \"First day of the week\" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday).\r\n\r\n## Bug Fixes\r\n\r\n- Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations.\r\n- File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed.\r\n\r\n## Internal Improvements & Documentation\r\n\r\n- Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames.\r\n- `StatusBarService`: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling.\r\n- Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports.\r\n- Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail.\r\n","aliases":["/releases/3.10.0/","/releases/3.10.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"option-to-store-task-title-in-filename","text":"Option to Store Task Title in Filename"},{"level":3,"id":"status-bar-component-for-tracked-tasks","text":"Status Bar Component for Tracked Tasks"},{"level":3,"id":"customizable-first-day-of-week-for-mini-calendar","text":"Customizable First Day of Week for Mini Calendar"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":2,"id":"internal-improvements-documentation","text":"Internal Improvements & Documentation"}],"html":"

This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.

\n

New Features#

\n

Option to Store Task Title in Filename#

\n

A new setting, storeTitleInFilename, is available under "Task Filenames" in the settings tab. This feature changes how task titles are stored.

\n

Implementation Details:

\n
    \n
  • When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter.
  • \n
  • For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks.
  • \n
  • When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity.
  • \n
  • Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom).
  • \n
  • This setting is disabled by default.
  • \n
\n

Status Bar Component for Tracked Tasks#

\n

A new UI component has been added to the app's status bar to display tasks with active time-tracking sessions.

\n

Functionality:

\n
    \n
  • When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip.
  • \n
  • When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks.
  • \n
  • The status bar item is hidden when no tasks are being tracked.
  • \n
  • This feature is controlled by the "Show tracked tasks in status bar" setting and is disabled by default.
  • \n
\n

Customizable First Day of Week for Mini Calendar#

\n

The mini calendar view now respects the "First day of the week" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday).

\n

Bug Fixes#

\n
    \n
  • Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations.
  • \n
  • File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed.
  • \n
\n

Internal Improvements & Documentation#

\n
    \n
  • Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames.
  • \n
  • StatusBarService: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling.
  • \n
  • Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports.
  • \n
  • Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail.
  • \n
\n","text":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements. New Features# Option to Store Task Title in Filename# A new setting, storeTitleInFilename, is available under \"Task Filenames\" in the settings tab. This feature changes how task titles are stored. Implementation Details: When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter. For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks. When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity. Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom). This setting is disabled by default. Status Bar Component for Tracked Tasks# A new UI component has been added to the app's status bar to display tasks with active time-tracking sessions. Functionality: When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip. When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks. The status bar item is hidden when no tasks are being tracked. This feature is controlled by the \"Show tracked tasks in status bar\" setting and is disabled by default. Customizable First Day of Week for Mini Calendar# The mini calendar view now respects the \"First day of the week\" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday). Bug Fixes# Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations. File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed. Internal Improvements & Documentation# Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames. StatusBarService: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling. Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports. Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail."},{"route":"/obsidian/releases/3.11.0/","title":"Release Notes: 3.11.0","description":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.11.0.md","namespace":"obsidian","relativePath":"releases/3.11.0.md","raw":"# Release Notes: 3.11.0\r\n\r\nThis release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.\r\n\r\n## New Features\r\n\r\n### Project Management\r\n\r\nA new project management system has been integrated, allowing for better organization and tracking of tasks within projects.\r\n\r\n- **Note-Based Projects**: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note.\r\n- **Project Selection UI**: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes.\r\n- **Filtering and Grouping by Project**:\r\n - The Filter Bar in all views now includes a \"Project\" filter, allowing you to see tasks for one or more specific projects.\r\n - The \"Group By\" option now includes \"Project\", which organizes the Task List and Kanban views by project.\r\n- **Clickable Project Links**: In task cards and other views, project names are now clickable links that take you directly to the project note.\r\n\r\n### Workflow and UI Enhancements\r\n\r\n- **Redesigned Pomodoro Timer**: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience.\r\n - **New Interface**: A more compact and visually appealing interface.\r\n - **Time Adjustment**: You can now add or subtract time from the current session or the prepared timer.\r\n - **Skip Break**: A \"Skip break\" button is now available after a work session.\r\n- **Enhanced Pomodoro Stats**: The Pomodoro statistics view has been improved to provide more insights.\r\n - **Overview Section**: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance.\r\n- **Instant Task Conversion**: The \"Convert task to TaskNote\" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction.\r\n- **Quick Actions for Current Task**: A new command, \"Quick actions for current task,\" allows you to open the action palette for the currently active TaskNote, providing quick access to common operations.\r\n- **Improved Sorting Logic**: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: `scheduled date` -> `due date` -> `priority` -> `title`. This ensures a more predictable and logical ordering of tasks.\r\n- **Archive Button in Edit Modal**: An \"Archive\" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks.\r\n- **Week Start Day Setting**: All calendar views now respect the \"Start week on\" setting from Obsidian's calendar preferences.\r\n\r\n## Bug Fixes and Minor Improvements\r\n\r\n- **Recurring Task Date Consistency**: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views.\r\n- **Pomodoro Daily Note Integration**: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries.\r\n- **Template Processing**:\r\n - The `{{parentNote}}` template variable now correctly resolves to a properly formatted markdown link.\r\n - YAML frontmatter in templates is now processed more safely to avoid parsing errors.\r\n- **Date Validation**: The `complete_instances` field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity.\r\n- **Natural Language Processing**: The natural language parser now correctly applies scheduled times (e.g., \"do something at 5pm\") to created tasks.\r\n- **Agenda View Quick Select**: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed.\r\n- **Styling and CSS**: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals.\r\n- **Documentation**:\r\n - The documentation has been updated to reflect the new project management features.\r\n - New workflow guides for \"Habit Tracking\" and \"Project Management\" have been added.\r\n\r\n","aliases":["/releases/3.11.0/","/releases/3.11.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-management","text":"Project Management"},{"level":3,"id":"workflow-and-ui-enhancements","text":"Workflow and UI Enhancements"},{"level":2,"id":"bug-fixes-and-minor-improvements","text":"Bug Fixes and Minor Improvements"}],"html":"

This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.

\n

New Features#

\n

Project Management#

\n

A new project management system has been integrated, allowing for better organization and tracking of tasks within projects.

\n
    \n
  • Note-Based Projects: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note.
  • \n
  • Project Selection UI: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes.
  • \n
  • Filtering and Grouping by Project:
      \n
    • The Filter Bar in all views now includes a "Project" filter, allowing you to see tasks for one or more specific projects.
    • \n
    • The "Group By" option now includes "Project", which organizes the Task List and Kanban views by project.
    • \n
    \n
  • \n
  • Clickable Project Links: In task cards and other views, project names are now clickable links that take you directly to the project note.
  • \n
\n

Workflow and UI Enhancements#

\n
    \n
  • Redesigned Pomodoro Timer: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience.
      \n
    • New Interface: A more compact and visually appealing interface.
    • \n
    • Time Adjustment: You can now add or subtract time from the current session or the prepared timer.
    • \n
    • Skip Break: A "Skip break" button is now available after a work session.
    • \n
    \n
  • \n
  • Enhanced Pomodoro Stats: The Pomodoro statistics view has been improved to provide more insights.
      \n
    • Overview Section: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance.
    • \n
    \n
  • \n
  • Instant Task Conversion: The "Convert task to TaskNote" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction.
  • \n
  • Quick Actions for Current Task: A new command, "Quick actions for current task," allows you to open the action palette for the currently active TaskNote, providing quick access to common operations.
  • \n
  • Improved Sorting Logic: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: scheduled date -> due date -> priority -> title. This ensures a more predictable and logical ordering of tasks.
  • \n
  • Archive Button in Edit Modal: An "Archive" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks.
  • \n
  • Week Start Day Setting: All calendar views now respect the "Start week on" setting from Obsidian's calendar preferences.
  • \n
\n

Bug Fixes and Minor Improvements#

\n
    \n
  • Recurring Task Date Consistency: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views.
  • \n
  • Pomodoro Daily Note Integration: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries.
  • \n
  • Template Processing:
      \n
    • The {{parentNote}} template variable now correctly resolves to a properly formatted markdown link.
    • \n
    • YAML frontmatter in templates is now processed more safely to avoid parsing errors.
    • \n
    \n
  • \n
  • Date Validation: The complete_instances field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity.
  • \n
  • Natural Language Processing: The natural language parser now correctly applies scheduled times (e.g., "do something at 5pm") to created tasks.
  • \n
  • Agenda View Quick Select: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed.
  • \n
  • Styling and CSS: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals.
  • \n
  • Documentation:
      \n
    • The documentation has been updated to reflect the new project management features.
    • \n
    • New workflow guides for "Habit Tracking" and "Project Management" have been added.
    • \n
    \n
  • \n
\n","text":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes. New Features# Project Management# A new project management system has been integrated, allowing for better organization and tracking of tasks within projects. Note-Based Projects: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note. Project Selection UI: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes. Filtering and Grouping by Project: The Filter Bar in all views now includes a \"Project\" filter, allowing you to see tasks for one or more specific projects. The \"Group By\" option now includes \"Project\", which organizes the Task List and Kanban views by project. Clickable Project Links: In task cards and other views, project names are now clickable links that take you directly to the project note. Workflow and UI Enhancements# Redesigned Pomodoro Timer: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience. New Interface: A more compact and visually appealing interface. Time Adjustment: You can now add or subtract time from the current session or the prepared timer. Skip Break: A \"Skip break\" button is now available after a work session. Enhanced Pomodoro Stats: The Pomodoro statistics view has been improved to provide more insights. Overview Section: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance. Instant Task Conversion: The \"Convert task to TaskNote\" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction. Quick Actions for Current Task: A new command, \"Quick actions for current task,\" allows you to open the action palette for the currently active TaskNote, providing quick access to common operations. Improved Sorting Logic: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: scheduled date -> due date -> priority -> title. This ensures a more predictable and logical ordering of tasks. Archive Button in Edit Modal: An \"Archive\" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks. Week Start Day Setting: All calendar views now respect the \"Start week on\" setting from Obsidian's calendar preferences. Bug Fixes and Minor Improvements# Recurring Task Date Consistency: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views. Pomodoro Daily Note Integration: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries. Template Processing: The {{parentNote}} template variable now correctly resolves to a properly formatted markdown link. YAML frontmatter in templates is now processed more safely to avoid parsing errors. Date Validation: The complete_instances field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity. Natural Language Processing: The natural language parser now correctly applies scheduled times (e.g., \"do something at 5pm\") to created tasks. Agenda View Quick Select: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed. Styling and CSS: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals. Documentation: The documentation has been updated to reflect the new project management features. New workflow guides for \"Habit Tracking\" and \"Project Management\" have been added."},{"route":"/obsidian/releases/3.11.1/","title":"Release Notes 3.11.1","description":"This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.11.1.md","namespace":"obsidian","relativePath":"releases/3.11.1.md","raw":"# Release Notes 3.11.1\r\n\r\n## API Modernization & Performance Improvements\r\n\r\nThis release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.\r\n\r\n### Improved autocomplete\r\n\r\n- Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API\r\n - Better keyboard navigation and visual consistency\r\n - More responsive type-ahead support for contexts and tags in task modals\r\n\r\n### API modernization\r\n\r\n- Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications\r\n - Eliminates risk of data corruption during migration processes\r\n - More reliable handling of YAML frontmatter updates\r\n- Native Link Parsing: Switched to Obsidian's built-in parseLinktext API\r\n - More robust wikilink parsing with better edge case handling\r\n - Improved consistency with Obsidian's internal link processing\r\n- Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage\r\n - Fixes issue where settings were shared across different vaults\r\n - Each vault now maintains its own view state and preferences\r\n\r\n## Bug fixes & stability\r\n\r\n- Memory Leak Prevention: Properly register and cleanup event listeners\r\n - Event listeners are now tracked with EventRef objects for proper cleanup\r\n - Prevents memory leaks when plugin is disabled or reloaded\r\n- Debounce Optimization: Uses Obsidian's built-in debounce function\r\n - More efficient calendar refresh operations\r\n - Better performance consistency\r\n- UI Polish: Fixed sentence case issues throughout the interface\r\n\r\n## Security & reliability\r\n\r\n- Resource Cleanup: Enhanced plugin lifecycle management\r\n - Better cleanup of event listeners and cached data\r\n - Improved plugin disable/enable reliability\r\n\r\n","aliases":["/releases/3.11.1/","/releases/3.11.1/"],"toc":[{"level":2,"id":"api-modernization-performance-improvements","text":"API Modernization & Performance Improvements"},{"level":3,"id":"improved-autocomplete","text":"Improved autocomplete"},{"level":3,"id":"api-modernization","text":"API modernization"},{"level":2,"id":"bug-fixes-stability","text":"Bug fixes & stability"},{"level":2,"id":"security-reliability","text":"Security & reliability"}],"html":"

API Modernization & Performance Improvements#

\n

This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.

\n

Improved autocomplete#

\n
    \n
  • Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API
      \n
    • Better keyboard navigation and visual consistency
    • \n
    • More responsive type-ahead support for contexts and tags in task modals
    • \n
    \n
  • \n
\n

API modernization#

\n
    \n
  • Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications
      \n
    • Eliminates risk of data corruption during migration processes
    • \n
    • More reliable handling of YAML frontmatter updates
    • \n
    \n
  • \n
  • Native Link Parsing: Switched to Obsidian's built-in parseLinktext API
      \n
    • More robust wikilink parsing with better edge case handling
    • \n
    • Improved consistency with Obsidian's internal link processing
    • \n
    \n
  • \n
  • Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage
      \n
    • Fixes issue where settings were shared across different vaults
    • \n
    • Each vault now maintains its own view state and preferences
    • \n
    \n
  • \n
\n

Bug fixes & stability#

\n
    \n
  • Memory Leak Prevention: Properly register and cleanup event listeners
      \n
    • Event listeners are now tracked with EventRef objects for proper cleanup
    • \n
    • Prevents memory leaks when plugin is disabled or reloaded
    • \n
    \n
  • \n
  • Debounce Optimization: Uses Obsidian's built-in debounce function
      \n
    • More efficient calendar refresh operations
    • \n
    • Better performance consistency
    • \n
    \n
  • \n
  • UI Polish: Fixed sentence case issues throughout the interface
  • \n
\n

Security & reliability#

\n
    \n
  • Resource Cleanup: Enhanced plugin lifecycle management
      \n
    • Better cleanup of event listeners and cached data
    • \n
    • Improved plugin disable/enable reliability
    • \n
    \n
  • \n
\n","text":"API Modernization & Performance Improvements# This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management. Improved autocomplete# Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API Better keyboard navigation and visual consistency More responsive type-ahead support for contexts and tags in task modals API modernization# Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications Eliminates risk of data corruption during migration processes More reliable handling of YAML frontmatter updates Native Link Parsing: Switched to Obsidian's built-in parseLinktext API More robust wikilink parsing with better edge case handling Improved consistency with Obsidian's internal link processing Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage Fixes issue where settings were shared across different vaults Each vault now maintains its own view state and preferences Bug fixes & stability# Memory Leak Prevention: Properly register and cleanup event listeners Event listeners are now tracked with EventRef objects for proper cleanup Prevents memory leaks when plugin is disabled or reloaded Debounce Optimization: Uses Obsidian's built-in debounce function More efficient calendar refresh operations Better performance consistency UI Polish: Fixed sentence case issues throughout the interface Security & reliability# Resource Cleanup: Enhanced plugin lifecycle management Better cleanup of event listeners and cached data Improved plugin disable/enable reliability"},{"route":"/obsidian/releases/3.11.2/","title":"Release Notes - 3.11.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.11.2.md","namespace":"obsidian","relativePath":"releases/3.11.2.md","raw":"# Release Notes - 3.11.2\r\n\r\n## Internal Improvements\r\n\r\n### API Standardization\r\n\r\n- Replaced custom wikilink parsing with Obsidian's native `parseLinktext` API\r\n- Migrated from custom debounce function to Obsidian's built-in debounce utility\r\n\r\n### Files Updated\r\n\r\n- TaskLinkOverlay.ts: Updated wikilink parsing\r\n- FilterService.ts: Improved project link resolution\r\n- TaskLinkDetectionService.ts: Simplified link detection\r\n- MinimalNativeCache.ts: Standardized project link handling\r\n- KanbanView.ts: Replaced custom debounce implementation\r\n- Test files: Updated mocks accordingly\r\n","aliases":["/releases/3.11.2/","/releases/3.11.2/"],"toc":[{"level":2,"id":"internal-improvements","text":"Internal Improvements"},{"level":3,"id":"api-standardization","text":"API Standardization"},{"level":3,"id":"files-updated","text":"Files Updated"}],"html":"

Internal Improvements#

\n

API Standardization#

\n
    \n
  • Replaced custom wikilink parsing with Obsidian's native parseLinktext API
  • \n
  • Migrated from custom debounce function to Obsidian's built-in debounce utility
  • \n
\n

Files Updated#

\n
    \n
  • TaskLinkOverlay.ts: Updated wikilink parsing
  • \n
  • FilterService.ts: Improved project link resolution
  • \n
  • TaskLinkDetectionService.ts: Simplified link detection
  • \n
  • MinimalNativeCache.ts: Standardized project link handling
  • \n
  • KanbanView.ts: Replaced custom debounce implementation
  • \n
  • Test files: Updated mocks accordingly
  • \n
\n","text":"Internal Improvements# API Standardization# Replaced custom wikilink parsing with Obsidian's native parseLinktext API Migrated from custom debounce function to Obsidian's built-in debounce utility Files Updated# TaskLinkOverlay.ts: Updated wikilink parsing FilterService.ts: Improved project link resolution TaskLinkDetectionService.ts: Simplified link detection MinimalNativeCache.ts: Standardized project link handling KanbanView.ts: Replaced custom debounce implementation Test files: Updated mocks accordingly"},{"route":"/obsidian/releases/3.12.0/","title":"Release Notes - 3.12.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.12.0.md","namespace":"obsidian","relativePath":"releases/3.12.0.md","raw":"# Release Notes - 3.12.0\r\n\r\n## New Features\r\n\r\n### Project Subtasks Widget\r\n\r\n- Add a collapsible widget that displays tasks linked to the current project note\r\n- Widget appears automatically in project notes and shows all tasks that reference the rpoject\r\n- Includes collapsible interface with persistent state across sessions\r\n- Updates automatically when tasks are modified or deleted\r\n- Can be enabled or disabled in plugin settings under \"Show project subtasks widget\"\r\n\r\n## Bug Fixes\r\n\r\n### FilterBar Improvements\r\n\r\n- Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138)\r\n- Fixed archived tasks' contexts and projects still appearing in filter bar (#139)\r\n- Resolved FilterBar showing projects with [[]] brackets\r\n- Fixed empty status list display on initial load\r\n- Improved initialization reliability with better event handling\r\n\r\n### Task Display\r\n\r\n- Fixed wikilink alias handling in TaskCard and inline displays (#145, #147)\r\n- Fixed projects not loading correctly in task edit modal (#141)\r\n- Improved cursor positioning in live preview mode\r\n\r\n## Documentation\r\n\r\n- Added documentation for project subtasks widget feature\r\n- Updated inline task integration documentation\r\n- Added configuration settings documentation\r\n","aliases":["/releases/3.12.0/","/releases/3.12.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-subtasks-widget","text":"Project Subtasks Widget"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filterbar-improvements","text":"FilterBar Improvements"},{"level":3,"id":"task-display","text":"Task Display"},{"level":2,"id":"documentation","text":"Documentation"}],"html":"

New Features#

\n

Project Subtasks Widget#

\n
    \n
  • Add a collapsible widget that displays tasks linked to the current project note
  • \n
  • Widget appears automatically in project notes and shows all tasks that reference the rpoject
  • \n
  • Includes collapsible interface with persistent state across sessions
  • \n
  • Updates automatically when tasks are modified or deleted
  • \n
  • Can be enabled or disabled in plugin settings under "Show project subtasks widget"
  • \n
\n

Bug Fixes#

\n

FilterBar Improvements#

\n
    \n
  • Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138)
  • \n
  • Fixed archived tasks' contexts and projects still appearing in filter bar (#139)
  • \n
  • Resolved FilterBar showing projects with [[]] brackets
  • \n
  • Fixed empty status list display on initial load
  • \n
  • Improved initialization reliability with better event handling
  • \n
\n

Task Display#

\n
    \n
  • Fixed wikilink alias handling in TaskCard and inline displays (#145, #147)
  • \n
  • Fixed projects not loading correctly in task edit modal (#141)
  • \n
  • Improved cursor positioning in live preview mode
  • \n
\n

Documentation#

\n
    \n
  • Added documentation for project subtasks widget feature
  • \n
  • Updated inline task integration documentation
  • \n
  • Added configuration settings documentation
  • \n
\n","text":"New Features# Project Subtasks Widget# Add a collapsible widget that displays tasks linked to the current project note Widget appears automatically in project notes and shows all tasks that reference the rpoject Includes collapsible interface with persistent state across sessions Updates automatically when tasks are modified or deleted Can be enabled or disabled in plugin settings under \"Show project subtasks widget\" Bug Fixes# FilterBar Improvements# Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138) Fixed archived tasks' contexts and projects still appearing in filter bar (#139) Resolved FilterBar showing projects with [[]] brackets Fixed empty status list display on initial load Improved initialization reliability with better event handling Task Display# Fixed wikilink alias handling in TaskCard and inline displays (#145, #147) Fixed projects not loading correctly in task edit modal (#141) Improved cursor positioning in live preview mode Documentation# Added documentation for project subtasks widget feature Updated inline task integration documentation Added configuration settings documentation"},{"route":"/obsidian/releases/3.12.1/","title":"Release Notes - 3.12.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.12.1.md","namespace":"obsidian","relativePath":"releases/3.12.1.md","raw":"# Release Notes - 3.12.1\r\n\r\n## New Features\r\n\r\n### Project Subtasks Widget Enhancements\r\n\r\n- New button for task creation - Added \"New\" button to widget header for quick task creation\r\n- Auto-populated project field - New tasks automatically reference the current note as their project\r\n- Improved positioning - Widget now appears at the end of documents for better user experience\r\n- Improve visual design - Added dashed border to indicate virtual/generated content and improved styling\r\n\r\n## Bug Fixes\r\n\r\n### Timezone and Date Handling\r\n\r\n- Fixed timezone boundary issues in Agenda view date filtering (#153)\r\n- Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift\r\n- Enhanced date normalization in AgendaView for consistent behavior across timezones\r\n- Improved task filtering with better date handling in getTasksForDate()\r\n\r\n## UI and Display Improvements\r\n\r\n- Fixed cursor positioning to prevent cursor appearing after project subtasks widget\r\n- Resolved pre-populated projects not displaying correctly in task creation modal\r\n- Improved widget rendering with CSS-only styling approach for better performance\r\n\r\n## Settings Reorganization\r\n\r\n### New Misc Tab\r\n\r\n- Renamed \"Performance\" tab to \"Misc\" and moved to end of settings tab list\r\n- Consolidated miscellaneous features into a single organized location\r\n- Improved settings navigation by grouping related toggles together\r\n\r\n### Settings Moved to Misc Tab\r\n\r\n- Status bar toggle - Show tracked tasks in status bar\r\n- Project subtasks widget toggle - Show project subtasks widget in notes\r\n- Notes indexing toggle - Disable note indexing for performance optimization\r\n\r\n## Documentation Updates\r\n\r\n### Settings Documentation\r\n\r\n- Updated all documentation to reflect new settings organization\r\n- Created comprehensive Misc Settings documentation with detailed explanations\r\n- Removed outdated references from Advanced Settings documentation\r\n- Updated troubleshooting guides with correct setting locations\r\n\r\n## Reference Updates\r\n\r\n- Updated inline task feature documentation to reference new Misc tab location\r\n- Fixed all setting location references throughout documentation\r\n- Maintained backward compatibility information for users upgrading\r\n\r\n","aliases":["/releases/3.12.1/","/releases/3.12.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-subtasks-widget-enhancements","text":"Project Subtasks Widget Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"timezone-and-date-handling","text":"Timezone and Date Handling"},{"level":2,"id":"ui-and-display-improvements","text":"UI and Display Improvements"},{"level":2,"id":"settings-reorganization","text":"Settings Reorganization"},{"level":3,"id":"new-misc-tab","text":"New Misc Tab"},{"level":3,"id":"settings-moved-to-misc-tab","text":"Settings Moved to Misc Tab"},{"level":2,"id":"documentation-updates","text":"Documentation Updates"},{"level":3,"id":"settings-documentation","text":"Settings Documentation"},{"level":2,"id":"reference-updates","text":"Reference Updates"}],"html":"

New Features#

\n

Project Subtasks Widget Enhancements#

\n
    \n
  • New button for task creation - Added "New" button to widget header for quick task creation
  • \n
  • Auto-populated project field - New tasks automatically reference the current note as their project
  • \n
  • Improved positioning - Widget now appears at the end of documents for better user experience
  • \n
  • Improve visual design - Added dashed border to indicate virtual/generated content and improved styling
  • \n
\n

Bug Fixes#

\n

Timezone and Date Handling#

\n
    \n
  • Fixed timezone boundary issues in Agenda view date filtering (#153)
  • \n
  • Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift
  • \n
  • Enhanced date normalization in AgendaView for consistent behavior across timezones
  • \n
  • Improved task filtering with better date handling in getTasksForDate()
  • \n
\n

UI and Display Improvements#

\n
    \n
  • Fixed cursor positioning to prevent cursor appearing after project subtasks widget
  • \n
  • Resolved pre-populated projects not displaying correctly in task creation modal
  • \n
  • Improved widget rendering with CSS-only styling approach for better performance
  • \n
\n

Settings Reorganization#

\n

New Misc Tab#

\n
    \n
  • Renamed "Performance" tab to "Misc" and moved to end of settings tab list
  • \n
  • Consolidated miscellaneous features into a single organized location
  • \n
  • Improved settings navigation by grouping related toggles together
  • \n
\n

Settings Moved to Misc Tab#

\n
    \n
  • Status bar toggle - Show tracked tasks in status bar
  • \n
  • Project subtasks widget toggle - Show project subtasks widget in notes
  • \n
  • Notes indexing toggle - Disable note indexing for performance optimization
  • \n
\n

Documentation Updates#

\n

Settings Documentation#

\n
    \n
  • Updated all documentation to reflect new settings organization
  • \n
  • Created comprehensive Misc Settings documentation with detailed explanations
  • \n
  • Removed outdated references from Advanced Settings documentation
  • \n
  • Updated troubleshooting guides with correct setting locations
  • \n
\n

Reference Updates#

\n
    \n
  • Updated inline task feature documentation to reference new Misc tab location
  • \n
  • Fixed all setting location references throughout documentation
  • \n
  • Maintained backward compatibility information for users upgrading
  • \n
\n","text":"New Features# Project Subtasks Widget Enhancements# New button for task creation - Added \"New\" button to widget header for quick task creation Auto-populated project field - New tasks automatically reference the current note as their project Improved positioning - Widget now appears at the end of documents for better user experience Improve visual design - Added dashed border to indicate virtual/generated content and improved styling Bug Fixes# Timezone and Date Handling# Fixed timezone boundary issues in Agenda view date filtering (#153) Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift Enhanced date normalization in AgendaView for consistent behavior across timezones Improved task filtering with better date handling in getTasksForDate() UI and Display Improvements# Fixed cursor positioning to prevent cursor appearing after project subtasks widget Resolved pre-populated projects not displaying correctly in task creation modal Improved widget rendering with CSS-only styling approach for better performance Settings Reorganization# New Misc Tab# Renamed \"Performance\" tab to \"Misc\" and moved to end of settings tab list Consolidated miscellaneous features into a single organized location Improved settings navigation by grouping related toggles together Settings Moved to Misc Tab# Status bar toggle - Show tracked tasks in status bar Project subtasks widget toggle - Show project subtasks widget in notes Notes indexing toggle - Disable note indexing for performance optimization Documentation Updates# Settings Documentation# Updated all documentation to reflect new settings organization Created comprehensive Misc Settings documentation with detailed explanations Removed outdated references from Advanced Settings documentation Updated troubleshooting guides with correct setting locations Reference Updates# Updated inline task feature documentation to reference new Misc tab location Fixed all setting location references throughout documentation Maintained backward compatibility information for users upgrading"},{"route":"/obsidian/releases/3.12.2/","title":"Release Notes - 3.12.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.12.2.md","namespace":"obsidian","relativePath":"releases/3.12.2.md","raw":"# Release Notes - 3.12.2\r\n\r\n## Bug Fixes\r\n\r\n### Calendar & Date Handling\r\n- Fixed off-by-one date bugs in completion calendar (#160)\r\n - Resolved timezone inconsistency where calendar showed one date but completion was recorded for another\r\n - Calendar rendering now uses UTC dates consistently across all components\r\n - Fixed \"Friday tasks appearing on Saturday\" issue in completion tracking\r\n\r\n### Task Management\r\n- Fixed project filters not working in agenda view (#161)\r\n - Project filtering now works consistently across all views\r\n- Fixed edit modal crash when tasks have empty project properties\r\n - Added null checks to prevent \"Cannot read properties of null\" errors\r\n - Handles null, undefined, and empty string project values gracefully\r\n- Fixed autofill suggestions not updating internal state (#159)\r\n - Context and tag suggestions now properly sync with modal internal state\r\n - Clicking suggestions now correctly updates the task data\r\n\r\n## UI & Styling\r\n- Fixed consistent styling for priorities and statuses settings tabs (#130)\r\n - Added missing BEM classes for proper grid alignment\r\n - Priority inputs now use same styling as status inputs\r\n - Fixed table column misalignment issues\r\n\r\n## Documentation\r\n\r\n- Improved README and documentation\r\n - Enhanced overview section with better flow and natural language\r\n - Added time-tracking and pomodoro feature descriptions\r\n - Fixed broken documentation links\r\n - Updated Core Features section with more accurate descriptions\r\n\r\n ## Testing\r\n\r\n- Added comprehensive tests for date handling issues\r\n - Increased test coverage for calendar and completion functionality\r\n - Added tests reproducing and verifying fixes for off-by-one date bugs\r\n","aliases":["/releases/3.12.2/","/releases/3.12.2/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-date-handling","text":"Calendar & Date Handling"},{"level":3,"id":"task-management","text":"Task Management"},{"level":2,"id":"ui-styling","text":"UI & Styling"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"testing","text":"Testing"}],"html":"

Bug Fixes#

\n

Calendar & Date Handling#

\n
    \n
  • Fixed off-by-one date bugs in completion calendar (#160)
      \n
    • Resolved timezone inconsistency where calendar showed one date but completion was recorded for another
    • \n
    • Calendar rendering now uses UTC dates consistently across all components
    • \n
    • Fixed "Friday tasks appearing on Saturday" issue in completion tracking
    • \n
    \n
  • \n
\n

Task Management#

\n
    \n
  • Fixed project filters not working in agenda view (#161)
      \n
    • Project filtering now works consistently across all views
    • \n
    \n
  • \n
  • Fixed edit modal crash when tasks have empty project properties
      \n
    • Added null checks to prevent "Cannot read properties of null" errors
    • \n
    • Handles null, undefined, and empty string project values gracefully
    • \n
    \n
  • \n
  • Fixed autofill suggestions not updating internal state (#159)
      \n
    • Context and tag suggestions now properly sync with modal internal state
    • \n
    • Clicking suggestions now correctly updates the task data
    • \n
    \n
  • \n
\n

UI & Styling#

\n
    \n
  • Fixed consistent styling for priorities and statuses settings tabs (#130)
      \n
    • Added missing BEM classes for proper grid alignment
    • \n
    • Priority inputs now use same styling as status inputs
    • \n
    • Fixed table column misalignment issues
    • \n
    \n
  • \n
\n

Documentation#

\n
    \n
  • Improved README and documentation
      \n
    • Enhanced overview section with better flow and natural language
    • \n
    • Added time-tracking and pomodoro feature descriptions
    • \n
    • Fixed broken documentation links
    • \n
    • Updated Core Features section with more accurate descriptions
    • \n
    \n
  • \n
\n

Testing#

\n
    \n
  • Added comprehensive tests for date handling issues
      \n
    • Increased test coverage for calendar and completion functionality
    • \n
    • Added tests reproducing and verifying fixes for off-by-one date bugs
    • \n
    \n
  • \n
\n","text":"Bug Fixes# Calendar & Date Handling# Fixed off-by-one date bugs in completion calendar (#160) Resolved timezone inconsistency where calendar showed one date but completion was recorded for another Calendar rendering now uses UTC dates consistently across all components Fixed \"Friday tasks appearing on Saturday\" issue in completion tracking Task Management# Fixed project filters not working in agenda view (#161) Project filtering now works consistently across all views Fixed edit modal crash when tasks have empty project properties Added null checks to prevent \"Cannot read properties of null\" errors Handles null, undefined, and empty string project values gracefully Fixed autofill suggestions not updating internal state (#159) Context and tag suggestions now properly sync with modal internal state Clicking suggestions now correctly updates the task data UI & Styling# Fixed consistent styling for priorities and statuses settings tabs (#130) Added missing BEM classes for proper grid alignment Priority inputs now use same styling as status inputs Fixed table column misalignment issues Documentation# Improved README and documentation Enhanced overview section with better flow and natural language Added time-tracking and pomodoro feature descriptions Fixed broken documentation links Updated Core Features section with more accurate descriptions Testing# Added comprehensive tests for date handling issues Increased test coverage for calendar and completion functionality Added tests reproducing and verifying fixes for off-by-one date bugs"},{"route":"/obsidian/releases/3.13.0/","title":"Release Notes - 3.13.0","description":"##Technical Changes","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.0.md","namespace":"obsidian","relativePath":"releases/3.13.0.md","raw":"# Release Notes - 3.13.0 \r\n\r\n## Major Changes\r\n\r\n### Filtering System Overhaul\r\n\r\n- Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface\r\n- Saved Views: Users can save, manage, and switch between custom filter configurations\r\n- FilterBar Redesign: Updated to use Obsidian components with improved styling\r\n\r\n### UI Updates\r\n\r\n- FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management\r\n- Dropdown Improvements: Status and priority filters now use display labels\r\n- Dropdown Positioning: Fixed positioning and CSS styling issues\r\n\r\n## New Features\r\n\r\n### Natural Language Processing\r\n\r\n- Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask)\r\n\r\n### Interface\r\n\r\n- Project Note Decorations: Updated styling and visual elements\r\n- Task Modal Styling: Refined task creation and editing interfaces\r\n\r\n## Bug Fixes\r\n\r\n### Filter System\r\n\r\n- Fixed handling of empty arrays in \"Projects is not empty\" conditions\r\n- Fixed incomplete filter conditions handling\r\n- Fixed saved views dropdown persistence when filters change\r\n- Fixed view options disappearing on refresh\r\n- Fixed view selector dropdown behavior\r\n\r\n### Testing\r\n\r\n- Fixed multiple unit and integration test failures\r\n- Fixed migration workflow test for YAML parsing errors\r\n- Expanded test coverage for task service completion\r\n\r\n### Code Quality\r\n\r\n- Removed debug console.log statements\r\n- Improved async handling and import organization\r\n- Better search functionality implementation\r\n\r\n##Technical Changes\r\n\r\n### Refactoring\r\n\r\n- Refactored FilterBar with Obsidian components\r\n- Updated filter rule definitions and UI components\r\n- Improved state management across views\r\n- Updated ViewStateManager\r\n\r\n## Development\r\n\r\n- Updated Typescript configuration\r\n- Added new Filter Utils.ts utility module\r\n- Improved code organization\r\n\r\n","aliases":["/releases/3.13.0/","/releases/3.13.0/"],"toc":[{"level":2,"id":"major-changes","text":"Major Changes"},{"level":3,"id":"filtering-system-overhaul","text":"Filtering System Overhaul"},{"level":3,"id":"ui-updates","text":"UI Updates"},{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"natural-language-processing","text":"Natural Language Processing"},{"level":3,"id":"interface","text":"Interface"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filter-system","text":"Filter System"},{"level":3,"id":"testing","text":"Testing"},{"level":3,"id":"code-quality","text":"Code Quality"},{"level":3,"id":"refactoring","text":"Refactoring"},{"level":2,"id":"development","text":"Development"}],"html":"

Major Changes#

\n

Filtering System Overhaul#

\n
    \n
  • Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface
  • \n
  • Saved Views: Users can save, manage, and switch between custom filter configurations
  • \n
  • FilterBar Redesign: Updated to use Obsidian components with improved styling
  • \n
\n

UI Updates#

\n
    \n
  • FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management
  • \n
  • Dropdown Improvements: Status and priority filters now use display labels
  • \n
  • Dropdown Positioning: Fixed positioning and CSS styling issues
  • \n
\n

New Features#

\n

Natural Language Processing#

\n
    \n
  • Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask)
  • \n
\n

Interface#

\n
    \n
  • Project Note Decorations: Updated styling and visual elements
  • \n
  • Task Modal Styling: Refined task creation and editing interfaces
  • \n
\n

Bug Fixes#

\n

Filter System#

\n
    \n
  • Fixed handling of empty arrays in "Projects is not empty" conditions
  • \n
  • Fixed incomplete filter conditions handling
  • \n
  • Fixed saved views dropdown persistence when filters change
  • \n
  • Fixed view options disappearing on refresh
  • \n
  • Fixed view selector dropdown behavior
  • \n
\n

Testing#

\n
    \n
  • Fixed multiple unit and integration test failures
  • \n
  • Fixed migration workflow test for YAML parsing errors
  • \n
  • Expanded test coverage for task service completion
  • \n
\n

Code Quality#

\n
    \n
  • Removed debug console.log statements
  • \n
  • Improved async handling and import organization
  • \n
  • Better search functionality implementation
  • \n
\n

##Technical Changes

\n

Refactoring#

\n
    \n
  • Refactored FilterBar with Obsidian components
  • \n
  • Updated filter rule definitions and UI components
  • \n
  • Improved state management across views
  • \n
  • Updated ViewStateManager
  • \n
\n

Development#

\n
    \n
  • Updated Typescript configuration
  • \n
  • Added new Filter Utils.ts utility module
  • \n
  • Improved code organization
  • \n
\n","text":"Major Changes# Filtering System Overhaul# Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface Saved Views: Users can save, manage, and switch between custom filter configurations FilterBar Redesign: Updated to use Obsidian components with improved styling UI Updates# FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management Dropdown Improvements: Status and priority filters now use display labels Dropdown Positioning: Fixed positioning and CSS styling issues New Features# Natural Language Processing# Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask) Interface# Project Note Decorations: Updated styling and visual elements Task Modal Styling: Refined task creation and editing interfaces Bug Fixes# Filter System# Fixed handling of empty arrays in \"Projects is not empty\" conditions Fixed incomplete filter conditions handling Fixed saved views dropdown persistence when filters change Fixed view options disappearing on refresh Fixed view selector dropdown behavior Testing# Fixed multiple unit and integration test failures Fixed migration workflow test for YAML parsing errors Expanded test coverage for task service completion Code Quality# Removed debug console.log statements Improved async handling and import organization Better search functionality implementation ##Technical Changes Refactoring# Refactored FilterBar with Obsidian components Updated filter rule definitions and UI components Improved state management across views Updated ViewStateManager Development# Updated Typescript configuration Added new Filter Utils.ts utility module Improved code organization"},{"route":"/obsidian/releases/3.13.1/","title":"Release Notes - 3.13.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.1.md","namespace":"obsidian","relativePath":"releases/3.13.1.md","raw":"# Release Notes - 3.13.1 \r\n\r\n## New Features\r\n\r\n### Saved Filter Views Storage\r\n\r\n- Saved filter views now sync across devices with your vault\r\n- Views are stored in plugin data instead of browser localStorage\r\n- Automatic migration from previous storage system on first load\r\n\r\n### FilterBar Behavior\r\n\r\n- Filter panel now stays open when clicking elsewhere in the interface\r\n- Panel only closes when the filter button is clicked again\r\n- Eliminates accidental filter panel closures during normal use\r\n\r\n## Performance Improvements\r\n\r\n### Filter Operations\r\n\r\n- Adding and removing filters is now significantly faster\r\n- Reduced lag when building complex filter queries\r\n- Search input state preserved during filter modifications\r\n\r\n### Migration System\r\n\r\n- Early migration detection prevents DOM errors on first use\r\n- Better error handling during plugin initialization\r\n- Cleaner migration process for new users\r\n\r\n## Bug Fixes\r\n\r\n### First-Time User Experience\r\n\r\n- Fixed \"removeChild\" DOM errors when using filters for the first time\r\n- Resolved race conditions between migration and UI initialization\r\n- Added fallback UI states for improved reliability\r\n\r\n### FilterBar Stability\r\n\r\n- Added DOM connection checks before manipulation\r\n- Improved error boundaries in filter rendering\r\n- Better cleanup of event listeners on component destruction\r\n\r\n## Technical Changes\r\n\r\n### View State Management\r\n\r\n- Saved views migrate from localStorage to plugin data system\r\n- ViewStateManager now uses plugin settings for persistence\r\n- Enhanced migration detection and completion tracking\r\n\r\n### Error Handling\r\n\r\n- Added safety checks for DOM element manipulation\r\n- Graceful degradation when filter operations fail\r\n- Improved logging for troubleshooting migration issues\r\n\r\n","aliases":["/releases/3.13.1/","/releases/3.13.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"saved-filter-views-storage","text":"Saved Filter Views Storage"},{"level":3,"id":"filterbar-behavior","text":"FilterBar Behavior"},{"level":2,"id":"performance-improvements","text":"Performance Improvements"},{"level":3,"id":"filter-operations","text":"Filter Operations"},{"level":3,"id":"migration-system","text":"Migration System"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"first-time-user-experience","text":"First-Time User Experience"},{"level":3,"id":"filterbar-stability","text":"FilterBar Stability"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"view-state-management","text":"View State Management"},{"level":3,"id":"error-handling","text":"Error Handling"}],"html":"

New Features#

\n

Saved Filter Views Storage#

\n
    \n
  • Saved filter views now sync across devices with your vault
  • \n
  • Views are stored in plugin data instead of browser localStorage
  • \n
  • Automatic migration from previous storage system on first load
  • \n
\n

FilterBar Behavior#

\n
    \n
  • Filter panel now stays open when clicking elsewhere in the interface
  • \n
  • Panel only closes when the filter button is clicked again
  • \n
  • Eliminates accidental filter panel closures during normal use
  • \n
\n

Performance Improvements#

\n

Filter Operations#

\n
    \n
  • Adding and removing filters is now significantly faster
  • \n
  • Reduced lag when building complex filter queries
  • \n
  • Search input state preserved during filter modifications
  • \n
\n

Migration System#

\n
    \n
  • Early migration detection prevents DOM errors on first use
  • \n
  • Better error handling during plugin initialization
  • \n
  • Cleaner migration process for new users
  • \n
\n

Bug Fixes#

\n

First-Time User Experience#

\n
    \n
  • Fixed "removeChild" DOM errors when using filters for the first time
  • \n
  • Resolved race conditions between migration and UI initialization
  • \n
  • Added fallback UI states for improved reliability
  • \n
\n

FilterBar Stability#

\n
    \n
  • Added DOM connection checks before manipulation
  • \n
  • Improved error boundaries in filter rendering
  • \n
  • Better cleanup of event listeners on component destruction
  • \n
\n

Technical Changes#

\n

View State Management#

\n
    \n
  • Saved views migrate from localStorage to plugin data system
  • \n
  • ViewStateManager now uses plugin settings for persistence
  • \n
  • Enhanced migration detection and completion tracking
  • \n
\n

Error Handling#

\n
    \n
  • Added safety checks for DOM element manipulation
  • \n
  • Graceful degradation when filter operations fail
  • \n
  • Improved logging for troubleshooting migration issues
  • \n
\n","text":"New Features# Saved Filter Views Storage# Saved filter views now sync across devices with your vault Views are stored in plugin data instead of browser localStorage Automatic migration from previous storage system on first load FilterBar Behavior# Filter panel now stays open when clicking elsewhere in the interface Panel only closes when the filter button is clicked again Eliminates accidental filter panel closures during normal use Performance Improvements# Filter Operations# Adding and removing filters is now significantly faster Reduced lag when building complex filter queries Search input state preserved during filter modifications Migration System# Early migration detection prevents DOM errors on first use Better error handling during plugin initialization Cleaner migration process for new users Bug Fixes# First-Time User Experience# Fixed \"removeChild\" DOM errors when using filters for the first time Resolved race conditions between migration and UI initialization Added fallback UI states for improved reliability FilterBar Stability# Added DOM connection checks before manipulation Improved error boundaries in filter rendering Better cleanup of event listeners on component destruction Technical Changes# View State Management# Saved views migrate from localStorage to plugin data system ViewStateManager now uses plugin settings for persistence Enhanced migration detection and completion tracking Error Handling# Added safety checks for DOM element manipulation Graceful degradation when filter operations fail Improved logging for troubleshooting migration issues"},{"route":"/obsidian/releases/3.13.2/","title":"Release Notes - 3.13.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.2.md","namespace":"obsidian","relativePath":"releases/3.13.2.md","raw":"# Release Notes - 3.13.2\r\n\r\n## Performance Improvements\r\n\r\n### FilterBar and Saved Views\r\n- Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters\r\n- Added \"Select...\" placeholder option for new filter conditions to prevent premature filtering\r\n- Eliminated unnecessary cache re-indexing when saving or deleting saved views\r\n- Made settings system smarter to only trigger cache updates when indexing-related settings actually change\r\n\r\n### Filter Processing\r\n- Implemented index-backed filtering that processes significantly fewer tasks for filtered views\r\n- Added intelligent query result caching with automatic expiration to eliminate redundant operations\r\n- Improved candidate selection using existing status, date, and overdue task indexes\r\n- Enhanced set intersection logic for multiple AND conditions to further reduce processing\r\n\r\n## Bug Fixes\r\n\r\n### Filter Logic\r\n- Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions\r\n- Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups\r\n- Improved query structure analysis to ensure filter correctness\r\n\r\n### Saved Views\r\n- Fixed issue where modifying one saved view could affect others due to shared object references\r\n- Added proper deep cloning of FilterQuery objects throughout the ViewStateManager\r\n- Ensured saved views remain independent when modified\r\n\r\n## Technical Details\r\n\r\n### Index Optimization Safety\r\n- Index optimizations now only apply when provably safe (AND relationships between indexed conditions)\r\n- Added recursive query analysis to detect OR groups containing indexed conditions\r\n- Maintains filter correctness while providing performance benefits where safe\r\n\r\n### Cache Management\r\n- Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping\r\n- Query result caching with 30-second auto-expiration and immediate invalidation on data changes\r\n- Debug logging available for performance monitoring\r\n\r\n## Performance Impact\r\n\r\n- Filter building is now responsive with no lag when adding conditions\r\n- Saved view operations are instant with no unnecessary re-indexing\r\n- Repeated filter operations are nearly instant due to intelligent caching\r\n- Significant memory usage reduction for large vaults\r\n\r\n","aliases":["/releases/3.13.2/","/releases/3.13.2/"],"toc":[{"level":2,"id":"performance-improvements","text":"Performance Improvements"},{"level":3,"id":"filterbar-and-saved-views","text":"FilterBar and Saved Views"},{"level":3,"id":"filter-processing","text":"Filter Processing"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filter-logic","text":"Filter Logic"},{"level":3,"id":"saved-views","text":"Saved Views"},{"level":2,"id":"technical-details","text":"Technical Details"},{"level":3,"id":"index-optimization-safety","text":"Index Optimization Safety"},{"level":3,"id":"cache-management","text":"Cache Management"},{"level":2,"id":"performance-impact","text":"Performance Impact"}],"html":"

Performance Improvements#

\n

FilterBar and Saved Views#

\n
    \n
  • Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters
  • \n
  • Added "Select..." placeholder option for new filter conditions to prevent premature filtering
  • \n
  • Eliminated unnecessary cache re-indexing when saving or deleting saved views
  • \n
  • Made settings system smarter to only trigger cache updates when indexing-related settings actually change
  • \n
\n

Filter Processing#

\n
    \n
  • Implemented index-backed filtering that processes significantly fewer tasks for filtered views
  • \n
  • Added intelligent query result caching with automatic expiration to eliminate redundant operations
  • \n
  • Improved candidate selection using existing status, date, and overdue task indexes
  • \n
  • Enhanced set intersection logic for multiple AND conditions to further reduce processing
  • \n
\n

Bug Fixes#

\n

Filter Logic#

\n
    \n
  • Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions
  • \n
  • Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups
  • \n
  • Improved query structure analysis to ensure filter correctness
  • \n
\n

Saved Views#

\n
    \n
  • Fixed issue where modifying one saved view could affect others due to shared object references
  • \n
  • Added proper deep cloning of FilterQuery objects throughout the ViewStateManager
  • \n
  • Ensured saved views remain independent when modified
  • \n
\n

Technical Details#

\n

Index Optimization Safety#

\n
    \n
  • Index optimizations now only apply when provably safe (AND relationships between indexed conditions)
  • \n
  • Added recursive query analysis to detect OR groups containing indexed conditions
  • \n
  • Maintains filter correctness while providing performance benefits where safe
  • \n
\n

Cache Management#

\n
    \n
  • Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping
  • \n
  • Query result caching with 30-second auto-expiration and immediate invalidation on data changes
  • \n
  • Debug logging available for performance monitoring
  • \n
\n

Performance Impact#

\n
    \n
  • Filter building is now responsive with no lag when adding conditions
  • \n
  • Saved view operations are instant with no unnecessary re-indexing
  • \n
  • Repeated filter operations are nearly instant due to intelligent caching
  • \n
  • Significant memory usage reduction for large vaults
  • \n
\n","text":"Performance Improvements# FilterBar and Saved Views# Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters Added \"Select...\" placeholder option for new filter conditions to prevent premature filtering Eliminated unnecessary cache re-indexing when saving or deleting saved views Made settings system smarter to only trigger cache updates when indexing-related settings actually change Filter Processing# Implemented index-backed filtering that processes significantly fewer tasks for filtered views Added intelligent query result caching with automatic expiration to eliminate redundant operations Improved candidate selection using existing status, date, and overdue task indexes Enhanced set intersection logic for multiple AND conditions to further reduce processing Bug Fixes# Filter Logic# Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups Improved query structure analysis to ensure filter correctness Saved Views# Fixed issue where modifying one saved view could affect others due to shared object references Added proper deep cloning of FilterQuery objects throughout the ViewStateManager Ensured saved views remain independent when modified Technical Details# Index Optimization Safety# Index optimizations now only apply when provably safe (AND relationships between indexed conditions) Added recursive query analysis to detect OR groups containing indexed conditions Maintains filter correctness while providing performance benefits where safe Cache Management# Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping Query result caching with 30-second auto-expiration and immediate invalidation on data changes Debug logging available for performance monitoring Performance Impact# Filter building is now responsive with no lag when adding conditions Saved view operations are instant with no unnecessary re-indexing Repeated filter operations are nearly instant due to intelligent caching Significant memory usage reduction for large vaults"},{"route":"/obsidian/releases/3.13.3/","title":"Release Notes - 3.13.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.3.md","namespace":"obsidian","relativePath":"releases/3.13.3.md","raw":"# Release Notes - 3.13.3\r\n\r\n## Bug Fixes\r\n\r\n### Fixed recurring task completion date recording\r\n- Resolved issue where \"mark completed for this date\" context menu option recorded completion for the wrong date\r\n- Fixed timezone inconsistency between completion date storage and checking logic\r\n- Recurring tasks now properly track completion status per calendar date\r\n\r\n### Improved recurring task filtering\r\n- Fixed \"Is completed\" filter condition to respect per-date completion status for recurring tasks\r\n- Filter results now accurately reflect whether recurring tasks are completed for specific dates\r\n\r\n## Enhancements\r\n\r\n### AgendaView improvements\r\n- Restored Today button with improved header layout\r\n- Reorganized header into three sections: navigation controls, period title, and actions\r\n- Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates\r\n- Removed keyboard navigation shortcuts (left/right arrows)\r\n\r\n### Interface updates\r\n- Enhanced AgendaView header styling with better spacing and visual hierarchy\r\n- Added responsive design for mobile layouts\r\n- Improved button styling with proper hover and focus states\r\n\r\n## Technical Changes\r\n\r\n- Updated TaskService to use consistent local timezone formatting for completion dates\r\n- Enhanced FilterService to properly evaluate recurring task completion status\r\n- Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling\r\n\r\n## Testing\r\n\r\n- Added comprehensive test coverage for timezone handling and date formatting consistency\r\n- Added tests to verify recurring task completion behavior across different scenarios\r\n\r\n\r\n","aliases":["/releases/3.13.3/","/releases/3.13.3/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"fixed-recurring-task-completion-date-recording","text":"Fixed recurring task completion date recording"},{"level":3,"id":"improved-recurring-task-filtering","text":"Improved recurring task filtering"},{"level":2,"id":"enhancements","text":"Enhancements"},{"level":3,"id":"agendaview-improvements","text":"AgendaView improvements"},{"level":3,"id":"interface-updates","text":"Interface updates"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":2,"id":"testing","text":"Testing"}],"html":"

Bug Fixes#

\n

Fixed recurring task completion date recording#

\n
    \n
  • Resolved issue where "mark completed for this date" context menu option recorded completion for the wrong date
  • \n
  • Fixed timezone inconsistency between completion date storage and checking logic
  • \n
  • Recurring tasks now properly track completion status per calendar date
  • \n
\n

Improved recurring task filtering#

\n
    \n
  • Fixed "Is completed" filter condition to respect per-date completion status for recurring tasks
  • \n
  • Filter results now accurately reflect whether recurring tasks are completed for specific dates
  • \n
\n

Enhancements#

\n

AgendaView improvements#

\n
    \n
  • Restored Today button with improved header layout
  • \n
  • Reorganized header into three sections: navigation controls, period title, and actions
  • \n
  • Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates
  • \n
  • Removed keyboard navigation shortcuts (left/right arrows)
  • \n
\n

Interface updates#

\n
    \n
  • Enhanced AgendaView header styling with better spacing and visual hierarchy
  • \n
  • Added responsive design for mobile layouts
  • \n
  • Improved button styling with proper hover and focus states
  • \n
\n

Technical Changes#

\n
    \n
  • Updated TaskService to use consistent local timezone formatting for completion dates
  • \n
  • Enhanced FilterService to properly evaluate recurring task completion status
  • \n
  • Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling
  • \n
\n

Testing#

\n
    \n
  • Added comprehensive test coverage for timezone handling and date formatting consistency
  • \n
  • Added tests to verify recurring task completion behavior across different scenarios
  • \n
\n","text":"Bug Fixes# Fixed recurring task completion date recording# Resolved issue where \"mark completed for this date\" context menu option recorded completion for the wrong date Fixed timezone inconsistency between completion date storage and checking logic Recurring tasks now properly track completion status per calendar date Improved recurring task filtering# Fixed \"Is completed\" filter condition to respect per-date completion status for recurring tasks Filter results now accurately reflect whether recurring tasks are completed for specific dates Enhancements# AgendaView improvements# Restored Today button with improved header layout Reorganized header into three sections: navigation controls, period title, and actions Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates Removed keyboard navigation shortcuts (left/right arrows) Interface updates# Enhanced AgendaView header styling with better spacing and visual hierarchy Added responsive design for mobile layouts Improved button styling with proper hover and focus states Technical Changes# Updated TaskService to use consistent local timezone formatting for completion dates Enhanced FilterService to properly evaluate recurring task completion status Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling Testing# Added comprehensive test coverage for timezone handling and date formatting consistency Added tests to verify recurring task completion behavior across different scenarios"},{"route":"/obsidian/releases/3.13.4/","title":"Release Notes - 3.13.4","description":"Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.13.4.md","namespace":"obsidian","relativePath":"releases/3.13.4.md","raw":"# Release Notes - 3.13.4\r\n\r\n## Bug Fixes\r\n\r\n### FilterBar Migration Issues\r\n- Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0\r\n- Resolved `Cannot read properties of undefined (reading 'forEach')` and `Cannot read properties of undefined (reading 'find')` errors in FilterBar rendering\r\n- Added detection for old FilterQuery format and automatic replacement with fresh defaults\r\n- Users upgrading from older versions now get clean filter states instead of broken data structures\r\n- Preserved valid sort and grouping settings when replacing incompatible filter data\r\n- Added error boundaries with console warnings for better debugging\r\n\r\n*Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally [@bcohen44](https://github.com/callumalpass/tasknotes/issues/170#issuecomment-3066981483) for reporting the FilterBar crashes that led to identifying these migration issues.*\r\n\r\n## Features\r\n\r\n### Calendar View Improvements\r\n- Added ICS refresh button directly in the Advanced Calendar view toolbar\r\n- ICS calendar subscriptions can now be refreshed without opening settings\r\n- Button integrates with existing ICS subscription service and triggers immediate calendar re-render\r\n- Improved ICS settings layout with horizontal button arrangement\r\n- Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides\r\n- Extended today highlight disable to timegrid columns for visual consistency\r\n\r\n## Notes\r\n\r\nThis release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0.\r\n\r\nThe ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings.\r\n","aliases":["/releases/3.13.4/","/releases/3.13.4/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"filterbar-migration-issues","text":"FilterBar Migration Issues"},{"level":2,"id":"features","text":"Features"},{"level":3,"id":"calendar-view-improvements","text":"Calendar View Improvements"},{"level":2,"id":"notes","text":"Notes"}],"html":"

Bug Fixes#

\n

FilterBar Migration Issues#

\n
    \n
  • Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0
  • \n
  • Resolved Cannot read properties of undefined (reading 'forEach') and Cannot read properties of undefined (reading 'find') errors in FilterBar rendering
  • \n
  • Added detection for old FilterQuery format and automatic replacement with fresh defaults
  • \n
  • Users upgrading from older versions now get clean filter states instead of broken data structures
  • \n
  • Preserved valid sort and grouping settings when replacing incompatible filter data
  • \n
  • Added error boundaries with console warnings for better debugging
  • \n
\n

Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues.

\n

Features#

\n

Calendar View Improvements#

\n
    \n
  • Added ICS refresh button directly in the Advanced Calendar view toolbar
  • \n
  • ICS calendar subscriptions can now be refreshed without opening settings
  • \n
  • Button integrates with existing ICS subscription service and triggers immediate calendar re-render
  • \n
  • Improved ICS settings layout with horizontal button arrangement
  • \n
  • Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides
  • \n
  • Extended today highlight disable to timegrid columns for visual consistency
  • \n
\n

Notes#

\n

This release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0.

\n

The ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings.

\n","text":"Bug Fixes# FilterBar Migration Issues# Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0 Resolved Cannot read properties of undefined (reading 'forEach') and Cannot read properties of undefined (reading 'find') errors in FilterBar rendering Added detection for old FilterQuery format and automatic replacement with fresh defaults Users upgrading from older versions now get clean filter states instead of broken data structures Preserved valid sort and grouping settings when replacing incompatible filter data Added error boundaries with console warnings for better debugging Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues. Features# Calendar View Improvements# Added ICS refresh button directly in the Advanced Calendar view toolbar ICS calendar subscriptions can now be refreshed without opening settings Button integrates with existing ICS subscription service and triggers immediate calendar re-render Improved ICS settings layout with horizontal button arrangement Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides Extended today highlight disable to timegrid columns for visual consistency Notes# This release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0. The ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings."},{"route":"/obsidian/releases/3.14.0/","title":"Release 3.14.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.14.0.md","namespace":"obsidian","relativePath":"releases/3.14.0.md","raw":"# Release 3.14.0\r\n\r\n## New Features\r\n\r\n### Project Management Enhancements\r\n\r\n- Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion\r\n- Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191]\r\n- Create Subtask Option: Added \"Create subtask\" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request\r\n- Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191]\r\n\r\n### User Interface Improvements\r\n\r\n- Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion\r\n- Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191]\r\n- Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR\r\n\r\n## Bug Fixes\r\n\r\n### Calendar and Recurring Tasks\r\n\r\n- Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations\r\n- All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting\r\n\r\n### Settings and State Management\r\n\r\n- Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report\r\n\r\n### Technical Changes\r\n\r\n### Performance and Stability\r\n\r\n- Enhanced cache management and event handling for project-related functionality\r\n- Improved error handling in project subtask operations\r\n- Optimized project detection algorithms for better performance\r\n\r\n### Code Organization\r\n\r\n- Refactored project-related services for better modularity\r\n- Enhanced TypeScript type definitions for project functionality\r\n- Improved service initialization and cleanup processes\r\n\r\n## Documentation\r\n\r\n- Updated README with new project assets and feature documentation\r\n","aliases":["/releases/3.14.0/","/releases/3.14.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-management-enhancements","text":"Project Management Enhancements"},{"level":3,"id":"user-interface-improvements","text":"User Interface Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-and-recurring-tasks","text":"Calendar and Recurring Tasks"},{"level":3,"id":"settings-and-state-management","text":"Settings and State Management"},{"level":3,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"performance-and-stability","text":"Performance and Stability"},{"level":3,"id":"code-organization","text":"Code Organization"},{"level":2,"id":"documentation","text":"Documentation"}],"html":"

New Features#

\n

Project Management Enhancements#

\n
    \n
  • Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion
  • \n
  • Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191]
  • \n
  • Create Subtask Option: Added "Create subtask" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request
  • \n
  • Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191]
  • \n
\n

User Interface Improvements#

\n
    \n
  • Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion
  • \n
  • Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191]
  • \n
  • Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR
  • \n
\n

Bug Fixes#

\n

Calendar and Recurring Tasks#

\n
    \n
  • Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations
  • \n
  • All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting
  • \n
\n

Settings and State Management#

\n
    \n
  • Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report
  • \n
\n

Technical Changes#

\n

Performance and Stability#

\n
    \n
  • Enhanced cache management and event handling for project-related functionality
  • \n
  • Improved error handling in project subtask operations
  • \n
  • Optimized project detection algorithms for better performance
  • \n
\n

Code Organization#

\n
    \n
  • Refactored project-related services for better modularity
  • \n
  • Enhanced TypeScript type definitions for project functionality
  • \n
  • Improved service initialization and cleanup processes
  • \n
\n

Documentation#

\n
    \n
  • Updated README with new project assets and feature documentation
  • \n
\n","text":"New Features# Project Management Enhancements# Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191] Create Subtask Option: Added \"Create subtask\" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191] User Interface Improvements# Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191] Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR Bug Fixes# Calendar and Recurring Tasks# Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting Settings and State Management# Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report Technical Changes# Performance and Stability# Enhanced cache management and event handling for project-related functionality Improved error handling in project subtask operations Optimized project detection algorithms for better performance Code Organization# Refactored project-related services for better modularity Enhanced TypeScript type definitions for project functionality Improved service initialization and cleanup processes Documentation# Updated README with new project assets and feature documentation"},{"route":"/obsidian/releases/3.15.0/","title":"Release 3.15.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.15.0.md","namespace":"obsidian","relativePath":"releases/3.15.0.md","raw":"# Release 3.15.0\n\n## New Features\n\n### NLP Input Enhancements\n\n- Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion\n- Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration\n- Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131]\n\n### Calendar Integration\n\n- ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests\n- ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220]\n- ICS Settings: Added ICS integration settings to calendar tab\n- Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this\n- Time Entry Interaction: Added time entry interaction functionality to advanced calendar\n\n### Time Management\n\n- Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184]\n- Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request\n- Pomodoro View: Added task card display and improved controls to pomodoro view [#184]\n- Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion\n\n### User Interface Improvements\n\n- Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback\n- Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion\n- Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request\n- UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements\n\n## Bug Fixes\n\n### Task Management\n\n- Nested Tags: Fixed support for nested tags in FilterBar\n- TypeError Resolution: Resolved TypeError when calling includes on non-array values\n\n### Calendar Integration\n\n- Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report\n- Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233]\n\n## Documentation\n\n- Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality\n- ICS Integration Guide: Created detailed ICS calendar integration documentation\n- Release Notes: Added comprehensive release notes documentation with links to all versions\n- Inline Task Widget: Added screenshots and documentation for inline task widgets\n\n## Technical Changes\n\n### Code Organization\n\n- Enhanced service architecture for ICS integration\n- Improved field mapping system for calendar events\n- Optimized auto-suggestion algorithms\n- Enhanced type definitions for new functionality\n\n### Performance\n\n- Improved rendering performance for pomodoro view\n- Optimized calendar event handling\n- Enhanced note picker search capabilities\n","aliases":["/releases/3.15.0/","/releases/3.15.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"nlp-input-enhancements","text":"NLP Input Enhancements"},{"level":3,"id":"calendar-integration","text":"Calendar Integration"},{"level":3,"id":"time-management","text":"Time Management"},{"level":3,"id":"user-interface-improvements","text":"User Interface Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-management","text":"Task Management"},{"level":3,"id":"calendar-integration-2","text":"Calendar Integration"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"code-organization","text":"Code Organization"},{"level":3,"id":"performance","text":"Performance"}],"html":"

New Features#

\n

NLP Input Enhancements#

\n
    \n
  • Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion
  • \n
  • Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration
  • \n
  • Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131]
  • \n
\n

Calendar Integration#

\n
    \n
  • ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests
  • \n
  • ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220]
  • \n
  • ICS Settings: Added ICS integration settings to calendar tab
  • \n
  • Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this
  • \n
  • Time Entry Interaction: Added time entry interaction functionality to advanced calendar
  • \n
\n

Time Management#

\n
    \n
  • Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184]
  • \n
  • Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request
  • \n
  • Pomodoro View: Added task card display and improved controls to pomodoro view [#184]
  • \n
  • Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion
  • \n
\n

User Interface Improvements#

\n
    \n
  • Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback
  • \n
  • Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion
  • \n
  • Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request
  • \n
  • UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements
  • \n
\n

Bug Fixes#

\n

Task Management#

\n
    \n
  • Nested Tags: Fixed support for nested tags in FilterBar
  • \n
  • TypeError Resolution: Resolved TypeError when calling includes on non-array values
  • \n
\n

Calendar Integration#

\n
    \n
  • Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report
  • \n
  • Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233]
  • \n
\n

Documentation#

\n
    \n
  • Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality
  • \n
  • ICS Integration Guide: Created detailed ICS calendar integration documentation
  • \n
  • Release Notes: Added comprehensive release notes documentation with links to all versions
  • \n
  • Inline Task Widget: Added screenshots and documentation for inline task widgets
  • \n
\n

Technical Changes#

\n

Code Organization#

\n
    \n
  • Enhanced service architecture for ICS integration
  • \n
  • Improved field mapping system for calendar events
  • \n
  • Optimized auto-suggestion algorithms
  • \n
  • Enhanced type definitions for new functionality
  • \n
\n

Performance#

\n
    \n
  • Improved rendering performance for pomodoro view
  • \n
  • Optimized calendar event handling
  • \n
  • Enhanced note picker search capabilities
  • \n
\n","text":"New Features# NLP Input Enhancements# Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131] Calendar Integration# ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220] ICS Settings: Added ICS integration settings to calendar tab Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this Time Entry Interaction: Added time entry interaction functionality to advanced calendar Time Management# Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184] Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request Pomodoro View: Added task card display and improved controls to pomodoro view [#184] Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion User Interface Improvements# Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements Bug Fixes# Task Management# Nested Tags: Fixed support for nested tags in FilterBar TypeError Resolution: Resolved TypeError when calling includes on non-array values Calendar Integration# Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233] Documentation# Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality ICS Integration Guide: Created detailed ICS calendar integration documentation Release Notes: Added comprehensive release notes documentation with links to all versions Inline Task Widget: Added screenshots and documentation for inline task widgets Technical Changes# Code Organization# Enhanced service architecture for ICS integration Improved field mapping system for calendar events Optimized auto-suggestion algorithms Enhanced type definitions for new functionality Performance# Improved rendering performance for pomodoro view Optimized calendar event handling Enhanced note picker search capabilities"},{"route":"/obsidian/releases/3.15.1/","title":"Release 3.15.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.15.1.md","namespace":"obsidian","relativePath":"releases/3.15.1.md","raw":"# Release 3.15.1\n\n## New Features\n\n### Kanban Board Enhancements\n\n- Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity\n- Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation\n\n### Calendar Improvements\n\n- All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR\n- Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., `fc-tag-meeting`, `fc-tag-work`), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation\n\n## Bug Fixes\n\n### Kanban Board\n\n- Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report\n\n### Subtask Widget Issues\n\n- Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234]\n- Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207]\n\n## Technical Changes\n\n### Documentation\n\n- Fixed line break formatting issues in documentation files\n\n### Code Organization\n\n- Improved task grouping architecture with new options interface\n- Enhanced calendar event rendering system for better tag-based customization\n- Refined subtask widget positioning logic for better editor integration\n","aliases":["/releases/3.15.1/","/releases/3.15.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"kanban-board-enhancements","text":"Kanban Board Enhancements"},{"level":3,"id":"calendar-improvements","text":"Calendar Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"kanban-board","text":"Kanban Board"},{"level":3,"id":"subtask-widget-issues","text":"Subtask Widget Issues"},{"level":2,"id":"technical-changes","text":"Technical Changes"},{"level":3,"id":"documentation","text":"Documentation"},{"level":3,"id":"code-organization","text":"Code Organization"}],"html":"

New Features#

\n

Kanban Board Enhancements#

\n
    \n
  • Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity
  • \n
  • Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation
  • \n
\n

Calendar Improvements#

\n
    \n
  • All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR
  • \n
  • Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., fc-tag-meeting, fc-tag-work), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation
  • \n
\n

Bug Fixes#

\n

Kanban Board#

\n
    \n
  • Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report
  • \n
\n

Subtask Widget Issues#

\n
    \n
  • Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234]
  • \n
  • Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207]
  • \n
\n

Technical Changes#

\n

Documentation#

\n
    \n
  • Fixed line break formatting issues in documentation files
  • \n
\n

Code Organization#

\n
    \n
  • Improved task grouping architecture with new options interface
  • \n
  • Enhanced calendar event rendering system for better tag-based customization
  • \n
  • Refined subtask widget positioning logic for better editor integration
  • \n
\n","text":"New Features# Kanban Board Enhancements# Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation Calendar Improvements# All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., fc-tag-meeting, fc-tag-work), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation Bug Fixes# Kanban Board# Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report Subtask Widget Issues# Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234] Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207] Technical Changes# Documentation# Fixed line break formatting issues in documentation files Code Organization# Improved task grouping architecture with new options interface Enhanced calendar event rendering system for better tag-based customization Refined subtask widget positioning logic for better editor integration"},{"route":"/obsidian/releases/3.16.0/","title":"TaskNotes 3.16.0","description":"Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.0.md","namespace":"obsidian","relativePath":"releases/3.16.0.md","raw":"# TaskNotes 3.16.0\n\n## New Features\n\n### Task Management\n\n- **Bulk Task Conversion**: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request\n- **Instant Task Conversion Enhancement**: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions\n- **Default Project Setting**: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request\n- **Advanced Tag and Project Parsing**: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug\n- **Enhanced Filter Bar Integration**: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion\n\n### Calendar and Views\n\n- **Custom Multi-Day Calendar View**: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request\n- **Responsive Calendar UI**: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion\n- **Locale-Aware Date Formatting**: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue\n- **Saved Views Enhancement**: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback\n\n### Task Organization\n\n- **Drag and Drop Status Reordering**: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion\n- **Overdue Tasks Filter**: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue\n- **Project Group Enhancements**: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion\n\n### Pomodoro Timer\n\n- **Background Timer Continuity**: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix\n- **System Notifications**: Convert Pomodoro notices to system notifications for better visibility (#136)\n- **Manual Duration Adjustment**: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing\n- **Task Completion Sorting**: Sort completed tasks to end of Pomodoro task selector for better organization\n\n## Bug Fixes\n\n### UI and Interaction\n\n- **Tooltip Standardization**: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report\n- **Open Note Button Stability**: Stabilized Open note button hover behavior and made font size consistent with other modal buttons\n- **Date Context Menu Clarity**: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion\n- **Project Removal**: Fixed project removal in edit modal not saving changes properly (#213)\n- **Advanced Calendar Resizing**: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix\n\n### Calendar and Recurring Tasks\n\n- **Timezone Bug Fixes**: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug\n- **Custom Calendar Display**: Fixed undefined days display in custom calendar view\n- **Calendar Recurrence**: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug\n\n### Task Management\n\n- **Pomodoro Task Tracking**: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report\n- **Plugin Conflict Protection**: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict\n- **Instant Conversion Improvements**: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues\n\n## Improvements\n\n### User Interface\n\n- **Minimalist Design System**: Implemented consistent borderless button design system across all components\n- **UI Polish**: Applied minimalist styling with cleaned up borders and shadows throughout the interface\n- **Settings Enhancement**: Enhanced settings explanatory sections with improved minimalist styling\n- **Advanced Calendar Title**: Made advanced calendar title smaller for better proportions\n\n### Search and Filtering\n\n- **Enhanced Search**: Improved search functionality to preserve existing filters when performing new searches\n- **Filter Preservation**: Better handling of filter states across different search operations\n\n### Development and Code Quality\n\n- **Code Documentation**: Improved code comments and documentation throughout the codebase\n- **Linting Cleanup**: Resolved various linting errors and improved code consistency\n- **Test Infrastructure**: Updated timezone-related tests to work reliably in CI environment\n- **GitHub Actions**: Added timeouts and offline preferences to improve CI reliability\n\n## Technical Improvements\n\n- Reduced excessive console logging from filter components\n- Updated Jest coverage thresholds to realistic levels\n- Improved error handling in various components\n- Improved defensive programming practices throughout the codebase\n\n## Contributors\n\nExtra thanks to **@Totobal5** for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes\n\n","aliases":["/releases/3.16.0/","/releases/3.16.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-management","text":"Task Management"},{"level":3,"id":"calendar-and-views","text":"Calendar and Views"},{"level":3,"id":"task-organization","text":"Task Organization"},{"level":3,"id":"pomodoro-timer","text":"Pomodoro Timer"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"ui-and-interaction","text":"UI and Interaction"},{"level":3,"id":"calendar-and-recurring-tasks","text":"Calendar and Recurring Tasks"},{"level":3,"id":"task-management-2","text":"Task Management"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"search-and-filtering","text":"Search and Filtering"},{"level":3,"id":"development-and-code-quality","text":"Development and Code Quality"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Task Management#

\n
    \n
  • Bulk Task Conversion: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request
  • \n
  • Instant Task Conversion Enhancement: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions
  • \n
  • Default Project Setting: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request
  • \n
  • Advanced Tag and Project Parsing: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug
  • \n
  • Enhanced Filter Bar Integration: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion
  • \n
\n

Calendar and Views#

\n
    \n
  • Custom Multi-Day Calendar View: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request
  • \n
  • Responsive Calendar UI: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion
  • \n
  • Locale-Aware Date Formatting: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue
  • \n
  • Saved Views Enhancement: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback
  • \n
\n

Task Organization#

\n
    \n
  • Drag and Drop Status Reordering: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion
  • \n
  • Overdue Tasks Filter: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue
  • \n
  • Project Group Enhancements: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion
  • \n
\n

Pomodoro Timer#

\n
    \n
  • Background Timer Continuity: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix
  • \n
  • System Notifications: Convert Pomodoro notices to system notifications for better visibility (#136)
  • \n
  • Manual Duration Adjustment: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing
  • \n
  • Task Completion Sorting: Sort completed tasks to end of Pomodoro task selector for better organization
  • \n
\n

Bug Fixes#

\n

UI and Interaction#

\n
    \n
  • Tooltip Standardization: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report
  • \n
  • Open Note Button Stability: Stabilized Open note button hover behavior and made font size consistent with other modal buttons
  • \n
  • Date Context Menu Clarity: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion
  • \n
  • Project Removal: Fixed project removal in edit modal not saving changes properly (#213)
  • \n
  • Advanced Calendar Resizing: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix
  • \n
\n

Calendar and Recurring Tasks#

\n
    \n
  • Timezone Bug Fixes: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug
  • \n
  • Custom Calendar Display: Fixed undefined days display in custom calendar view
  • \n
  • Calendar Recurrence: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug
  • \n
\n

Task Management#

\n
    \n
  • Pomodoro Task Tracking: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report
  • \n
  • Plugin Conflict Protection: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict
  • \n
  • Instant Conversion Improvements: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues
  • \n
\n

Improvements#

\n

User Interface#

\n
    \n
  • Minimalist Design System: Implemented consistent borderless button design system across all components
  • \n
  • UI Polish: Applied minimalist styling with cleaned up borders and shadows throughout the interface
  • \n
  • Settings Enhancement: Enhanced settings explanatory sections with improved minimalist styling
  • \n
  • Advanced Calendar Title: Made advanced calendar title smaller for better proportions
  • \n
\n

Search and Filtering#

\n
    \n
  • Enhanced Search: Improved search functionality to preserve existing filters when performing new searches
  • \n
  • Filter Preservation: Better handling of filter states across different search operations
  • \n
\n

Development and Code Quality#

\n
    \n
  • Code Documentation: Improved code comments and documentation throughout the codebase
  • \n
  • Linting Cleanup: Resolved various linting errors and improved code consistency
  • \n
  • Test Infrastructure: Updated timezone-related tests to work reliably in CI environment
  • \n
  • GitHub Actions: Added timeouts and offline preferences to improve CI reliability
  • \n
\n

Technical Improvements#

\n
    \n
  • Reduced excessive console logging from filter components
  • \n
  • Updated Jest coverage thresholds to realistic levels
  • \n
  • Improved error handling in various components
  • \n
  • Improved defensive programming practices throughout the codebase
  • \n
\n

Contributors#

\n

Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes

\n","text":"New Features# Task Management# Bulk Task Conversion: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request Instant Task Conversion Enhancement: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions Default Project Setting: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request Advanced Tag and Project Parsing: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug Enhanced Filter Bar Integration: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion Calendar and Views# Custom Multi-Day Calendar View: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request Responsive Calendar UI: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion Locale-Aware Date Formatting: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue Saved Views Enhancement: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback Task Organization# Drag and Drop Status Reordering: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion Overdue Tasks Filter: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue Project Group Enhancements: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion Pomodoro Timer# Background Timer Continuity: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix System Notifications: Convert Pomodoro notices to system notifications for better visibility (#136) Manual Duration Adjustment: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing Task Completion Sorting: Sort completed tasks to end of Pomodoro task selector for better organization Bug Fixes# UI and Interaction# Tooltip Standardization: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report Open Note Button Stability: Stabilized Open note button hover behavior and made font size consistent with other modal buttons Date Context Menu Clarity: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion Project Removal: Fixed project removal in edit modal not saving changes properly (#213) Advanced Calendar Resizing: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix Calendar and Recurring Tasks# Timezone Bug Fixes: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug Custom Calendar Display: Fixed undefined days display in custom calendar view Calendar Recurrence: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug Task Management# Pomodoro Task Tracking: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report Plugin Conflict Protection: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict Instant Conversion Improvements: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues Improvements# User Interface# Minimalist Design System: Implemented consistent borderless button design system across all components UI Polish: Applied minimalist styling with cleaned up borders and shadows throughout the interface Settings Enhancement: Enhanced settings explanatory sections with improved minimalist styling Advanced Calendar Title: Made advanced calendar title smaller for better proportions Search and Filtering# Enhanced Search: Improved search functionality to preserve existing filters when performing new searches Filter Preservation: Better handling of filter states across different search operations Development and Code Quality# Code Documentation: Improved code comments and documentation throughout the codebase Linting Cleanup: Resolved various linting errors and improved code consistency Test Infrastructure: Updated timezone-related tests to work reliably in CI environment GitHub Actions: Added timeouts and offline preferences to improve CI reliability Technical Improvements# Reduced excessive console logging from filter components Updated Jest coverage thresholds to realistic levels Improved error handling in various components Improved defensive programming practices throughout the codebase Contributors# Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes"},{"route":"/obsidian/releases/3.16.1/","title":"TaskNotes 3.16.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.1.md","namespace":"obsidian","relativePath":"releases/3.16.1.md","raw":"# TaskNotes 3.16.1\n\n## New Features\n\n### Task Management\n\n- **Visual Filter State Indicators**: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active\n\n## Bug Fixes\n\n### Link Generation and Consistency\n\n- **Obsidian Link Format Compliance**: Fixed \"Insert tasknote link\" and \"Convert task to TaskNote\" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support\n- **Consistent Link Formatting**: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred\n\n### Timezone and Date Handling\n\n- **Recurring Task Completion Fix**: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views\n- **UTC Date Consistency**: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking\n- **Calendar Date Normalization**: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling\n\n### User Interface\n\n- **Sort Arrow Visibility**: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode\n- **Duplicate Tooltip Prevention**: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes\n- **Pointer Cursor Consistency**: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution\n\n### Error Handling and Stability\n\n- **Daily Note Creation Protection**: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing \"Cannot read properties of undefined\" errors\n- **Security Compliance**: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations\n\n## Improvements\n\n### User Interface\n\n- **Calendar Styling Enhancements**: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency\n- **Enhanced Visual Definition**: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance\n\n### Development and Code Quality\n\n- **Test Infrastructure**: Added missing setTooltip mock to resolve 39 failing TaskCard tests\n- **Documentation Updates**: Improved documentation formatting and appearance\n\n## Technical Improvements\n\n- Enhanced date handling throughout the codebase with UTC method standardization\n- Improved defensive programming practices for timezone-sensitive operations\n- Better error messaging for daily note creation failures\n- Code security improvements with ESLint compliance\n\n","aliases":["/releases/3.16.1/","/releases/3.16.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-management","text":"Task Management"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"link-generation-and-consistency","text":"Link Generation and Consistency"},{"level":3,"id":"timezone-and-date-handling","text":"Timezone and Date Handling"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"error-handling-and-stability","text":"Error Handling and Stability"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"user-interface-2","text":"User Interface"},{"level":3,"id":"development-and-code-quality","text":"Development and Code Quality"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"}],"html":"

New Features#

\n

Task Management#

\n
    \n
  • Visual Filter State Indicators: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active
  • \n
\n

Bug Fixes#

\n\n
    \n
  • Obsidian Link Format Compliance: Fixed "Insert tasknote link" and "Convert task to TaskNote" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support
  • \n
  • Consistent Link Formatting: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred
  • \n
\n

Timezone and Date Handling#

\n
    \n
  • Recurring Task Completion Fix: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views
  • \n
  • UTC Date Consistency: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking
  • \n
  • Calendar Date Normalization: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling
  • \n
\n

User Interface#

\n
    \n
  • Sort Arrow Visibility: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode
  • \n
  • Duplicate Tooltip Prevention: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes
  • \n
  • Pointer Cursor Consistency: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution
  • \n
\n

Error Handling and Stability#

\n
    \n
  • Daily Note Creation Protection: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing "Cannot read properties of undefined" errors
  • \n
  • Security Compliance: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations
  • \n
\n

Improvements#

\n

User Interface#

\n
    \n
  • Calendar Styling Enhancements: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency
  • \n
  • Enhanced Visual Definition: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance
  • \n
\n

Development and Code Quality#

\n
    \n
  • Test Infrastructure: Added missing setTooltip mock to resolve 39 failing TaskCard tests
  • \n
  • Documentation Updates: Improved documentation formatting and appearance
  • \n
\n

Technical Improvements#

\n
    \n
  • Enhanced date handling throughout the codebase with UTC method standardization
  • \n
  • Improved defensive programming practices for timezone-sensitive operations
  • \n
  • Better error messaging for daily note creation failures
  • \n
  • Code security improvements with ESLint compliance
  • \n
\n","text":"New Features# Task Management# Visual Filter State Indicators: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active Bug Fixes# Link Generation and Consistency# Obsidian Link Format Compliance: Fixed \"Insert tasknote link\" and \"Convert task to TaskNote\" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support Consistent Link Formatting: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred Timezone and Date Handling# Recurring Task Completion Fix: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views UTC Date Consistency: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking Calendar Date Normalization: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling User Interface# Sort Arrow Visibility: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode Duplicate Tooltip Prevention: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes Pointer Cursor Consistency: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution Error Handling and Stability# Daily Note Creation Protection: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing \"Cannot read properties of undefined\" errors Security Compliance: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations Improvements# User Interface# Calendar Styling Enhancements: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency Enhanced Visual Definition: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance Development and Code Quality# Test Infrastructure: Added missing setTooltip mock to resolve 39 failing TaskCard tests Documentation Updates: Improved documentation formatting and appearance Technical Improvements# Enhanced date handling throughout the codebase with UTC method standardization Improved defensive programming practices for timezone-sensitive operations Better error messaging for daily note creation failures Code security improvements with ESLint compliance"},{"route":"/obsidian/releases/3.16.2/","title":"TaskNotes 3.16.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.2.md","namespace":"obsidian","relativePath":"releases/3.16.2.md","raw":"# TaskNotes 3.16.2\n\n## New Features\n\n### Task Link Integration\n\n- **Markdown Link Support for Inline Task Widgets**: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders `[text](path)` markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links\n\n## Improvements\n\n### Link Processing\n\n- **Link Detection**: Improved TaskLinkDetectionService to detect both `[[wikilinks]]` and `[markdown](links)` with proper URL decoding for paths containing spaces\n- **Link Rendering**: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently\n- **API Integration**: Uses proper Obsidian API functions (`parseLinktext()` and `getFirstLinkpathDest()`) for reliable link resolution\n","aliases":["/releases/3.16.2/","/releases/3.16.2/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-link-integration","text":"Task Link Integration"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"link-processing","text":"Link Processing"}],"html":"

New Features#

\n\n
    \n
  • Markdown Link Support for Inline Task Widgets: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders [text](path) markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links
  • \n
\n

Improvements#

\n\n
    \n
  • Link Detection: Improved TaskLinkDetectionService to detect both [[wikilinks]] and [markdown](links) with proper URL decoding for paths containing spaces
  • \n
  • Link Rendering: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently
  • \n
  • API Integration: Uses proper Obsidian API functions (parseLinktext() and getFirstLinkpathDest()) for reliable link resolution
  • \n
\n","text":"New Features# Task Link Integration# Markdown Link Support for Inline Task Widgets: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders [text](path) markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links Improvements# Link Processing# Link Detection: Improved TaskLinkDetectionService to detect both [[wikilinks]] and [markdown](links) with proper URL decoding for paths containing spaces Link Rendering: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently API Integration: Uses proper Obsidian API functions (parseLinktext() and getFirstLinkpathDest()) for reliable link resolution"},{"route":"/obsidian/releases/3.16.3/","title":"TaskNotes 3.16.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.3.md","namespace":"obsidian","relativePath":"releases/3.16.3.md","raw":"# TaskNotes 3.16.3\n\n## Bug Fixes\n\n### User Interface\n\n- **Create Task Modal Accessibility**: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue\n\n### Timezone Handling\n\n- **Recurring Task Calendar Display**: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view\n- **Task Completion Calendar**: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones\n\n### Task Conversion\n\n- **Context Detection in Instant Tasks**: Fixed instant task conversion to properly detect and preserve contexts specified with \"@context\" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue\n- **Time Preservation**: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process\n\n## Improvements\n\n### Code Quality\n\n- **Test Coverage**: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases","aliases":["/releases/3.16.3/","/releases/3.16.3/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"timezone-handling","text":"Timezone Handling"},{"level":3,"id":"task-conversion","text":"Task Conversion"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"code-quality","text":"Code Quality"}],"html":"

Bug Fixes#

\n

User Interface#

\n
    \n
  • Create Task Modal Accessibility: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue
  • \n
\n

Timezone Handling#

\n
    \n
  • Recurring Task Calendar Display: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view
  • \n
  • Task Completion Calendar: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones
  • \n
\n

Task Conversion#

\n
    \n
  • Context Detection in Instant Tasks: Fixed instant task conversion to properly detect and preserve contexts specified with "@context" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue
  • \n
  • Time Preservation: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process
  • \n
\n

Improvements#

\n

Code Quality#

\n
    \n
  • Test Coverage: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases
  • \n
\n","text":"Bug Fixes# User Interface# Create Task Modal Accessibility: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue Timezone Handling# Recurring Task Calendar Display: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view Task Completion Calendar: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones Task Conversion# Context Detection in Instant Tasks: Fixed instant task conversion to properly detect and preserve contexts specified with \"@context\" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue Time Preservation: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process Improvements# Code Quality# Test Coverage: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases"},{"route":"/obsidian/releases/3.16.4/","title":"TaskNotes 3.16.4","description":"This ensures users can always edit task titles regardless of the modal type or natural language input settings.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.16.4.md","namespace":"obsidian","relativePath":"releases/3.16.4.md","raw":"# TaskNotes 3.16.4\n\n## Bug Fixes\n\n### User Interface\n\n- **Task Modal Title Field**: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic:\n - Edit modals: Title field always visible in the details section\n - Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea)\n - Create modals with natural language input disabled: Title field only appears at the top of the modal\n\nThis ensures users can always edit task titles regardless of the modal type or natural language input settings.","aliases":["/releases/3.16.4/","/releases/3.16.4/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"user-interface","text":"User Interface"}],"html":"

Bug Fixes#

\n

User Interface#

\n
    \n
  • Task Modal Title Field: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic:
      \n
    • Edit modals: Title field always visible in the details section
    • \n
    • Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea)
    • \n
    • Create modals with natural language input disabled: Title field only appears at the top of the modal
    • \n
    \n
  • \n
\n

This ensures users can always edit task titles regardless of the modal type or natural language input settings.

\n","text":"Bug Fixes# User Interface# Task Modal Title Field: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic: Edit modals: Title field always visible in the details section Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea) Create modals with natural language input disabled: Title field only appears at the top of the modal This ensures users can always edit task titles regardless of the modal type or natural language input settings."},{"route":"/obsidian/releases/3.17.0/","title":"TaskNotes 3.17.0","description":"This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.17.0.md","namespace":"obsidian","relativePath":"releases/3.17.0.md","raw":"# TaskNotes 3.17.0\n\n## Major Features\n\n### Enhanced Recurring Tasks with DTSTART Support\n\nThis release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering.\n\n**Background and Motivation:**\n\nThe previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior.\n\n**Key Improvements:**\n\n- **DTSTART Integration**: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern\n- **Dynamic Date Updates**: The `task.scheduled` field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates\n- **Flexible Next Occurrence Scheduling**: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling\n- **Visual Hierarchy**: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task\n- **Independent Time Control**: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern\n- **Dual Drag Behavior**: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance\n- **Automatic DTSTART Addition**: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions\n- **Manual Rescheduling Support**: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications\n\n### Expandable Project Subtasks\n\nA new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy.\n\n**Features:**\n\n- **Chevron Controls**: Click chevron icons on project task cards to expand/collapse subtask display\n- **Configurable**: New \"Show expandable subtasks\" setting allows users to enable/disable the feature\n\n### Responsive Pomodoro View\n\nThe Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design.\n\nThanks to @oliverlalan for requesting this improvement (#339).\n\n### Enhanced Filename Templates\n\nSignificant expansion of available template variables for task creation, providing much greater flexibility in filename patterns.\n\n**New Template Variables:**\n\n- **Date/Time Variations**: shortDate, monthName, dayName, week, quarter, time12, time24\n- **Unix Timestamps**: unix (seconds), unixMs (milliseconds) \n- **Title Case Variations**: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal\n- **Short Forms**: priorityShort, statusShort for single-letter representations\n- **Unique Identifiers**: zettel (Zettelkasten ID), nano (high-precision unique ID)\n\nThe settings UI now documents all 40+ available template variables for easy reference.\n\nThanks to @fastrick for the original unix timestamp request.\n\n## Bug Fixes\n\n### Critical Timezone Handling Fixes\n\nThis release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the \"UTC Anchor\" principle for consistent date handling.\n\n**Major Timezone Bugs Fixed:**\n\n- **Recurring Task Completion**: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314\n- **Calendar Date Misalignment**: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec)\n- **Weekly Task Display**: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322\n- **Task Completion Date Bug**: Resolved bug where `complete_instances` was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314\n- **Date Parsing Inconsistencies**: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application\n- **Filter Date Handling**: Fixed date filtering to work consistently across all timezones\n- **Agenda View \"Today\" Detection**: Corrected timezone-sensitive today detection that affected agenda headers\n- **ICS Import Timezone Issues**: Resolved timezone problems with both recurring and single events from ICS imports\n\n**Technical Implementation:**\n\n- Introduced `parseDateToUTC()` function for consistent UTC anchoring of date-only strings\n- Updated date comparison functions to use UTC anchors throughout\n- Replaced timezone-sensitive date operations with consistent UTC-based alternatives\n- Comprehensive audit and fix of all date handling patterns in the codebase\n\n### Project Filtering Improvements\n\nResolved critical bugs in project filtering that prevented proper task display and project selection.\n\n**Fixes:**\n- **Wikilink Resolution**: Fixed handling of relative vs absolute project wikilinks (e.g., `[[../Projects/My Project]]` vs `[[My Project]]`) - thanks to @xorander00 for the detailed bug report\n- **Filter Grouping Logic**: Corrected AND/OR grouping in project filters to prevent showing too many tasks\n- **Missing Projects**: Fixed issue where not all projects appeared in filter dropdown selection\n- **Cache Management**: Improved cache invalidation and project name extraction with better validation\n\n### Subtask Widget Improvements\n\nFixed several issues with the project subtasks widget affecting user experience and reliability.\n\n**Widget Fixes:**\n\n- **View State Persistence**: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329)\n- **Filter State Isolation**: Prevented filter settings from bleeding between different notes' subtask widgets\n- **Configurable Positioning**: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164)\n- **Event Listener Management**: Improved cleanup to prevent memory leaks and event accumulation\n- **Event Bubbling**: Fixed issue where clicking subtasks would trigger both subtask and parent task modals\n- **Styling Isolation**: Prevented completion styles from affecting nested subtasks incorrectly\n\n### ICS Calendar Integration\n\n**Timezone Processing**: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events.\n\n### Performance and Reliability\n\n**Cache Optimization**: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness.\n\n**Type Safety**: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues.\n\n**Error Handling**: Enhanced error handling and null safety checks throughout project filtering and service initialization.\n\n## Technical Improvements\n\n### UTC Anchor Implementation\n\nComprehensive implementation of the UTC Anchor principle for robust timezone handling:\n\n- All date-only strings now consistently parsed as UTC anchors\n- Date comparison operations standardized using UTC methods\n- Eliminated timezone-dependent date creation patterns\n- Added comprehensive timezone test coverage\n\n### Service Architecture\n\n**Expanded Projects Service**: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management.\n\n**View State Manager**: Improved view state persistence across different contexts and note switches.\n\n### Documentation Updates\n\n- Updated recurring tasks documentation to reflect new behavior\n- Added timezone handling guides for developers\n- Enhanced calendar views documentation with drag behavior explanations\n- Comprehensive template variable documentation\n\n## Breaking Changes\n\n**Date Handling**: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle.\n\n## Migration Notes\n\nExisting recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling).\n\n","aliases":["/releases/3.17.0/","/releases/3.17.0/"],"toc":[{"level":2,"id":"major-features","text":"Major Features"},{"level":3,"id":"enhanced-recurring-tasks-with-dtstart-support","text":"Enhanced Recurring Tasks with DTSTART Support"},{"level":3,"id":"expandable-project-subtasks","text":"Expandable Project Subtasks"},{"level":3,"id":"responsive-pomodoro-view","text":"Responsive Pomodoro View"},{"level":3,"id":"enhanced-filename-templates","text":"Enhanced Filename Templates"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"critical-timezone-handling-fixes","text":"Critical Timezone Handling Fixes"},{"level":3,"id":"project-filtering-improvements","text":"Project Filtering Improvements"},{"level":3,"id":"subtask-widget-improvements","text":"Subtask Widget Improvements"},{"level":3,"id":"ics-calendar-integration","text":"ICS Calendar Integration"},{"level":3,"id":"performance-and-reliability","text":"Performance and Reliability"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"},{"level":3,"id":"utc-anchor-implementation","text":"UTC Anchor Implementation"},{"level":3,"id":"service-architecture","text":"Service Architecture"},{"level":3,"id":"documentation-updates","text":"Documentation Updates"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"},{"level":2,"id":"migration-notes","text":"Migration Notes"}],"html":"

Major Features#

\n

Enhanced Recurring Tasks with DTSTART Support#

\n

This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering.

\n

Background and Motivation:

\n

The previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior.

\n

Key Improvements:

\n
    \n
  • DTSTART Integration: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern
  • \n
  • Dynamic Date Updates: The task.scheduled field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates
  • \n
  • Flexible Next Occurrence Scheduling: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling
  • \n
  • Visual Hierarchy: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task
  • \n
  • Independent Time Control: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern
  • \n
  • Dual Drag Behavior: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance
  • \n
  • Automatic DTSTART Addition: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions
  • \n
  • Manual Rescheduling Support: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications
  • \n
\n

Expandable Project Subtasks#

\n

A new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy.

\n

Features:

\n
    \n
  • Chevron Controls: Click chevron icons on project task cards to expand/collapse subtask display
  • \n
  • Configurable: New "Show expandable subtasks" setting allows users to enable/disable the feature
  • \n
\n

Responsive Pomodoro View#

\n

The Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design.

\n

Thanks to @oliverlalan for requesting this improvement (#339).

\n

Enhanced Filename Templates#

\n

Significant expansion of available template variables for task creation, providing much greater flexibility in filename patterns.

\n

New Template Variables:

\n
    \n
  • Date/Time Variations: shortDate, monthName, dayName, week, quarter, time12, time24
  • \n
  • Unix Timestamps: unix (seconds), unixMs (milliseconds)
  • \n
  • Title Case Variations: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal
  • \n
  • Short Forms: priorityShort, statusShort for single-letter representations
  • \n
  • Unique Identifiers: zettel (Zettelkasten ID), nano (high-precision unique ID)
  • \n
\n

The settings UI now documents all 40+ available template variables for easy reference.

\n

Thanks to @fastrick for the original unix timestamp request.

\n

Bug Fixes#

\n

Critical Timezone Handling Fixes#

\n

This release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the "UTC Anchor" principle for consistent date handling.

\n

Major Timezone Bugs Fixed:

\n
    \n
  • Recurring Task Completion: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314
  • \n
  • Calendar Date Misalignment: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec)
  • \n
  • Weekly Task Display: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322
  • \n
  • Task Completion Date Bug: Resolved bug where complete_instances was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314
  • \n
  • Date Parsing Inconsistencies: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application
  • \n
  • Filter Date Handling: Fixed date filtering to work consistently across all timezones
  • \n
  • Agenda View "Today" Detection: Corrected timezone-sensitive today detection that affected agenda headers
  • \n
  • ICS Import Timezone Issues: Resolved timezone problems with both recurring and single events from ICS imports
  • \n
\n

Technical Implementation:

\n
    \n
  • Introduced parseDateToUTC() function for consistent UTC anchoring of date-only strings
  • \n
  • Updated date comparison functions to use UTC anchors throughout
  • \n
  • Replaced timezone-sensitive date operations with consistent UTC-based alternatives
  • \n
  • Comprehensive audit and fix of all date handling patterns in the codebase
  • \n
\n

Project Filtering Improvements#

\n

Resolved critical bugs in project filtering that prevented proper task display and project selection.

\n

Fixes:

\n
    \n
  • Wikilink Resolution: Fixed handling of relative vs absolute project wikilinks (e.g., [[../Projects/My Project]] vs [[My Project]]) - thanks to @xorander00 for the detailed bug report
  • \n
  • Filter Grouping Logic: Corrected AND/OR grouping in project filters to prevent showing too many tasks
  • \n
  • Missing Projects: Fixed issue where not all projects appeared in filter dropdown selection
  • \n
  • Cache Management: Improved cache invalidation and project name extraction with better validation
  • \n
\n

Subtask Widget Improvements#

\n

Fixed several issues with the project subtasks widget affecting user experience and reliability.

\n

Widget Fixes:

\n
    \n
  • View State Persistence: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329)
  • \n
  • Filter State Isolation: Prevented filter settings from bleeding between different notes' subtask widgets
  • \n
  • Configurable Positioning: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164)
  • \n
  • Event Listener Management: Improved cleanup to prevent memory leaks and event accumulation
  • \n
  • Event Bubbling: Fixed issue where clicking subtasks would trigger both subtask and parent task modals
  • \n
  • Styling Isolation: Prevented completion styles from affecting nested subtasks incorrectly
  • \n
\n

ICS Calendar Integration#

\n

Timezone Processing: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events.

\n

Performance and Reliability#

\n

Cache Optimization: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness.

\n

Type Safety: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues.

\n

Error Handling: Enhanced error handling and null safety checks throughout project filtering and service initialization.

\n

Technical Improvements#

\n

UTC Anchor Implementation#

\n

Comprehensive implementation of the UTC Anchor principle for robust timezone handling:

\n
    \n
  • All date-only strings now consistently parsed as UTC anchors
  • \n
  • Date comparison operations standardized using UTC methods
  • \n
  • Eliminated timezone-dependent date creation patterns
  • \n
  • Added comprehensive timezone test coverage
  • \n
\n

Service Architecture#

\n

Expanded Projects Service: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management.

\n

View State Manager: Improved view state persistence across different contexts and note switches.

\n

Documentation Updates#

\n
    \n
  • Updated recurring tasks documentation to reflect new behavior
  • \n
  • Added timezone handling guides for developers
  • \n
  • Enhanced calendar views documentation with drag behavior explanations
  • \n
  • Comprehensive template variable documentation
  • \n
\n

Breaking Changes#

\n

Date Handling: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle.

\n

Migration Notes#

\n

Existing recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling).

\n","text":"Major Features# Enhanced Recurring Tasks with DTSTART Support# This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering. Background and Motivation: The previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior. Key Improvements: DTSTART Integration: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern Dynamic Date Updates: The task.scheduled field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates Flexible Next Occurrence Scheduling: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling Visual Hierarchy: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task Independent Time Control: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern Dual Drag Behavior: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance Automatic DTSTART Addition: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions Manual Rescheduling Support: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications Expandable Project Subtasks# A new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy. Features: Chevron Controls: Click chevron icons on project task cards to expand/collapse subtask display Configurable: New \"Show expandable subtasks\" setting allows users to enable/disable the feature Responsive Pomodoro View# The Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design. Thanks to @oliverlalan for requesting this improvement (#339). Enhanced Filename Templates# Significant expansion of available template variables for task creation, providing much greater flexibility in filename patterns. New Template Variables: Date/Time Variations: shortDate, monthName, dayName, week, quarter, time12, time24 Unix Timestamps: unix (seconds), unixMs (milliseconds) Title Case Variations: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal Short Forms: priorityShort, statusShort for single-letter representations Unique Identifiers: zettel (Zettelkasten ID), nano (high-precision unique ID) The settings UI now documents all 40+ available template variables for easy reference. Thanks to @fastrick for the original unix timestamp request. Bug Fixes# Critical Timezone Handling Fixes# This release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the \"UTC Anchor\" principle for consistent date handling. Major Timezone Bugs Fixed: Recurring Task Completion: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314 Calendar Date Misalignment: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec) Weekly Task Display: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322 Task Completion Date Bug: Resolved bug where complete_instances was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314 Date Parsing Inconsistencies: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application Filter Date Handling: Fixed date filtering to work consistently across all timezones Agenda View \"Today\" Detection: Corrected timezone-sensitive today detection that affected agenda headers ICS Import Timezone Issues: Resolved timezone problems with both recurring and single events from ICS imports Technical Implementation: Introduced parseDateToUTC() function for consistent UTC anchoring of date-only strings Updated date comparison functions to use UTC anchors throughout Replaced timezone-sensitive date operations with consistent UTC-based alternatives Comprehensive audit and fix of all date handling patterns in the codebase Project Filtering Improvements# Resolved critical bugs in project filtering that prevented proper task display and project selection. Fixes: Wikilink Resolution: Fixed handling of relative vs absolute project wikilinks (e.g., [[../Projects/My Project]] vs [[My Project]]) - thanks to @xorander00 for the detailed bug report Filter Grouping Logic: Corrected AND/OR grouping in project filters to prevent showing too many tasks Missing Projects: Fixed issue where not all projects appeared in filter dropdown selection Cache Management: Improved cache invalidation and project name extraction with better validation Subtask Widget Improvements# Fixed several issues with the project subtasks widget affecting user experience and reliability. Widget Fixes: View State Persistence: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329) Filter State Isolation: Prevented filter settings from bleeding between different notes' subtask widgets Configurable Positioning: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164) Event Listener Management: Improved cleanup to prevent memory leaks and event accumulation Event Bubbling: Fixed issue where clicking subtasks would trigger both subtask and parent task modals Styling Isolation: Prevented completion styles from affecting nested subtasks incorrectly ICS Calendar Integration# Timezone Processing: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events. Performance and Reliability# Cache Optimization: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness. Type Safety: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues. Error Handling: Enhanced error handling and null safety checks throughout project filtering and service initialization. Technical Improvements# UTC Anchor Implementation# Comprehensive implementation of the UTC Anchor principle for robust timezone handling: All date-only strings now consistently parsed as UTC anchors Date comparison operations standardized using UTC methods Eliminated timezone-dependent date creation patterns Added comprehensive timezone test coverage Service Architecture# Expanded Projects Service: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management. View State Manager: Improved view state persistence across different contexts and note switches. Documentation Updates# Updated recurring tasks documentation to reflect new behavior Added timezone handling guides for developers Enhanced calendar views documentation with drag behavior explanations Comprehensive template variable documentation Breaking Changes# Date Handling: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle. Migration Notes# Existing recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling)."},{"route":"/obsidian/releases/3.17.1/","title":"TaskNotes 3.17.1","description":"This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.17.1.md","namespace":"obsidian","relativePath":"releases/3.17.1.md","raw":"# TaskNotes 3.17.1\n\n## Bug Fixes\n\n### Critical Timezone Handling Fixes\n\nThis patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones.\n\n#### Completions Calendar Rendering (#322)\n\nFixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC:\n\n- **Day Number Display**: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction\n- **Month Comparison Logic**: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection\n- **Calendar Navigation**: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months\n\nThese fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users.\n\n#### Advanced Calendar Drag-and-Drop Operations (#344)\n\nResolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC.\n\nThanks to @trang-ngn for reporting this issue with clear reproduction steps.\n\n**Root Cause**: The drag-and-drop system was using `formatDateForStorage()` which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI.\n\n**Fixed Operations**:\n\n- All-day and timed event drag-and-drop (`handleEventDrop`)\n- External task drag-and-drop from outside the calendar (`handleExternalDrop`)\n- Modal-based task scheduling (`scheduleTask`)\n- Date selection task creation (`handleDateSelect`)\n- Timeblock creation and event resizing operations\n- Event context menu date handling\n\nThe fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data.\n\n#### Task Completion Status Checks (#322)\n\nFixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in `getEffectiveTaskStatus()`. \n\n**Root Cause**: The function was using timezone-sensitive `date-fns format()` for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users).\n\n**Solution**: Replaced timezone-sensitive formatting with `formatDateForStorage()` to ensure consistent UTC-anchored date strings that match the format used in `complete_instances`.\n\nThis fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete.\n\n## Technical Implementation\n\nAll fixes implement the established \"UTC Anchor\" principle for consistent timezone handling:\n\n- Consistent use of UTC-anchored date operations for date-only comparisons\n- Replacement of timezone-sensitive date formatting with UTC-based alternatives \n- Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)\n\n","aliases":["/releases/3.17.1/","/releases/3.17.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"critical-timezone-handling-fixes","text":"Critical Timezone Handling Fixes"},{"level":2,"id":"technical-implementation","text":"Technical Implementation"}],"html":"

Bug Fixes#

\n

Critical Timezone Handling Fixes#

\n

This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones.

\n

Completions Calendar Rendering (#322)#

\n

Fixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC:

\n
    \n
  • Day Number Display: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction
  • \n
  • Month Comparison Logic: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection
  • \n
  • Calendar Navigation: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months
  • \n
\n

These fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users.

\n

Advanced Calendar Drag-and-Drop Operations (#344)#

\n

Resolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC.

\n

Thanks to @trang-ngn for reporting this issue with clear reproduction steps.

\n

Root Cause: The drag-and-drop system was using formatDateForStorage() which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI.

\n

Fixed Operations:

\n
    \n
  • All-day and timed event drag-and-drop (handleEventDrop)
  • \n
  • External task drag-and-drop from outside the calendar (handleExternalDrop)
  • \n
  • Modal-based task scheduling (scheduleTask)
  • \n
  • Date selection task creation (handleDateSelect)
  • \n
  • Timeblock creation and event resizing operations
  • \n
  • Event context menu date handling
  • \n
\n

The fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data.

\n

Task Completion Status Checks (#322)#

\n

Fixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in getEffectiveTaskStatus().

\n

Root Cause: The function was using timezone-sensitive date-fns format() for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users).

\n

Solution: Replaced timezone-sensitive formatting with formatDateForStorage() to ensure consistent UTC-anchored date strings that match the format used in complete_instances.

\n

This fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete.

\n

Technical Implementation#

\n

All fixes implement the established "UTC Anchor" principle for consistent timezone handling:

\n
    \n
  • Consistent use of UTC-anchored date operations for date-only comparisons
  • \n
  • Replacement of timezone-sensitive date formatting with UTC-based alternatives
  • \n
  • Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)
  • \n
\n","text":"Bug Fixes# Critical Timezone Handling Fixes# This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones. Completions Calendar Rendering (#322)# Fixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC: Day Number Display: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction Month Comparison Logic: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection Calendar Navigation: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months These fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users. Advanced Calendar Drag-and-Drop Operations (#344)# Resolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC. Thanks to @trang-ngn for reporting this issue with clear reproduction steps. Root Cause: The drag-and-drop system was using formatDateForStorage() which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI. Fixed Operations: All-day and timed event drag-and-drop (handleEventDrop) External task drag-and-drop from outside the calendar (handleExternalDrop) Modal-based task scheduling (scheduleTask) Date selection task creation (handleDateSelect) Timeblock creation and event resizing operations Event context menu date handling The fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data. Task Completion Status Checks (#322)# Fixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in getEffectiveTaskStatus(). Root Cause: The function was using timezone-sensitive date-fns format() for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users). Solution: Replaced timezone-sensitive formatting with formatDateForStorage() to ensure consistent UTC-anchored date strings that match the format used in complete_instances. This fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete. Technical Implementation# All fixes implement the established \"UTC Anchor\" principle for consistent timezone handling: Consistent use of UTC-anchored date operations for date-only comparisons Replacement of timezone-sensitive date formatting with UTC-based alternatives Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)"},{"route":"/obsidian/releases/3.18.0/","title":"TaskNotes 3.18.0","description":"A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.18.0.md","namespace":"obsidian","relativePath":"releases/3.18.0.md","raw":"# TaskNotes 3.18.0\n\n## New Features\n\n### Task Reminders System\n\nA complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.\n\n**Core Features:**\n\n- Support for both relative reminders (e.g., \"15 minutes before due date\") and absolute reminders (specific date/time)\n- Visual reminder indicators on task cards with clickable bell icons\n- Integration with task creation and editing workflows\n\n**User Interface:**\n\n- **Reminder Modal**: Modal for managing task reminders with form validation and real-time preview\n- **Reminder Context Menu**: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates)\n- Reminder management accessible from task creation modal, edit modal, and task cards\n\n**Default Reminders:**\n\n- Configure default reminders that automatically apply to new tasks\n- Support for multiple default reminders per task type\n- Applies to both manual task creation and instant conversion workflows\n\n### Property-Based Task Identification\n\nTasks can now be identified using frontmatter properties instead of requiring tags.\n\n- Configure property name and value for task identification (e.g., `categories: [[Tasks]]`)\n- Full backward compatibility with existing tag-based workflows\n- Addresses modern Obsidian property-based vault organization patterns\n\n*Thanks to @mdbraber for the feature request (#340)*\n\n### Enhanced Saved Views\n- Clicking an active saved view now clears all filters, providing quick access to unfiltered task list\n- Preserves sort and group settings while resetting filters\n\n*Thanks to @oldjove for the suggestion (#351)*\n\n### Parent Note as Project Option\n- New setting to automatically use parent note as project during instant task conversion\n- Useful for users who organize tasks within project-specific notes\n- Merges with existing default projects to avoid duplicates\n\n*Thanks to @FindingJohnny for the feature request (#348)*\n\n## Bug Fixes\n\n### ICS Calendar Integration\n\n- **Fixed recurring event exceptions**: Properly handle EXDATE properties and RECURRENCE-ID for modified instances\n- **Eliminated duplicate events**: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared\n\n*Thanks to @robmikulec for reporting the recurring events issue (#342)*\n\n### Settings Persistence\n\n- **Fixed settings reset during updates**: Prevent user configuration loss when plugin updates introduce new default settings\n- Apply deep merge strategy to preserve customizations in nested configuration objects\n\n## Improvements\n\n### User Interface\n\n- Reminder modal uses consistent design patterns with task creation/edit modals\n- Fixed task card icon overlap issues with proper spacing for multiple indicators\n\n### Code Quality\n\n- Added unit test coverage for new reminder functionality\n- Improved type safety with proper TypeScript interfaces for reminder data structures\n- Improved error handling and user feedback across reminder operations\n\n## Technical Details\n\n### Data Model Changes\n\n- Added optional `reminders` array field to TaskInfo interface\n- Extended field mapping support for custom reminder property names\n- Enhanced cache system to include reminder data in task extraction\n\n","aliases":["/releases/3.18.0/","/releases/3.18.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-reminders-system","text":"Task Reminders System"},{"level":3,"id":"property-based-task-identification","text":"Property-Based Task Identification"},{"level":3,"id":"enhanced-saved-views","text":"Enhanced Saved Views"},{"level":3,"id":"parent-note-as-project-option","text":"Parent Note as Project Option"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"ics-calendar-integration","text":"ICS Calendar Integration"},{"level":3,"id":"settings-persistence","text":"Settings Persistence"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"code-quality","text":"Code Quality"},{"level":2,"id":"technical-details","text":"Technical Details"},{"level":3,"id":"data-model-changes","text":"Data Model Changes"}],"html":"

New Features#

\n

Task Reminders System#

\n

A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.

\n

Core Features:

\n
    \n
  • Support for both relative reminders (e.g., "15 minutes before due date") and absolute reminders (specific date/time)
  • \n
  • Visual reminder indicators on task cards with clickable bell icons
  • \n
  • Integration with task creation and editing workflows
  • \n
\n

User Interface:

\n
    \n
  • Reminder Modal: Modal for managing task reminders with form validation and real-time preview
  • \n
  • Reminder Context Menu: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates)
  • \n
  • Reminder management accessible from task creation modal, edit modal, and task cards
  • \n
\n

Default Reminders:

\n
    \n
  • Configure default reminders that automatically apply to new tasks
  • \n
  • Support for multiple default reminders per task type
  • \n
  • Applies to both manual task creation and instant conversion workflows
  • \n
\n

Property-Based Task Identification#

\n

Tasks can now be identified using frontmatter properties instead of requiring tags.

\n
    \n
  • Configure property name and value for task identification (e.g., categories: [[Tasks]])
  • \n
  • Full backward compatibility with existing tag-based workflows
  • \n
  • Addresses modern Obsidian property-based vault organization patterns
  • \n
\n

Thanks to @mdbraber for the feature request (#340)

\n

Enhanced Saved Views#

\n
    \n
  • Clicking an active saved view now clears all filters, providing quick access to unfiltered task list
  • \n
  • Preserves sort and group settings while resetting filters
  • \n
\n

Thanks to @oldjove for the suggestion (#351)

\n

Parent Note as Project Option#

\n
    \n
  • New setting to automatically use parent note as project during instant task conversion
  • \n
  • Useful for users who organize tasks within project-specific notes
  • \n
  • Merges with existing default projects to avoid duplicates
  • \n
\n

Thanks to @FindingJohnny for the feature request (#348)

\n

Bug Fixes#

\n

ICS Calendar Integration#

\n
    \n
  • Fixed recurring event exceptions: Properly handle EXDATE properties and RECURRENCE-ID for modified instances
  • \n
  • Eliminated duplicate events: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared
  • \n
\n

Thanks to @robmikulec for reporting the recurring events issue (#342)

\n

Settings Persistence#

\n
    \n
  • Fixed settings reset during updates: Prevent user configuration loss when plugin updates introduce new default settings
  • \n
  • Apply deep merge strategy to preserve customizations in nested configuration objects
  • \n
\n

Improvements#

\n

User Interface#

\n
    \n
  • Reminder modal uses consistent design patterns with task creation/edit modals
  • \n
  • Fixed task card icon overlap issues with proper spacing for multiple indicators
  • \n
\n

Code Quality#

\n
    \n
  • Added unit test coverage for new reminder functionality
  • \n
  • Improved type safety with proper TypeScript interfaces for reminder data structures
  • \n
  • Improved error handling and user feedback across reminder operations
  • \n
\n

Technical Details#

\n

Data Model Changes#

\n
    \n
  • Added optional reminders array field to TaskInfo interface
  • \n
  • Extended field mapping support for custom reminder property names
  • \n
  • Enhanced cache system to include reminder data in task extraction
  • \n
\n","text":"New Features# Task Reminders System# A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality. Core Features: Support for both relative reminders (e.g., \"15 minutes before due date\") and absolute reminders (specific date/time) Visual reminder indicators on task cards with clickable bell icons Integration with task creation and editing workflows User Interface: Reminder Modal: Modal for managing task reminders with form validation and real-time preview Reminder Context Menu: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates) Reminder management accessible from task creation modal, edit modal, and task cards Default Reminders: Configure default reminders that automatically apply to new tasks Support for multiple default reminders per task type Applies to both manual task creation and instant conversion workflows Property-Based Task Identification# Tasks can now be identified using frontmatter properties instead of requiring tags. Configure property name and value for task identification (e.g., categories: [[Tasks]]) Full backward compatibility with existing tag-based workflows Addresses modern Obsidian property-based vault organization patterns Thanks to @mdbraber for the feature request (#340) Enhanced Saved Views# Clicking an active saved view now clears all filters, providing quick access to unfiltered task list Preserves sort and group settings while resetting filters Thanks to @oldjove for the suggestion (#351) Parent Note as Project Option# New setting to automatically use parent note as project during instant task conversion Useful for users who organize tasks within project-specific notes Merges with existing default projects to avoid duplicates Thanks to @FindingJohnny for the feature request (#348) Bug Fixes# ICS Calendar Integration# Fixed recurring event exceptions: Properly handle EXDATE properties and RECURRENCE-ID for modified instances Eliminated duplicate events: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared Thanks to @robmikulec for reporting the recurring events issue (#342) Settings Persistence# Fixed settings reset during updates: Prevent user configuration loss when plugin updates introduce new default settings Apply deep merge strategy to preserve customizations in nested configuration objects Improvements# User Interface# Reminder modal uses consistent design patterns with task creation/edit modals Fixed task card icon overlap issues with proper spacing for multiple indicators Code Quality# Added unit test coverage for new reminder functionality Improved type safety with proper TypeScript interfaces for reminder data structures Improved error handling and user feedback across reminder operations Technical Details# Data Model Changes# Added optional reminders array field to TaskInfo interface Extended field mapping support for custom reminder property names Enhanced cache system to include reminder data in task extraction"},{"route":"/obsidian/releases/3.18.1/","title":"TaskNotes 3.18.1","description":"Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.18.1.md","namespace":"obsidian","relativePath":"releases/3.18.1.md","raw":"# TaskNotes 3.18.1\n\n## Bug Fixes\n\n### Cache Synchronization Race Conditions (#358)\n\nFixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations.\n\n*Thanks to @willgraham345 for reporting the calendar auto-refresh issue*\n\n## Code Quality Improvements\n\n### Event Listener Management\n\nSimplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array.\n\n## Technical Details\n\n**Cache Synchronization Strategy**: The implementation follows a \"wait-then-update\" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times.\n\n","aliases":["/releases/3.18.1/","/releases/3.18.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"cache-synchronization-race-conditions-358","text":"Cache Synchronization Race Conditions (#358)"},{"level":2,"id":"code-quality-improvements","text":"Code Quality Improvements"},{"level":3,"id":"event-listener-management","text":"Event Listener Management"},{"level":2,"id":"technical-details","text":"Technical Details"}],"html":"

Bug Fixes#

\n

Cache Synchronization Race Conditions (#358)#

\n

Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations.

\n

Thanks to @willgraham345 for reporting the calendar auto-refresh issue

\n

Code Quality Improvements#

\n

Event Listener Management#

\n

Simplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array.

\n

Technical Details#

\n

Cache Synchronization Strategy: The implementation follows a "wait-then-update" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times.

\n","text":"Bug Fixes# Cache Synchronization Race Conditions (#358)# Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations. Thanks to @willgraham345 for reporting the calendar auto-refresh issue Code Quality Improvements# Event Listener Management# Simplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array. Technical Details# Cache Synchronization Strategy: The implementation follows a \"wait-then-update\" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times."},{"route":"/obsidian/releases/3.18.2/","title":"TaskNotes 3.18.2","description":"Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.18.2.md","namespace":"obsidian","relativePath":"releases/3.18.2.md","raw":"# TaskNotes 3.18.2\n\n## Bug Fixes\n\n### Timeblock Date Shift Issue (#368)\n\nFixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs.\n\nTimeblocks now appear on the correct calendar day regardless of user timezone or DST transitions.\n\n*Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information.*\n\n### Performance Issues with Task Views\n\nEliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing.\n\n## New Features\n\n### Enhanced Filename Template Variables (#370)\n\nAdded new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility:\n\n- `{milliseconds}`, `{ms}` - 3-digit milliseconds (000-999)\n- `{timezone}`, `{utcOffset}` - UTC offset in ±HH:MM format \n- `{timezoneShort}`, `{utcOffsetShort}` - UTC offset in ±HHMM format\n\n*Thanks to @mnipritom for requesting these variables*. \n\n### Boolean Property Identification\n\nEnhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter.\n\n*A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage*\n\n### Boolean Status Field Support (#108)\n\nAdded automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values:\n\n- String \"true\" → boolean true (in frontmatter)\n- String \"false\" → boolean false (in frontmatter) \n- Boolean true → string \"true\" (when read back)\n- Boolean false → string \"false\" (when read back)\n- Other status values remain unchanged as strings\n\n*Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling.*\n*And thanks again to @renatomen--the boolean property identification fix inspired this change!*","aliases":["/releases/3.18.2/","/releases/3.18.2/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"timeblock-date-shift-issue-368","text":"Timeblock Date Shift Issue (#368)"},{"level":3,"id":"performance-issues-with-task-views","text":"Performance Issues with Task Views"},{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"enhanced-filename-template-variables-370","text":"Enhanced Filename Template Variables (#370)"},{"level":3,"id":"boolean-property-identification","text":"Boolean Property Identification"},{"level":3,"id":"boolean-status-field-support-108","text":"Boolean Status Field Support (#108)"}],"html":"

Bug Fixes#

\n

Timeblock Date Shift Issue (#368)#

\n

Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs.

\n

Timeblocks now appear on the correct calendar day regardless of user timezone or DST transitions.

\n

Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information.

\n

Performance Issues with Task Views#

\n

Eliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing.

\n

New Features#

\n

Enhanced Filename Template Variables (#370)#

\n

Added new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility:

\n
    \n
  • {milliseconds}, {ms} - 3-digit milliseconds (000-999)
  • \n
  • {timezone}, {utcOffset} - UTC offset in ±HH:MM format
  • \n
  • {timezoneShort}, {utcOffsetShort} - UTC offset in ±HHMM format
  • \n
\n

Thanks to @mnipritom for requesting these variables.

\n

Boolean Property Identification#

\n

Enhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter.

\n

A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage

\n

Boolean Status Field Support (#108)#

\n

Added automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values:

\n
    \n
  • String "true" → boolean true (in frontmatter)
  • \n
  • String "false" → boolean false (in frontmatter)
  • \n
  • Boolean true → string "true" (when read back)
  • \n
  • Boolean false → string "false" (when read back)
  • \n
  • Other status values remain unchanged as strings
  • \n
\n

Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling.\nAnd thanks again to @renatomen--the boolean property identification fix inspired this change!

\n","text":"Bug Fixes# Timeblock Date Shift Issue (#368)# Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs. Timeblocks now appear on the correct calendar day regardless of user timezone or DST transitions. Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information. Performance Issues with Task Views# Eliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing. New Features# Enhanced Filename Template Variables (#370)# Added new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility: {milliseconds}, {ms} - 3-digit milliseconds (000-999) {timezone}, {utcOffset} - UTC offset in ±HH:MM format {timezoneShort}, {utcOffsetShort} - UTC offset in ±HHMM format Thanks to @mnipritom for requesting these variables. Boolean Property Identification# Enhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter. A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage Boolean Status Field Support (#108)# Added automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values: String \"true\" → boolean true (in frontmatter) String \"false\" → boolean false (in frontmatter) Boolean true → string \"true\" (when read back) Boolean false → string \"false\" (when read back) Other status values remain unchanged as strings Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling. And thanks again to @renatomen--the boolean property identification fix inspired this change!"},{"route":"/obsidian/releases/3.19.0/","title":"TaskNotes 3.19.0","description":"TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natu...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.19.0.md","namespace":"obsidian","relativePath":"releases/3.19.0.md","raw":"# TaskNotes 3.19.0\n\n## New Features\n\n### HTTP REST API with Natural Language Processing\n\nTaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing.\n\n**Key API Features:**\n\n- Complete CRUD operations for tasks\n- Time tracking endpoints\n- Task statistics and filtering\n- Bearer token authentication\n- CORS support for browser extensions\n- Desktop-only implementation with mobile-safe architecture\n\n**Natural Language Processing Endpoints:**\n\n- `/api/nlp/parse` - Parse natural language into structured task data\n- `/api/nlp/create` - Create tasks directly from natural language input\n- Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence\n- Intelligent parsing of expressions like \"Review PR #123 tomorrow high priority @work\"\n\n**Companion Project Integration:**\n\nThe HTTP API enables two new companion projects:\n- [tasknotes-cli](https://github.com/callumalpass/tasknotes-cli) - Command-line interface for TaskNotes task management\n- [tasknotes-browser-extension](https://github.com/callumalpass/tasknotes-browser-extension) - Browser extension for quick task creation\n\n**Configuration:**\n\n- Enable via Settings → HTTP API tab (desktop only)\n- Configurable port (default 8080) and optional authentication token\n- Documentation at `/docs/HTTP_API.md` and `/docs/nlp-api.md`\n\n### Enhanced Calendar Integration\n\n#### Calendar Export and Context Menu System\n\n**Task Calendar Export:**\n\n- Add tasks to external calendars (Google, Outlook, Yahoo)\n- Download ICS files\n- Right-click context menu support for quick calendar actions\n\n#### Agenda View Calendar Improvements\n\n**ICS Integration in Agenda:**\n\n- Calendar event cards now display in Agenda view\n- Toggle calendar subscriptions visibility via FilterBar\n- Always-available \"Refresh calendars\" button\n- Normalized scheduled date handling for all-day and timed events\n\n*Thanks @scottaltham-payroc for the feature request!*\n\n## Bug Fixes\n\n### Task Styling Enhancement (#355)\n\nAdded CSS class `task-card--has-projects` to task cards that contain projects.\n\n*Thanks @mdbraber for the suggestion*\n\n### Calendar Event Scheduling\n\nFixed scheduled date normalization when creating tasks from ICS events:\n\n- All-day events: Use YYYY-MM-DD format\n- Timed events: Use YYYY-MM-DDTHH:mm format\n- Consistent behavior across all calendar interfaces\n\n### File Copy Script Improvements\n\nEnhanced copy-files script with better error handling:\n\n- Improved default path handling\n- Destination directory creation\n- Better ENOENT error handling\n\n## API Documentation\n\n### New Documentation Files\n\n- **HTTP_API.md** - Complete API reference with examples\n- **nlp-api.md** - Natural language processing capabilities and usage\n\n## Technical Enhancements\n\n### Core Infrastructure\n\n**API Service Architecture:**\n\n- Mobile-compatible implementation using Node.js http module\n- Platform detection prevents mobile loading\n- Express.js alternative for lightweight operation\n- Full error handling and validation\n\n**Calendar Service Integration:**\n- Extracted reusable CalendarExportService\n- Unified TaskContextMenu component\n- Enhanced event listener management\n\n### Development Improvements\n\n**Code Organization:**\n\n- Modular component extraction for better reusability\n- Consistent API response formats\n- Comprehensive test coverage for new features\n- TypeScript improvements for icon handling\n\n## Migration Notes\n\n### HTTP API Setup\n\nFor users wanting to enable the new HTTP API:\n\n1. Navigate to Settings → HTTP API tab (desktop only)\n2. Configure desired port (default 8080)\n3. Optionally set authentication token for security\n4. Restart Obsidian to start the API server\n5. Test with: `curl http://localhost:8080/api/health`\n\n","aliases":["/releases/3.19.0/","/releases/3.19.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"http-rest-api-with-natural-language-processing","text":"HTTP REST API with Natural Language Processing"},{"level":3,"id":"enhanced-calendar-integration","text":"Enhanced Calendar Integration"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-styling-enhancement-355","text":"Task Styling Enhancement (#355)"},{"level":3,"id":"calendar-event-scheduling","text":"Calendar Event Scheduling"},{"level":3,"id":"file-copy-script-improvements","text":"File Copy Script Improvements"},{"level":2,"id":"api-documentation","text":"API Documentation"},{"level":3,"id":"new-documentation-files","text":"New Documentation Files"},{"level":2,"id":"technical-enhancements","text":"Technical Enhancements"},{"level":3,"id":"core-infrastructure","text":"Core Infrastructure"},{"level":3,"id":"development-improvements","text":"Development Improvements"},{"level":2,"id":"migration-notes","text":"Migration Notes"},{"level":3,"id":"http-api-setup","text":"HTTP API Setup"}],"html":"

New Features#

\n

HTTP REST API with Natural Language Processing#

\n

TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing.

\n

Key API Features:

\n
    \n
  • Complete CRUD operations for tasks
  • \n
  • Time tracking endpoints
  • \n
  • Task statistics and filtering
  • \n
  • Bearer token authentication
  • \n
  • CORS support for browser extensions
  • \n
  • Desktop-only implementation with mobile-safe architecture
  • \n
\n

Natural Language Processing Endpoints:

\n
    \n
  • /api/nlp/parse - Parse natural language into structured task data
  • \n
  • /api/nlp/create - Create tasks directly from natural language input
  • \n
  • Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence
  • \n
  • Intelligent parsing of expressions like "Review PR #123 tomorrow high priority @work"
  • \n
\n

Companion Project Integration:

\n

The HTTP API enables two new companion projects:

\n\n

Configuration:

\n
    \n
  • Enable via Settings → HTTP API tab (desktop only)
  • \n
  • Configurable port (default 8080) and optional authentication token
  • \n
  • Documentation at /docs/HTTP_API.md and /docs/nlp-api.md
  • \n
\n

Enhanced Calendar Integration#

\n

Calendar Export and Context Menu System#

\n

Task Calendar Export:

\n
    \n
  • Add tasks to external calendars (Google, Outlook, Yahoo)
  • \n
  • Download ICS files
  • \n
  • Right-click context menu support for quick calendar actions
  • \n
\n

Agenda View Calendar Improvements#

\n

ICS Integration in Agenda:

\n
    \n
  • Calendar event cards now display in Agenda view
  • \n
  • Toggle calendar subscriptions visibility via FilterBar
  • \n
  • Always-available "Refresh calendars" button
  • \n
  • Normalized scheduled date handling for all-day and timed events
  • \n
\n

Thanks @scottaltham-payroc for the feature request!

\n

Bug Fixes#

\n

Task Styling Enhancement (#355)#

\n

Added CSS class task-card--has-projects to task cards that contain projects.

\n

Thanks @mdbraber for the suggestion

\n

Calendar Event Scheduling#

\n

Fixed scheduled date normalization when creating tasks from ICS events:

\n
    \n
  • All-day events: Use YYYY-MM-DD format
  • \n
  • Timed events: Use YYYY-MM-DDTHH:mm format
  • \n
  • Consistent behavior across all calendar interfaces
  • \n
\n

File Copy Script Improvements#

\n

Enhanced copy-files script with better error handling:

\n
    \n
  • Improved default path handling
  • \n
  • Destination directory creation
  • \n
  • Better ENOENT error handling
  • \n
\n

API Documentation#

\n

New Documentation Files#

\n
    \n
  • HTTP_API.md - Complete API reference with examples
  • \n
  • nlp-api.md - Natural language processing capabilities and usage
  • \n
\n

Technical Enhancements#

\n

Core Infrastructure#

\n

API Service Architecture:

\n
    \n
  • Mobile-compatible implementation using Node.js http module
  • \n
  • Platform detection prevents mobile loading
  • \n
  • Express.js alternative for lightweight operation
  • \n
  • Full error handling and validation
  • \n
\n

Calendar Service Integration:

\n
    \n
  • Extracted reusable CalendarExportService
  • \n
  • Unified TaskContextMenu component
  • \n
  • Enhanced event listener management
  • \n
\n

Development Improvements#

\n

Code Organization:

\n
    \n
  • Modular component extraction for better reusability
  • \n
  • Consistent API response formats
  • \n
  • Comprehensive test coverage for new features
  • \n
  • TypeScript improvements for icon handling
  • \n
\n

Migration Notes#

\n

HTTP API Setup#

\n

For users wanting to enable the new HTTP API:

\n
    \n
  1. Navigate to Settings → HTTP API tab (desktop only)
  2. \n
  3. Configure desired port (default 8080)
  4. \n
  5. Optionally set authentication token for security
  6. \n
  7. Restart Obsidian to start the API server
  8. \n
  9. Test with: curl http://localhost:8080/api/health
  10. \n
\n","text":"New Features# HTTP REST API with Natural Language Processing# TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing. Key API Features: Complete CRUD operations for tasks Time tracking endpoints Task statistics and filtering Bearer token authentication CORS support for browser extensions Desktop-only implementation with mobile-safe architecture Natural Language Processing Endpoints: /api/nlp/parse - Parse natural language into structured task data /api/nlp/create - Create tasks directly from natural language input Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence Intelligent parsing of expressions like \"Review PR #123 tomorrow high priority @work\" Companion Project Integration: The HTTP API enables two new companion projects: tasknotes-cli - Command-line interface for TaskNotes task management tasknotes-browser-extension - Browser extension for quick task creation Configuration: Enable via Settings → HTTP API tab (desktop only) Configurable port (default 8080) and optional authentication token Documentation at /docs/HTTP_API.md and /docs/nlp-api.md Enhanced Calendar Integration# Calendar Export and Context Menu System# Task Calendar Export: Add tasks to external calendars (Google, Outlook, Yahoo) Download ICS files Right-click context menu support for quick calendar actions Agenda View Calendar Improvements# ICS Integration in Agenda: Calendar event cards now display in Agenda view Toggle calendar subscriptions visibility via FilterBar Always-available \"Refresh calendars\" button Normalized scheduled date handling for all-day and timed events Thanks @scottaltham-payroc for the feature request! Bug Fixes# Task Styling Enhancement (#355)# Added CSS class task-card--has-projects to task cards that contain projects. Thanks @mdbraber for the suggestion Calendar Event Scheduling# Fixed scheduled date normalization when creating tasks from ICS events: All-day events: Use YYYY-MM-DD format Timed events: Use YYYY-MM-DDTHH:mm format Consistent behavior across all calendar interfaces File Copy Script Improvements# Enhanced copy-files script with better error handling: Improved default path handling Destination directory creation Better ENOENT error handling API Documentation# New Documentation Files# HTTP_API.md - Complete API reference with examples nlp-api.md - Natural language processing capabilities and usage Technical Enhancements# Core Infrastructure# API Service Architecture: Mobile-compatible implementation using Node.js http module Platform detection prevents mobile loading Express.js alternative for lightweight operation Full error handling and validation Calendar Service Integration: Extracted reusable CalendarExportService Unified TaskContextMenu component Enhanced event listener management Development Improvements# Code Organization: Modular component extraction for better reusability Consistent API response formats Comprehensive test coverage for new features TypeScript improvements for icon handling Migration Notes# HTTP API Setup# For users wanting to enable the new HTTP API: Navigate to Settings → HTTP API tab (desktop only) Configure desired port (default 8080) Optionally set authentication token for security Restart Obsidian to start the API server Test with: curl http://localhost:8080/api/health"},{"route":"/obsidian/releases/3.19.1/","title":"TaskNotes 3.19.1","description":"Added webhook system enabling integrations with external services and automation workflows.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.19.1.md","namespace":"obsidian","relativePath":"releases/3.19.1.md","raw":"# TaskNotes 3.19.1\n\n## New Features\n\n### Webhook Support\n\nAdded webhook system enabling integrations with external services and automation workflows.\n\n**Webhook Management:**\n\n- CRUD operations for webhook configuration\n- HTTP API endpoints for webhook management (`POST /api/webhooks`, `GET /api/webhooks`, `DELETE /api/webhooks/{id}`)\n- Delivery history tracking (`GET /api/webhooks/deliveries`)\n- Settings UI integration with event subscription controls\n\n**Event Types:**\n\n- **Task events:** created, updated, deleted, completed, archived, unarchived\n- **Time tracking:** started, stopped\n- **Pomodoro:** started, completed, interrupted \n- **Recurring tasks:** instance completed\n- **Reminders:** triggered\n\n**Security and Reliability:**\n\n- HMAC-SHA256 signature verification for payload authentication\n- Automatic retries with exponential backoff (3 attempts)\n- 10-second delivery timeout with failure monitoring\n- Auto-disable webhooks after repeated failures\n- Non-blocking async delivery maintains TaskNotes responsiveness\n\nDocumentation and testing utilities included in `docs/webhooks.md` and `test-webhook.js`.\n\n## Bug Fixes\n\n### Boolean Property Identification Regression (#367)\n\nFixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification.\n\nDuring code refactoring, the `comparePropertyValues` function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean `true`/`false` frontmatter values to correctly match `\"true\"`/`\"false\"` setting values.\n\n*Thanks to @renatomen for reporting this regression*\n","aliases":["/releases/3.19.1/","/releases/3.19.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"webhook-support","text":"Webhook Support"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"boolean-property-identification-regression-367","text":"Boolean Property Identification Regression (#367)"}],"html":"

New Features#

\n

Webhook Support#

\n

Added webhook system enabling integrations with external services and automation workflows.

\n

Webhook Management:

\n
    \n
  • CRUD operations for webhook configuration
  • \n
  • HTTP API endpoints for webhook management (POST /api/webhooks, GET /api/webhooks, DELETE /api/webhooks/{id})
  • \n
  • Delivery history tracking (GET /api/webhooks/deliveries)
  • \n
  • Settings UI integration with event subscription controls
  • \n
\n

Event Types:

\n
    \n
  • Task events: created, updated, deleted, completed, archived, unarchived
  • \n
  • Time tracking: started, stopped
  • \n
  • Pomodoro: started, completed, interrupted
  • \n
  • Recurring tasks: instance completed
  • \n
  • Reminders: triggered
  • \n
\n

Security and Reliability:

\n
    \n
  • HMAC-SHA256 signature verification for payload authentication
  • \n
  • Automatic retries with exponential backoff (3 attempts)
  • \n
  • 10-second delivery timeout with failure monitoring
  • \n
  • Auto-disable webhooks after repeated failures
  • \n
  • Non-blocking async delivery maintains TaskNotes responsiveness
  • \n
\n

Documentation and testing utilities included in docs/webhooks.md and test-webhook.js.

\n

Bug Fixes#

\n

Boolean Property Identification Regression (#367)#

\n

Fixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification.

\n

During code refactoring, the comparePropertyValues function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean true/false frontmatter values to correctly match "true"/"false" setting values.

\n

Thanks to @renatomen for reporting this regression

\n","text":"New Features# Webhook Support# Added webhook system enabling integrations with external services and automation workflows. Webhook Management: CRUD operations for webhook configuration HTTP API endpoints for webhook management (POST /api/webhooks, GET /api/webhooks, DELETE /api/webhooks/{id}) Delivery history tracking (GET /api/webhooks/deliveries) Settings UI integration with event subscription controls Event Types: Task events: created, updated, deleted, completed, archived, unarchived Time tracking: started, stopped Pomodoro: started, completed, interrupted Recurring tasks: instance completed Reminders: triggered Security and Reliability: HMAC-SHA256 signature verification for payload authentication Automatic retries with exponential backoff (3 attempts) 10-second delivery timeout with failure monitoring Auto-disable webhooks after repeated failures Non-blocking async delivery maintains TaskNotes responsiveness Documentation and testing utilities included in docs/webhooks.md and test-webhook.js. Bug Fixes# Boolean Property Identification Regression (#367)# Fixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification. During code refactoring, the comparePropertyValues function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean true/false frontmatter values to correctly match \"true\"/\"false\" setting values. Thanks to @renatomen for reporting this regression"},{"route":"/obsidian/releases/3.20.0/","title":"TaskNotes 3.20.0","description":"Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for conta...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.20.0.md","namespace":"obsidian","relativePath":"releases/3.20.0.md","raw":"# TaskNotes 3.20.0\n\n## New Features\n\n### Task Organization and Filtering\n\n**Folder-Based Task Filtering** - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. *Addresses issue #369 reported by kmaustral*\n\n**Dynamic Task Folder Organization** - Added template variable support for default task folder setting with task variables (`{{context}}`, `{{project}}`, `{{priority}}`, `{{status}}`, `{{title}}`) and date variables (`{{year}}`, `{{month}}`, `{{day}}`, `{{date}}`). Supports automatic folder creation and title sanitization. *Addresses feature request #376 by Mara-Li*\n\n**Archive Task Organization** - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (`moveArchivedTasks`, `archiveFolder`). *Addresses feature request #402 by anareaty*\n\n### Enhanced UI and Controls\n\n**Enhanced Filter Bar** - Improved filter bar with instant badge updates, right-click clear functionality, \"Clear All Filters\" button, and better UI synchronization across main and subtask views. *Contributed by renatomen*\n\n**Collapsible Groups** - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. *Contributed by renatomen*\n\n**Expand/Collapse All Controls** - Added \"Expand All\" and \"Collapse All\" buttons to task list toolbar that appear when grouping is active. *Contributed by renatomen*\n\n**Configurable UI Elements** - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. *Contributed by renatomen*\n\n### Advanced API Architecture and Webhook System\n\nRefactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility.\n\n**Webhook System** - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders.\n\n**Webhook Testing and Development** - Included standalone webhook testing server (`test-webhook.js`) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging.\n\n## Improvements\n\n### UI and Visual Enhancements\n\n**TaskNotes Icons** - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets.\n\n**Task Card Polish** - Improved status and priority dot alignment and reordered context menu (\"Copy task title\" moved to top). *Addresses alignment issue #410 reported by kmaustral*\n\n**Button Styling** - Fixed agenda view and filter popup button backgrounds with improved styling consistency.\n\n### Technical Improvements\n\n**Settings Architecture** - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability.\n\n**Documentation** - Added extensive webhook documentation in `docs/examples/webhook-transforms/` with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification.\n\n**Webhook Integration Services** - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring.\n\n## Bug Fixes\n\n**Mobile Modal Close Button** - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. *Addresses issue #404 reported by anareaty*\n\n**Test Suite Stabilization** - Resolved test failures and linting errors\n\n**HTTP API Field Consistency** - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. *Addresses issue #393 reported by @nightroman*\n\n**Missing Webhook Trigger** - Added webhook trigger for recurring task completion events.\n\n## Documentation Updates\n\n- Task defaults documentation with template variables\n- Miscellaneous settings documentation \n- Webhook transform documentation and examples\n- Demo GIFs for new features\n\nThanks @renatomen!\n\n## Contributors\n\nSpecial thanks to the following contributors:\n\n- **@Mara-Li** - Feature request for template variables in task folders\n- **@kmaustral** - Feature requests for folder filtering and UI alignment improvements\n- **@anareaty** - Bug report for mobile modal close button issue\n- **@nightroman** - Reported mislead API documentation\n\nA really big thanks to @renatomen whose very polished contributions form the bulk of this update!\n\n\n","aliases":["/releases/3.20.0/","/releases/3.20.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"task-organization-and-filtering","text":"Task Organization and Filtering"},{"level":3,"id":"enhanced-ui-and-controls","text":"Enhanced UI and Controls"},{"level":3,"id":"advanced-api-architecture-and-webhook-system","text":"Advanced API Architecture and Webhook System"},{"level":2,"id":"improvements","text":"Improvements"},{"level":3,"id":"ui-and-visual-enhancements","text":"UI and Visual Enhancements"},{"level":3,"id":"technical-improvements","text":"Technical Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":2,"id":"documentation-updates","text":"Documentation Updates"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Task Organization and Filtering#

\n

Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. Addresses issue #369 reported by kmaustral

\n

Dynamic Task Folder Organization - Added template variable support for default task folder setting with task variables ({{context}}, {{project}}, {{priority}}, {{status}}, {{title}}) and date variables ({{year}}, {{month}}, {{day}}, {{date}}). Supports automatic folder creation and title sanitization. Addresses feature request #376 by Mara-Li

\n

Archive Task Organization - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (moveArchivedTasks, archiveFolder). Addresses feature request #402 by anareaty

\n

Enhanced UI and Controls#

\n

Enhanced Filter Bar - Improved filter bar with instant badge updates, right-click clear functionality, "Clear All Filters" button, and better UI synchronization across main and subtask views. Contributed by renatomen

\n

Collapsible Groups - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. Contributed by renatomen

\n

Expand/Collapse All Controls - Added "Expand All" and "Collapse All" buttons to task list toolbar that appear when grouping is active. Contributed by renatomen

\n

Configurable UI Elements - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. Contributed by renatomen

\n

Advanced API Architecture and Webhook System#

\n

Refactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility.

\n

Webhook System - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders.

\n

Webhook Testing and Development - Included standalone webhook testing server (test-webhook.js) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging.

\n

Improvements#

\n

UI and Visual Enhancements#

\n

TaskNotes Icons - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets.

\n

Task Card Polish - Improved status and priority dot alignment and reordered context menu ("Copy task title" moved to top). Addresses alignment issue #410 reported by kmaustral

\n

Button Styling - Fixed agenda view and filter popup button backgrounds with improved styling consistency.

\n

Technical Improvements#

\n

Settings Architecture - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability.

\n

Documentation - Added extensive webhook documentation in docs/examples/webhook-transforms/ with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification.

\n

Webhook Integration Services - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring.

\n

Bug Fixes#

\n

Mobile Modal Close Button - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. Addresses issue #404 reported by anareaty

\n

Test Suite Stabilization - Resolved test failures and linting errors

\n

HTTP API Field Consistency - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. Addresses issue #393 reported by @nightroman

\n

Missing Webhook Trigger - Added webhook trigger for recurring task completion events.

\n

Documentation Updates#

\n
    \n
  • Task defaults documentation with template variables
  • \n
  • Miscellaneous settings documentation
  • \n
  • Webhook transform documentation and examples
  • \n
  • Demo GIFs for new features
  • \n
\n

Thanks @renatomen!

\n

Contributors#

\n

Special thanks to the following contributors:

\n
    \n
  • @Mara-Li - Feature request for template variables in task folders
  • \n
  • @kmaustral - Feature requests for folder filtering and UI alignment improvements
  • \n
  • @anareaty - Bug report for mobile modal close button issue
  • \n
  • @nightroman - Reported mislead API documentation
  • \n
\n

A really big thanks to @renatomen whose very polished contributions form the bulk of this update!

\n","text":"New Features# Task Organization and Filtering# Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. Addresses issue #369 reported by kmaustral Dynamic Task Folder Organization - Added template variable support for default task folder setting with task variables ({{context}}, {{project}}, {{priority}}, {{status}}, {{title}}) and date variables ({{year}}, {{month}}, {{day}}, {{date}}). Supports automatic folder creation and title sanitization. Addresses feature request #376 by Mara-Li Archive Task Organization - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (moveArchivedTasks, archiveFolder). Addresses feature request #402 by anareaty Enhanced UI and Controls# Enhanced Filter Bar - Improved filter bar with instant badge updates, right-click clear functionality, \"Clear All Filters\" button, and better UI synchronization across main and subtask views. Contributed by renatomen Collapsible Groups - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. Contributed by renatomen Expand/Collapse All Controls - Added \"Expand All\" and \"Collapse All\" buttons to task list toolbar that appear when grouping is active. Contributed by renatomen Configurable UI Elements - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. Contributed by renatomen Advanced API Architecture and Webhook System# Refactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility. Webhook System - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders. Webhook Testing and Development - Included standalone webhook testing server (test-webhook.js) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging. Improvements# UI and Visual Enhancements# TaskNotes Icons - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets. Task Card Polish - Improved status and priority dot alignment and reordered context menu (\"Copy task title\" moved to top). Addresses alignment issue #410 reported by kmaustral Button Styling - Fixed agenda view and filter popup button backgrounds with improved styling consistency. Technical Improvements# Settings Architecture - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability. Documentation - Added extensive webhook documentation in docs/examples/webhook-transforms/ with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification. Webhook Integration Services - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring. Bug Fixes# Mobile Modal Close Button - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. Addresses issue #404 reported by anareaty Test Suite Stabilization - Resolved test failures and linting errors HTTP API Field Consistency - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. Addresses issue #393 reported by @nightroman Missing Webhook Trigger - Added webhook trigger for recurring task completion events. Documentation Updates# Task defaults documentation with template variables Miscellaneous settings documentation Webhook transform documentation and examples Demo GIFs for new features Thanks @renatomen! Contributors# Special thanks to the following contributors: @Mara-Li - Feature request for template variables in task folders @kmaustral - Feature requests for folder filtering and UI alignment improvements @anareaty - Bug report for mobile modal close button issue @nightroman - Reported mislead API documentation A really big thanks to @renatomen whose very polished contributions form the bulk of this update!"},{"route":"/obsidian/releases/3.20.1/","title":"TaskNotes 3.20.1","description":"Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.20.1.md","namespace":"obsidian","relativePath":"releases/3.20.1.md","raw":"# TaskNotes 3.20.1\n\n## New Features\n\n### Enhanced View Organization and Visual Feedback\n\n**Saved View Headings with Completion Counts** - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in \"completed / total\" format. Shows \"All\" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. *Contributed by @renatomen*\n\n**Consistent Group Count Badges** - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified \"completed / total\" format. Removed redundant bracketed counts for cleaner presentation. *Contributed by @renatomen*\n\n**Collapsible Agenda Date Groups** - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via \"Expand All\" / \"Collapse All\" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. *Contributed by @renatomen*\n\n### Improved User Interface\n\n**Reorganized Task Context Menu** - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality. \n\n## Bug Fixes\n\n### Calendar Integration Fixes\n\n**Outlook Calendar 500 Errors** - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. *Fixes issue #458 reported by @girisumit and @heinzochsner*\n\n**Recurring Tasks Date Display** - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. *Fixes issue #439 reported by @brianarn and @jpmoo*\n\n### Task Management Fixes \n\n**Project Suggestions Crash Prevention** - Fixed crash in Task Creation modal when typing \"+\" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with \", \", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. *Contributed by @renatomen*\n\n## Documentation Updates\n\n- Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget\n- Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality \n- Updated view documentation with new visual features\n- Enhanced inline task documentation for Subtask Widget improvements\n\n*Contributed by @renatomen*\n\n## Contributors\n\nSpecial recognition goes to **@renatomen** for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality.\n\nThanks to the following community members for their bug reports and feedback:\n\n- **@girisumit and @heinzochsner** - Reported Outlook calendar integration issues\n- **@brianarn and @jpmoo** - Identified recurring tasks date display bug with detailed reproduction steps\n","aliases":["/releases/3.20.1/","/releases/3.20.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"enhanced-view-organization-and-visual-feedback","text":"Enhanced View Organization and Visual Feedback"},{"level":3,"id":"improved-user-interface","text":"Improved User Interface"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-integration-fixes","text":"Calendar Integration Fixes"},{"level":3,"id":"task-management-fixes","text":"Task Management Fixes"},{"level":2,"id":"documentation-updates","text":"Documentation Updates"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Enhanced View Organization and Visual Feedback#

\n

Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in "completed / total" format. Shows "All" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. Contributed by @renatomen

\n

Consistent Group Count Badges - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified "completed / total" format. Removed redundant bracketed counts for cleaner presentation. Contributed by @renatomen

\n

Collapsible Agenda Date Groups - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via "Expand All" / "Collapse All" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. Contributed by @renatomen

\n

Improved User Interface#

\n

Reorganized Task Context Menu - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality.

\n

Bug Fixes#

\n

Calendar Integration Fixes#

\n

Outlook Calendar 500 Errors - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. Fixes issue #458 reported by @girisumit and @heinzochsner

\n

Recurring Tasks Date Display - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. Fixes issue #439 reported by @brianarn and @jpmoo

\n

Task Management Fixes#

\n

Project Suggestions Crash Prevention - Fixed crash in Task Creation modal when typing "+" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with ", ", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. Contributed by @renatomen

\n

Documentation Updates#

\n
    \n
  • Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget
  • \n
  • Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality
  • \n
  • Updated view documentation with new visual features
  • \n
  • Enhanced inline task documentation for Subtask Widget improvements
  • \n
\n

Contributed by @renatomen

\n

Contributors#

\n

Special recognition goes to @renatomen for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality.

\n

Thanks to the following community members for their bug reports and feedback:

\n
    \n
  • @girisumit and @heinzochsner - Reported Outlook calendar integration issues
  • \n
  • @brianarn and @jpmoo - Identified recurring tasks date display bug with detailed reproduction steps
  • \n
\n","text":"New Features# Enhanced View Organization and Visual Feedback# Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in \"completed / total\" format. Shows \"All\" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. Contributed by @renatomen Consistent Group Count Badges - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified \"completed / total\" format. Removed redundant bracketed counts for cleaner presentation. Contributed by @renatomen Collapsible Agenda Date Groups - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via \"Expand All\" / \"Collapse All\" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. Contributed by @renatomen Improved User Interface# Reorganized Task Context Menu - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality. Bug Fixes# Calendar Integration Fixes# Outlook Calendar 500 Errors - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. Fixes issue #458 reported by @girisumit and @heinzochsner Recurring Tasks Date Display - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. Fixes issue #439 reported by @brianarn and @jpmoo Task Management Fixes# Project Suggestions Crash Prevention - Fixed crash in Task Creation modal when typing \"+\" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with \", \", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. Contributed by @renatomen Documentation Updates# Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality Updated view documentation with new visual features Enhanced inline task documentation for Subtask Widget improvements Contributed by @renatomen Contributors# Special recognition goes to @renatomen for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality. Thanks to the following community members for their bug reports and feedback: @girisumit and @heinzochsner - Reported Outlook calendar integration issues @brianarn and @jpmoo - Identified recurring tasks date display bug with detailed reproduction steps"},{"route":"/obsidian/releases/3.21.0/","title":"TaskNotes 3.21.0","description":"Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Ad...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.21.0.md","namespace":"obsidian","relativePath":"releases/3.21.0.md","raw":"# TaskNotes 3.21.0\n\n## New Features\n\n### Custom User Fields System\n\n**Custom User Fields Mapping** - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like \"2-Medium\" as numeric 2. *Contributed by @renatomen*\n\n**Group and Sort by Custom User Fields** - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. *Contributed by @renatomen*\n\n**User Fields in Task Modals** - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. *Contributed by @callumalpass*\n\n### Enhanced Task Interaction\n\n**Configurable Click Behavior** - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. *Contributed by @fastrick*\n\n### Calendar Integration Enhancements\n\n**Calendar Event Filename Templates** - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including `{icsEventTitle}`, `{icsEventLocation}`, `{icsEventDescription}`, and `{icsEventTitleWithDate}`. The `{title}` variable now uses clean event titles without date suffixes. *Fixes issue #362 reported by @bepolymathe*\n\n**Chronological ICS Event Sorting** - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. *Fixes issue #472 reported by @Crunchnuggetz*\n\n## Bug Fixes\n\n### API Endpoint Improvements\n\n**Custom Status Configuration Support** - Fixed API endpoints (`/api/nlp/parse` and `/api/nlp/create`) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. *Fixes issue #487 reported by @23maverick23*\n\n**Task Creation Defaults** - Fixed REST API endpoint (`POST /api/tasks`) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. *Fixes issue reported by @nightroman*\n\n### Project Management Fixes\n\n**Project Consolidation and Display** - Fixed project grouping to consolidate different formats pointing to the same file (e.g., `[[project]]` and `[[project|alias]]` now group together). Improved display formatting with clickable headers showing absolute paths without `.md` extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. *Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty*\n\n### User Experience Improvements\n\n**Tag Input Sanitization** - Added automatic sanitization to remove `#` prefixes from tag input, preventing duplicate tags like `#tag1` and `##tag1`. Applied to task creation, editing, and real-time input handling. *Fixes issue #331 reported by @AndreMonthy*\n\n## Contributors\n\nSpecial recognition goes to **@renatomen** for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities.\n\nThanks to **@fastrick** for implementing the configurable click behavior feature.\n\nThanks to the following community members for their bug reports and feature requests:\n\n- **@23maverick23** - Reported API custom status configuration issues with detailed technical analysis\n- **@Crunchnuggetz** - Identified ICS calendar event sorting problem in agenda view\n- **@minchinweb** - Reported project consolidation issues with wikilink variations \n- **@anareaty** - Identified project display formatting problems in kanban view\n- **@bepolymathe** - Requested calendar event filename template functionality\n- **@AndreMonthy** - Reported tag input sanitization issues with clear examples\n- **@nightroman** - Reported API issues where defaults were not being applied","aliases":["/releases/3.21.0/","/releases/3.21.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"custom-user-fields-system","text":"Custom User Fields System"},{"level":3,"id":"enhanced-task-interaction","text":"Enhanced Task Interaction"},{"level":3,"id":"calendar-integration-enhancements","text":"Calendar Integration Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"api-endpoint-improvements","text":"API Endpoint Improvements"},{"level":3,"id":"project-management-fixes","text":"Project Management Fixes"},{"level":3,"id":"user-experience-improvements","text":"User Experience Improvements"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Custom User Fields System#

\n

Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like "2-Medium" as numeric 2. Contributed by @renatomen

\n

Group and Sort by Custom User Fields - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. Contributed by @renatomen

\n

User Fields in Task Modals - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. Contributed by @callumalpass

\n

Enhanced Task Interaction#

\n

Configurable Click Behavior - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. Contributed by @fastrick

\n

Calendar Integration Enhancements#

\n

Calendar Event Filename Templates - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including {icsEventTitle}, {icsEventLocation}, {icsEventDescription}, and {icsEventTitleWithDate}. The {title} variable now uses clean event titles without date suffixes. Fixes issue #362 reported by @bepolymathe

\n

Chronological ICS Event Sorting - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. Fixes issue #472 reported by @Crunchnuggetz

\n

Bug Fixes#

\n

API Endpoint Improvements#

\n

Custom Status Configuration Support - Fixed API endpoints (/api/nlp/parse and /api/nlp/create) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. Fixes issue #487 reported by @23maverick23

\n

Task Creation Defaults - Fixed REST API endpoint (POST /api/tasks) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. Fixes issue reported by @nightroman

\n

Project Management Fixes#

\n

Project Consolidation and Display - Fixed project grouping to consolidate different formats pointing to the same file (e.g., [[project]] and [[project|alias]] now group together). Improved display formatting with clickable headers showing absolute paths without .md extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty

\n

User Experience Improvements#

\n

Tag Input Sanitization - Added automatic sanitization to remove # prefixes from tag input, preventing duplicate tags like #tag1 and ##tag1. Applied to task creation, editing, and real-time input handling. Fixes issue #331 reported by @AndreMonthy

\n

Contributors#

\n

Special recognition goes to @renatomen for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities.

\n

Thanks to @fastrick for implementing the configurable click behavior feature.

\n

Thanks to the following community members for their bug reports and feature requests:

\n
    \n
  • @23maverick23 - Reported API custom status configuration issues with detailed technical analysis
  • \n
  • @Crunchnuggetz - Identified ICS calendar event sorting problem in agenda view
  • \n
  • @minchinweb - Reported project consolidation issues with wikilink variations
  • \n
  • @anareaty - Identified project display formatting problems in kanban view
  • \n
  • @bepolymathe - Requested calendar event filename template functionality
  • \n
  • @AndreMonthy - Reported tag input sanitization issues with clear examples
  • \n
  • @nightroman - Reported API issues where defaults were not being applied
  • \n
\n","text":"New Features# Custom User Fields System# Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like \"2-Medium\" as numeric 2. Contributed by @renatomen Group and Sort by Custom User Fields - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. Contributed by @renatomen User Fields in Task Modals - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. Contributed by @callumalpass Enhanced Task Interaction# Configurable Click Behavior - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. Contributed by @fastrick Calendar Integration Enhancements# Calendar Event Filename Templates - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including {icsEventTitle}, {icsEventLocation}, {icsEventDescription}, and {icsEventTitleWithDate}. The {title} variable now uses clean event titles without date suffixes. Fixes issue #362 reported by @bepolymathe Chronological ICS Event Sorting - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. Fixes issue #472 reported by @Crunchnuggetz Bug Fixes# API Endpoint Improvements# Custom Status Configuration Support - Fixed API endpoints (/api/nlp/parse and /api/nlp/create) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. Fixes issue #487 reported by @23maverick23 Task Creation Defaults - Fixed REST API endpoint (POST /api/tasks) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. Fixes issue reported by @nightroman Project Management Fixes# Project Consolidation and Display - Fixed project grouping to consolidate different formats pointing to the same file (e.g., [[project]] and [[project|alias]] now group together). Improved display formatting with clickable headers showing absolute paths without .md extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty User Experience Improvements# Tag Input Sanitization - Added automatic sanitization to remove # prefixes from tag input, preventing duplicate tags like #tag1 and ##tag1. Applied to task creation, editing, and real-time input handling. Fixes issue #331 reported by @AndreMonthy Contributors# Special recognition goes to @renatomen for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities. Thanks to @fastrick for implementing the configurable click behavior feature. Thanks to the following community members for their bug reports and feature requests: @23maverick23 - Reported API custom status configuration issues with detailed technical analysis @Crunchnuggetz - Identified ICS calendar event sorting problem in agenda view @minchinweb - Reported project consolidation issues with wikilink variations @anareaty - Identified project display formatting problems in kanban view @bepolymathe - Requested calendar event filename template functionality @AndreMonthy - Reported tag input sanitization issues with clear examples @nightroman - Reported API issues where defaults were not being applied"},{"route":"/obsidian/releases/3.22.0/","title":"TaskNotes 3.22.0","description":"Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total t...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.22.0.md","namespace":"obsidian","relativePath":"releases/3.22.0.md","raw":"# TaskNotes 3.22.0\n\n## Major Features\n\n### Modular Properties System\n\n- Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. *Thanks to @renatomen for the initial implementation of this feature*\n\n- Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users.\n\n- Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled.\n\n### Bases-style Filter Bar Redesign\n\n- Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability.\n- Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization.\n- Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability.\n- Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience.\n- Added dedicated \"+ New\" task creation button to filter bar with neutral styling and proper view context awareness.\n\n### Statistics view\n\n- Implement a new view to track statistics about projects and time tracking. \n\n## UX\n\n### Task Interaction Improvements\n\n- Changed \"This Week\" grouping label to \"Next seven days\" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. *Fixes issue #516 reported by @anareaty*\n\n### External Contributions\n\n- Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. *Contributed by @renatomen*\n- Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. *Contributed by @renatomen* \n- Fixed project names containing commas (e.g., `[[Money, Org & Adm]]`) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. *Contributed by @renatomen*\n- Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. *Contributed by @renatomen*\n- Fixed User Fields column order in settings to match Field mapping configuration for consistency. *Contributed by @renatomen*\n\n## Bug Fixes\n\n### Timezone and Date Handling\n\n- Fixed timezone-dependent \"Today\" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. *Fixes issue #452 reported by @MinchinWeb*\n\n\n### User Interface Fixes\n\n- Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings.\n- Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. *Fixes issue #529 reported by @motusira*\n- Removed title length limits that were causing text truncation, allowing full title display. *Fixes issue #378 reported by @nsstrickland*\n- Added all-day slot toggle to calendar view for better event organization. *Fixes issue #242 requested by @Crunchnuggetz*\n- Added calendar locale configuration for international calendar support with proper localization. *Contributed by @pixeler*\n- Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. *Fixes issue #527 reported by @jordandrako*\n- Fixed inline task overlay title wrapping using `white-space: break-spaces` for proper text display. *Fixes issue #517 reported by @cathywu*\n\n### New Capabilities\n\n- Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. *Fixes issue #238 requested by @girisumit*\n- Added tags to available sorting and grouping options for more flexible task organization. *Fixes issue #169 requested by @bce283c*\n- Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. *Fixes issue #299 requested by @0dfa1bc*\n- Added filename template variables to folder templates including support for additional customization options. *Fixes issue #473 requested by @oliverlalan*\n- Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing.\n\n## Infrastructure Improvements\n\n### Development and Testing\n\n- Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility.\n- Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality.\n- Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions.\n\n## Contributors\n\nSpecial recognition goes to **@renatomen** for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment.\n\nThanks to the following community members for their bug reports and feature requests:\n\n- **@anareaty** - Reported grouping label confusion with clear examples\n- **@MinchinWeb** - Identified timezone handling inconsistencies across multiple views\n- **@motusira** - Reported contrast issues with INTERRUPTED status badge\n- **@nsstrickland** - Identified title truncation problems\n- **@Crunchnuggetz** - Requested all-day slot toggle for calendar views\n- **@jordandrako** - Reported task state refresh issues at midnight\n- **@cathywu** - Identified text wrapping problems in overlays \n- **@girisumit** - Requested enhanced date picker functionality\n- **@oliverlalan** - Requested template variable enhancements","aliases":["/releases/3.22.0/","/releases/3.22.0/"],"toc":[{"level":2,"id":"major-features","text":"Major Features"},{"level":3,"id":"modular-properties-system","text":"Modular Properties System"},{"level":3,"id":"bases-style-filter-bar-redesign","text":"Bases-style Filter Bar Redesign"},{"level":3,"id":"statistics-view","text":"Statistics view"},{"level":2,"id":"ux","text":"UX"},{"level":3,"id":"task-interaction-improvements","text":"Task Interaction Improvements"},{"level":3,"id":"external-contributions","text":"External Contributions"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"timezone-and-date-handling","text":"Timezone and Date Handling"},{"level":3,"id":"user-interface-fixes","text":"User Interface Fixes"},{"level":3,"id":"new-capabilities","text":"New Capabilities"},{"level":2,"id":"infrastructure-improvements","text":"Infrastructure Improvements"},{"level":3,"id":"development-and-testing","text":"Development and Testing"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

Major Features#

\n

Modular Properties System#

\n
    \n
  • Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. Thanks to @renatomen for the initial implementation of this feature

    \n
  • \n
  • Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users.

    \n
  • \n
  • Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled.

    \n
  • \n
\n

Bases-style Filter Bar Redesign#

\n
    \n
  • Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability.
  • \n
  • Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization.
  • \n
  • Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability.
  • \n
  • Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience.
  • \n
  • Added dedicated "+ New" task creation button to filter bar with neutral styling and proper view context awareness.
  • \n
\n

Statistics view#

\n
    \n
  • Implement a new view to track statistics about projects and time tracking.
  • \n
\n

UX#

\n

Task Interaction Improvements#

\n
    \n
  • Changed "This Week" grouping label to "Next seven days" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. Fixes issue #516 reported by @anareaty
  • \n
\n

External Contributions#

\n
    \n
  • Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. Contributed by @renatomen
  • \n
  • Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. Contributed by @renatomen
  • \n
  • Fixed project names containing commas (e.g., [[Money, Org & Adm]]) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. Contributed by @renatomen
  • \n
  • Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. Contributed by @renatomen
  • \n
  • Fixed User Fields column order in settings to match Field mapping configuration for consistency. Contributed by @renatomen
  • \n
\n

Bug Fixes#

\n

Timezone and Date Handling#

\n
    \n
  • Fixed timezone-dependent "Today" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. Fixes issue #452 reported by @MinchinWeb
  • \n
\n

User Interface Fixes#

\n
    \n
  • Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings.
  • \n
  • Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. Fixes issue #529 reported by @motusira
  • \n
  • Removed title length limits that were causing text truncation, allowing full title display. Fixes issue #378 reported by @nsstrickland
  • \n
  • Added all-day slot toggle to calendar view for better event organization. Fixes issue #242 requested by @Crunchnuggetz
  • \n
  • Added calendar locale configuration for international calendar support with proper localization. Contributed by @pixeler
  • \n
  • Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. Fixes issue #527 reported by @jordandrako
  • \n
  • Fixed inline task overlay title wrapping using white-space: break-spaces for proper text display. Fixes issue #517 reported by @cathywu
  • \n
\n

New Capabilities#

\n
    \n
  • Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. Fixes issue #238 requested by @girisumit
  • \n
  • Added tags to available sorting and grouping options for more flexible task organization. Fixes issue #169 requested by @bce283c
  • \n
  • Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. Fixes issue #299 requested by @0dfa1bc
  • \n
  • Added filename template variables to folder templates including support for additional customization options. Fixes issue #473 requested by @oliverlalan
  • \n
  • Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing.
  • \n
\n

Infrastructure Improvements#

\n

Development and Testing#

\n
    \n
  • Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility.
  • \n
  • Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality.
  • \n
  • Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions.
  • \n
\n

Contributors#

\n

Special recognition goes to @renatomen for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment.

\n

Thanks to the following community members for their bug reports and feature requests:

\n
    \n
  • @anareaty - Reported grouping label confusion with clear examples
  • \n
  • @MinchinWeb - Identified timezone handling inconsistencies across multiple views
  • \n
  • @motusira - Reported contrast issues with INTERRUPTED status badge
  • \n
  • @nsstrickland - Identified title truncation problems
  • \n
  • @Crunchnuggetz - Requested all-day slot toggle for calendar views
  • \n
  • @jordandrako - Reported task state refresh issues at midnight
  • \n
  • @cathywu - Identified text wrapping problems in overlays
  • \n
  • @girisumit - Requested enhanced date picker functionality
  • \n
  • @oliverlalan - Requested template variable enhancements
  • \n
\n","text":"Major Features# Modular Properties System# Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. Thanks to @renatomen for the initial implementation of this feature Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users. Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled. Bases-style Filter Bar Redesign# Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability. Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization. Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability. Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience. Added dedicated \"+ New\" task creation button to filter bar with neutral styling and proper view context awareness. Statistics view# Implement a new view to track statistics about projects and time tracking. UX# Task Interaction Improvements# Changed \"This Week\" grouping label to \"Next seven days\" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. Fixes issue #516 reported by @anareaty External Contributions# Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. Contributed by @renatomen Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. Contributed by @renatomen Fixed project names containing commas (e.g., [[Money, Org & Adm]]) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. Contributed by @renatomen Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. Contributed by @renatomen Fixed User Fields column order in settings to match Field mapping configuration for consistency. Contributed by @renatomen Bug Fixes# Timezone and Date Handling# Fixed timezone-dependent \"Today\" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. Fixes issue #452 reported by @MinchinWeb User Interface Fixes# Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings. Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. Fixes issue #529 reported by @motusira Removed title length limits that were causing text truncation, allowing full title display. Fixes issue #378 reported by @nsstrickland Added all-day slot toggle to calendar view for better event organization. Fixes issue #242 requested by @Crunchnuggetz Added calendar locale configuration for international calendar support with proper localization. Contributed by @pixeler Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. Fixes issue #527 reported by @jordandrako Fixed inline task overlay title wrapping using white-space: break-spaces for proper text display. Fixes issue #517 reported by @cathywu New Capabilities# Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. Fixes issue #238 requested by @girisumit Added tags to available sorting and grouping options for more flexible task organization. Fixes issue #169 requested by @bce283c Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. Fixes issue #299 requested by @0dfa1bc Added filename template variables to folder templates including support for additional customization options. Fixes issue #473 requested by @oliverlalan Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing. Infrastructure Improvements# Development and Testing# Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility. Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality. Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions. Contributors# Special recognition goes to @renatomen for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment. Thanks to the following community members for their bug reports and feature requests: @anareaty - Reported grouping label confusion with clear examples @MinchinWeb - Identified timezone handling inconsistencies across multiple views @motusira - Reported contrast issues with INTERRUPTED status badge @nsstrickland - Identified title truncation problems @Crunchnuggetz - Requested all-day slot toggle for calendar views @jordandrako - Reported task state refresh issues at midnight @cathywu - Identified text wrapping problems in overlays @girisumit - Requested enhanced date picker functionality @oliverlalan - Requested template variable enhancements"},{"route":"/obsidian/releases/3.22.1/","title":"TaskNotes 3.22.1","description":"Thanks to @jhedlund for implementing the configurable recurring task due date feature.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.22.1.md","namespace":"obsidian","relativePath":"releases/3.22.1.md","raw":"# TaskNotes 3.22.1\n\n## New Features\n\n### Configurable Recurring Task Due Date Behavior\n\n- Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new \"Maintain due date offset in recurring tasks\" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. *Contributed by @jhedlund, fixes issue #470*\n\n## Bug Fixes\n\n### Calendar and Task Display\n\n- Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved `timeEntries.filter is not a function` errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. *Fixes issue #520 reported by @cathywu*\n\n### Saved Views and Property Management\n\n- Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. *Fixes issue #545 reported by @anareaty*\n- Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving.\n- Added proper null safety checks for FilterBar interactions to prevent errors during view save operations.\n\n### User Interface Improvements\n\n- Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. *Fixes issue #549 reported by @TonyAtlas*\n\n## Development Improvements\n\n- Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting.\n\n## Contributors\n\nThanks to **@jhedlund** for implementing the configurable recurring task due date feature.\n\nThanks to the following community members for their bug reports:\n\n- **@cathywu** - Reported calendar view task display issues with detailed technical information\n- **@anareaty** - Identified property visibility persistence problems in saved views \n- **@TonyAtlas** - Reported filter bar overflow issues in narrow sidebars with helpful screenshots","aliases":["/releases/3.22.1/","/releases/3.22.1/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"configurable-recurring-task-due-date-behavior","text":"Configurable Recurring Task Due Date Behavior"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-and-task-display","text":"Calendar and Task Display"},{"level":3,"id":"saved-views-and-property-management","text":"Saved Views and Property Management"},{"level":3,"id":"user-interface-improvements","text":"User Interface Improvements"},{"level":2,"id":"development-improvements","text":"Development Improvements"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

New Features#

\n

Configurable Recurring Task Due Date Behavior#

\n
    \n
  • Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new "Maintain due date offset in recurring tasks" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. Contributed by @jhedlund, fixes issue #470
  • \n
\n

Bug Fixes#

\n

Calendar and Task Display#

\n
    \n
  • Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved timeEntries.filter is not a function errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. Fixes issue #520 reported by @cathywu
  • \n
\n

Saved Views and Property Management#

\n
    \n
  • Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. Fixes issue #545 reported by @anareaty
  • \n
  • Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving.
  • \n
  • Added proper null safety checks for FilterBar interactions to prevent errors during view save operations.
  • \n
\n

User Interface Improvements#

\n
    \n
  • Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. Fixes issue #549 reported by @TonyAtlas
  • \n
\n

Development Improvements#

\n
    \n
  • Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting.
  • \n
\n

Contributors#

\n

Thanks to @jhedlund for implementing the configurable recurring task due date feature.

\n

Thanks to the following community members for their bug reports:

\n
    \n
  • @cathywu - Reported calendar view task display issues with detailed technical information
  • \n
  • @anareaty - Identified property visibility persistence problems in saved views
  • \n
  • @TonyAtlas - Reported filter bar overflow issues in narrow sidebars with helpful screenshots
  • \n
\n","text":"New Features# Configurable Recurring Task Due Date Behavior# Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new \"Maintain due date offset in recurring tasks\" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. Contributed by @jhedlund, fixes issue #470 Bug Fixes# Calendar and Task Display# Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved timeEntries.filter is not a function errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. Fixes issue #520 reported by @cathywu Saved Views and Property Management# Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. Fixes issue #545 reported by @anareaty Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving. Added proper null safety checks for FilterBar interactions to prevent errors during view save operations. User Interface Improvements# Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. Fixes issue #549 reported by @TonyAtlas Development Improvements# Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting. Contributors# Thanks to @jhedlund for implementing the configurable recurring task due date feature. Thanks to the following community members for their bug reports: @cathywu - Reported calendar view task display issues with detailed technical information @anareaty - Identified property visibility persistence problems in saved views @TonyAtlas - Reported filter bar overflow issues in narrow sidebars with helpful screenshots"},{"route":"/obsidian/releases/3.23.0/","title":"TaskNotes 3.23.0","description":"We extend special thanks to @renatomen for his exceptional contributions to this release:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.0.md","namespace":"obsidian","relativePath":"releases/3.23.0.md","raw":"# TaskNotes 3.23.0\n\n## New Features\n\n### ICS Export and Calendar Integration\n\n- Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility\n- Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows\n- Added manual \"Export all tasks as ICS file\" command for bulk export operations\n- *Thanks to @mdbraber for requesting this feature (#422)*\n\n### Status-Based Auto-Archive\n\n- Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes)\n- Added persistent queue that survives plugin restarts for reliable task archiving\n- Implemented settings UI for fine-grained control over auto-archive behavior\n- *Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions*\n\n### Multi-Language Natural Language Processing\n\n- Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian\n- Implemented locale-specific date parsing using chrono-node language support\n- Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts\n- *Thanks to @pschoenbach for requesting German language support (#563)*\n\n### Enhanced Project Autosuggest\n\n- Implemented configurable multi-row project cards with customizable display fields\n- Added selective search functionality across chosen fields with simple flag system\n- Introduced fuzzy search option for broader, multi-word matching capabilities\n- Enhanced project selection with clear metadata display (title, aliases, path)\n- *Thanks to @renatomen for implementing this feature (#555)*\n\n### Bases Plugin Integration\n\n- Added experimental integration with the Bases plugin for enhanced task management workflows\n- Implemented direct formula computation and custom property support\n- Added clickable tags and contexts with accessibility support\n- Created simplified kanban view integration with proper lifecycle management\n- *Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature*\n\n### Settings UI Modernization\n\n- Complete redesign of settings interface with card-based design system\n- Added collapsible functionality and live API documentation\n- Enhanced calendar subscription interface with local file support\n\n## Bug Fixes\n\n### Task Creation and File Handling\n\n- Fixed startup crash when templates contain empty reminders property (*reported by @glpayson, #583*)\n- Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (*reported by @glpayson, #590*)\n- Added support for platform-specific filename characters (hash, square brackets)\n- Resolved inconsistent behavior between instant convert and manual task creation\n\n### Project and Link Functionality \n\n- Added clickable project links in task edit modal for better navigation (*requested by @anareaty, #432*)\n- Fixed completion date timezone handling to ensure consistent local time recording\n- Corrected frontmatter property naming in Bases kanban drag-and-drop operations\n\n### Property Display and Performance\n\n- Fixed custom property duplication when configured in both settings and filter bar\n- Resolved unwanted total tracked time display showing zero values\n- Standardized custom property identifiers with consistent prefix format\n\n### Plugin Integration and Stability\n\n- Resolved Bases plugin integration issues and view switching problems\n- Fixed kanban view loading with proper static imports and interface consistency\n- Improved error handling and cleanup patterns for better stability\n- Fixed API endpoints to respect custom status configurations (*reported by @23maverick23, #487*)\n\n## Acknowledgments\n\n### Special Recognition\n\nWe extend special thanks to **@renatomen** for his exceptional contributions to this release:\n\n- Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555)\n- Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration\n- His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible!\n\n### Community Contributors\n\nWe're grateful to the community members whose issues were resolved in this release:\n\n- **@glpayson** for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590)\n- **@mdbraber** for requesting ICS export functionality that became a major feature in this release (#422)\n- **@TonyAtlas** for the auto-archive feature request that resulted in the new status-based auto-archive system (#547)\n- **@anareaty** for requesting clickable project links (#432) and reporting the \"This Week\" grouping label issue (#516)\n- **@pschoenbach** for requesting multi-language NLP support, specifically German language support (#563)\n- **@23maverick23** for reporting API status configuration issues that improved custom status handling (#487)\n- **@Burrish** for the documentation correction (#597)\n\n---\n\n**Full Changelog**: [3.22.1...3.23.0](https://github.com/callumalpass/tasknotes/compare/3.22.1...3.23.0)\n\n","aliases":["/releases/3.23.0/","/releases/3.23.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"ics-export-and-calendar-integration","text":"ICS Export and Calendar Integration"},{"level":3,"id":"status-based-auto-archive","text":"Status-Based Auto-Archive"},{"level":3,"id":"multi-language-natural-language-processing","text":"Multi-Language Natural Language Processing"},{"level":3,"id":"enhanced-project-autosuggest","text":"Enhanced Project Autosuggest"},{"level":3,"id":"bases-plugin-integration","text":"Bases Plugin Integration"},{"level":3,"id":"settings-ui-modernization","text":"Settings UI Modernization"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-creation-and-file-handling","text":"Task Creation and File Handling"},{"level":3,"id":"project-and-link-functionality","text":"Project and Link Functionality"},{"level":3,"id":"property-display-and-performance","text":"Property Display and Performance"},{"level":3,"id":"plugin-integration-and-stability","text":"Plugin Integration and Stability"},{"level":2,"id":"acknowledgments","text":"Acknowledgments"},{"level":3,"id":"special-recognition","text":"Special Recognition"},{"level":3,"id":"community-contributors","text":"Community Contributors"}],"html":"

New Features#

\n

ICS Export and Calendar Integration#

\n
    \n
  • Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility
  • \n
  • Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows
  • \n
  • Added manual "Export all tasks as ICS file" command for bulk export operations
  • \n
  • Thanks to @mdbraber for requesting this feature (#422)
  • \n
\n

Status-Based Auto-Archive#

\n
    \n
  • Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes)
  • \n
  • Added persistent queue that survives plugin restarts for reliable task archiving
  • \n
  • Implemented settings UI for fine-grained control over auto-archive behavior
  • \n
  • Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions
  • \n
\n

Multi-Language Natural Language Processing#

\n
    \n
  • Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian
  • \n
  • Implemented locale-specific date parsing using chrono-node language support
  • \n
  • Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts
  • \n
  • Thanks to @pschoenbach for requesting German language support (#563)
  • \n
\n

Enhanced Project Autosuggest#

\n
    \n
  • Implemented configurable multi-row project cards with customizable display fields
  • \n
  • Added selective search functionality across chosen fields with simple flag system
  • \n
  • Introduced fuzzy search option for broader, multi-word matching capabilities
  • \n
  • Enhanced project selection with clear metadata display (title, aliases, path)
  • \n
  • Thanks to @renatomen for implementing this feature (#555)
  • \n
\n

Bases Plugin Integration#

\n
    \n
  • Added experimental integration with the Bases plugin for enhanced task management workflows
  • \n
  • Implemented direct formula computation and custom property support
  • \n
  • Added clickable tags and contexts with accessibility support
  • \n
  • Created simplified kanban view integration with proper lifecycle management
  • \n
  • Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature
  • \n
\n

Settings UI Modernization#

\n
    \n
  • Complete redesign of settings interface with card-based design system
  • \n
  • Added collapsible functionality and live API documentation
  • \n
  • Enhanced calendar subscription interface with local file support
  • \n
\n

Bug Fixes#

\n

Task Creation and File Handling#

\n
    \n
  • Fixed startup crash when templates contain empty reminders property (reported by @glpayson, #583)
  • \n
  • Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (reported by @glpayson, #590)
  • \n
  • Added support for platform-specific filename characters (hash, square brackets)
  • \n
  • Resolved inconsistent behavior between instant convert and manual task creation
  • \n
\n\n
    \n
  • Added clickable project links in task edit modal for better navigation (requested by @anareaty, #432)
  • \n
  • Fixed completion date timezone handling to ensure consistent local time recording
  • \n
  • Corrected frontmatter property naming in Bases kanban drag-and-drop operations
  • \n
\n

Property Display and Performance#

\n
    \n
  • Fixed custom property duplication when configured in both settings and filter bar
  • \n
  • Resolved unwanted total tracked time display showing zero values
  • \n
  • Standardized custom property identifiers with consistent prefix format
  • \n
\n

Plugin Integration and Stability#

\n
    \n
  • Resolved Bases plugin integration issues and view switching problems
  • \n
  • Fixed kanban view loading with proper static imports and interface consistency
  • \n
  • Improved error handling and cleanup patterns for better stability
  • \n
  • Fixed API endpoints to respect custom status configurations (reported by @23maverick23, #487)
  • \n
\n

Acknowledgments#

\n

Special Recognition#

\n

We extend special thanks to @renatomen for his exceptional contributions to this release:

\n
    \n
  • Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555)
  • \n
  • Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration
  • \n
  • His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible!
  • \n
\n

Community Contributors#

\n

We're grateful to the community members whose issues were resolved in this release:

\n
    \n
  • @glpayson for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590)
  • \n
  • @mdbraber for requesting ICS export functionality that became a major feature in this release (#422)
  • \n
  • @TonyAtlas for the auto-archive feature request that resulted in the new status-based auto-archive system (#547)
  • \n
  • @anareaty for requesting clickable project links (#432) and reporting the "This Week" grouping label issue (#516)
  • \n
  • @pschoenbach for requesting multi-language NLP support, specifically German language support (#563)
  • \n
  • @23maverick23 for reporting API status configuration issues that improved custom status handling (#487)
  • \n
  • @Burrish for the documentation correction (#597)
  • \n
\n
\n

Full Changelog: 3.22.1...3.23.0

\n","text":"New Features# ICS Export and Calendar Integration# Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows Added manual \"Export all tasks as ICS file\" command for bulk export operations Thanks to @mdbraber for requesting this feature (#422) Status-Based Auto-Archive# Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes) Added persistent queue that survives plugin restarts for reliable task archiving Implemented settings UI for fine-grained control over auto-archive behavior Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions Multi-Language Natural Language Processing# Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian Implemented locale-specific date parsing using chrono-node language support Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts Thanks to @pschoenbach for requesting German language support (#563) Enhanced Project Autosuggest# Implemented configurable multi-row project cards with customizable display fields Added selective search functionality across chosen fields with simple flag system Introduced fuzzy search option for broader, multi-word matching capabilities Enhanced project selection with clear metadata display (title, aliases, path) Thanks to @renatomen for implementing this feature (#555) Bases Plugin Integration# Added experimental integration with the Bases plugin for enhanced task management workflows Implemented direct formula computation and custom property support Added clickable tags and contexts with accessibility support Created simplified kanban view integration with proper lifecycle management Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature Settings UI Modernization# Complete redesign of settings interface with card-based design system Added collapsible functionality and live API documentation Enhanced calendar subscription interface with local file support Bug Fixes# Task Creation and File Handling# Fixed startup crash when templates contain empty reminders property (reported by @glpayson, #583) Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (reported by @glpayson, #590) Added support for platform-specific filename characters (hash, square brackets) Resolved inconsistent behavior between instant convert and manual task creation Project and Link Functionality# Added clickable project links in task edit modal for better navigation (requested by @anareaty, #432) Fixed completion date timezone handling to ensure consistent local time recording Corrected frontmatter property naming in Bases kanban drag-and-drop operations Property Display and Performance# Fixed custom property duplication when configured in both settings and filter bar Resolved unwanted total tracked time display showing zero values Standardized custom property identifiers with consistent prefix format Plugin Integration and Stability# Resolved Bases plugin integration issues and view switching problems Fixed kanban view loading with proper static imports and interface consistency Improved error handling and cleanup patterns for better stability Fixed API endpoints to respect custom status configurations (reported by @23maverick23, #487) Acknowledgments# Special Recognition# We extend special thanks to @renatomen for his exceptional contributions to this release: Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555) Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible! Community Contributors# We're grateful to the community members whose issues were resolved in this release: @glpayson for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590) @mdbraber for requesting ICS export functionality that became a major feature in this release (#422) @TonyAtlas for the auto-archive feature request that resulted in the new status-based auto-archive system (#547) @anareaty for requesting clickable project links (#432) and reporting the \"This Week\" grouping label issue (#516) @pschoenbach for requesting multi-language NLP support, specifically German language support (#563) @23maverick23 for reporting API status configuration issues that improved custom status handling (#487) @Burrish for the documentation correction (#597) Full Changelog: 3.22.1...3.23.0"},{"route":"/obsidian/releases/3.23.1/","title":"TaskNotes 3.23.1","description":"Full Changelog: 3.23.0...3.23.1","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.1.md","namespace":"obsidian","relativePath":"releases/3.23.1.md","raw":"# TaskNotes 3.23.1\n\n## Bug Fixes\n\n### Bases Plugin Integration\n\n- Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. *Thanks to @anareaty for reporting this issue (#607)*\n\n---\n\n**Full Changelog**: [3.23.0...3.23.1](https://github.com/callumalpass/tasknotes/compare/3.23.0...3.23.1)","aliases":["/releases/3.23.1/","/releases/3.23.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"bases-plugin-integration","text":"Bases Plugin Integration"}],"html":"

Bug Fixes#

\n

Bases Plugin Integration#

\n
    \n
  • Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. Thanks to @anareaty for reporting this issue (#607)
  • \n
\n
\n

Full Changelog: 3.23.0...3.23.1

\n","text":"Bug Fixes# Bases Plugin Integration# Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. Thanks to @anareaty for reporting this issue (#607) Full Changelog: 3.23.0...3.23.1"},{"route":"/obsidian/releases/3.23.2/","title":"TaskNotes v3.23.2 Release Notes","description":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.2.md","namespace":"obsidian","relativePath":"releases/3.23.2.md","raw":"# TaskNotes v3.23.2 Release Notes\n\nThis release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks. \n\n## New Features\n\n- Added agenda/list view to Advanced Calendar \n- New `{{contexts}}` template variable for joining multiple context values\n- New `{{projects}}` template variable for joining multiple project values *Thanks to @Mara-Li for these additions*\n\n### Time Format Consistency\n\n- Plugin-wide 12hr/24hr time format preference support\n- Consistent time display across all calendar views and components\n- *Thanks to @anareaty and @Astrusia for this suggestion #431*\n\n### Performance Architecture\n\n- Centralized ViewPerformanceService for all TaskNotes views\n- Global task version cache with change detection\n- Debounced updates with configurable batching\n- View-specific update handlers with selective refresh logic\n- Memory management and automatic cache cleanup\n\n## Bug Fixes\n\n- Fixed cursor positioning issues when creating subtask widgets *Thanks to @jhedlund for this fix!*\n\n## Contributors\n\nSpecial thanks to contributors:\n- @jhedlund for fixing cursor positioning with subtasks\n- @Mara-Li for implementing context/project template variables and bracket fixes\n- @anareaty for reporting time format inconsistencies\n","aliases":["/releases/3.23.2/","/releases/3.23.2/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"time-format-consistency","text":"Time Format Consistency"},{"level":3,"id":"performance-architecture","text":"Performance Architecture"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks.

\n

New Features#

\n
    \n
  • Added agenda/list view to Advanced Calendar
  • \n
  • New {{contexts}} template variable for joining multiple context values
  • \n
  • New {{projects}} template variable for joining multiple project values Thanks to @Mara-Li for these additions
  • \n
\n

Time Format Consistency#

\n
    \n
  • Plugin-wide 12hr/24hr time format preference support
  • \n
  • Consistent time display across all calendar views and components
  • \n
  • Thanks to @anareaty and @Astrusia for this suggestion #431
  • \n
\n

Performance Architecture#

\n
    \n
  • Centralized ViewPerformanceService for all TaskNotes views
  • \n
  • Global task version cache with change detection
  • \n
  • Debounced updates with configurable batching
  • \n
  • View-specific update handlers with selective refresh logic
  • \n
  • Memory management and automatic cache cleanup
  • \n
\n

Bug Fixes#

\n
    \n
  • Fixed cursor positioning issues when creating subtask widgets Thanks to @jhedlund for this fix!
  • \n
\n

Contributors#

\n

Special thanks to contributors:

\n
    \n
  • @jhedlund for fixing cursor positioning with subtasks
  • \n
  • @Mara-Li for implementing context/project template variables and bracket fixes
  • \n
  • @anareaty for reporting time format inconsistencies
  • \n
\n","text":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks. New Features# Added agenda/list view to Advanced Calendar New {{contexts}} template variable for joining multiple context values New {{projects}} template variable for joining multiple project values Thanks to @Mara-Li for these additions Time Format Consistency# Plugin-wide 12hr/24hr time format preference support Consistent time display across all calendar views and components Thanks to @anareaty and @Astrusia for this suggestion #431 Performance Architecture# Centralized ViewPerformanceService for all TaskNotes views Global task version cache with change detection Debounced updates with configurable batching View-specific update handlers with selective refresh logic Memory management and automatic cache cleanup Bug Fixes# Fixed cursor positioning issues when creating subtask widgets Thanks to @jhedlund for this fix! Contributors# Special thanks to contributors: @jhedlund for fixing cursor positioning with subtasks @Mara-Li for implementing context/project template variables and bracket fixes @anareaty for reporting time format inconsistencies"},{"route":"/obsidian/releases/3.23.3/","title":"TaskNotes v3.23.3 Release Notes","description":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.3.md","namespace":"obsidian","relativePath":"releases/3.23.3.md","raw":"# TaskNotes v3.23.3 Release Notes\n\nThis release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.\n\n## New Features\n\n### Project Property Filter Support\n\n- Added property-based filtering for project picker dropdown\n- Configure projects to appear in picker based on frontmatter properties (e.g., `type: project`)\n- Complements existing folder and tag filtering options\n- *Thanks to @aubreyz for requesting this feature enhancement (#660)*\n\n## Bug Fixes\n\n### Project/Subtask Field Mapping\n\n- Fixed project and subtask functionality not working when users customize project field names\n- ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration\n- Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings\n- *Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues*\n\n### Test Infrastructure\n\n- Added missing test mocks for `isTaskUsedAsProjectSync` and `formatDateForStorage` functions\n- Ensures test suite stability for project-related functionality\n","aliases":["/releases/3.23.3/","/releases/3.23.3/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"project-property-filter-support","text":"Project Property Filter Support"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"projectsubtask-field-mapping","text":"Project/Subtask Field Mapping"},{"level":3,"id":"test-infrastructure","text":"Test Infrastructure"}],"html":"

This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.

\n

New Features#

\n

Project Property Filter Support#

\n
    \n
  • Added property-based filtering for project picker dropdown
  • \n
  • Configure projects to appear in picker based on frontmatter properties (e.g., type: project)
  • \n
  • Complements existing folder and tag filtering options
  • \n
  • Thanks to @aubreyz for requesting this feature enhancement (#660)
  • \n
\n

Bug Fixes#

\n

Project/Subtask Field Mapping#

\n
    \n
  • Fixed project and subtask functionality not working when users customize project field names
  • \n
  • ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration
  • \n
  • Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings
  • \n
  • Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues
  • \n
\n

Test Infrastructure#

\n
    \n
  • Added missing test mocks for isTaskUsedAsProjectSync and formatDateForStorage functions
  • \n
  • Ensures test suite stability for project-related functionality
  • \n
\n","text":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities. New Features# Project Property Filter Support# Added property-based filtering for project picker dropdown Configure projects to appear in picker based on frontmatter properties (e.g., type: project) Complements existing folder and tag filtering options Thanks to @aubreyz for requesting this feature enhancement (#660) Bug Fixes# Project/Subtask Field Mapping# Fixed project and subtask functionality not working when users customize project field names ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues Test Infrastructure# Added missing test mocks for isTaskUsedAsProjectSync and formatDateForStorage functions Ensures test suite stability for project-related functionality"},{"route":"/obsidian/releases/3.23.4/","title":"TaskNotes 3.23.4","description":"Special thanks to contributors:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.23.4.md","namespace":"obsidian","relativePath":"releases/3.23.4.md","raw":"# TaskNotes 3.23.4\n\n## Bug Fixes\n\n### Task Scheduling & Natural Language Processing\n\n- Fixed Russian weekday scheduling conflict where single weekdays (e.g., \"воскресенье\") were incorrectly interpreted as recurring tasks instead of single-day scheduling ([#665](https://github.com/callumalpass/tasknotes/issues/665), thanks to @anareaty for the report)\n- Fixed issue where natural language processing failed to save parsed time estimates in task creation modal ([#682](https://github.com/callumalpass/tasknotes/issues/682), thanks to @RumiaKitinari for the detailed report)\n- Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under \"Past Scheduled\" instead of \"Today\" ([#384](https://github.com/callumalpass/tasknotes/issues/384), thanks to @jcromwell for the report)\n\n### Settings & Configuration\n\n- Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings ([#664](https://github.com/callumalpass/tasknotes/issues/664), thanks to @Yoav6 for identifying this issue)\n\n### Calendar & Time Management\n\n- Fixed calendar not refreshing when task duration or time tracking changes ([#382](https://github.com/callumalpass/tasknotes/issues/382), thanks to @mdbraber)\n- Fixed calendar not refreshing after task archive or move operations\n- Fixed timeblock editing using stored date instead of current date for past day modifications ([#647](https://github.com/callumalpass/tasknotes/issues/647), thanks to @RumiaKitinari)\n- Fixed Pomodoro timer not preserving task context when auto-starting sessions ([#641](https://github.com/callumalpass/tasknotes/issues/641), thanks to @RumiaKitinari)\n- Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to [Danny Talks Tech](https://www.youtube.com/watch?v=SRavkMUYWzo) for reporting this in his video review)\n\n### User Interface\n\n- Fixed mini calendar header overflow issue in sidebar view ([#459](https://github.com/callumalpass/tasknotes/issues/459), with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report)\n\n## New Features & Enhancements\n\n### Visual Improvements\n\n- Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons ([#662](https://github.com/callumalpass/tasknotes/issues/662), thanks to @ras0q for the suggestion)\n- Improved mini calendar styling, interactions, and legend display\n- Enhanced task dot visualization to reflect accurate matching dates\n\n### Settings Organization\n\n- Moved timeblocking settings to Features tab with improved usage instructions for better discoverability\n\n## Documentation\n\n- Updated documentation to fix auto-archiving settings reference ([#673](https://github.com/callumalpass/tasknotes/issues/673), thanks to @antonio for pointing out the inconsistency)\n\n## Contributors\n\nSpecial thanks to contributors:\n\n- @anareaty for reporting the Russian weekday scheduling conflict\n- @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues\n- @jcromwell for reporting the scheduled task grouping UTC regression\n- @Yoav6 for identifying the excluded folders trailing comma issue\n- @mdbraber for reporting calendar refresh issues with time tracking changes\n- @girisumit for reporting the mini calendar header overflow issue\n- @jsonshanks for providing CSS improvement suggestions for the mini calendar\n- @ras0q for suggesting the file-text icon addition to agenda view\n- @antonio for pointing out the auto-archiving documentation inconsistency\n- [Danny Talks Tech](https://www.youtube.com/watch?v=SRavkMUYWzo) for reporting the all-day task rendering issue in his video review\n\n---\n\nThis release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish.","aliases":["/releases/3.23.4/","/releases/3.23.4/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-scheduling-natural-language-processing","text":"Task Scheduling & Natural Language Processing"},{"level":3,"id":"settings-configuration","text":"Settings & Configuration"},{"level":3,"id":"calendar-time-management","text":"Calendar & Time Management"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":2,"id":"new-features-enhancements","text":"New Features & Enhancements"},{"level":3,"id":"visual-improvements","text":"Visual Improvements"},{"level":3,"id":"settings-organization","text":"Settings Organization"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"contributors","text":"Contributors"}],"html":"

Bug Fixes#

\n

Task Scheduling & Natural Language Processing#

\n
    \n
  • Fixed Russian weekday scheduling conflict where single weekdays (e.g., "воскресенье") were incorrectly interpreted as recurring tasks instead of single-day scheduling (#665, thanks to @anareaty for the report)
  • \n
  • Fixed issue where natural language processing failed to save parsed time estimates in task creation modal (#682, thanks to @RumiaKitinari for the detailed report)
  • \n
  • Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under "Past Scheduled" instead of "Today" (#384, thanks to @jcromwell for the report)
  • \n
\n

Settings & Configuration#

\n
    \n
  • Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings (#664, thanks to @Yoav6 for identifying this issue)
  • \n
\n

Calendar & Time Management#

\n
    \n
  • Fixed calendar not refreshing when task duration or time tracking changes (#382, thanks to @mdbraber)
  • \n
  • Fixed calendar not refreshing after task archive or move operations
  • \n
  • Fixed timeblock editing using stored date instead of current date for past day modifications (#647, thanks to @RumiaKitinari)
  • \n
  • Fixed Pomodoro timer not preserving task context when auto-starting sessions (#641, thanks to @RumiaKitinari)
  • \n
  • Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to Danny Talks Tech for reporting this in his video review)
  • \n
\n

User Interface#

\n
    \n
  • Fixed mini calendar header overflow issue in sidebar view (#459, with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report)
  • \n
\n

New Features & Enhancements#

\n

Visual Improvements#

\n
    \n
  • Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons (#662, thanks to @ras0q for the suggestion)
  • \n
  • Improved mini calendar styling, interactions, and legend display
  • \n
  • Enhanced task dot visualization to reflect accurate matching dates
  • \n
\n

Settings Organization#

\n
    \n
  • Moved timeblocking settings to Features tab with improved usage instructions for better discoverability
  • \n
\n

Documentation#

\n
    \n
  • Updated documentation to fix auto-archiving settings reference (#673, thanks to @antonio for pointing out the inconsistency)
  • \n
\n

Contributors#

\n

Special thanks to contributors:

\n
    \n
  • @anareaty for reporting the Russian weekday scheduling conflict
  • \n
  • @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues
  • \n
  • @jcromwell for reporting the scheduled task grouping UTC regression
  • \n
  • @Yoav6 for identifying the excluded folders trailing comma issue
  • \n
  • @mdbraber for reporting calendar refresh issues with time tracking changes
  • \n
  • @girisumit for reporting the mini calendar header overflow issue
  • \n
  • @jsonshanks for providing CSS improvement suggestions for the mini calendar
  • \n
  • @ras0q for suggesting the file-text icon addition to agenda view
  • \n
  • @antonio for pointing out the auto-archiving documentation inconsistency
  • \n
  • Danny Talks Tech for reporting the all-day task rendering issue in his video review
  • \n
\n
\n

This release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish.

\n","text":"Bug Fixes# Task Scheduling & Natural Language Processing# Fixed Russian weekday scheduling conflict where single weekdays (e.g., \"воскресенье\") were incorrectly interpreted as recurring tasks instead of single-day scheduling (#665, thanks to @anareaty for the report) Fixed issue where natural language processing failed to save parsed time estimates in task creation modal (#682, thanks to @RumiaKitinari for the detailed report) Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under \"Past Scheduled\" instead of \"Today\" (#384, thanks to @jcromwell for the report) Settings & Configuration# Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings (#664, thanks to @Yoav6 for identifying this issue) Calendar & Time Management# Fixed calendar not refreshing when task duration or time tracking changes (#382, thanks to @mdbraber) Fixed calendar not refreshing after task archive or move operations Fixed timeblock editing using stored date instead of current date for past day modifications (#647, thanks to @RumiaKitinari) Fixed Pomodoro timer not preserving task context when auto-starting sessions (#641, thanks to @RumiaKitinari) Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to Danny Talks Tech for reporting this in his video review) User Interface# Fixed mini calendar header overflow issue in sidebar view (#459, with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report) New Features & Enhancements# Visual Improvements# Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons (#662, thanks to @ras0q for the suggestion) Improved mini calendar styling, interactions, and legend display Enhanced task dot visualization to reflect accurate matching dates Settings Organization# Moved timeblocking settings to Features tab with improved usage instructions for better discoverability Documentation# Updated documentation to fix auto-archiving settings reference (#673, thanks to @antonio for pointing out the inconsistency) Contributors# Special thanks to contributors: @anareaty for reporting the Russian weekday scheduling conflict @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues @jcromwell for reporting the scheduled task grouping UTC regression @Yoav6 for identifying the excluded folders trailing comma issue @mdbraber for reporting calendar refresh issues with time tracking changes @girisumit for reporting the mini calendar header overflow issue @jsonshanks for providing CSS improvement suggestions for the mini calendar @ras0q for suggesting the file-text icon addition to agenda view @antonio for pointing out the auto-archiving documentation inconsistency Danny Talks Tech for reporting the all-day task rendering issue in his video review This release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish."},{"route":"/obsidian/releases/3.24.0/","title":"TaskNotes 3.24.0","description":"Special thanks to all this release's contributors:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.0.md","namespace":"obsidian","relativePath":"releases/3.24.0.md","raw":"# TaskNotes 3.24.0\n\n## New Features\n\n### Agenda View Overdue Section\n\n- Added separate \"Overdue\" section in Agenda view instead of mixing overdue tasks with today's tasks ([#557](https://github.com/callumalpass/tasknotes/issues/557), thanks to @backyardbiomech for the detailed report)\n- Collapsible section with task completion statistics and proper internationalization support\n- Includes overdue recurring tasks based on their scheduled dates\n\n### Task Dependencies and Blocking Relationships\n\n- Implemented blocking/blocked task dependencies with persistent relationships ([#701](https://github.com/callumalpass/tasknotes/issues/701), thanks to @prayidae for the detailed feature request)\n- Tasks can be marked as blocking other tasks or blocked by other tasks\n- Dependency relationships persist in frontmatter as structural links\n- Dynamic blocked state computed based on blocking task completion status\n\n### Task Card Widget in Notes\n\n- Added configurable task card widget displaying at the top of task notes ([#576](https://github.com/callumalpass/tasknotes/issues/576), thanks to @jhedlund for the request)\n- Provides immediate access to task actions and context menus without requiring command palette\n- Uses CodeMirror widget system for integration\n- Appears above project subtasks widget when both enabled\n- Can be disabled via settings\n\n### Hierarchical Subgrouping\n\n- Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution)\n- Allows two-level task organization (e.g., Group by Status, Subgroup by Priority)\n- Cross-view support with consistent behavior\n- State persistence for expand/collapse preferences\n- Custom user fields supported as subgroup options\n\n### Internationalization Support\n\n- Added i18n framework with multi-language support\n- Support for German, Spanish, French, Russian, Chinese, and Japanese\n- Translation coverage for command palette entries and UI strings\n- Localized agenda and filter interface elements\n\n### Template Variables\n\n- Added `{{hashtags}}` template variable for space-separated hashtag rendering ([#612](https://github.com/callumalpass/tasknotes/issues/612), thanks to @strazto for the suggestion)\n- Added `{{currentNoteTitle}}` template variable for note-specific folder organization ([#637](https://github.com/callumalpass/tasknotes/issues/637), thanks to @Mara-Li for the request)\n- Added template variable support for archive folder paths ([#677](https://github.com/callumalpass/tasknotes/issues/677), thanks to @dsebastien for the request)\n- Fixed `{{project}}` variables to properly extract basenames from wikilinks ([#490](https://github.com/callumalpass/tasknotes/issues/490), thanks to @nsstrickland for the detailed bug report)\n\n### Project and Subtask Management\n\n- Enhanced task modals with project and subtask management capabilities\n- Added \"Add to project\" and \"Add subtasks\" sections in task creation/edit modals\n- Context menu options for assigning tasks to projects and adding subtasks\n- Collapsible lists with visual separators between form sections\n\n### View and Grouping Enhancements\n\n- Added \"Completed Date\" as grouping option for analyzing productivity ([#430](https://github.com/callumalpass/tasknotes/issues/430), thanks to @anareaty for the suggestion)\n- Added \"Status\" as sorting option in Kanban and Task List views ([#633](https://github.com/callumalpass/tasknotes/issues/633), thanks to @mdbraber for the report)\n- Implemented per-grouping column persistence for Kanban views\n- Smart default ordering respecting StatusManager and PriorityManager configurations\n\n## Bug Fixes\n\n### Calendar and Advanced Calendar\n\n- Fixed calendar not refreshing when task duration or time tracking changes\n- Fixed calendar not refreshing after task archive or move operations\n- Fixed agenda duplication for all-day ICS events ([#695](https://github.com/callumalpass/tasknotes/issues/695), thanks to @realJohnDoe for the report)\n- Added configurable `eventMinHeight` for Advanced Calendar to make short duration tasks readable ([#718](https://github.com/callumalpass/tasknotes/issues/718), thanks to @Ruboks-Cube for the detailed report)\n- Fixed multi-day task creation in month/year view to properly calculate time estimates ([#564](https://github.com/callumalpass/tasknotes/issues/564), thanks to @same774 for the report)\n\n### Kanban View\n\n- Fixed kanban view losing columns after upgrades ([#689](https://github.com/callumalpass/tasknotes/issues/689), thanks to @mikesale for the report)\n- Fixed clearing filters defaulting to \"none\" instead of \"status\" grouping ([#679](https://github.com/callumalpass/tasknotes/issues/679), thanks to @camara-tech-pro for the question)\n- Fixed column order changes when switching between views ([#710](https://github.com/callumalpass/tasknotes/issues/710), thanks to @phortx for the report)\n- Fixed kanban drag-and-drop for custom field grouping ([#494](https://github.com/callumalpass/tasknotes/issues/494), thanks to @anareaty for the report)\n- Enhanced save view modal functionality with improved styling and accessibility\n\n### Task Management\n\n- Fixed HTTP API task creation to return sanitized title matching stored content ([#635](https://github.com/callumalpass/tasknotes/issues/635), thanks to @nightroman for the detailed report)\n- Fixed `#task` tag being incorrectly added when using property-based task identification ([#570](https://github.com/callumalpass/tasknotes/issues/570), thanks to @RobbK17 for the report)\n- Fixed recurring task completion styling in Bases views ([#669](https://github.com/callumalpass/tasknotes/issues/669), thanks to @jordandrako for the report)\n\n### Hierarchical Tag Support\n\n- Added hierarchical tag support with exclusion patterns for Obsidian nested tags ([#584](https://github.com/callumalpass/tasknotes/issues/584), thanks to @renatomen for the detailed feature request)\n- Hierarchical matching allows searching for parent tags to match child tags (e.g., `t/ef` matches `t/ef/project`, `t/ef/task`)\n- Exclusion patterns support using `-` prefix to exclude specific tags and their children\n- Maintains backward compatibility with existing substring matching\n\n### Natural Language Processing and Tags\n\n- Fixed nested tags losing slashes in agenda view rendering ([#712](https://github.com/callumalpass/tasknotes/issues/712), thanks to @antonio for the report and fix)\n- Added support for hyphens in NLP tag parsing ([#568](https://github.com/callumalpass/tasknotes/issues/568), thanks to @jordandrako for the report)\n\n### Settings and Configuration\n\n- Fixed property value truncation in project autosuggest settings by adding input debouncing ([#705](https://github.com/callumalpass/tasknotes/issues/705), thanks to @aubreyz for the report)\n- Improved webhook transform error handling with detailed logging ([#719](https://github.com/callumalpass/tasknotes/issues/719), thanks to @stephen-netu for the detailed report)\n- Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation)\n\n### Code Quality and Development\n\n- Configured Prettier formatter for consistent code formatting ([#717](https://github.com/callumalpass/tasknotes/issues/717), thanks to @ras0q for the request)\n- Applied ESLint fixes reducing problems from 209 to 97\n- Added format and format:check scripts for development workflow\n- Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction)\n\n## Enhancements\n\n### Performance and Reliability\n\n- Added debouncing to project autosuggest property inputs\n- Improved error handling for webhook transform failures\n\n### User Interface\n\n- Added time display based on `timeEstimate` property in task statistics (thanks to Sergen Aras for the implementation)\n- Enhanced language selection display with native scripts\n\n### Settings Organization\n\n- Reorganized settings with improved categorization\n- Added collapsible functionality to various UI sections\n- Enhanced accessibility with proper button labeling\n\n## Documentation\n\n- Added documentation for task dependencies feature\n- Updated comprehensive subgrouping feature documentation\n- Enhanced template variable documentation\n- Updated various view documentation for new features\n\n## Contributors\n\nSpecial thanks to all this release's contributors:\n\n### Feature Contributors\n\n- **@renatomen** for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584)\n- **@antonio** for implementing nested tag slash preservation and providing the fix\n- **@elijahmanor** for fixing the browser extension repository URL\n- **@sergenaras** for implementing time display based on timeEstimate property in task statistics\n- **@hamlim** for implementing save button disable logic to prevent duplicate task creation\n\n### Issue Reporters and Feature Requesters\n\n- **@backyardbiomech** for the detailed overdue recurring tasks report (#557)\n- **@prayidae** for the detailed task dependencies feature request (#701)\n- **@jhedlund** for requesting task context menu in notes (#576)\n- **@anareaty** for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494)\n- **@mdbraber** for reporting missing status sorting option (#633)\n- **@strazto** for requesting hashtags template variable (#612)\n- **@Mara-Li** for requesting currentNoteTitle template variable (#637)\n- **@dsebastien** for requesting archive folder template support (#677)\n- **@nsstrickland** for the detailed project variable bug report (#490)\n- **@realJohnDoe** for reporting ICS all-day event duplication (#695)\n- **@Ruboks-Cube** for reporting short duration task rendering issues (#718)\n- **@same774** for reporting multi-day task creation issues (#564)\n- **@mikesale** for reporting kanban column loss (#689)\n- **@camara-tech-pro** for the kanban grouping question (#679)\n- **@phortx** for reporting column order changes (#710)\n- **@nightroman** for the detailed HTTP API title sanitization report (#635)\n- **@RobbK17** for reporting property identification tag issue (#570)\n- **@jordandrako** for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568)\n- **@aubreyz** for reporting project autosuggest truncation issue (#705)\n- **@ras0q** for requesting code formatting improvements (#717)\n- **@stephen-netu** for the detailed webhook transform script loading report (#719)\n","aliases":["/releases/3.24.0/","/releases/3.24.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":3,"id":"agenda-view-overdue-section","text":"Agenda View Overdue Section"},{"level":3,"id":"task-dependencies-and-blocking-relationships","text":"Task Dependencies and Blocking Relationships"},{"level":3,"id":"task-card-widget-in-notes","text":"Task Card Widget in Notes"},{"level":3,"id":"hierarchical-subgrouping","text":"Hierarchical Subgrouping"},{"level":3,"id":"internationalization-support","text":"Internationalization Support"},{"level":3,"id":"template-variables","text":"Template Variables"},{"level":3,"id":"project-and-subtask-management","text":"Project and Subtask Management"},{"level":3,"id":"view-and-grouping-enhancements","text":"View and Grouping Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"calendar-and-advanced-calendar","text":"Calendar and Advanced Calendar"},{"level":3,"id":"kanban-view","text":"Kanban View"},{"level":3,"id":"task-management","text":"Task Management"},{"level":3,"id":"hierarchical-tag-support","text":"Hierarchical Tag Support"},{"level":3,"id":"natural-language-processing-and-tags","text":"Natural Language Processing and Tags"},{"level":3,"id":"settings-and-configuration","text":"Settings and Configuration"},{"level":3,"id":"code-quality-and-development","text":"Code Quality and Development"},{"level":2,"id":"enhancements","text":"Enhancements"},{"level":3,"id":"performance-and-reliability","text":"Performance and Reliability"},{"level":3,"id":"user-interface","text":"User Interface"},{"level":3,"id":"settings-organization","text":"Settings Organization"},{"level":2,"id":"documentation","text":"Documentation"},{"level":2,"id":"contributors","text":"Contributors"},{"level":3,"id":"feature-contributors","text":"Feature Contributors"},{"level":3,"id":"issue-reporters-and-feature-requesters","text":"Issue Reporters and Feature Requesters"}],"html":"

New Features#

\n

Agenda View Overdue Section#

\n
    \n
  • Added separate "Overdue" section in Agenda view instead of mixing overdue tasks with today's tasks (#557, thanks to @backyardbiomech for the detailed report)
  • \n
  • Collapsible section with task completion statistics and proper internationalization support
  • \n
  • Includes overdue recurring tasks based on their scheduled dates
  • \n
\n

Task Dependencies and Blocking Relationships#

\n
    \n
  • Implemented blocking/blocked task dependencies with persistent relationships (#701, thanks to @prayidae for the detailed feature request)
  • \n
  • Tasks can be marked as blocking other tasks or blocked by other tasks
  • \n
  • Dependency relationships persist in frontmatter as structural links
  • \n
  • Dynamic blocked state computed based on blocking task completion status
  • \n
\n

Task Card Widget in Notes#

\n
    \n
  • Added configurable task card widget displaying at the top of task notes (#576, thanks to @jhedlund for the request)
  • \n
  • Provides immediate access to task actions and context menus without requiring command palette
  • \n
  • Uses CodeMirror widget system for integration
  • \n
  • Appears above project subtasks widget when both enabled
  • \n
  • Can be disabled via settings
  • \n
\n

Hierarchical Subgrouping#

\n
    \n
  • Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution)
  • \n
  • Allows two-level task organization (e.g., Group by Status, Subgroup by Priority)
  • \n
  • Cross-view support with consistent behavior
  • \n
  • State persistence for expand/collapse preferences
  • \n
  • Custom user fields supported as subgroup options
  • \n
\n

Internationalization Support#

\n
    \n
  • Added i18n framework with multi-language support
  • \n
  • Support for German, Spanish, French, Russian, Chinese, and Japanese
  • \n
  • Translation coverage for command palette entries and UI strings
  • \n
  • Localized agenda and filter interface elements
  • \n
\n

Template Variables#

\n
    \n
  • Added {{hashtags}} template variable for space-separated hashtag rendering (#612, thanks to @strazto for the suggestion)
  • \n
  • Added {{currentNoteTitle}} template variable for note-specific folder organization (#637, thanks to @Mara-Li for the request)
  • \n
  • Added template variable support for archive folder paths (#677, thanks to @dsebastien for the request)
  • \n
  • Fixed {{project}} variables to properly extract basenames from wikilinks (#490, thanks to @nsstrickland for the detailed bug report)
  • \n
\n

Project and Subtask Management#

\n
    \n
  • Enhanced task modals with project and subtask management capabilities
  • \n
  • Added "Add to project" and "Add subtasks" sections in task creation/edit modals
  • \n
  • Context menu options for assigning tasks to projects and adding subtasks
  • \n
  • Collapsible lists with visual separators between form sections
  • \n
\n

View and Grouping Enhancements#

\n
    \n
  • Added "Completed Date" as grouping option for analyzing productivity (#430, thanks to @anareaty for the suggestion)
  • \n
  • Added "Status" as sorting option in Kanban and Task List views (#633, thanks to @mdbraber for the report)
  • \n
  • Implemented per-grouping column persistence for Kanban views
  • \n
  • Smart default ordering respecting StatusManager and PriorityManager configurations
  • \n
\n

Bug Fixes#

\n

Calendar and Advanced Calendar#

\n
    \n
  • Fixed calendar not refreshing when task duration or time tracking changes
  • \n
  • Fixed calendar not refreshing after task archive or move operations
  • \n
  • Fixed agenda duplication for all-day ICS events (#695, thanks to @realJohnDoe for the report)
  • \n
  • Added configurable eventMinHeight for Advanced Calendar to make short duration tasks readable (#718, thanks to @Ruboks-Cube for the detailed report)
  • \n
  • Fixed multi-day task creation in month/year view to properly calculate time estimates (#564, thanks to @same774 for the report)
  • \n
\n

Kanban View#

\n
    \n
  • Fixed kanban view losing columns after upgrades (#689, thanks to @mikesale for the report)
  • \n
  • Fixed clearing filters defaulting to "none" instead of "status" grouping (#679, thanks to @camara-tech-pro for the question)
  • \n
  • Fixed column order changes when switching between views (#710, thanks to @phortx for the report)
  • \n
  • Fixed kanban drag-and-drop for custom field grouping (#494, thanks to @anareaty for the report)
  • \n
  • Enhanced save view modal functionality with improved styling and accessibility
  • \n
\n

Task Management#

\n
    \n
  • Fixed HTTP API task creation to return sanitized title matching stored content (#635, thanks to @nightroman for the detailed report)
  • \n
  • Fixed #task tag being incorrectly added when using property-based task identification (#570, thanks to @RobbK17 for the report)
  • \n
  • Fixed recurring task completion styling in Bases views (#669, thanks to @jordandrako for the report)
  • \n
\n

Hierarchical Tag Support#

\n
    \n
  • Added hierarchical tag support with exclusion patterns for Obsidian nested tags (#584, thanks to @renatomen for the detailed feature request)
  • \n
  • Hierarchical matching allows searching for parent tags to match child tags (e.g., t/ef matches t/ef/project, t/ef/task)
  • \n
  • Exclusion patterns support using - prefix to exclude specific tags and their children
  • \n
  • Maintains backward compatibility with existing substring matching
  • \n
\n

Natural Language Processing and Tags#

\n
    \n
  • Fixed nested tags losing slashes in agenda view rendering (#712, thanks to @antonio for the report and fix)
  • \n
  • Added support for hyphens in NLP tag parsing (#568, thanks to @jordandrako for the report)
  • \n
\n

Settings and Configuration#

\n
    \n
  • Fixed property value truncation in project autosuggest settings by adding input debouncing (#705, thanks to @aubreyz for the report)
  • \n
  • Improved webhook transform error handling with detailed logging (#719, thanks to @stephen-netu for the detailed report)
  • \n
  • Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation)
  • \n
\n

Code Quality and Development#

\n
    \n
  • Configured Prettier formatter for consistent code formatting (#717, thanks to @ras0q for the request)
  • \n
  • Applied ESLint fixes reducing problems from 209 to 97
  • \n
  • Added format and format:check scripts for development workflow
  • \n
  • Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction)
  • \n
\n

Enhancements#

\n

Performance and Reliability#

\n
    \n
  • Added debouncing to project autosuggest property inputs
  • \n
  • Improved error handling for webhook transform failures
  • \n
\n

User Interface#

\n
    \n
  • Added time display based on timeEstimate property in task statistics (thanks to Sergen Aras for the implementation)
  • \n
  • Enhanced language selection display with native scripts
  • \n
\n

Settings Organization#

\n
    \n
  • Reorganized settings with improved categorization
  • \n
  • Added collapsible functionality to various UI sections
  • \n
  • Enhanced accessibility with proper button labeling
  • \n
\n

Documentation#

\n
    \n
  • Added documentation for task dependencies feature
  • \n
  • Updated comprehensive subgrouping feature documentation
  • \n
  • Enhanced template variable documentation
  • \n
  • Updated various view documentation for new features
  • \n
\n

Contributors#

\n

Special thanks to all this release's contributors:

\n

Feature Contributors#

\n
    \n
  • @renatomen for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584)
  • \n
  • @antonio for implementing nested tag slash preservation and providing the fix
  • \n
  • @elijahmanor for fixing the browser extension repository URL
  • \n
  • @sergenaras for implementing time display based on timeEstimate property in task statistics
  • \n
  • @hamlim for implementing save button disable logic to prevent duplicate task creation
  • \n
\n

Issue Reporters and Feature Requesters#

\n
    \n
  • @backyardbiomech for the detailed overdue recurring tasks report (#557)
  • \n
  • @prayidae for the detailed task dependencies feature request (#701)
  • \n
  • @jhedlund for requesting task context menu in notes (#576)
  • \n
  • @anareaty for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494)
  • \n
  • @mdbraber for reporting missing status sorting option (#633)
  • \n
  • @strazto for requesting hashtags template variable (#612)
  • \n
  • @Mara-Li for requesting currentNoteTitle template variable (#637)
  • \n
  • @dsebastien for requesting archive folder template support (#677)
  • \n
  • @nsstrickland for the detailed project variable bug report (#490)
  • \n
  • @realJohnDoe for reporting ICS all-day event duplication (#695)
  • \n
  • @Ruboks-Cube for reporting short duration task rendering issues (#718)
  • \n
  • @same774 for reporting multi-day task creation issues (#564)
  • \n
  • @mikesale for reporting kanban column loss (#689)
  • \n
  • @camara-tech-pro for the kanban grouping question (#679)
  • \n
  • @phortx for reporting column order changes (#710)
  • \n
  • @nightroman for the detailed HTTP API title sanitization report (#635)
  • \n
  • @RobbK17 for reporting property identification tag issue (#570)
  • \n
  • @jordandrako for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568)
  • \n
  • @aubreyz for reporting project autosuggest truncation issue (#705)
  • \n
  • @ras0q for requesting code formatting improvements (#717)
  • \n
  • @stephen-netu for the detailed webhook transform script loading report (#719)
  • \n
\n","text":"New Features# Agenda View Overdue Section# Added separate \"Overdue\" section in Agenda view instead of mixing overdue tasks with today's tasks (#557, thanks to @backyardbiomech for the detailed report) Collapsible section with task completion statistics and proper internationalization support Includes overdue recurring tasks based on their scheduled dates Task Dependencies and Blocking Relationships# Implemented blocking/blocked task dependencies with persistent relationships (#701, thanks to @prayidae for the detailed feature request) Tasks can be marked as blocking other tasks or blocked by other tasks Dependency relationships persist in frontmatter as structural links Dynamic blocked state computed based on blocking task completion status Task Card Widget in Notes# Added configurable task card widget displaying at the top of task notes (#576, thanks to @jhedlund for the request) Provides immediate access to task actions and context menus without requiring command palette Uses CodeMirror widget system for integration Appears above project subtasks widget when both enabled Can be disabled via settings Hierarchical Subgrouping# Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution) Allows two-level task organization (e.g., Group by Status, Subgroup by Priority) Cross-view support with consistent behavior State persistence for expand/collapse preferences Custom user fields supported as subgroup options Internationalization Support# Added i18n framework with multi-language support Support for German, Spanish, French, Russian, Chinese, and Japanese Translation coverage for command palette entries and UI strings Localized agenda and filter interface elements Template Variables# Added {{hashtags}} template variable for space-separated hashtag rendering (#612, thanks to @strazto for the suggestion) Added {{currentNoteTitle}} template variable for note-specific folder organization (#637, thanks to @Mara-Li for the request) Added template variable support for archive folder paths (#677, thanks to @dsebastien for the request) Fixed {{project}} variables to properly extract basenames from wikilinks (#490, thanks to @nsstrickland for the detailed bug report) Project and Subtask Management# Enhanced task modals with project and subtask management capabilities Added \"Add to project\" and \"Add subtasks\" sections in task creation/edit modals Context menu options for assigning tasks to projects and adding subtasks Collapsible lists with visual separators between form sections View and Grouping Enhancements# Added \"Completed Date\" as grouping option for analyzing productivity (#430, thanks to @anareaty for the suggestion) Added \"Status\" as sorting option in Kanban and Task List views (#633, thanks to @mdbraber for the report) Implemented per-grouping column persistence for Kanban views Smart default ordering respecting StatusManager and PriorityManager configurations Bug Fixes# Calendar and Advanced Calendar# Fixed calendar not refreshing when task duration or time tracking changes Fixed calendar not refreshing after task archive or move operations Fixed agenda duplication for all-day ICS events (#695, thanks to @realJohnDoe for the report) Added configurable eventMinHeight for Advanced Calendar to make short duration tasks readable (#718, thanks to @Ruboks-Cube for the detailed report) Fixed multi-day task creation in month/year view to properly calculate time estimates (#564, thanks to @same774 for the report) Kanban View# Fixed kanban view losing columns after upgrades (#689, thanks to @mikesale for the report) Fixed clearing filters defaulting to \"none\" instead of \"status\" grouping (#679, thanks to @camara-tech-pro for the question) Fixed column order changes when switching between views (#710, thanks to @phortx for the report) Fixed kanban drag-and-drop for custom field grouping (#494, thanks to @anareaty for the report) Enhanced save view modal functionality with improved styling and accessibility Task Management# Fixed HTTP API task creation to return sanitized title matching stored content (#635, thanks to @nightroman for the detailed report) Fixed #task tag being incorrectly added when using property-based task identification (#570, thanks to @RobbK17 for the report) Fixed recurring task completion styling in Bases views (#669, thanks to @jordandrako for the report) Hierarchical Tag Support# Added hierarchical tag support with exclusion patterns for Obsidian nested tags (#584, thanks to @renatomen for the detailed feature request) Hierarchical matching allows searching for parent tags to match child tags (e.g., t/ef matches t/ef/project, t/ef/task) Exclusion patterns support using - prefix to exclude specific tags and their children Maintains backward compatibility with existing substring matching Natural Language Processing and Tags# Fixed nested tags losing slashes in agenda view rendering (#712, thanks to @antonio for the report and fix) Added support for hyphens in NLP tag parsing (#568, thanks to @jordandrako for the report) Settings and Configuration# Fixed property value truncation in project autosuggest settings by adding input debouncing (#705, thanks to @aubreyz for the report) Improved webhook transform error handling with detailed logging (#719, thanks to @stephen-netu for the detailed report) Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation) Code Quality and Development# Configured Prettier formatter for consistent code formatting (#717, thanks to @ras0q for the request) Applied ESLint fixes reducing problems from 209 to 97 Added format and format:check scripts for development workflow Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction) Enhancements# Performance and Reliability# Added debouncing to project autosuggest property inputs Improved error handling for webhook transform failures User Interface# Added time display based on timeEstimate property in task statistics (thanks to Sergen Aras for the implementation) Enhanced language selection display with native scripts Settings Organization# Reorganized settings with improved categorization Added collapsible functionality to various UI sections Enhanced accessibility with proper button labeling Documentation# Added documentation for task dependencies feature Updated comprehensive subgrouping feature documentation Enhanced template variable documentation Updated various view documentation for new features Contributors# Special thanks to all this release's contributors: Feature Contributors# @renatomen for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584) @antonio for implementing nested tag slash preservation and providing the fix @elijahmanor for fixing the browser extension repository URL @sergenaras for implementing time display based on timeEstimate property in task statistics @hamlim for implementing save button disable logic to prevent duplicate task creation Issue Reporters and Feature Requesters# @backyardbiomech for the detailed overdue recurring tasks report (#557) @prayidae for the detailed task dependencies feature request (#701) @jhedlund for requesting task context menu in notes (#576) @anareaty for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494) @mdbraber for reporting missing status sorting option (#633) @strazto for requesting hashtags template variable (#612) @Mara-Li for requesting currentNoteTitle template variable (#637) @dsebastien for requesting archive folder template support (#677) @nsstrickland for the detailed project variable bug report (#490) @realJohnDoe for reporting ICS all-day event duplication (#695) @Ruboks-Cube for reporting short duration task rendering issues (#718) @same774 for reporting multi-day task creation issues (#564) @mikesale for reporting kanban column loss (#689) @camara-tech-pro for the kanban grouping question (#679) @phortx for reporting column order changes (#710) @nightroman for the detailed HTTP API title sanitization report (#635) @RobbK17 for reporting property identification tag issue (#570) @jordandrako for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568) @aubreyz for reporting project autosuggest truncation issue (#705) @ras0q for requesting code formatting improvements (#717) @stephen-netu for the detailed webhook transform script loading report (#719)"},{"route":"/obsidian/releases/3.24.1/","title":"TaskNotes 3.24.1","description":"This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.1.md","namespace":"obsidian","relativePath":"releases/3.24.1.md","raw":"# TaskNotes 3.24.1\n\n## Bug Fixes\n\n### Task Card Widget\n\n- Fixed task card widget appearing on all notes instead of only task notes\n- Widget now properly respects task identification settings (tag or property-based)\n\nThis patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.","aliases":["/releases/3.24.1/","/releases/3.24.1/"],"toc":[{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"task-card-widget","text":"Task Card Widget"}],"html":"

Bug Fixes#

\n

Task Card Widget#

\n
    \n
  • Fixed task card widget appearing on all notes instead of only task notes
  • \n
  • Widget now properly respects task identification settings (tag or property-based)
  • \n
\n

This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.

\n","text":"Bug Fixes# Task Card Widget# Fixed task card widget appearing on all notes instead of only task notes Widget now properly respects task identification settings (tag or property-based) This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes."},{"route":"/obsidian/releases/3.24.2/","title":"TaskNotes 3.24.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.2.md","namespace":"obsidian","relativePath":"releases/3.24.2.md","raw":"# TaskNotes 3.24.2 \n\n## Fixed\n\n- (#766) Fixed tag parsing incorrectly identifying notes with tags containing \"task\" (like \"pkm-task\") as task notes\n - Added exact hierarchical tag matching for task identification to prevent false positives\n - Preserved substring matching behavior for filter bar searches where it's desired\n - Only exact matches or hierarchical children (like \"task/work\") now identify notes as tasks\n - Thanks to @anareaty and @fastrick for reporting this issue\n- (#767) Fixed subgroups not rendering under the \"Overdue\" agenda group\n - Thanks to @renatomen for reporting this issue\n- (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values\n - Added time validation in settings UI with proper error messages and debouncing\n - Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00)\n - Prevents \"Cannot read properties of null (reading 'years')\" error from FullCalendar\n - Thanks to @kmaustral for reporting\n- (#769) Fixed NLP processor incorrectly assigning hardcoded \"waiting\" status when \"blocked\" appears in task titles\n - NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns\n - Prevents unexpected status assignments for users with custom status workflows\n - Fallback patterns still work when no custom status configurations are defined\n - Thanks to @renatomen for reporting this issue\n","aliases":["/releases/3.24.2/","/releases/3.24.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#766) Fixed tag parsing incorrectly identifying notes with tags containing "task" (like "pkm-task") as task notes
      \n
    • Added exact hierarchical tag matching for task identification to prevent false positives
    • \n
    • Preserved substring matching behavior for filter bar searches where it's desired
    • \n
    • Only exact matches or hierarchical children (like "task/work") now identify notes as tasks
    • \n
    • Thanks to @anareaty and @fastrick for reporting this issue
    • \n
    \n
  • \n
  • (#767) Fixed subgroups not rendering under the "Overdue" agenda group
      \n
    • Thanks to @renatomen for reporting this issue
    • \n
    \n
  • \n
  • (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values
      \n
    • Added time validation in settings UI with proper error messages and debouncing
    • \n
    • Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00)
    • \n
    • Prevents "Cannot read properties of null (reading 'years')" error from FullCalendar
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#769) Fixed NLP processor incorrectly assigning hardcoded "waiting" status when "blocked" appears in task titles
      \n
    • NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns
    • \n
    • Prevents unexpected status assignments for users with custom status workflows
    • \n
    • Fallback patterns still work when no custom status configurations are defined
    • \n
    • Thanks to @renatomen for reporting this issue
    • \n
    \n
  • \n
\n","text":"Fixed# (#766) Fixed tag parsing incorrectly identifying notes with tags containing \"task\" (like \"pkm-task\") as task notes Added exact hierarchical tag matching for task identification to prevent false positives Preserved substring matching behavior for filter bar searches where it's desired Only exact matches or hierarchical children (like \"task/work\") now identify notes as tasks Thanks to @anareaty and @fastrick for reporting this issue (#767) Fixed subgroups not rendering under the \"Overdue\" agenda group Thanks to @renatomen for reporting this issue (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values Added time validation in settings UI with proper error messages and debouncing Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00) Prevents \"Cannot read properties of null (reading 'years')\" error from FullCalendar Thanks to @kmaustral for reporting (#769) Fixed NLP processor incorrectly assigning hardcoded \"waiting\" status when \"blocked\" appears in task titles NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns Prevents unexpected status assignments for users with custom status workflows Fallback patterns still work when no custom status configurations are defined Thanks to @renatomen for reporting this issue"},{"route":"/obsidian/releases/3.24.3/","title":"TaskNotes 3.24.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.3.md","namespace":"obsidian","relativePath":"releases/3.24.3.md","raw":"# TaskNotes 3.24.3\n\n- (#776) Fixed screens failing to load with \"toLowerCase is not a function\" error\n - Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.)\n - Added type validation to filter out non-string values before processing tags\n - Valid string tags continue to work normally while invalid types are safely skipped\n - Thanks to @kmf and @Andre-Ioda for help debugging this issue\n","aliases":["/releases/3.24.3/","/releases/3.24.3/"],"toc":[],"html":"
    \n
  • (#776) Fixed screens failing to load with "toLowerCase is not a function" error
      \n
    • Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.)
    • \n
    • Added type validation to filter out non-string values before processing tags
    • \n
    • Valid string tags continue to work normally while invalid types are safely skipped
    • \n
    • Thanks to @kmf and @Andre-Ioda for help debugging this issue
    • \n
    \n
  • \n
\n","text":"(#776) Fixed screens failing to load with \"toLowerCase is not a function\" error Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.) Added type validation to filter out non-string values before processing tags Valid string tags continue to work normally while invalid types are safely skipped Thanks to @kmf and @Andre-Ioda for help debugging this issue"},{"route":"/obsidian/releases/3.24.4/","title":"TaskNotes 3.24.4","description":"(#768) Fixed calendar view crashes when tasks contain null values in grouping fields","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.4.md","namespace":"obsidian","relativePath":"releases/3.24.4.md","raw":"# TaskNotes 3.24.4\n\n## Fixed\n\n- (#768) Fixed calendar view crashes when tasks contain null values in grouping fields\n - Added null/undefined checks in sort comparisons to prevent localeCompare errors\n - Calendar now handles null values in tags, contexts, and custom fields gracefully\n - Thanks to @kmaustral for reporting\n\n- (#601) Fixed Unicode characters not displaying in tags and contexts\n - Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts\n - Affects Agenda View, Task List View, and all other views displaying tags\n - Thanks to @Kapinekas for reporting\n\n- (#778) Fixed cursor artifacts in CodeMirror widgets\n - Thanks to @jhedlund for the fix\n\n- Fixed task card widgets in note editor not updating for archive and time tracking changes\n - Task card widgets now properly detect when tasks are archived/unarchived\n - Task card widgets now properly detect when time tracking starts/stops\n - Blue \"tracking\" border now appears/disappears correctly in live preview\n - Archive styling now updates correctly in live preview\n\n## Changed\n\n- (#751) Status bar tracked task click behavior now opens task notes directly\n - Single tracked task: opens the task note immediately\n - Multiple tracked tasks: shows selector modal to choose which task note to open\n - Provides faster access to tracked tasks compared to previous task list view\n\n- (#727) \"Create New Inline Task\" command now respects the \"Include Current Note in Project\" setting\n - When enabled, the current note is automatically added as a project to inline tasks\n - Provides consistency with instant convert functionality\n - Thanks to @chrisfeagles for the suggestion\n\n- Improved link handling throughout the plugin using Obsidian's native APIs\n - Replaced manual wikilink generation with `FileManager.generateMarkdownLink()`\n - Now respects user's link format settings (wikilink vs markdown, relative paths)\n - Replaced manual link parsing with `parseLinktext()` for proper alias handling\n - Better compatibility with future Obsidian updates\n - Added centralized link utilities in `linkUtils.ts`\n\n- Refactored widget cursor styles into reusable utility class\n - Consolidated shared CSS into .cm-widget-cursor-fix utility\n - Improved maintainability across widget components\n\n","aliases":["/releases/3.24.4/","/releases/3.24.4/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#768) Fixed calendar view crashes when tasks contain null values in grouping fields

    \n
      \n
    • Added null/undefined checks in sort comparisons to prevent localeCompare errors
    • \n
    • Calendar now handles null values in tags, contexts, and custom fields gracefully
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#601) Fixed Unicode characters not displaying in tags and contexts

    \n
      \n
    • Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts
    • \n
    • Affects Agenda View, Task List View, and all other views displaying tags
    • \n
    • Thanks to @Kapinekas for reporting
    • \n
    \n
  • \n
  • (#778) Fixed cursor artifacts in CodeMirror widgets

    \n
      \n
    • Thanks to @jhedlund for the fix
    • \n
    \n
  • \n
  • Fixed task card widgets in note editor not updating for archive and time tracking changes

    \n
      \n
    • Task card widgets now properly detect when tasks are archived/unarchived
    • \n
    • Task card widgets now properly detect when time tracking starts/stops
    • \n
    • Blue "tracking" border now appears/disappears correctly in live preview
    • \n
    • Archive styling now updates correctly in live preview
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • (#751) Status bar tracked task click behavior now opens task notes directly

    \n
      \n
    • Single tracked task: opens the task note immediately
    • \n
    • Multiple tracked tasks: shows selector modal to choose which task note to open
    • \n
    • Provides faster access to tracked tasks compared to previous task list view
    • \n
    \n
  • \n
  • (#727) "Create New Inline Task" command now respects the "Include Current Note in Project" setting

    \n
      \n
    • When enabled, the current note is automatically added as a project to inline tasks
    • \n
    • Provides consistency with instant convert functionality
    • \n
    • Thanks to @chrisfeagles for the suggestion
    • \n
    \n
  • \n
  • Improved link handling throughout the plugin using Obsidian's native APIs

    \n
      \n
    • Replaced manual wikilink generation with FileManager.generateMarkdownLink()
    • \n
    • Now respects user's link format settings (wikilink vs markdown, relative paths)
    • \n
    • Replaced manual link parsing with parseLinktext() for proper alias handling
    • \n
    • Better compatibility with future Obsidian updates
    • \n
    • Added centralized link utilities in linkUtils.ts
    • \n
    \n
  • \n
  • Refactored widget cursor styles into reusable utility class

    \n
      \n
    • Consolidated shared CSS into .cm-widget-cursor-fix utility
    • \n
    • Improved maintainability across widget components
    • \n
    \n
  • \n
\n","text":"Fixed# (#768) Fixed calendar view crashes when tasks contain null values in grouping fields Added null/undefined checks in sort comparisons to prevent localeCompare errors Calendar now handles null values in tags, contexts, and custom fields gracefully Thanks to @kmaustral for reporting (#601) Fixed Unicode characters not displaying in tags and contexts Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts Affects Agenda View, Task List View, and all other views displaying tags Thanks to @Kapinekas for reporting (#778) Fixed cursor artifacts in CodeMirror widgets Thanks to @jhedlund for the fix Fixed task card widgets in note editor not updating for archive and time tracking changes Task card widgets now properly detect when tasks are archived/unarchived Task card widgets now properly detect when time tracking starts/stops Blue \"tracking\" border now appears/disappears correctly in live preview Archive styling now updates correctly in live preview Changed# (#751) Status bar tracked task click behavior now opens task notes directly Single tracked task: opens the task note immediately Multiple tracked tasks: shows selector modal to choose which task note to open Provides faster access to tracked tasks compared to previous task list view (#727) \"Create New Inline Task\" command now respects the \"Include Current Note in Project\" setting When enabled, the current note is automatically added as a project to inline tasks Provides consistency with instant convert functionality Thanks to @chrisfeagles for the suggestion Improved link handling throughout the plugin using Obsidian's native APIs Replaced manual wikilink generation with FileManager.generateMarkdownLink() Now respects user's link format settings (wikilink vs markdown, relative paths) Replaced manual link parsing with parseLinktext() for proper alias handling Better compatibility with future Obsidian updates Added centralized link utilities in linkUtils.ts Refactored widget cursor styles into reusable utility class Consolidated shared CSS into .cm-widget-cursor-fix utility Improved maintainability across widget components"},{"route":"/obsidian/releases/3.24.5/","title":"TaskNotes 3.24.5","description":"(#806) Fixed Bases views crashing on Obsidian 1.10.0 startup","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.5.md","namespace":"obsidian","relativePath":"releases/3.24.5.md","raw":"# TaskNotes 3.24.5\n\n## Fixed\n\n- (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup\n - TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup\n - Added defensive checks in `setEphemeralState` to handle early lifecycle calls\n - Added `focus()` method to view objects for proper restoration\n - Made root elements focusable to support Obsidian 1.10.0 view lifecycle\n\n- (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter\n - Added support for markdown link format `[text](path)` in projects and blockedBy fields\n - Handles URL-encoded paths like `[Car Maintenance](../../projects/Car%20Maintenance.md)`\n - Markdown links now render as clickable links showing display text instead of raw `[text](path)` format\n - Links are properly resolved for grouping, filtering, and project-task associations\n - Previously only wikilink format `[[path]]` was supported\n - Prevents automatic removal of project assignments when editing tasks\n - Thanks to @minchinweb for reporting\n\n- (#780) Fixed \"Cannot Create Timeblocks\" error when daily notes folder doesn't exist\n - Added proper error handling when `createDailyNote` fails due to missing folder\n - Improved error messages to guide users to check Daily Notes plugin configuration\n - Prevents uncaught errors from `obsidian-daily-notes-interface` package\n - Thanks to @uberunix for reporting\n\n","aliases":["/releases/3.24.5/","/releases/3.24.5/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup

    \n
      \n
    • TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup
    • \n
    • Added defensive checks in setEphemeralState to handle early lifecycle calls
    • \n
    • Added focus() method to view objects for proper restoration
    • \n
    • Made root elements focusable to support Obsidian 1.10.0 view lifecycle
    • \n
    \n
  • \n
  • (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter

    \n
      \n
    • Added support for markdown link format [text](path) in projects and blockedBy fields
    • \n
    • Handles URL-encoded paths like [Car Maintenance](../../projects/Car%20Maintenance.md)
    • \n
    • Markdown links now render as clickable links showing display text instead of raw [text](path) format
    • \n
    • Links are properly resolved for grouping, filtering, and project-task associations
    • \n
    • Previously only wikilink format [[path]] was supported
    • \n
    • Prevents automatic removal of project assignments when editing tasks
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#780) Fixed "Cannot Create Timeblocks" error when daily notes folder doesn't exist

    \n
      \n
    • Added proper error handling when createDailyNote fails due to missing folder
    • \n
    • Improved error messages to guide users to check Daily Notes plugin configuration
    • \n
    • Prevents uncaught errors from obsidian-daily-notes-interface package
    • \n
    • Thanks to @uberunix for reporting
    • \n
    \n
  • \n
\n","text":"Fixed# (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter Added support for markdown link format [text](path) in projects and blockedBy fields Handles URL-encoded paths like [Car Maintenance](../../projects/Car%20Maintenance.md) Markdown links now render as clickable links showing display text instead of raw [text](path) format Links are properly resolved for grouping, filtering, and project-task associations Previously only wikilink format [[path]] was supported Prevents automatic removal of project assignments when editing tasks Thanks to @minchinweb for reporting (#780) Fixed \"Cannot Create Timeblocks\" error when daily notes folder doesn't exist Added proper error handling when createDailyNote fails due to missing folder Improved error messages to guide users to check Daily Notes plugin configuration Prevents uncaught errors from obsidian-daily-notes-interface package Thanks to @uberunix for reporting"},{"route":"/obsidian/releases/3.24.6/","title":"TaskNotes 3.24.6","description":"(#440) Fixed inline task replacement not working for links with relative paths","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.24.6.md","namespace":"obsidian","relativePath":"releases/3.24.6.md","raw":"# TaskNotes 3.24.6\n\n## Added\n\n- Added release notes viewer\n - New view displays release notes in a dedicated tab when plugin updates\n - Automatically opens after updating to a new version\n - Access anytime via command palette \"TaskNotes: View release notes\" or Settings > General\n - Release notes are rendered using native Obsidian markdown rendering\n - Includes link to view all releases on GitHub\n - Fully internationalized with i18n support\n - Auto-generation system ensures correct version is loaded without manual updates\n\n## Fixed\n\n- (#440) Fixed inline task replacement not working for links with relative paths\n - Markdown links with relative paths like `[task](../../../GTD/tasks/task.md)` now display inline previews\n - Wikilinks with relative paths now work correctly\n - Removed overly aggressive path sanitization that was stripping `..` from all link paths\n - Works in both Live Preview and Reading Mode\n - Thanks to @minchinweb for reporting\n\n- (#814) Fixed markdown links in projects field not being recognized on Project notes\n - Tasks with markdown-style project links `[text](path)` now appear in project's Subtasks section\n - Updated project link detection to use `parseLinkToPath` utility which handles both wikilinks and markdown links\n - Handles URL-encoded paths like `[z Test Project](z%20Test%20Project.md)`\n - Thanks to @minchinweb for reporting\n\n- (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings\n - Project links in frontmatter are now always generated as wikilinks `[[link]]` by default for Obsidian compatibility\n - Obsidian does not support markdown links in frontmatter properties without third-party plugins\n - Added optional setting to enable markdown links in frontmatter for users with `obsidian-frontmatter-markdown-links` plugin\n - Setting only appears when user has markdown links enabled globally in Obsidian\n - Thanks to @nightroman for reporting\n","aliases":["/releases/3.24.6/","/releases/3.24.6/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added release notes viewer
      \n
    • New view displays release notes in a dedicated tab when plugin updates
    • \n
    • Automatically opens after updating to a new version
    • \n
    • Access anytime via command palette "TaskNotes: View release notes" or Settings > General
    • \n
    • Release notes are rendered using native Obsidian markdown rendering
    • \n
    • Includes link to view all releases on GitHub
    • \n
    • Fully internationalized with i18n support
    • \n
    • Auto-generation system ensures correct version is loaded without manual updates
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#440) Fixed inline task replacement not working for links with relative paths

    \n
      \n
    • Markdown links with relative paths like [task](../../../GTD/tasks/task.md) now display inline previews
    • \n
    • Wikilinks with relative paths now work correctly
    • \n
    • Removed overly aggressive path sanitization that was stripping .. from all link paths
    • \n
    • Works in both Live Preview and Reading Mode
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#814) Fixed markdown links in projects field not being recognized on Project notes

    \n
      \n
    • Tasks with markdown-style project links [text](path) now appear in project's Subtasks section
    • \n
    • Updated project link detection to use parseLinkToPath utility which handles both wikilinks and markdown links
    • \n
    • Handles URL-encoded paths like [z Test Project](z%20Test%20Project.md)
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings

    \n
      \n
    • Project links in frontmatter are now always generated as wikilinks [[link]] by default for Obsidian compatibility
    • \n
    • Obsidian does not support markdown links in frontmatter properties without third-party plugins
    • \n
    • Added optional setting to enable markdown links in frontmatter for users with obsidian-frontmatter-markdown-links plugin
    • \n
    • Setting only appears when user has markdown links enabled globally in Obsidian
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
\n","text":"Added# Added release notes viewer New view displays release notes in a dedicated tab when plugin updates Automatically opens after updating to a new version Access anytime via command palette \"TaskNotes: View release notes\" or Settings > General Release notes are rendered using native Obsidian markdown rendering Includes link to view all releases on GitHub Fully internationalized with i18n support Auto-generation system ensures correct version is loaded without manual updates Fixed# (#440) Fixed inline task replacement not working for links with relative paths Markdown links with relative paths like [task](../../../GTD/tasks/task.md) now display inline previews Wikilinks with relative paths now work correctly Removed overly aggressive path sanitization that was stripping .. from all link paths Works in both Live Preview and Reading Mode Thanks to @minchinweb for reporting (#814) Fixed markdown links in projects field not being recognized on Project notes Tasks with markdown-style project links [text](path) now appear in project's Subtasks section Updated project link detection to use parseLinkToPath utility which handles both wikilinks and markdown links Handles URL-encoded paths like [z Test Project](z%20Test%20Project.md) Thanks to @minchinweb for reporting (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings Project links in frontmatter are now always generated as wikilinks [[link]] by default for Obsidian compatibility Obsidian does not support markdown links in frontmatter properties without third-party plugins Added optional setting to enable markdown links in frontmatter for users with obsidian-frontmatter-markdown-links plugin Setting only appears when user has markdown links enabled globally in Obsidian Thanks to @nightroman for reporting"},{"route":"/obsidian/releases/3.25.0/","title":"TaskNotes 3.25.0","description":"Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.0.md","namespace":"obsidian","relativePath":"releases/3.25.0.md","raw":"# TaskNotes 3.25.0\n\n## Added\n\n- Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)\n - Supports month, week, day, year, and list views\n - Property-based events from note date properties (configurable start date, end date, and title properties)\n - Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events\n - Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height\n - Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based)\n - Date validation to handle invalid property values\n - Drag-and-drop to update property-based event dates in frontmatter\n - Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese)\n\n- Added grouped rendering support for Bases integration list and kanban views\n - List view displays collapsible groups with toggle controls\n - Kanban view renders grouped columns with drag-drop support\n - Automatically detects ungrouped views and renders as flat list\n\n- (#842) Added keyboard navigation support for task forms\n - Action bar icons now focusable with proper tab order and ARIA attributes\n - Enter and Space keys trigger actions on focused elements\n - Added submenu support for reminders button for better keyboard accessibility\n - Improved focus indicators for better visual feedback\n - Thanks to @maybetm for this excellent contribution!\n\n## Changed\n\n- Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions\n\n## Fixed\n\n- (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths\n - Changed debounce to trailing mode to ensure final value is saved instead of partial input\n - Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths\n - Thanks to @sascha224 for reporting\n\n- (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup\n - TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup\n - Added defensive checks in `setEphemeralState` to handle early lifecycle calls\n - Added `focus()` method to view objects for proper restoration\n - Made root elements focusable to support Obsidian 1.10.0 view lifecycle\n\n- (#825) Fixed single/double click settings not applying to calendar views\n - Shared click handling now works consistently across Advanced Calendar and Bases Calendar\n - Ctrl/Cmd+click opens tasks in new tab as expected\n - Single and double-click actions respect user settings\n\n- (#699) Fixed Obsidian freezing when moving calendar tab to new window\n - Skip calendar resize during window transfer to prevent freeze\n - Calendar may display incorrectly after move but can be fixed by switching views\n - Prevents complete UI lockup during tab transfer\n\n- (#816) Fixed template variables not processing in ICS subscription note folder paths\n - Template variables like `{{year}}`, `{{month}}`, `{{date}}` now work in ICS note folder settings\n - Extracted folder template processing into shared utility for consistency\n - Added support for ICS-specific variables: `{{icsEventTitle}}`, `{{icsEventLocation}}`, `{{icsEventDescription}}`\n - Users can now organize ICS notes in date-based hierarchies (e.g., `Daily/{{year}}/{{month}}/`)\n - Thanks to @j-peeters for reporting\n\n- (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views\n - Added 5-minute grace period after cache expiration to keep events visible during refresh\n - Trigger automatic background refresh when cache is stale or missing\n - Initialize ICS service instances early so views can register event listeners before data loads\n - Prevents disappearance during network errors or when calendar opens at Obsidian startup\n - Thanks to @j-peeters for reporting\n\n- (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion\n - Added `timeEstimate` field to `ParsedTaskData` interface\n - Time estimates from natural language parsing now properly transferred to task frontmatter\n - Parsed values now take priority over default settings\n - RRule strings passed directly without conversion (preferred format)\n - Thanks to @Justin-Burg for reporting\n\n- (#826) Fixed task card widget not appearing when Obsidian starts with task note open\n - Deferred dispatch calls to avoid \"EditorView.update not allowed during update\" error\n - Widget now renders correctly on startup without requiring workarounds\n - Thanks to @nightroman for reporting\n\n- (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues\n - Events with non-IANA timezone identifiers (e.g., `TZID=Zurich` without VTIMEZONE) now display at correct local times\n - Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone\n - Replaced unreliable `toJSDate()` conversion with `toUnixTime()` for accurate UTC timestamp handling\n - Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats\n - Thanks to @chrlaney for reporting and @wilf80 for detailed analysis\n\n- (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view\n - Recurring tasks now check both `due` and `scheduled` dates for overdue status\n - Previously only `scheduled` was checked for recurring tasks, causing tasks with overdue `due` dates to be hidden\n - Ensures consistent overdue detection logic between recurring and non-recurring tasks\n - Thanks to @skyrunner15 for reporting\n\n- (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones\n - Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones\n - UTC-anchored dates are now converted to local calendar dates before formatting\n - Fixes off-by-one day error that affected date selection and display\n - Thanks to @kenhsmith for reporting\n\n","aliases":["/releases/3.25.0/","/releases/3.25.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)

    \n
      \n
    • Supports month, week, day, year, and list views
    • \n
    • Property-based events from note date properties (configurable start date, end date, and title properties)
    • \n
    • Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events
    • \n
    • Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height
    • \n
    • Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based)
    • \n
    • Date validation to handle invalid property values
    • \n
    • Drag-and-drop to update property-based event dates in frontmatter
    • \n
    • Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese)
    • \n
    \n
  • \n
  • Added grouped rendering support for Bases integration list and kanban views

    \n
      \n
    • List view displays collapsible groups with toggle controls
    • \n
    • Kanban view renders grouped columns with drag-drop support
    • \n
    • Automatically detects ungrouped views and renders as flat list
    • \n
    \n
  • \n
  • (#842) Added keyboard navigation support for task forms

    \n
      \n
    • Action bar icons now focusable with proper tab order and ARIA attributes
    • \n
    • Enter and Space keys trigger actions on focused elements
    • \n
    • Added submenu support for reminders button for better keyboard accessibility
    • \n
    • Improved focus indicators for better visual feedback
    • \n
    • Thanks to @maybetm for this excellent contribution!
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions
  • \n
\n

Fixed#

\n
    \n
  • (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths

    \n
      \n
    • Changed debounce to trailing mode to ensure final value is saved instead of partial input
    • \n
    • Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths
    • \n
    • Thanks to @sascha224 for reporting
    • \n
    \n
  • \n
  • (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup

    \n
      \n
    • TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup
    • \n
    • Added defensive checks in setEphemeralState to handle early lifecycle calls
    • \n
    • Added focus() method to view objects for proper restoration
    • \n
    • Made root elements focusable to support Obsidian 1.10.0 view lifecycle
    • \n
    \n
  • \n
  • (#825) Fixed single/double click settings not applying to calendar views

    \n
      \n
    • Shared click handling now works consistently across Advanced Calendar and Bases Calendar
    • \n
    • Ctrl/Cmd+click opens tasks in new tab as expected
    • \n
    • Single and double-click actions respect user settings
    • \n
    \n
  • \n
  • (#699) Fixed Obsidian freezing when moving calendar tab to new window

    \n
      \n
    • Skip calendar resize during window transfer to prevent freeze
    • \n
    • Calendar may display incorrectly after move but can be fixed by switching views
    • \n
    • Prevents complete UI lockup during tab transfer
    • \n
    \n
  • \n
  • (#816) Fixed template variables not processing in ICS subscription note folder paths

    \n
      \n
    • Template variables like {{year}}, {{month}}, {{date}} now work in ICS note folder settings
    • \n
    • Extracted folder template processing into shared utility for consistency
    • \n
    • Added support for ICS-specific variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}}
    • \n
    • Users can now organize ICS notes in date-based hierarchies (e.g., Daily/{{year}}/{{month}}/)
    • \n
    • Thanks to @j-peeters for reporting
    • \n
    \n
  • \n
  • (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views

    \n
      \n
    • Added 5-minute grace period after cache expiration to keep events visible during refresh
    • \n
    • Trigger automatic background refresh when cache is stale or missing
    • \n
    • Initialize ICS service instances early so views can register event listeners before data loads
    • \n
    • Prevents disappearance during network errors or when calendar opens at Obsidian startup
    • \n
    • Thanks to @j-peeters for reporting
    • \n
    \n
  • \n
  • (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion

    \n
      \n
    • Added timeEstimate field to ParsedTaskData interface
    • \n
    • Time estimates from natural language parsing now properly transferred to task frontmatter
    • \n
    • Parsed values now take priority over default settings
    • \n
    • RRule strings passed directly without conversion (preferred format)
    • \n
    • Thanks to @Justin-Burg for reporting
    • \n
    \n
  • \n
  • (#826) Fixed task card widget not appearing when Obsidian starts with task note open

    \n
      \n
    • Deferred dispatch calls to avoid "EditorView.update not allowed during update" error
    • \n
    • Widget now renders correctly on startup without requiring workarounds
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
  • (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues

    \n
      \n
    • Events with non-IANA timezone identifiers (e.g., TZID=Zurich without VTIMEZONE) now display at correct local times
    • \n
    • Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone
    • \n
    • Replaced unreliable toJSDate() conversion with toUnixTime() for accurate UTC timestamp handling
    • \n
    • Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats
    • \n
    • Thanks to @chrlaney for reporting and @wilf80 for detailed analysis
    • \n
    \n
  • \n
  • (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view

    \n
      \n
    • Recurring tasks now check both due and scheduled dates for overdue status
    • \n
    • Previously only scheduled was checked for recurring tasks, causing tasks with overdue due dates to be hidden
    • \n
    • Ensures consistent overdue detection logic between recurring and non-recurring tasks
    • \n
    • Thanks to @skyrunner15 for reporting
    • \n
    \n
  • \n
  • (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones

    \n
      \n
    • Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones
    • \n
    • UTC-anchored dates are now converted to local calendar dates before formatting
    • \n
    • Fixes off-by-one day error that affected date selection and display
    • \n
    • Thanks to @kenhsmith for reporting
    • \n
    \n
  • \n
\n","text":"Added# Added Calendar view for Bases plugin integration (requires Bases 1.10.0+) Supports month, week, day, year, and list views Property-based events from note date properties (configurable start date, end date, and title properties) Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based) Date validation to handle invalid property values Drag-and-drop to update property-based event dates in frontmatter Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese) Added grouped rendering support for Bases integration list and kanban views List view displays collapsible groups with toggle controls Kanban view renders grouped columns with drag-drop support Automatically detects ungrouped views and renders as flat list (#842) Added keyboard navigation support for task forms Action bar icons now focusable with proper tab order and ARIA attributes Enter and Space keys trigger actions on focused elements Added submenu support for reminders button for better keyboard accessibility Improved focus indicators for better visual feedback Thanks to @maybetm for this excellent contribution! Changed# Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions Fixed# (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths Changed debounce to trailing mode to ensure final value is saved instead of partial input Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths Thanks to @sascha224 for reporting (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#825) Fixed single/double click settings not applying to calendar views Shared click handling now works consistently across Advanced Calendar and Bases Calendar Ctrl/Cmd+click opens tasks in new tab as expected Single and double-click actions respect user settings (#699) Fixed Obsidian freezing when moving calendar tab to new window Skip calendar resize during window transfer to prevent freeze Calendar may display incorrectly after move but can be fixed by switching views Prevents complete UI lockup during tab transfer (#816) Fixed template variables not processing in ICS subscription note folder paths Template variables like {{year}}, {{month}}, {{date}} now work in ICS note folder settings Extracted folder template processing into shared utility for consistency Added support for ICS-specific variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Users can now organize ICS notes in date-based hierarchies (e.g., Daily/{{year}}/{{month}}/) Thanks to @j-peeters for reporting (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views Added 5-minute grace period after cache expiration to keep events visible during refresh Trigger automatic background refresh when cache is stale or missing Initialize ICS service instances early so views can register event listeners before data loads Prevents disappearance during network errors or when calendar opens at Obsidian startup Thanks to @j-peeters for reporting (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion Added timeEstimate field to ParsedTaskData interface Time estimates from natural language parsing now properly transferred to task frontmatter Parsed values now take priority over default settings RRule strings passed directly without conversion (preferred format) Thanks to @Justin-Burg for reporting (#826) Fixed task card widget not appearing when Obsidian starts with task note open Deferred dispatch calls to avoid \"EditorView.update not allowed during update\" error Widget now renders correctly on startup without requiring workarounds Thanks to @nightroman for reporting (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues Events with non-IANA timezone identifiers (e.g., TZID=Zurich without VTIMEZONE) now display at correct local times Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone Replaced unreliable toJSDate() conversion with toUnixTime() for accurate UTC timestamp handling Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats Thanks to @chrlaney for reporting and @wilf80 for detailed analysis (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view Recurring tasks now check both due and scheduled dates for overdue status Previously only scheduled was checked for recurring tasks, causing tasks with overdue due dates to be hidden Ensures consistent overdue detection logic between recurring and non-recurring tasks Thanks to @skyrunner15 for reporting (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones UTC-anchored dates are now converted to local calendar dates before formatting Fixes off-by-one day error that affected date selection and display Thanks to @kenhsmith for reporting"},{"route":"/obsidian/releases/3.25.1/","title":"TaskNotes 3.25.1","description":"(#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.1.md","namespace":"obsidian","relativePath":"releases/3.25.1.md","raw":"# TaskNotes 3.25.1\n\n## Fixed\n\n- (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice\n - All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps\n - Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones)\n - All-day events no longer appear twice in Agenda view\n - Updated all date parsing throughout the codebase to handle date-only format correctly\n - Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events\n - Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695\n\n- (#859) Fixed multi-day task creation in Bases calendar view\n - Extracted shared task creation logic to `calendar-core.ts` for consistency between calendar views\n - Multi-day all-day selections now correctly set time estimate based on number of days dragged\n - Timed task selections (week view) now correctly calculate duration in minutes\n - Single-day clicks no longer override default time estimate settings\n - Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior\n - Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar)\n - Follows UTC Anchor principle for date-only strings\n - Thanks to @anareaty for reporting\n","aliases":["/releases/3.25.1/","/releases/3.25.1/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice

    \n
      \n
    • All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps
    • \n
    • Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones)
    • \n
    • All-day events no longer appear twice in Agenda view
    • \n
    • Updated all date parsing throughout the codebase to handle date-only format correctly
    • \n
    • Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events
    • \n
    • Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695
    • \n
    \n
  • \n
  • (#859) Fixed multi-day task creation in Bases calendar view

    \n
      \n
    • Extracted shared task creation logic to calendar-core.ts for consistency between calendar views
    • \n
    • Multi-day all-day selections now correctly set time estimate based on number of days dragged
    • \n
    • Timed task selections (week view) now correctly calculate duration in minutes
    • \n
    • Single-day clicks no longer override default time estimate settings
    • \n
    • Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior
    • \n
    • Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar)
    • \n
    • Follows UTC Anchor principle for date-only strings
    • \n
    • Thanks to @anareaty for reporting
    • \n
    \n
  • \n
\n","text":"Fixed# (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones) All-day events no longer appear twice in Agenda view Updated all date parsing throughout the codebase to handle date-only format correctly Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695 (#859) Fixed multi-day task creation in Bases calendar view Extracted shared task creation logic to calendar-core.ts for consistency between calendar views Multi-day all-day selections now correctly set time estimate based on number of days dragged Timed task selections (week view) now correctly calculate duration in minutes Single-day clicks no longer override default time estimate settings Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar) Follows UTC Anchor principle for date-only strings Thanks to @anareaty for reporting"},{"route":"/obsidian/releases/3.25.2/","title":"TaskNotes 3.25.2","description":"(#857) Fixed Mini Calendar opening previous day's daily note when clicked","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.2.md","namespace":"obsidian","relativePath":"releases/3.25.2.md","raw":"# TaskNotes 3.25.2\n\n## Fixed\n\n- (#857) Fixed Mini Calendar opening previous day's daily note when clicked\n - Affects users in negative UTC offset timezones (Americas, Pacific)\n - Thanks to @tsweezy for reporting\n\n- (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields\n - Added support for both Bases 1.10.0+ format (`{property: string, direction: string}`) and legacy string format\n - Note: GroupBy is not exposed in the Bases public API (`config.get('groupBy')` returns undefined)\n - Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths\n - Tasks with different wikilink formats pointing to the same project file will appear in separate columns\n - Example: `[[Project]]`, `[[path/to/Project]]`, and `[[Project|Alias]]` create separate columns\n - This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths\n - Thanks to @kmaustral for reporting\n\n## Added\n\n- Added date navigation configuration for Bases calendar views\n - Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load\n - Property-based navigation: Automatically navigate to dates from filtered note properties\n - Three navigation strategies: First result, Earliest date, or Latest date\n\n## Changed\n\n- Release notes now bundle all versions from current and previous minor series with collapsible sections\n - Added setting to disable automatic release notes display after updates\n","aliases":["/releases/3.25.2/","/releases/3.25.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#857) Fixed Mini Calendar opening previous day's daily note when clicked

    \n
      \n
    • Affects users in negative UTC offset timezones (Americas, Pacific)
    • \n
    • Thanks to @tsweezy for reporting
    • \n
    \n
  • \n
  • (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields

    \n
      \n
    • Added support for both Bases 1.10.0+ format ({property: string, direction: string}) and legacy string format
    • \n
    • Note: GroupBy is not exposed in the Bases public API (config.get('groupBy') returns undefined)
    • \n
    • Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths
        \n
      • Tasks with different wikilink formats pointing to the same project file will appear in separate columns
      • \n
      • Example: [[Project]], [[path/to/Project]], and [[Project|Alias]] create separate columns
      • \n
      • This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths
      • \n
      \n
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • Added date navigation configuration for Bases calendar views
      \n
    • Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load
    • \n
    • Property-based navigation: Automatically navigate to dates from filtered note properties
    • \n
    • Three navigation strategies: First result, Earliest date, or Latest date
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Release notes now bundle all versions from current and previous minor series with collapsible sections
      \n
    • Added setting to disable automatic release notes display after updates
    • \n
    \n
  • \n
\n","text":"Fixed# (#857) Fixed Mini Calendar opening previous day's daily note when clicked Affects users in negative UTC offset timezones (Americas, Pacific) Thanks to @tsweezy for reporting (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields Added support for both Bases 1.10.0+ format ({property: string, direction: string}) and legacy string format Note: GroupBy is not exposed in the Bases public API (config.get('groupBy') returns undefined) Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths Tasks with different wikilink formats pointing to the same project file will appear in separate columns Example: [[Project]], [[path/to/Project]], and [[Project|Alias]] create separate columns This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths Thanks to @kmaustral for reporting Added# Added date navigation configuration for Bases calendar views Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load Property-based navigation: Automatically navigate to dates from filtered note properties Three navigation strategies: First result, Earliest date, or Latest date Changed# Release notes now bundle all versions from current and previous minor series with collapsible sections Added setting to disable automatic release notes display after updates"},{"route":"/obsidian/releases/3.25.3/","title":"TaskNotes 3.25.3","description":"(#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.3.md","namespace":"obsidian","relativePath":"releases/3.25.3.md","raw":"# TaskNotes 3.25.3\n\n## Added\n\n- (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility\n - Fixes issue where themes like Retroma couldn't distinguish active tabs\n - Thanks to @Bregor for the contribution\n\n## Fixed\n\n- (#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled\n - Setting now always visible since it affects command palette task conversion\n - Resolves confusion for users who convert tasks via command palette\n - Thanks to @nnnell for the fix\n\n- (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions\n - Custom field wikilink suggestions (`[[`) now show all vault files instead of only filtered projects\n - Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal\n - Thanks to @renatomen for the thorough fix and tests\n","aliases":["/releases/3.25.3/","/releases/3.25.3/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility
      \n
    • Fixes issue where themes like Retroma couldn't distinguish active tabs
    • \n
    • Thanks to @Bregor for the contribution
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#899) Fixed "Folder for converted tasks" setting being hidden when convert button is disabled

    \n
      \n
    • Setting now always visible since it affects command palette task conversion
    • \n
    • Resolves confusion for users who convert tasks via command palette
    • \n
    • Thanks to @nnnell for the fix
    • \n
    \n
  • \n
  • (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions

    \n
      \n
    • Custom field wikilink suggestions ([[) now show all vault files instead of only filtered projects
    • \n
    • Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal
    • \n
    • Thanks to @renatomen for the thorough fix and tests
    • \n
    \n
  • \n
\n","text":"Added# (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility Fixes issue where themes like Retroma couldn't distinguish active tabs Thanks to @Bregor for the contribution Fixed# (#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled Setting now always visible since it affects command palette task conversion Resolves confusion for users who convert tasks via command palette Thanks to @nnnell for the fix (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions Custom field wikilink suggestions ([[) now show all vault files instead of only filtered projects Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal Thanks to @renatomen for the thorough fix and tests"},{"route":"/obsidian/releases/3.25.4/","title":"TaskNotes 3.25.4","description":"(#937), (#956) Added optional setting to hide identification tags in task cards","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.4.md","namespace":"obsidian","relativePath":"releases/3.25.4.md","raw":"# TaskNotes 3.25.4\n\n## Added\n\n- (#937), (#956) Added optional setting to hide identification tags in task cards\n - New \"Hide identification tags in task cards\" setting (only visible when using tag-based identification)\n - Hides exact matches (e.g., `#task`) and hierarchical children (e.g., `#task/project`, `#task/work/urgent`)\n - Reduces visual clutter while keeping tags in frontmatter for organizational purposes\n - Backward compatible - disabled by default\n - Thanks to @renatomen for implementing this feature and @edakimling for reporting\n\n- (#911) Added custom field suggestion filtering\n - New `autosuggestFilter` field to `UserMappedField` interface allows filtering suggestions by current filter context\n - Added collapsible filter section in settings with visual indicator\n - Comprehensive test coverage for custom field filtering feature\n - Thanks to @renatomen for this enhancement\n\n## Fixed\n\n- (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done\n - Edit Task modal now correctly adds completedDate when changing status to completed\n - Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter\n - Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions)\n - Thanks to @nightroman for reporting\n\n- (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured\n - All tasks were appearing in a single \"None\" column\n - Columns now appear in the order defined in TaskNotes settings (not alphabetical)\n - Detects invalid Bases grouping and falls back to status-based grouping\n - Tasks are properly distributed across status columns\n - Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting\n\n","aliases":["/releases/3.25.4/","/releases/3.25.4/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#937), (#956) Added optional setting to hide identification tags in task cards

    \n
      \n
    • New "Hide identification tags in task cards" setting (only visible when using tag-based identification)
    • \n
    • Hides exact matches (e.g., #task) and hierarchical children (e.g., #task/project, #task/work/urgent)
    • \n
    • Reduces visual clutter while keeping tags in frontmatter for organizational purposes
    • \n
    • Backward compatible - disabled by default
    • \n
    • Thanks to @renatomen for implementing this feature and @edakimling for reporting
    • \n
    \n
  • \n
  • (#911) Added custom field suggestion filtering

    \n
      \n
    • New autosuggestFilter field to UserMappedField interface allows filtering suggestions by current filter context
    • \n
    • Added collapsible filter section in settings with visual indicator
    • \n
    • Comprehensive test coverage for custom field filtering feature
    • \n
    • Thanks to @renatomen for this enhancement
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done

    \n
      \n
    • Edit Task modal now correctly adds completedDate when changing status to completed
    • \n
    • Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter
    • \n
    • Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions)
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
  • (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured

    \n
      \n
    • All tasks were appearing in a single "None" column
    • \n
    • Columns now appear in the order defined in TaskNotes settings (not alphabetical)
    • \n
    • Detects invalid Bases grouping and falls back to status-based grouping
    • \n
    • Tasks are properly distributed across status columns
    • \n
    • Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting
    • \n
    \n
  • \n
\n","text":"Added# (#937), (#956) Added optional setting to hide identification tags in task cards New \"Hide identification tags in task cards\" setting (only visible when using tag-based identification) Hides exact matches (e.g., #task) and hierarchical children (e.g., #task/project, #task/work/urgent) Reduces visual clutter while keeping tags in frontmatter for organizational purposes Backward compatible - disabled by default Thanks to @renatomen for implementing this feature and @edakimling for reporting (#911) Added custom field suggestion filtering New autosuggestFilter field to UserMappedField interface allows filtering suggestions by current filter context Added collapsible filter section in settings with visual indicator Comprehensive test coverage for custom field filtering feature Thanks to @renatomen for this enhancement Fixed# (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done Edit Task modal now correctly adds completedDate when changing status to completed Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions) Thanks to @nightroman for reporting (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured All tasks were appearing in a single \"None\" column Columns now appear in the order defined in TaskNotes settings (not alphabetical) Detects invalid Bases grouping and falls back to status-based grouping Tasks are properly distributed across status columns Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting"},{"route":"/obsidian/releases/3.25.6/","title":"Tasknotes 3.25.6","description":"(#1013) Fixed inability to subscribe to Apple iCloud calendars","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.25.6.md","namespace":"obsidian","relativePath":"releases/3.25.6.md","raw":"# Tasknotes 3.25.6\n\n## Fixed\n\n- (#1013) Fixed inability to subscribe to Apple iCloud calendars\n - Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly\n - Previously required manually changing the URL format before it would be accepted\n - Works with both standard and secure calendar URLs (webcal:// and webcals://)\n - Thanks to @nickbirch51 for reporting\n\n- (#1022) Fixed tasks randomly disappearing from views and not being recognized\n - Tasks would appear initially but disappear after a few seconds, especially during long sessions\n - Restarting Obsidian or using \"Refresh Cache\" would only temporarily fix the issue\n - Thanks to @seepage87 for reporting and @alejandrospoz for help debugging\n\n- (#968) Fixed timeEntries being duplicated when mapped to custom property name\n - When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property\n - FieldMapper now correctly uses only the configured property name for time tracking data\n - Thanks to @minchinweb for reporting this issue \n\n- (#953) Fixed non-task notes incorrectly appearing as subtasks in views\n - Notes with Parent or project properties but no task tag/property no longer show up as tasks\n - Views now update correctly when task tags are removed from files\n - Improved performance for large vaults by optimizing cache invalidation\n - Thanks to @renatomen for reporting and submitting PR #955\n","aliases":["/releases/3.25.6/","/releases/3.25.6/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1013) Fixed inability to subscribe to Apple iCloud calendars

    \n
      \n
    • Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly
    • \n
    • Previously required manually changing the URL format before it would be accepted
    • \n
    • Works with both standard and secure calendar URLs (webcal:// and webcals://)
    • \n
    • Thanks to @nickbirch51 for reporting
    • \n
    \n
  • \n
  • (#1022) Fixed tasks randomly disappearing from views and not being recognized

    \n
      \n
    • Tasks would appear initially but disappear after a few seconds, especially during long sessions
    • \n
    • Restarting Obsidian or using "Refresh Cache" would only temporarily fix the issue
    • \n
    • Thanks to @seepage87 for reporting and @alejandrospoz for help debugging
    • \n
    \n
  • \n
  • (#968) Fixed timeEntries being duplicated when mapped to custom property name

    \n
      \n
    • When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property
    • \n
    • FieldMapper now correctly uses only the configured property name for time tracking data
    • \n
    • Thanks to @minchinweb for reporting this issue
    • \n
    \n
  • \n
  • (#953) Fixed non-task notes incorrectly appearing as subtasks in views

    \n
      \n
    • Notes with Parent or project properties but no task tag/property no longer show up as tasks
    • \n
    • Views now update correctly when task tags are removed from files
    • \n
    • Improved performance for large vaults by optimizing cache invalidation
    • \n
    • Thanks to @renatomen for reporting and submitting PR #955
    • \n
    \n
  • \n
\n","text":"Fixed# (#1013) Fixed inability to subscribe to Apple iCloud calendars Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly Previously required manually changing the URL format before it would be accepted Works with both standard and secure calendar URLs (webcal:// and webcals://) Thanks to @nickbirch51 for reporting (#1022) Fixed tasks randomly disappearing from views and not being recognized Tasks would appear initially but disappear after a few seconds, especially during long sessions Restarting Obsidian or using \"Refresh Cache\" would only temporarily fix the issue Thanks to @seepage87 for reporting and @alejandrospoz for help debugging (#968) Fixed timeEntries being duplicated when mapped to custom property name When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property FieldMapper now correctly uses only the configured property name for time tracking data Thanks to @minchinweb for reporting this issue (#953) Fixed non-task notes incorrectly appearing as subtasks in views Notes with Parent or project properties but no task tag/property no longer show up as tasks Views now update correctly when task tags are removed from files Improved performance for large vaults by optimizing cache invalidation Thanks to @renatomen for reporting and submitting PR #955"},{"route":"/obsidian/releases/3.3.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.3.0.md","namespace":"obsidian","relativePath":"releases/3.3.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0\n","aliases":["/releases/3.3.0/","/releases/3.3.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0"},{"route":"/obsidian/releases/3.4.0/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.4.0.md","namespace":"obsidian","relativePath":"releases/3.4.0.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0\n","aliases":["/releases/3.4.0/","/releases/3.4.0/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0"},{"route":"/obsidian/releases/3.4.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.4.1.md","namespace":"obsidian","relativePath":"releases/3.4.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1\n","aliases":["/releases/3.4.1/","/releases/3.4.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1"},{"route":"/obsidian/releases/3.4.2/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.4.2.md","namespace":"obsidian","relativePath":"releases/3.4.2.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2\n","aliases":["/releases/3.4.2/","/releases/3.4.2/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2"},{"route":"/obsidian/releases/3.5.1/","title":"Untitled","description":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.5.1.md","namespace":"obsidian","relativePath":"releases/3.5.1.md","raw":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1\n","aliases":["/releases/3.5.1/","/releases/3.5.1/"],"toc":[],"html":"

This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.

\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1

\n","text":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1"},{"route":"/obsidian/releases/3.6.0/","title":"Untitled","description":"Fix task tag check. Add optional timeblocking.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.6.0.md","namespace":"obsidian","relativePath":"releases/3.6.0.md","raw":"Fix task tag check. \r\nAdd optional timeblocking. \n","aliases":["/releases/3.6.0/","/releases/3.6.0/"],"toc":[],"html":"

Fix task tag check. \nAdd optional timeblocking.

\n","text":"Fix task tag check. Add optional timeblocking."},{"route":"/obsidian/releases/3.7.0/","title":"TaskNotes v3.7.0 Release Notes","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.7.0.md","namespace":"obsidian","relativePath":"releases/3.7.0.md","raw":"# TaskNotes v3.7.0 Release Notes\r\n\r\n### Reading Mode Task Previews (thank you @amithkk)\r\n\r\n- Task link previews now work in Reading Mode in addition to Live Preview \r\n- Consistent interactive experience across all Obsidian view modes\r\n- Same functionality: click to edit, right-click for context menu, hover for file preview\r\n- New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling\r\n\r\n### Task Action Palette\r\n\r\n- New quick-action command palette for rapid task management\r\n- Access via command palette: \"TaskNotes: Open Task Action Palette\"\r\n- Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks\r\n- Handles recurring task instances vs. series intelligently\r\n- Fully keyboard navigable with categorized actions\r\n\r\n### Natural Language Task Input\r\n\r\n- Parse natural language when creating tasks: \"Buy groceries tomorrow 3pm high priority @home #errands\"\r\n- Powered by chrono-node for robust date/time parsing\r\n- Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates\r\n- Multi-line support: first line parsed, additional lines become task details\r\n- Toggle in Settings → Basic Defaults\r\n\r\n## UI/UX Improvements\r\n\r\n### Enhanced Task Creation Modal\r\n\r\n- Smart input mode with simplified interface when natural language is enabled\r\n- Progressive disclosure to detailed form when needed\r\n- Better conversion flow with pre-populated forms\r\n- Live filename preview as you type\r\n\r\n### Settings & Modal Improvements\r\n\r\n- Moved Natural Language Input to Basic Defaults section\r\n- Updated task link overlay description to mention both view modes\r\n- Reusable confirmation modal for consistent dialogs\r\n- Better error handling and accessibility improvements\r\n\r\n## Bug Fixes\r\n\r\n### Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)\r\n\r\n- Problem: Inline task conversion applied \"none\" instead of configured defaults\r\n- Solution: Changed useDefaultsOnInstantConvert default from false to true\r\n\r\n### Timer Function Standardization\r\n\r\n- Fixed browser compatibility by replacing Node.js timer types with browser-native timers\r\n- Resolved timing issues across different environments\r\n\r\n### Enhanced Task Link Overlays\r\n\r\n- Better path resolution with security enhancements\r\n- Graceful fallbacks for invalid or missing task files\r\n- Improved handling of rapid view changes\r\n\r\n## Technical Improvements\r\n\r\n### Enhanced Date Support\r\n\r\n- Full due date and scheduled date support in task creation and filename generation\r\n- New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format)\r\n- Support for ISO dates, relative dates, named dates, and natural language\r\n\r\n### Performance & Code Quality\r\n\r\n- Improved event handling with better refresh logic\r\n- Layout change listeners for immediate overlay updates\r\n- Enhanced error handling with user-friendly messages\r\n- Better TypeScript types and modular design\r\n\r\n## New Files & Dependencies\r\n\r\n### New Files\r\n\r\n- src/editor/ReadingModeTaskLinkProcessor.ts\r\n- src/modals/TaskActionPaletteModal.ts\r\n- src/services/NaturalLanguageParser.ts\r\n- src/modals/ConfirmationModal.ts\r\n- styles/task-action-palette-modal.css\r\n\r\n### New Dependency\r\n\r\n- chrono-node: Natural language date parsing library\r\n\r\n## What's Changed\r\n* Feat/task previews in reading mode by @amithkk in https://github.com/callumalpass/tasknotes/pull/57\r\n\r\n## New Contributors\r\n* @amithkk made their first contribution in https://github.com/callumalpass/tasknotes/pull/57\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0\n","aliases":["/releases/3.7.0/","/releases/3.7.0/"],"toc":[{"level":3,"id":"reading-mode-task-previews-thank-you-amithkk","text":"Reading Mode Task Previews (thank you @amithkk)"},{"level":3,"id":"task-action-palette","text":"Task Action Palette"},{"level":3,"id":"natural-language-task-input","text":"Natural Language Task Input"},{"level":2,"id":"uiux-improvements","text":"UI/UX Improvements"},{"level":3,"id":"enhanced-task-creation-modal","text":"Enhanced Task Creation Modal"},{"level":3,"id":"settings-modal-improvements","text":"Settings & Modal Improvements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"},{"level":3,"id":"fixed-inline-tasks-not-respecting-default-status-priority-issue-58","text":"Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)"},{"level":3,"id":"timer-function-standardization","text":"Timer Function Standardization"},{"level":3,"id":"enhanced-task-link-overlays","text":"Enhanced Task Link Overlays"},{"level":2,"id":"technical-improvements","text":"Technical Improvements"},{"level":3,"id":"enhanced-date-support","text":"Enhanced Date Support"},{"level":3,"id":"performance-code-quality","text":"Performance & Code Quality"},{"level":2,"id":"new-files-dependencies","text":"New Files & Dependencies"},{"level":3,"id":"new-files","text":"New Files"},{"level":3,"id":"new-dependency","text":"New Dependency"},{"level":2,"id":"what39s-changed","text":"What's Changed"},{"level":2,"id":"new-contributors","text":"New Contributors"}],"html":"

Reading Mode Task Previews (thank you @amithkk)#

\n
    \n
  • Task link previews now work in Reading Mode in addition to Live Preview
  • \n
  • Consistent interactive experience across all Obsidian view modes
  • \n
  • Same functionality: click to edit, right-click for context menu, hover for file preview
  • \n
  • New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling
  • \n
\n

Task Action Palette#

\n
    \n
  • New quick-action command palette for rapid task management
  • \n
  • Access via command palette: "TaskNotes: Open Task Action Palette"
  • \n
  • Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks
  • \n
  • Handles recurring task instances vs. series intelligently
  • \n
  • Fully keyboard navigable with categorized actions
  • \n
\n

Natural Language Task Input#

\n
    \n
  • Parse natural language when creating tasks: "Buy groceries tomorrow 3pm high priority @home #errands"
  • \n
  • Powered by chrono-node for robust date/time parsing
  • \n
  • Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates
  • \n
  • Multi-line support: first line parsed, additional lines become task details
  • \n
  • Toggle in Settings → Basic Defaults
  • \n
\n

UI/UX Improvements#

\n

Enhanced Task Creation Modal#

\n
    \n
  • Smart input mode with simplified interface when natural language is enabled
  • \n
  • Progressive disclosure to detailed form when needed
  • \n
  • Better conversion flow with pre-populated forms
  • \n
  • Live filename preview as you type
  • \n
\n

Settings & Modal Improvements#

\n
    \n
  • Moved Natural Language Input to Basic Defaults section
  • \n
  • Updated task link overlay description to mention both view modes
  • \n
  • Reusable confirmation modal for consistent dialogs
  • \n
  • Better error handling and accessibility improvements
  • \n
\n

Bug Fixes#

\n

Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)#

\n
    \n
  • Problem: Inline task conversion applied "none" instead of configured defaults
  • \n
  • Solution: Changed useDefaultsOnInstantConvert default from false to true
  • \n
\n

Timer Function Standardization#

\n
    \n
  • Fixed browser compatibility by replacing Node.js timer types with browser-native timers
  • \n
  • Resolved timing issues across different environments
  • \n
\n\n
    \n
  • Better path resolution with security enhancements
  • \n
  • Graceful fallbacks for invalid or missing task files
  • \n
  • Improved handling of rapid view changes
  • \n
\n

Technical Improvements#

\n

Enhanced Date Support#

\n
    \n
  • Full due date and scheduled date support in task creation and filename generation
  • \n
  • New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format)
  • \n
  • Support for ISO dates, relative dates, named dates, and natural language
  • \n
\n

Performance & Code Quality#

\n
    \n
  • Improved event handling with better refresh logic
  • \n
  • Layout change listeners for immediate overlay updates
  • \n
  • Enhanced error handling with user-friendly messages
  • \n
  • Better TypeScript types and modular design
  • \n
\n

New Files & Dependencies#

\n

New Files#

\n
    \n
  • src/editor/ReadingModeTaskLinkProcessor.ts
  • \n
  • src/modals/TaskActionPaletteModal.ts
  • \n
  • src/services/NaturalLanguageParser.ts
  • \n
  • src/modals/ConfirmationModal.ts
  • \n
  • styles/task-action-palette-modal.css
  • \n
\n

New Dependency#

\n
    \n
  • chrono-node: Natural language date parsing library
  • \n
\n

What's Changed#

\n\n

New Contributors#

\n\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0

\n","text":"Reading Mode Task Previews (thank you @amithkk)# Task link previews now work in Reading Mode in addition to Live Preview Consistent interactive experience across all Obsidian view modes Same functionality: click to edit, right-click for context menu, hover for file preview New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling Task Action Palette# New quick-action command palette for rapid task management Access via command palette: \"TaskNotes: Open Task Action Palette\" Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks Handles recurring task instances vs. series intelligently Fully keyboard navigable with categorized actions Natural Language Task Input# Parse natural language when creating tasks: \"Buy groceries tomorrow 3pm high priority @home #errands\" Powered by chrono-node for robust date/time parsing Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates Multi-line support: first line parsed, additional lines become task details Toggle in Settings → Basic Defaults UI/UX Improvements# Enhanced Task Creation Modal# Smart input mode with simplified interface when natural language is enabled Progressive disclosure to detailed form when needed Better conversion flow with pre-populated forms Live filename preview as you type Settings & Modal Improvements# Moved Natural Language Input to Basic Defaults section Updated task link overlay description to mention both view modes Reusable confirmation modal for consistent dialogs Better error handling and accessibility improvements Bug Fixes# Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)# Problem: Inline task conversion applied \"none\" instead of configured defaults Solution: Changed useDefaultsOnInstantConvert default from false to true Timer Function Standardization# Fixed browser compatibility by replacing Node.js timer types with browser-native timers Resolved timing issues across different environments Enhanced Task Link Overlays# Better path resolution with security enhancements Graceful fallbacks for invalid or missing task files Improved handling of rapid view changes Technical Improvements# Enhanced Date Support# Full due date and scheduled date support in task creation and filename generation New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format) Support for ISO dates, relative dates, named dates, and natural language Performance & Code Quality# Improved event handling with better refresh logic Layout change listeners for immediate overlay updates Enhanced error handling with user-friendly messages Better TypeScript types and modular design New Files & Dependencies# New Files# src/editor/ReadingModeTaskLinkProcessor.ts src/modals/TaskActionPaletteModal.ts src/services/NaturalLanguageParser.ts src/modals/ConfirmationModal.ts styles/task-action-palette-modal.css New Dependency# chrono-node: Natural language date parsing library What's Changed# Feat/task previews in reading mode by @amithkk in https://github.com/callumalpass/tasknotes/pull/57 New Contributors# @amithkk made their first contribution in https://github.com/callumalpass/tasknotes/pull/57 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0"},{"route":"/obsidian/releases/3.7.1/","title":"Version 3.7.1","description":"Files with Major Changes:","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.7.1.md","namespace":"obsidian","relativePath":"releases/3.7.1.md","raw":"# Version 3.7.1\r\n\r\n## Major UI/UX Enhancements\r\n\r\n### Interactive Inline Task Previews\r\n\r\n- Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview\r\n- Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing\r\n- Enhanced Visual Design:\r\n - Redesigned with minimal styling\r\n - Improved spacing and vertical alignment between status dots, priority indicators, and task titles\r\n - Better hover effects with brightness and subtle animations\r\n - Status dots now use bordered design for better visibility\r\n\r\n### Modernized Task Card Design\r\n\r\n- Interactive Status Cycling: Click status dots on task cards to quickly change task status\r\n- Improved Mobile Support: Better touch targets and responsive behavior\r\n- Enhanced Animations: Smooth hover effects, scaling, and transition animations\r\n- Cleaner Layout: Streamlined design with better visual hierarchy\r\n\r\n### Enhanced Natural Language Processing\r\n\r\n#### Advanced Date Parsing\r\n\r\n- Explicit Trigger Recognition: Now recognizes specific phrases:\r\n - Due dates: \"due on\", \"deadline\", \"must be done by\", \"needs to be completed\"\r\n - Scheduled dates: \"scheduled for\", \"start on\", \"work on\", \"planned for\"\r\n- Configurable Defaults: New setting to choose whether ambiguous dates default to \"due\" or \"scheduled\"\r\n- Enhanced Recurrence Patterns:\r\n - \"every [weekday]\" patterns (every monday, every friday)\r\n - Plural day patterns (mondays, tuesdays, etc.)\r\n - \"Every other\" interval patterns (every other week, every 2 days)\r\n - Multiple days (\"every tuesday and thursday\")\r\n\r\n#### Improved Date/Time Handling\r\n\r\n- Better Time Component Support: Enhanced parsing of specific times with dates\r\n- Robust Validation: Improved handling of edge cases and malformed input\r\n- Smart Cleanup: Automatic removal of duplicate tags and contexts\r\n\r\n## Performance & Developer Experience\r\n\r\n### Instant Task Conversion Improvements\r\n\r\n- Real-time Updates: Task link overlays refresh immediately after task conversion\r\n- Smart Caching: Improved metadata cache management for newly created tasks\r\n- Better Error Handling: Enhanced validation with user-friendly error messages\r\n- Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines\r\n\r\n### Technical Improvements\r\n\r\n- Improved Event Handling: Fixed n.dispatch is not a function error with proper validation\r\n- BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization\r\n- Performance Optimizations: Reduced unnecessary re-renders and improved widget caching\r\n- Enhanced State Management: Better synchronization between UI updates and task data\r\n\r\n## Modal & Interface Enhancements\r\n\r\n### Enhanced Date/Time Modals\r\n\r\n- Better Keyboard Navigation: Enter to save, Escape to cancel\r\n- Separate Time Inputs: Dedicated date and time fields for precision\r\n- Quick Date Buttons: Common date selections for faster input\r\n- Improved Accessibility: Proper ARIA labels and screen reader support\r\n\r\n### Better User Experience\r\n\r\n- One-Click Status Changes: Direct status cycling from any task preview\r\n- Direct Date Editing: Click any date to immediately edit it\r\n- Enhanced Visual Feedback: Better hover states, transitions, and loading animations\r\n- Accessibility Improvements: Enhanced keyboard navigation and screen reader support\r\n\r\n### Bug Fixes & Stability\r\n\r\n- Fixed: Inline task widget dispatch errors that caused console warnings\r\n- Fixed: Vertical alignment issues with different-sized status and priority indicators\r\n- Fixed: Layout conflicts between flexbox and inline display properties\r\n- Fixed: Spacing issues in inline task previews causing cramped appearance\r\n- Fixed: Missing task link overlay refreshes after instant task conversion\r\n\r\n## Configuration & Settings\r\n\r\n### New User Settings\r\n\r\n- Natural Language Default: Configure whether ambiguous dates default to \"due\" or \"scheduled\"\r\n- Enhanced Task Creation: Improved default value application for instant task conversion\r\n\r\n## Technical Details\r\n\r\nFiles with Major Changes:\r\n- Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts)\r\n- Modernized task card design (TaskCard.ts)\r\n- Advanced natural language processing (NaturalLanguageParser.ts)\r\n- Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts)\r\n- Comprehensive CSS overhaul with BEM methodology\r\n","aliases":["/releases/3.7.1/","/releases/3.7.1/"],"toc":[{"level":2,"id":"major-uiux-enhancements","text":"Major UI/UX Enhancements"},{"level":3,"id":"interactive-inline-task-previews","text":"Interactive Inline Task Previews"},{"level":3,"id":"modernized-task-card-design","text":"Modernized Task Card Design"},{"level":3,"id":"enhanced-natural-language-processing","text":"Enhanced Natural Language Processing"},{"level":2,"id":"performance-developer-experience","text":"Performance & Developer Experience"},{"level":3,"id":"instant-task-conversion-improvements","text":"Instant Task Conversion Improvements"},{"level":3,"id":"technical-improvements","text":"Technical Improvements"},{"level":2,"id":"modal-interface-enhancements","text":"Modal & Interface Enhancements"},{"level":3,"id":"enhanced-datetime-modals","text":"Enhanced Date/Time Modals"},{"level":3,"id":"better-user-experience","text":"Better User Experience"},{"level":3,"id":"bug-fixes-stability","text":"Bug Fixes & Stability"},{"level":2,"id":"configuration-settings","text":"Configuration & Settings"},{"level":3,"id":"new-user-settings","text":"New User Settings"},{"level":2,"id":"technical-details","text":"Technical Details"}],"html":"

Major UI/UX Enhancements#

\n

Interactive Inline Task Previews#

\n
    \n
  • Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview
  • \n
  • Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing
  • \n
  • Enhanced Visual Design:
      \n
    • Redesigned with minimal styling
    • \n
    • Improved spacing and vertical alignment between status dots, priority indicators, and task titles
    • \n
    • Better hover effects with brightness and subtle animations
    • \n
    • Status dots now use bordered design for better visibility
    • \n
    \n
  • \n
\n

Modernized Task Card Design#

\n
    \n
  • Interactive Status Cycling: Click status dots on task cards to quickly change task status
  • \n
  • Improved Mobile Support: Better touch targets and responsive behavior
  • \n
  • Enhanced Animations: Smooth hover effects, scaling, and transition animations
  • \n
  • Cleaner Layout: Streamlined design with better visual hierarchy
  • \n
\n

Enhanced Natural Language Processing#

\n

Advanced Date Parsing#

\n
    \n
  • Explicit Trigger Recognition: Now recognizes specific phrases:
      \n
    • Due dates: "due on", "deadline", "must be done by", "needs to be completed"
    • \n
    • Scheduled dates: "scheduled for", "start on", "work on", "planned for"
    • \n
    \n
  • \n
  • Configurable Defaults: New setting to choose whether ambiguous dates default to "due" or "scheduled"
  • \n
  • Enhanced Recurrence Patterns:
      \n
    • "every [weekday]" patterns (every monday, every friday)
    • \n
    • Plural day patterns (mondays, tuesdays, etc.)
    • \n
    • "Every other" interval patterns (every other week, every 2 days)
    • \n
    • Multiple days ("every tuesday and thursday")
    • \n
    \n
  • \n
\n

Improved Date/Time Handling#

\n
    \n
  • Better Time Component Support: Enhanced parsing of specific times with dates
  • \n
  • Robust Validation: Improved handling of edge cases and malformed input
  • \n
  • Smart Cleanup: Automatic removal of duplicate tags and contexts
  • \n
\n

Performance & Developer Experience#

\n

Instant Task Conversion Improvements#

\n
    \n
  • Real-time Updates: Task link overlays refresh immediately after task conversion
  • \n
  • Smart Caching: Improved metadata cache management for newly created tasks
  • \n
  • Better Error Handling: Enhanced validation with user-friendly error messages
  • \n
  • Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines
  • \n
\n

Technical Improvements#

\n
    \n
  • Improved Event Handling: Fixed n.dispatch is not a function error with proper validation
  • \n
  • BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization
  • \n
  • Performance Optimizations: Reduced unnecessary re-renders and improved widget caching
  • \n
  • Enhanced State Management: Better synchronization between UI updates and task data
  • \n
\n

Modal & Interface Enhancements#

\n

Enhanced Date/Time Modals#

\n
    \n
  • Better Keyboard Navigation: Enter to save, Escape to cancel
  • \n
  • Separate Time Inputs: Dedicated date and time fields for precision
  • \n
  • Quick Date Buttons: Common date selections for faster input
  • \n
  • Improved Accessibility: Proper ARIA labels and screen reader support
  • \n
\n

Better User Experience#

\n
    \n
  • One-Click Status Changes: Direct status cycling from any task preview
  • \n
  • Direct Date Editing: Click any date to immediately edit it
  • \n
  • Enhanced Visual Feedback: Better hover states, transitions, and loading animations
  • \n
  • Accessibility Improvements: Enhanced keyboard navigation and screen reader support
  • \n
\n

Bug Fixes & Stability#

\n
    \n
  • Fixed: Inline task widget dispatch errors that caused console warnings
  • \n
  • Fixed: Vertical alignment issues with different-sized status and priority indicators
  • \n
  • Fixed: Layout conflicts between flexbox and inline display properties
  • \n
  • Fixed: Spacing issues in inline task previews causing cramped appearance
  • \n
  • Fixed: Missing task link overlay refreshes after instant task conversion
  • \n
\n

Configuration & Settings#

\n

New User Settings#

\n
    \n
  • Natural Language Default: Configure whether ambiguous dates default to "due" or "scheduled"
  • \n
  • Enhanced Task Creation: Improved default value application for instant task conversion
  • \n
\n

Technical Details#

\n

Files with Major Changes:

\n
    \n
  • Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts)
  • \n
  • Modernized task card design (TaskCard.ts)
  • \n
  • Advanced natural language processing (NaturalLanguageParser.ts)
  • \n
  • Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts)
  • \n
  • Comprehensive CSS overhaul with BEM methodology
  • \n
\n","text":"Major UI/UX Enhancements# Interactive Inline Task Previews# Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing Enhanced Visual Design: Redesigned with minimal styling Improved spacing and vertical alignment between status dots, priority indicators, and task titles Better hover effects with brightness and subtle animations Status dots now use bordered design for better visibility Modernized Task Card Design# Interactive Status Cycling: Click status dots on task cards to quickly change task status Improved Mobile Support: Better touch targets and responsive behavior Enhanced Animations: Smooth hover effects, scaling, and transition animations Cleaner Layout: Streamlined design with better visual hierarchy Enhanced Natural Language Processing# Advanced Date Parsing# Explicit Trigger Recognition: Now recognizes specific phrases: Due dates: \"due on\", \"deadline\", \"must be done by\", \"needs to be completed\" Scheduled dates: \"scheduled for\", \"start on\", \"work on\", \"planned for\" Configurable Defaults: New setting to choose whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Recurrence Patterns: \"every [weekday]\" patterns (every monday, every friday) Plural day patterns (mondays, tuesdays, etc.) \"Every other\" interval patterns (every other week, every 2 days) Multiple days (\"every tuesday and thursday\") Improved Date/Time Handling# Better Time Component Support: Enhanced parsing of specific times with dates Robust Validation: Improved handling of edge cases and malformed input Smart Cleanup: Automatic removal of duplicate tags and contexts Performance & Developer Experience# Instant Task Conversion Improvements# Real-time Updates: Task link overlays refresh immediately after task conversion Smart Caching: Improved metadata cache management for newly created tasks Better Error Handling: Enhanced validation with user-friendly error messages Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines Technical Improvements# Improved Event Handling: Fixed n.dispatch is not a function error with proper validation BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization Performance Optimizations: Reduced unnecessary re-renders and improved widget caching Enhanced State Management: Better synchronization between UI updates and task data Modal & Interface Enhancements# Enhanced Date/Time Modals# Better Keyboard Navigation: Enter to save, Escape to cancel Separate Time Inputs: Dedicated date and time fields for precision Quick Date Buttons: Common date selections for faster input Improved Accessibility: Proper ARIA labels and screen reader support Better User Experience# One-Click Status Changes: Direct status cycling from any task preview Direct Date Editing: Click any date to immediately edit it Enhanced Visual Feedback: Better hover states, transitions, and loading animations Accessibility Improvements: Enhanced keyboard navigation and screen reader support Bug Fixes & Stability# Fixed: Inline task widget dispatch errors that caused console warnings Fixed: Vertical alignment issues with different-sized status and priority indicators Fixed: Layout conflicts between flexbox and inline display properties Fixed: Spacing issues in inline task previews causing cramped appearance Fixed: Missing task link overlay refreshes after instant task conversion Configuration & Settings# New User Settings# Natural Language Default: Configure whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Task Creation: Improved default value application for instant task conversion Technical Details# Files with Major Changes: Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts) Modernized task card design (TaskCard.ts) Advanced natural language processing (NaturalLanguageParser.ts) Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts) Comprehensive CSS overhaul with BEM methodology"},{"route":"/obsidian/releases/3.8.1/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.1.md","namespace":"obsidian","relativePath":"releases/3.8.1.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1\n","aliases":["/releases/3.8.1/","/releases/3.8.1/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1"},{"route":"/obsidian/releases/3.8.5/","title":"TaskNotes 3.8.5 Release Notes","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.5.md","namespace":"obsidian","relativePath":"releases/3.8.5.md","raw":"# TaskNotes 3.8.5 Release Notes\r\n\r\n## UI/UX Improvements\r\n\r\n### Compact Filter Bar (Special thanks to @amithkk :tada: )\r\n\r\n- Complete redesign of FilterBar component with compact, modern interface\r\n- Native Obsidian dropdowns replace basic HTML select elements for better consistency\r\n- Collapsible controls - settings are hidden by default with expandable controls via settings button\r\n- Visual indicators showing active filter count on settings button\r\n- Integrated search bar with search icon and improved visual hierarchy\r\n- Right-aligned control buttons for better layout organization\r\n\r\n### Advanced Calendar View Integration\r\n\r\n- Unified view options - calendar view toggles now integrated into FilterBar dropdown\r\n- Streamlined interface - removed separate toggle controls in favor of FilterBar integration\r\n- Consistent UX across different view types with shared filter/view controls\r\n- Dynamic option management with real-time updates and state synchronization\r\n\r\n## Enhanced Natural Language Processing\r\n\r\n### Improved Text Processing\r\n\r\n- Better whitespace handling with new cleanupWhitespace() function for consistent text normalization\r\n- Enhanced priority detection with improved pattern matching and conflict resolution\r\n- Completion status support - added isCompleted field to parsed task data\r\n- More robust text extraction across tags, contexts, priorities, and dates\r\n\r\n### Date and Time Handling Improvements\r\n\r\n- Enhanced date parsing with better timezone handling for date-only strings\r\n- Improved date normalization with direct Date constructor to avoid timezone issues\r\n- Better error handling for invalid date strings and edge cases\r\n- More robust timestamp formatting with validation checks\r\n\r\n## Testing Infrastructure\r\n\r\n### Comprehensive Test Suite\r\n\r\n- Complete testing infrastructure with Jest configuration for both unit and integration tests\r\n- Enhanced mocking system with improved Obsidian API mocks and better type safety\r\n- Integration test helpers with utilities for end-to-end workflow testing\r\n- Improved test coverage across core components and services\r\n\r\n### Mock Improvements\r\n\r\n- Updated mock factories with better type consistency and realistic data generation\r\n- Enhanced DOM simulation for better UI component testing\r\n- Improved date-fns mocking with support for \"MMM d, yyyy h:mm a\" format\r\n- Better Obsidian API compatibility in test mocks\r\n\r\n## Developer Experience\r\n\r\n### Type Safety Enhancements\r\n\r\n- Refactored type definitions for improved consistency across the codebase\r\n- Better TypeScript integration with enhanced type checking and inference\r\n- Improved callback types for better development experience\r\n\r\n## Build and Deployment\r\n\r\n- Updated GitHub Actions with artifact uploader v4 for improved CI/CD\r\n- Enhanced development workflow with better testing and build processes\r\n\r\n## User Interface Polish\r\n\r\n### Task Creation Modal\r\n\r\n- Improved placeholder text with more natural language examples\r\n- Better user guidance for natural language task input format\r\n- Clearer instruction formatting for enhanced user experience\r\n\r\n### Visual Consistency\r\n\r\n- Native Obsidian styling throughout filter and control components\r\n- Consistent iconography using Obsidian's icon system\r\n- Improved responsive design with better mobile and small screen support\r\n\r\n## Bug Fixes and Stability\r\n\r\n#### Error Handling\r\n\r\n- Improved error handling in date parsing and normalization functions\r\n- Better validation for user input and edge cases\r\n- Enhanced robustness in text processing and natural language parsing\r\n\r\n### Code Quality\r\n\r\n- Refactored components for better maintainability and performance\r\n- Simplified scheduled date logic with cleaner default handling\r\n- Enhanced code organization with better separation of concerns\r\n\r\n\r\n## What's Changed\r\n\r\n* Add compact filter bar by @amithkk in https://github.com/callumalpass/tasknotes/pull/73\r\n\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5\n","aliases":["/releases/3.8.5/","/releases/3.8.5/"],"toc":[{"level":2,"id":"uiux-improvements","text":"UI/UX Improvements"},{"level":3,"id":"compact-filter-bar-special-thanks-to-amithkk-tada","text":"Compact Filter Bar (Special thanks to @amithkk :tada: )"},{"level":3,"id":"advanced-calendar-view-integration","text":"Advanced Calendar View Integration"},{"level":2,"id":"enhanced-natural-language-processing","text":"Enhanced Natural Language Processing"},{"level":3,"id":"improved-text-processing","text":"Improved Text Processing"},{"level":3,"id":"date-and-time-handling-improvements","text":"Date and Time Handling Improvements"},{"level":2,"id":"testing-infrastructure","text":"Testing Infrastructure"},{"level":3,"id":"comprehensive-test-suite","text":"Comprehensive Test Suite"},{"level":3,"id":"mock-improvements","text":"Mock Improvements"},{"level":2,"id":"developer-experience","text":"Developer Experience"},{"level":3,"id":"type-safety-enhancements","text":"Type Safety Enhancements"},{"level":2,"id":"build-and-deployment","text":"Build and Deployment"},{"level":2,"id":"user-interface-polish","text":"User Interface Polish"},{"level":3,"id":"task-creation-modal","text":"Task Creation Modal"},{"level":3,"id":"visual-consistency","text":"Visual Consistency"},{"level":2,"id":"bug-fixes-and-stability","text":"Bug Fixes and Stability"},{"level":3,"id":"code-quality","text":"Code Quality"},{"level":2,"id":"what39s-changed","text":"What's Changed"}],"html":"

UI/UX Improvements#

\n

Compact Filter Bar (Special thanks to @amithkk :tada: )#

\n
    \n
  • Complete redesign of FilterBar component with compact, modern interface
  • \n
  • Native Obsidian dropdowns replace basic HTML select elements for better consistency
  • \n
  • Collapsible controls - settings are hidden by default with expandable controls via settings button
  • \n
  • Visual indicators showing active filter count on settings button
  • \n
  • Integrated search bar with search icon and improved visual hierarchy
  • \n
  • Right-aligned control buttons for better layout organization
  • \n
\n

Advanced Calendar View Integration#

\n
    \n
  • Unified view options - calendar view toggles now integrated into FilterBar dropdown
  • \n
  • Streamlined interface - removed separate toggle controls in favor of FilterBar integration
  • \n
  • Consistent UX across different view types with shared filter/view controls
  • \n
  • Dynamic option management with real-time updates and state synchronization
  • \n
\n

Enhanced Natural Language Processing#

\n

Improved Text Processing#

\n
    \n
  • Better whitespace handling with new cleanupWhitespace() function for consistent text normalization
  • \n
  • Enhanced priority detection with improved pattern matching and conflict resolution
  • \n
  • Completion status support - added isCompleted field to parsed task data
  • \n
  • More robust text extraction across tags, contexts, priorities, and dates
  • \n
\n

Date and Time Handling Improvements#

\n
    \n
  • Enhanced date parsing with better timezone handling for date-only strings
  • \n
  • Improved date normalization with direct Date constructor to avoid timezone issues
  • \n
  • Better error handling for invalid date strings and edge cases
  • \n
  • More robust timestamp formatting with validation checks
  • \n
\n

Testing Infrastructure#

\n

Comprehensive Test Suite#

\n
    \n
  • Complete testing infrastructure with Jest configuration for both unit and integration tests
  • \n
  • Enhanced mocking system with improved Obsidian API mocks and better type safety
  • \n
  • Integration test helpers with utilities for end-to-end workflow testing
  • \n
  • Improved test coverage across core components and services
  • \n
\n

Mock Improvements#

\n
    \n
  • Updated mock factories with better type consistency and realistic data generation
  • \n
  • Enhanced DOM simulation for better UI component testing
  • \n
  • Improved date-fns mocking with support for "MMM d, yyyy h:mm a" format
  • \n
  • Better Obsidian API compatibility in test mocks
  • \n
\n

Developer Experience#

\n

Type Safety Enhancements#

\n
    \n
  • Refactored type definitions for improved consistency across the codebase
  • \n
  • Better TypeScript integration with enhanced type checking and inference
  • \n
  • Improved callback types for better development experience
  • \n
\n

Build and Deployment#

\n
    \n
  • Updated GitHub Actions with artifact uploader v4 for improved CI/CD
  • \n
  • Enhanced development workflow with better testing and build processes
  • \n
\n

User Interface Polish#

\n

Task Creation Modal#

\n
    \n
  • Improved placeholder text with more natural language examples
  • \n
  • Better user guidance for natural language task input format
  • \n
  • Clearer instruction formatting for enhanced user experience
  • \n
\n

Visual Consistency#

\n
    \n
  • Native Obsidian styling throughout filter and control components
  • \n
  • Consistent iconography using Obsidian's icon system
  • \n
  • Improved responsive design with better mobile and small screen support
  • \n
\n

Bug Fixes and Stability#

\n

Error Handling#

\n
    \n
  • Improved error handling in date parsing and normalization functions
  • \n
  • Better validation for user input and edge cases
  • \n
  • Enhanced robustness in text processing and natural language parsing
  • \n
\n

Code Quality#

\n
    \n
  • Refactored components for better maintainability and performance
  • \n
  • Simplified scheduled date logic with cleaner default handling
  • \n
  • Enhanced code organization with better separation of concerns
  • \n
\n

What's Changed#

\n\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5

\n","text":"UI/UX Improvements# Compact Filter Bar (Special thanks to @amithkk :tada: )# Complete redesign of FilterBar component with compact, modern interface Native Obsidian dropdowns replace basic HTML select elements for better consistency Collapsible controls - settings are hidden by default with expandable controls via settings button Visual indicators showing active filter count on settings button Integrated search bar with search icon and improved visual hierarchy Right-aligned control buttons for better layout organization Advanced Calendar View Integration# Unified view options - calendar view toggles now integrated into FilterBar dropdown Streamlined interface - removed separate toggle controls in favor of FilterBar integration Consistent UX across different view types with shared filter/view controls Dynamic option management with real-time updates and state synchronization Enhanced Natural Language Processing# Improved Text Processing# Better whitespace handling with new cleanupWhitespace() function for consistent text normalization Enhanced priority detection with improved pattern matching and conflict resolution Completion status support - added isCompleted field to parsed task data More robust text extraction across tags, contexts, priorities, and dates Date and Time Handling Improvements# Enhanced date parsing with better timezone handling for date-only strings Improved date normalization with direct Date constructor to avoid timezone issues Better error handling for invalid date strings and edge cases More robust timestamp formatting with validation checks Testing Infrastructure# Comprehensive Test Suite# Complete testing infrastructure with Jest configuration for both unit and integration tests Enhanced mocking system with improved Obsidian API mocks and better type safety Integration test helpers with utilities for end-to-end workflow testing Improved test coverage across core components and services Mock Improvements# Updated mock factories with better type consistency and realistic data generation Enhanced DOM simulation for better UI component testing Improved date-fns mocking with support for \"MMM d, yyyy h:mm a\" format Better Obsidian API compatibility in test mocks Developer Experience# Type Safety Enhancements# Refactored type definitions for improved consistency across the codebase Better TypeScript integration with enhanced type checking and inference Improved callback types for better development experience Build and Deployment# Updated GitHub Actions with artifact uploader v4 for improved CI/CD Enhanced development workflow with better testing and build processes User Interface Polish# Task Creation Modal# Improved placeholder text with more natural language examples Better user guidance for natural language task input format Clearer instruction formatting for enhanced user experience Visual Consistency# Native Obsidian styling throughout filter and control components Consistent iconography using Obsidian's icon system Improved responsive design with better mobile and small screen support Bug Fixes and Stability# Error Handling# Improved error handling in date parsing and normalization functions Better validation for user input and edge cases Enhanced robustness in text processing and natural language parsing Code Quality# Refactored components for better maintainability and performance Simplified scheduled date logic with cleaner default handling Enhanced code organization with better separation of concerns What's Changed# Add compact filter bar by @amithkk in https://github.com/callumalpass/tasknotes/pull/73 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5"},{"route":"/obsidian/releases/3.8.6/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.6.md","namespace":"obsidian","relativePath":"releases/3.8.6.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6\n","aliases":["/releases/3.8.6/","/releases/3.8.6/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6"},{"route":"/obsidian/releases/3.8.7/","title":"Untitled","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.8.7.md","namespace":"obsidian","relativePath":"releases/3.8.7.md","raw":"**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7\n","aliases":["/releases/3.8.7/","/releases/3.8.7/"],"toc":[],"html":"

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7

\n","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7"},{"route":"/obsidian/releases/3.9.0/","title":"Release Notes v3.9.0","description":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.9.0.md","namespace":"obsidian","relativePath":"releases/3.9.0.md","raw":"# Release Notes v3.9.0\r\n\r\nThis release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience.\r\nKey updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance.\r\n\r\nA special thank you to amithkk (https://github.com/amithkk) for their contributions to this release!\r\n\r\n## New Features\r\n\r\n * RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible\r\n recurring task schedules. A migration assistant will help you update your existing tasks to the new format.\r\n * Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage\r\n individual completions of recurring tasks.\r\n * \"Show\" Dropdown in Filter Bar: A unified \"Show\" dropdown has been added to the filter bar, providing enhanced filtering options for your\r\n tasks.\r\n * Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow.\r\n * Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save\r\n tasks in the same folder as the current note.\r\n * \"Show Due Dates When Scheduled\" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view.\r\n * Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!)\r\n * Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features.\r\n * \"Highlight Today\" in Calendar View: The calendar view now highlights the current day for better visibility.\r\n * New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability.\r\n * CI/CD and Testing:\r\n * A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions.\r\n * GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases.\r\n\r\n## Enhancements\r\n\r\n * UI/UX Improvements:\r\n * The task edit and creation modals have been redesigned for a more minimalist and intuitive experience.\r\n * Task-related icons have been updated for better clarity.\r\n * Context menus have been added to task cards for quick actions.\r\n * The agenda view sorting options have been fixed.\r\n * The recurring calendar widget is now centered and on a separate line from its label.\r\n * Dropdown menus now handle clicks on text labels more reliably.\r\n * Performance and Reliability:\r\n * The task link overlay has been refactored to use a ViewPlugin for better performance.\r\n * The Advanced Calendar view now handles resizing and being moved to a new window more gracefully.\r\n * The natural language processing for task creation has been improved with a fallback mechanism.\r\n * Date parsing and handling have been made more robust, especially for UTC and different date formats.\r\n * Development Workflow:\r\n * ESLint configuration has been updated with new rules and plugins for better code consistency.\r\n * The build process for CSS has been improved.\r\n * The development guidelines have been updated to reflect the new architecture.\r\n\r\n## Bug Fixes\r\n\r\n\r\n * Fixed an issue where agenda view sorting options were not working correctly.\r\n * Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window.\r\n * Resolved a TypeError in the task modal's suggestion filtering.\r\n * Fixed an issue where the Pomodoro task selector did not show all un-archived tasks.\r\n * Corrected the filtering of daily notes in the getNotesForDate function.\r\n * Fixed a bug where the underlying markdown of a task link was not revealed on hover.\r\n * Removed misleading placeholder symbols from the settings.\r\n * Addressed various linting issues and improved code quality.\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0\n","aliases":["/releases/3.9.0/","/releases/3.9.0/"],"toc":[{"level":2,"id":"new-features","text":"New Features"},{"level":2,"id":"enhancements","text":"Enhancements"},{"level":2,"id":"bug-fixes","text":"Bug Fixes"}],"html":"

This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience.\nKey updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance.

\n

A special thank you to amithkk (https://github.com/amithkk) for their contributions to this release!

\n

New Features#

\n
    \n
  • RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible\nrecurring task schedules. A migration assistant will help you update your existing tasks to the new format.
  • \n
  • Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage\nindividual completions of recurring tasks.
  • \n
  • "Show" Dropdown in Filter Bar: A unified "Show" dropdown has been added to the filter bar, providing enhanced filtering options for your\ntasks.
  • \n
  • Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow.
  • \n
  • Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save\ntasks in the same folder as the current note.
  • \n
  • "Show Due Dates When Scheduled" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view.
  • \n
  • Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!)
  • \n
  • Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features.
  • \n
  • "Highlight Today" in Calendar View: The calendar view now highlights the current day for better visibility.
  • \n
  • New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability.
  • \n
  • CI/CD and Testing:
      \n
    • A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions.
    • \n
    • GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases.
    • \n
    \n
  • \n
\n

Enhancements#

\n
    \n
  • UI/UX Improvements:
      \n
    • The task edit and creation modals have been redesigned for a more minimalist and intuitive experience.
    • \n
    • Task-related icons have been updated for better clarity.
    • \n
    • Context menus have been added to task cards for quick actions.
    • \n
    • The agenda view sorting options have been fixed.
    • \n
    • The recurring calendar widget is now centered and on a separate line from its label.
    • \n
    • Dropdown menus now handle clicks on text labels more reliably.
    • \n
    \n
  • \n
  • Performance and Reliability:
      \n
    • The task link overlay has been refactored to use a ViewPlugin for better performance.
    • \n
    • The Advanced Calendar view now handles resizing and being moved to a new window more gracefully.
    • \n
    • The natural language processing for task creation has been improved with a fallback mechanism.
    • \n
    • Date parsing and handling have been made more robust, especially for UTC and different date formats.
    • \n
    \n
  • \n
  • Development Workflow:
      \n
    • ESLint configuration has been updated with new rules and plugins for better code consistency.
    • \n
    • The build process for CSS has been improved.
    • \n
    • The development guidelines have been updated to reflect the new architecture.
    • \n
    \n
  • \n
\n

Bug Fixes#

\n
    \n
  • Fixed an issue where agenda view sorting options were not working correctly.
  • \n
  • Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window.
  • \n
  • Resolved a TypeError in the task modal's suggestion filtering.
  • \n
  • Fixed an issue where the Pomodoro task selector did not show all un-archived tasks.
  • \n
  • Corrected the filtering of daily notes in the getNotesForDate function.
  • \n
  • Fixed a bug where the underlying markdown of a task link was not revealed on hover.
  • \n
  • Removed misleading placeholder symbols from the settings.
  • \n
  • Addressed various linting issues and improved code quality.
  • \n
\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0

\n","text":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance. A special thank you to amithkk (https://github.com/amithkk) for their contributions to this release! New Features# RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible recurring task schedules. A migration assistant will help you update your existing tasks to the new format. Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage individual completions of recurring tasks. \"Show\" Dropdown in Filter Bar: A unified \"Show\" dropdown has been added to the filter bar, providing enhanced filtering options for your tasks. Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow. Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save tasks in the same folder as the current note. \"Show Due Dates When Scheduled\" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view. Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!) Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features. \"Highlight Today\" in Calendar View: The calendar view now highlights the current day for better visibility. New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability. CI/CD and Testing: A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions. GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases. Enhancements# UI/UX Improvements: The task edit and creation modals have been redesigned for a more minimalist and intuitive experience. Task-related icons have been updated for better clarity. Context menus have been added to task cards for quick actions. The agenda view sorting options have been fixed. The recurring calendar widget is now centered and on a separate line from its label. Dropdown menus now handle clicks on text labels more reliably. Performance and Reliability: The task link overlay has been refactored to use a ViewPlugin for better performance. The Advanced Calendar view now handles resizing and being moved to a new window more gracefully. The natural language processing for task creation has been improved with a fallback mechanism. Date parsing and handling have been made more robust, especially for UTC and different date formats. Development Workflow: ESLint configuration has been updated with new rules and plugins for better code consistency. The build process for CSS has been improved. The development guidelines have been updated to reflect the new architecture. Bug Fixes# Fixed an issue where agenda view sorting options were not working correctly. Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window. Resolved a TypeError in the task modal's suggestion filtering. Fixed an issue where the Pomodoro task selector did not show all un-archived tasks. Corrected the filtering of daily notes in the getNotesForDate function. Fixed a bug where the underlying markdown of a task link was not revealed on hover. Removed misleading placeholder symbols from the settings. Addressed various linting issues and improved code quality. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0"},{"route":"/obsidian/releases/3.9.1/","title":"Release Notes: 3.9.1","description":"New Features","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/3.9.1.md","namespace":"obsidian","relativePath":"releases/3.9.1.md","raw":"# Release Notes: 3.9.1\r\n\r\nNew Features\r\n\r\n * GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided.\r\n\r\nBug Fixes\r\n\r\n * Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended.\r\n * Task Creation: The \"Magic Wand\" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input.\r\n\r\n\r\n\r\n## What's Changed\r\n* Add github issue templates by @amithkk in https://github.com/callumalpass/tasknotes/pull/101\r\n\r\n\r\n**Full Changelog**: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1\n","aliases":["/releases/3.9.1/","/releases/3.9.1/"],"toc":[{"level":2,"id":"what39s-changed","text":"What's Changed"}],"html":"

New Features

\n
    \n
  • GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided.
  • \n
\n

Bug Fixes

\n
    \n
  • Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended.
  • \n
  • Task Creation: The "Magic Wand" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input.
  • \n
\n

What's Changed#

\n\n

Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1

\n","text":"New Features GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided. Bug Fixes Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended. Task Creation: The \"Magic Wand\" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input. What's Changed# Add github issue templates by @amithkk in https://github.com/callumalpass/tasknotes/pull/101 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1"},{"route":"/obsidian/releases/4.0.0-beta.0/","title":"TaskNotes 4.0.0-beta.0","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.0.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.0.md","raw":"# TaskNotes 4.0.0-beta.0\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## What's New in v4\n\nTaskNotes v4 migrates all views to the Bases system.\n\n### Breaking Changes\n\n- **Minimum Obsidian version: 1.10.1**\n- **View commands now use Bases files** - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open `.base` files created automatically in your vault\n- **Saved filter views** - Custom saved views can be converted to `.base` files using a conversion button in settings\n\n## Added\n\n### OAuth Calendar Integration\n\n- Google Calendar and Microsoft Outlook integration via OAuth 2.0\n - View and sync calendar events in Bases calendar\n - Drag events in the TaskNotes bases calendar to change the event's time online\n - Events sync every 15 minutes or upon local change\n - Requires creating your own OAuth application (approximately 15 minutes)\n - See [Calendar Setup Guide](https://tasknotes.dev/calendar-setup)\n\n### Time Entry Editor Modal\n\n- Dedicated interface for managing time entries\n - Alt-drag on Bases calendar to create time entries\n - View total tracked time per task\n - Edit and delete time entries\n - Access via Task Action Palette (Alt/Opt + Enter)\n\n### Kanban Swimlane Layout\n\n- Horizontal swimlane grouping option for Bases Kanban\n - Group tasks by status, priority, or other fields\n - Hide empty columns\n - Configurable column widths\n - Improved drag-and-drop in swimlane mode\n\n### Saved View Converter\n\n- Conversion button in settings to convert saved filter views to `.base` files\n- Original settings preserved\n- Converted views created in `TaskNotes/Views/`\n\n## Changed\n\n### View System Architecture\n\n- All views now use Bases architecture\n - Calendar, Kanban, Tasks, Agenda, and Project Subtasks are `.base` files\n - Views stored in `TaskNotes/Views/`\n - Keyboard shortcuts and ribbon icons map to `.base` files\n - Configure file paths in Settings → Integrations → Bases Integration\n\n### Calendar\n\n- Control which calendar sources display\n - Toggle Google Calendar, Microsoft Calendar, and ICS events independently\n - Configurable list view with custom day count (2-10 days)\n - Improved timezone handling for recurring events\n\n### Settings\n\n- Reorganized settings tabs\n - OAuth calendar settings in Integrations tab\n - Updated help text\n\n## Fixed\n\n- (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\"\n - TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting\n - Thanks to @jack2game\n- Fixed dark mode calendar borders\n- Fixed Bases Kanban column ordering - Thanks to @mweichert\n- Fixed state management bug in FilterSettingsComponent\n- Fixed timezone handling for recurring events\n\n## Migration Guide\n\n### First Launch\n\n1. Default view files are created automatically in `TaskNotes/Views/`\n2. Ribbon and command palette commands now open `.base` files\n3. Review Settings → General to customize view file paths\n\n### Converting Saved Filter Views\n\n1. Go to Settings → General\n2. Click the conversion button to convert saved filter views to `.base` files\n3. Converted views appear in a file in `TaskNotes/Views/`\n\n### Calendar Integration (Optional)\n\n1. Go to Settings → Integrations → OAuth Calendar Integration\n2. Follow the [Calendar Setup Guide](https://tasknotes.dev/calendar-setup)\n3. Create OAuth applications with Google and/or Microsoft (approximately 15 minutes)\n4. Enter Client ID and Secret in calendar cards\n5. Click Connect\n\n## Known Limitations\n\n- Quick OAuth setup is disabled - only advanced setup (your own credentials) is available\n- Saved filter views require manual conversion using the button in settings\n- Migration is one-way - downgrading to v3 may require manual reconfiguration\n- OAuth setup requires creating applications with Google/Microsoft\n\n## Feedback\n\nReport issues on [GitHub](https://github.com/callumalpass/tasknotes/issues). Include:\n\n- Obsidian version\n- Steps to reproduce\n- Console errors (Ctrl/Cmd + Shift + I)\n- Whether issue occurs after migration or fresh install\n","aliases":["/releases/4.0.0-beta.0/","/releases/4.0.0-beta.0/"],"toc":[{"level":2,"id":"what39s-new-in-v4","text":"What's New in v4"},{"level":3,"id":"breaking-changes","text":"Breaking Changes"},{"level":2,"id":"added","text":"Added"},{"level":3,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"time-entry-editor-modal","text":"Time Entry Editor Modal"},{"level":3,"id":"kanban-swimlane-layout","text":"Kanban Swimlane Layout"},{"level":3,"id":"saved-view-converter","text":"Saved View Converter"},{"level":2,"id":"changed","text":"Changed"},{"level":3,"id":"view-system-architecture","text":"View System Architecture"},{"level":3,"id":"calendar","text":"Calendar"},{"level":3,"id":"settings","text":"Settings"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"migration-guide","text":"Migration Guide"},{"level":3,"id":"first-launch","text":"First Launch"},{"level":3,"id":"converting-saved-filter-views","text":"Converting Saved Filter Views"},{"level":3,"id":"calendar-integration-optional","text":"Calendar Integration (Optional)"},{"level":2,"id":"known-limitations","text":"Known Limitations"},{"level":2,"id":"feedback","text":"Feedback"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

What's New in v4#

\n

TaskNotes v4 migrates all views to the Bases system.

\n

Breaking Changes#

\n
    \n
  • Minimum Obsidian version: 1.10.1
  • \n
  • View commands now use Bases files - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open .base files created automatically in your vault
  • \n
  • Saved filter views - Custom saved views can be converted to .base files using a conversion button in settings
  • \n
\n

Added#

\n

OAuth Calendar Integration#

\n
    \n
  • Google Calendar and Microsoft Outlook integration via OAuth 2.0
      \n
    • View and sync calendar events in Bases calendar
    • \n
    • Drag events in the TaskNotes bases calendar to change the event's time online
    • \n
    • Events sync every 15 minutes or upon local change
    • \n
    • Requires creating your own OAuth application (approximately 15 minutes)
    • \n
    • See Calendar Setup Guide
    • \n
    \n
  • \n
\n

Time Entry Editor Modal#

\n
    \n
  • Dedicated interface for managing time entries
      \n
    • Alt-drag on Bases calendar to create time entries
    • \n
    • View total tracked time per task
    • \n
    • Edit and delete time entries
    • \n
    • Access via Task Action Palette (Alt/Opt + Enter)
    • \n
    \n
  • \n
\n

Kanban Swimlane Layout#

\n
    \n
  • Horizontal swimlane grouping option for Bases Kanban
      \n
    • Group tasks by status, priority, or other fields
    • \n
    • Hide empty columns
    • \n
    • Configurable column widths
    • \n
    • Improved drag-and-drop in swimlane mode
    • \n
    \n
  • \n
\n

Saved View Converter#

\n
    \n
  • Conversion button in settings to convert saved filter views to .base files
  • \n
  • Original settings preserved
  • \n
  • Converted views created in TaskNotes/Views/
  • \n
\n

Changed#

\n

View System Architecture#

\n
    \n
  • All views now use Bases architecture
      \n
    • Calendar, Kanban, Tasks, Agenda, and Project Subtasks are .base files
    • \n
    • Views stored in TaskNotes/Views/
    • \n
    • Keyboard shortcuts and ribbon icons map to .base files
    • \n
    • Configure file paths in Settings → Integrations → Bases Integration
    • \n
    \n
  • \n
\n

Calendar#

\n
    \n
  • Control which calendar sources display
      \n
    • Toggle Google Calendar, Microsoft Calendar, and ICS events independently
    • \n
    • Configurable list view with custom day count (2-10 days)
    • \n
    • Improved timezone handling for recurring events
    • \n
    \n
  • \n
\n

Settings#

\n
    \n
  • Reorganized settings tabs
      \n
    • OAuth calendar settings in Integrations tab
    • \n
    • Updated help text
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#843) Fixed task tag being added when "Identify tasks by" is set to "Property"
      \n
    • TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting
    • \n
    • Thanks to @jack2game
    • \n
    \n
  • \n
  • Fixed dark mode calendar borders
  • \n
  • Fixed Bases Kanban column ordering - Thanks to @mweichert
  • \n
  • Fixed state management bug in FilterSettingsComponent
  • \n
  • Fixed timezone handling for recurring events
  • \n
\n

Migration Guide#

\n

First Launch#

\n
    \n
  1. Default view files are created automatically in TaskNotes/Views/
  2. \n
  3. Ribbon and command palette commands now open .base files
  4. \n
  5. Review Settings → General to customize view file paths
  6. \n
\n

Converting Saved Filter Views#

\n
    \n
  1. Go to Settings → General
  2. \n
  3. Click the conversion button to convert saved filter views to .base files
  4. \n
  5. Converted views appear in a file in TaskNotes/Views/
  6. \n
\n

Calendar Integration (Optional)#

\n
    \n
  1. Go to Settings → Integrations → OAuth Calendar Integration
  2. \n
  3. Follow the Calendar Setup Guide
  4. \n
  5. Create OAuth applications with Google and/or Microsoft (approximately 15 minutes)
  6. \n
  7. Enter Client ID and Secret in calendar cards
  8. \n
  9. Click Connect
  10. \n
\n

Known Limitations#

\n
    \n
  • Quick OAuth setup is disabled - only advanced setup (your own credentials) is available
  • \n
  • Saved filter views require manual conversion using the button in settings
  • \n
  • Migration is one-way - downgrading to v3 may require manual reconfiguration
  • \n
  • OAuth setup requires creating applications with Google/Microsoft
  • \n
\n

Feedback#

\n

Report issues on GitHub. Include:

\n
    \n
  • Obsidian version
  • \n
  • Steps to reproduce
  • \n
  • Console errors (Ctrl/Cmd + Shift + I)
  • \n
  • Whether issue occurs after migration or fresh install
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. What's New in v4# TaskNotes v4 migrates all views to the Bases system. Breaking Changes# Minimum Obsidian version: 1.10.1 View commands now use Bases files - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open .base files created automatically in your vault Saved filter views - Custom saved views can be converted to .base files using a conversion button in settings Added# OAuth Calendar Integration# Google Calendar and Microsoft Outlook integration via OAuth 2.0 View and sync calendar events in Bases calendar Drag events in the TaskNotes bases calendar to change the event's time online Events sync every 15 minutes or upon local change Requires creating your own OAuth application (approximately 15 minutes) See Calendar Setup Guide Time Entry Editor Modal# Dedicated interface for managing time entries Alt-drag on Bases calendar to create time entries View total tracked time per task Edit and delete time entries Access via Task Action Palette (Alt/Opt + Enter) Kanban Swimlane Layout# Horizontal swimlane grouping option for Bases Kanban Group tasks by status, priority, or other fields Hide empty columns Configurable column widths Improved drag-and-drop in swimlane mode Saved View Converter# Conversion button in settings to convert saved filter views to .base files Original settings preserved Converted views created in TaskNotes/Views/ Changed# View System Architecture# All views now use Bases architecture Calendar, Kanban, Tasks, Agenda, and Project Subtasks are .base files Views stored in TaskNotes/Views/ Keyboard shortcuts and ribbon icons map to .base files Configure file paths in Settings → Integrations → Bases Integration Calendar# Control which calendar sources display Toggle Google Calendar, Microsoft Calendar, and ICS events independently Configurable list view with custom day count (2-10 days) Improved timezone handling for recurring events Settings# Reorganized settings tabs OAuth calendar settings in Integrations tab Updated help text Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting Thanks to @jack2game Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events Migration Guide# First Launch# Default view files are created automatically in TaskNotes/Views/ Ribbon and command palette commands now open .base files Review Settings → General to customize view file paths Converting Saved Filter Views# Go to Settings → General Click the conversion button to convert saved filter views to .base files Converted views appear in a file in TaskNotes/Views/ Calendar Integration (Optional)# Go to Settings → Integrations → OAuth Calendar Integration Follow the Calendar Setup Guide Create OAuth applications with Google and/or Microsoft (approximately 15 minutes) Enter Client ID and Secret in calendar cards Click Connect Known Limitations# Quick OAuth setup is disabled - only advanced setup (your own credentials) is available Saved filter views require manual conversion using the button in settings Migration is one-way - downgrading to v3 may require manual reconfiguration OAuth setup requires creating applications with Google/Microsoft Feedback# Report issues on GitHub. Include: Obsidian version Steps to reproduce Console errors (Ctrl/Cmd + Shift + I) Whether issue occurs after migration or fresh install"},{"route":"/obsidian/releases/4.0.0-beta.1/","title":"TaskNotes 4.0.0-beta.1","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.1.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.1.md","raw":"# TaskNotes 4.0.0-beta.1\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## Added\n\n- Added context menus for time entries and ICS events in calendar\n - Time entries: Right-click shows task context menu, left-click opens time entry editor modal\n - ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info\n- Added calendar icon to ICS event titles for better visual distinction\n- Added hover tooltips for timeblocks in calendar views\n- Added **MiniCalendar view** for Bases integration\n - Monthly calendar grid with dot indicators on days with notes\n - Configurable date property (file.ctime, note.dateCreated, etc.)\n - Fuzzy selector modal for selecting notes on clicked days\n - Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note\n- Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets\n - TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups\n - KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell)\n - Tested with up to **30,000 notes** with no performance degradation\n - Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help\n\n\n## Changed\n\n- Refactored Bases integration to use public API and trust pre-sorted data\n - Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture\n - Removed legacy view files and ~500 lines of redundant sorting/grouping logic\n - Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions\n - Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API\n - Reduced code duplication by 40% while maintaining full feature parity\n- Refactored calendar modules to use ES6 imports instead of lazy require() calls\n - Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts\n - Consolidated all imports at module top level\n - Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices\n- Time entry events now show task context menu on right-click (previously had no context menu)\n- Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability\n - Removed complex index synchronization in favor of direct MetadataCache queries\n - Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.)\n - Added minimal DependencyCache for task dependencies and project references only\n - Zero startup time (no index building required)\n - Always provides fresh, accurate task data from Obsidian's MetadataCache\n- Completed internationalization with 100% translation coverage across all supported languages\n - Added 90 missing translation keys to English base\n - Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese)\n - All locales now have complete coverage (1745/1745 keys)\n - Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components\n- Migrated to i18n-state-manager CLI tool for translation management\n - Replaced custom scripts with more robust i18n-state-manager package\n - Added i18n-state.config.json for project-specific patterns\n - New features: find-unused, check-duplicates, improved stale detection\n - Hash-based state tracking and ripgrep-based scanning for performance\n- Bases view templates now generate dynamically based on user settings\n - Task filters adapt to user's task identification method (tag or property)\n - Property ordering reflects defaultVisibleProperties setting\n - Uses correct YAML object notation for Bases filters\n - Maintains backward compatibility with legacy static templates\n- Updated Bases CalendarView to show TaskNotes in property-based events\n - Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.)\n - Previously all TaskNotes were filtered out from property-based events\n\n## Fixed\n\n- (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled\n - Eliminated race condition caused by index synchronization delays\n - TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes\n - No more timing-sensitive code that could conflict with other plugins' metadata processing\n - Tasks will always be visible regardless of other plugins' processing times\n - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging. \n- (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar\n - Removed unnecessary dynamic imports that were causing module resolution failures\n - Consolidated imports at top of calendar-core.ts module\n - Thanks to @jalooc for reporting this issue\n- Fixed task dependencies not displaying on task cards\n - TaskManager now properly calculates isBlocked and isBlocking flags from dependency data\n - Added missing property extractors and renderers in TaskCard for all dependency-related fields\n - Dependency information now shows correctly in Bases views, task note widgets, and other views\n - Shows \"Blocked (n)\" and \"Blocking (n)\" pills, plus detailed task links\n- Fixed Bases property mapping for user-configured field names\n - PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations\n - Example: User configures \"state\" → \"status\", Bases provides \"note.state\", now correctly maps to \"status\"\n - Ensures TaskCard properly recognizes and renders user-configured properties\n- Fixed Bases views not respecting user-configured visible properties\n - Now prioritizes Bases 1.10.0+ public API config.getOrder() method\n - Removed reliance on internal API paths that no longer work\n - Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy)\n- Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling\n- Fixed DateValue conversion in BasesDataAdapter\n - DateValue objects have {date: Date, time: boolean} structure\n - Now properly checks for value.date instanceof Date before legacy conversion methods\n - Fixes property-based events in CalendarView\n\n","aliases":["/releases/4.0.0-beta.1/","/releases/4.0.0-beta.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

Added#

\n
    \n
  • Added context menus for time entries and ICS events in calendar
      \n
    • Time entries: Right-click shows task context menu, left-click opens time entry editor modal
    • \n
    • ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info
    • \n
    \n
  • \n
  • Added calendar icon to ICS event titles for better visual distinction
  • \n
  • Added hover tooltips for timeblocks in calendar views
  • \n
  • Added MiniCalendar view for Bases integration
      \n
    • Monthly calendar grid with dot indicators on days with notes
    • \n
    • Configurable date property (file.ctime, note.dateCreated, etc.)
    • \n
    • Fuzzy selector modal for selecting notes on clicked days
    • \n
    • Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note
    • \n
    \n
  • \n
  • Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets
      \n
    • TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups
    • \n
    • KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell)
    • \n
    • Tested with up to 30,000 notes with no performance degradation
    • \n
    • Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Refactored Bases integration to use public API and trust pre-sorted data
      \n
    • Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture
    • \n
    • Removed legacy view files and ~500 lines of redundant sorting/grouping logic
    • \n
    • Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions
    • \n
    • Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API
    • \n
    • Reduced code duplication by 40% while maintaining full feature parity
    • \n
    \n
  • \n
  • Refactored calendar modules to use ES6 imports instead of lazy require() calls
      \n
    • Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts
    • \n
    • Consolidated all imports at module top level
    • \n
    • Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices
    • \n
    \n
  • \n
  • Time entry events now show task context menu on right-click (previously had no context menu)
  • \n
  • Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability
      \n
    • Removed complex index synchronization in favor of direct MetadataCache queries
    • \n
    • Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.)
    • \n
    • Added minimal DependencyCache for task dependencies and project references only
    • \n
    • Zero startup time (no index building required)
    • \n
    • Always provides fresh, accurate task data from Obsidian's MetadataCache
    • \n
    \n
  • \n
  • Completed internationalization with 100% translation coverage across all supported languages
      \n
    • Added 90 missing translation keys to English base
    • \n
    • Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese)
    • \n
    • All locales now have complete coverage (1745/1745 keys)
    • \n
    • Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components
    • \n
    \n
  • \n
  • Migrated to i18n-state-manager CLI tool for translation management
      \n
    • Replaced custom scripts with more robust i18n-state-manager package
    • \n
    • Added i18n-state.config.json for project-specific patterns
    • \n
    • New features: find-unused, check-duplicates, improved stale detection
    • \n
    • Hash-based state tracking and ripgrep-based scanning for performance
    • \n
    \n
  • \n
  • Bases view templates now generate dynamically based on user settings
      \n
    • Task filters adapt to user's task identification method (tag or property)
    • \n
    • Property ordering reflects defaultVisibleProperties setting
    • \n
    • Uses correct YAML object notation for Bases filters
    • \n
    • Maintains backward compatibility with legacy static templates
    • \n
    \n
  • \n
  • Updated Bases CalendarView to show TaskNotes in property-based events
      \n
    • Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.)
    • \n
    • Previously all TaskNotes were filtered out from property-based events
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled
      \n
    • Eliminated race condition caused by index synchronization delays
    • \n
    • TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes
    • \n
    • No more timing-sensitive code that could conflict with other plugins' metadata processing
    • \n
    • Tasks will always be visible regardless of other plugins' processing times
    • \n
    • Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging.
    • \n
    \n
  • \n
  • (#992) Fixed "Failed to resolve module specifier 'obsidian'" error when moving recurring task instances in calendar
      \n
    • Removed unnecessary dynamic imports that were causing module resolution failures
    • \n
    • Consolidated imports at top of calendar-core.ts module
    • \n
    • Thanks to @jalooc for reporting this issue
    • \n
    \n
  • \n
  • Fixed task dependencies not displaying on task cards
      \n
    • TaskManager now properly calculates isBlocked and isBlocking flags from dependency data
    • \n
    • Added missing property extractors and renderers in TaskCard for all dependency-related fields
    • \n
    • Dependency information now shows correctly in Bases views, task note widgets, and other views
    • \n
    • Shows "Blocked (n)" and "Blocking (n)" pills, plus detailed task links
    • \n
    \n
  • \n
  • Fixed Bases property mapping for user-configured field names
      \n
    • PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations
    • \n
    • Example: User configures "state" → "status", Bases provides "note.state", now correctly maps to "status"
    • \n
    • Ensures TaskCard properly recognizes and renders user-configured properties
    • \n
    \n
  • \n
  • Fixed Bases views not respecting user-configured visible properties
      \n
    • Now prioritizes Bases 1.10.0+ public API config.getOrder() method
    • \n
    • Removed reliance on internal API paths that no longer work
    • \n
    • Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy)
    • \n
    \n
  • \n
  • Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling
  • \n
  • Fixed DateValue conversion in BasesDataAdapter
      \n
    • DateValue objects have {date: Date, time: boolean} structure
    • \n
    • Now properly checks for value.date instanceof Date before legacy conversion methods
    • \n
    • Fixes property-based events in CalendarView
    • \n
    \n
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Added context menus for time entries and ICS events in calendar Time entries: Right-click shows task context menu, left-click opens time entry editor modal ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info Added calendar icon to ICS event titles for better visual distinction Added hover tooltips for timeblocks in calendar views Added MiniCalendar view for Bases integration Monthly calendar grid with dot indicators on days with notes Configurable date property (file.ctime, note.dateCreated, etc.) Fuzzy selector modal for selecting notes on clicked days Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell) Tested with up to 30,000 notes with no performance degradation Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help Changed# Refactored Bases integration to use public API and trust pre-sorted data Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture Removed legacy view files and ~500 lines of redundant sorting/grouping logic Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API Reduced code duplication by 40% while maintaining full feature parity Refactored calendar modules to use ES6 imports instead of lazy require() calls Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts Consolidated all imports at module top level Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices Time entry events now show task context menu on right-click (previously had no context menu) Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability Removed complex index synchronization in favor of direct MetadataCache queries Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.) Added minimal DependencyCache for task dependencies and project references only Zero startup time (no index building required) Always provides fresh, accurate task data from Obsidian's MetadataCache Completed internationalization with 100% translation coverage across all supported languages Added 90 missing translation keys to English base Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese) All locales now have complete coverage (1745/1745 keys) Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components Migrated to i18n-state-manager CLI tool for translation management Replaced custom scripts with more robust i18n-state-manager package Added i18n-state.config.json for project-specific patterns New features: find-unused, check-duplicates, improved stale detection Hash-based state tracking and ripgrep-based scanning for performance Bases view templates now generate dynamically based on user settings Task filters adapt to user's task identification method (tag or property) Property ordering reflects defaultVisibleProperties setting Uses correct YAML object notation for Bases filters Maintains backward compatibility with legacy static templates Updated Bases CalendarView to show TaskNotes in property-based events Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.) Previously all TaskNotes were filtered out from property-based events Fixed# (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled Eliminated race condition caused by index synchronization delays TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes No more timing-sensitive code that could conflict with other plugins' metadata processing Tasks will always be visible regardless of other plugins' processing times Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging. (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar Removed unnecessary dynamic imports that were causing module resolution failures Consolidated imports at top of calendar-core.ts module Thanks to @jalooc for reporting this issue Fixed task dependencies not displaying on task cards TaskManager now properly calculates isBlocked and isBlocking flags from dependency data Added missing property extractors and renderers in TaskCard for all dependency-related fields Dependency information now shows correctly in Bases views, task note widgets, and other views Shows \"Blocked (n)\" and \"Blocking (n)\" pills, plus detailed task links Fixed Bases property mapping for user-configured field names PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations Example: User configures \"state\" → \"status\", Bases provides \"note.state\", now correctly maps to \"status\" Ensures TaskCard properly recognizes and renders user-configured properties Fixed Bases views not respecting user-configured visible properties Now prioritizes Bases 1.10.0+ public API config.getOrder() method Removed reliance on internal API paths that no longer work Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy) Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter DateValue objects have {date: Date, time: boolean} structure Now properly checks for value.date instanceof Date before legacy conversion methods Fixes property-based events in CalendarView"},{"route":"/obsidian/releases/4.0.0-beta.2/","title":"TaskNotes 4.0.0-beta.2","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.2.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.2.md","raw":"# TaskNotes 4.0.0-beta.2\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## Added\n\n- (#1090) Portuguese (Brazil) translation\n - Full Portuguese (pt-BR) localization support\n - A big thanks to @andysteel for the contribution\n- **Configurable task modal fields** \n - New \"Modal Fields\" settings tab for complete control over task creation and edit modals\n - Configure which fields appear in creation vs edit modals independently\n - Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom)\n - Enable/disable individual fields (including core fields like contexts, tags, time estimate)\n - Organize fields into groups \n - Automatic migration of existing user-defined fields\n - Title and details fields support visibility toggling (ordering fixed for consistency)\n- **Rich markdown editor for NLP task creation**\n - Replaced plain textarea with full CodeMirror markdown editor\n - Live preview, syntax highlighting, and wikilink support\n - Ctrl/Cmd+Enter keyboard shortcut to save task\n - Esc/Tab keyboard shortcuts for modal control\n- **Customizable NLP triggers with autocomplete**\n - Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority)\n - Supports user-defined field triggers\n - CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab)\n - Quote support for multi-word values in user fields\n - Native tag suggester integration when using # trigger\n- **Inline task link overlay enhancements**\n - Configurable visible properties for inline task cards\n - PropertySelectorModal for selecting which properties to display\n - Improved layout: title prioritized, horizontal scrolling for metadata\n - Real-time updates when task data changes\n- **New utility services**\n - `TriggerConfigService` - manages NLP trigger configurations\n - `PropertySelectorModal` - reusable multi-select property picker\n - Property helpers for consistent property handling across views\n- Kanban column reordering via drag and drop\n - Drag column headers to reorder columns\n - Column order is saved per grouping property\n - Visual feedback during drag operations\n- Mini calendar enhancements (in progress)\n - Week numbers column\n - Heat map intensity visualization\n - Note preview tooltips on hover\n - Keyboard navigation\n- **Unified Relationships widget**\n - Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget\n - Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban)\n - Tabs automatically show/hide based on available relationship data\n - Bases views handle all data updates reactively - no manual refresh needed\n - Single configuration setting: show/hide and position (top/bottom)\n - Significantly reduced code complexity (430 fewer lines)\n\n## Fixed\n\n- (#1084) Fixed word wrapping in NLP preview items\n - Thanks to @maybetm for the fix\n- (#975) Fixed advanced calendar list headers not respecting theme colors\n - Thanks to @hugohil for the fix\n- (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space\n - Embedded bases now scroll internally instead of expanding to show all tasks\n - Consistent behavior between task list and kanban embedded views\n - Thanks to @same774 for reporting with screenshot\n- **Bases Calendar view options now working correctly**\n - Fixed \"Highlight today\" toggle not applying - now properly adds/removes CSS class when toggled\n - Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons\n - View type is now persisted when users click month/week/day buttons in the calendar UI\n- (#1050) Task modal no longer adds unwanted empty contexts and projects arrays\n - FieldMapper now checks if arrays are empty before writing to frontmatter\n - Thanks to @nightroman for reporting this issue\n- **Inline task link overlay fixes**\n - Fixed layout prioritization: title now prioritized over metadata\n - Added horizontal scrolling for metadata to prevent overflow\n - Fixed real-time update listeners for task data changes\n- Fixed group collapse/expand functionality in TaskListView\n - Re-registered click event listener for group headers using Component API\n - Groups can now be properly collapsed and expanded\n- Fixed config loading race condition in KanbanView and CalendarView\n - Config is now properly loaded in onload() lifecycle method\n - Views wait for config before rendering options\n- Fixed MiniCalendarView to use direct Bases API like other views\n - Consistent use of Component lifecycle methods\n - Proper cleanup in onunload()\n\n## Changed\n\n- **NLP system overhaul**\n - Replaced `StatusSuggestionService` wrapper with direct `NaturalLanguageParser` usage\n - Consolidated trigger configuration into unified `TriggerConfigService`\n - Enhanced `NaturalLanguageParser` with full trigger and user field support\n - Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger)\n- **Task card and editor improvements**\n - Simplified `TaskCard` interface - removed unused options (showCheckbox, showArchiveButton, groupByDate)\n - Refactored `TaskLinkWidget` to use unified `TaskCard` component for consistency\n - Added support for inline vs. block layout modes in task cards\n - Improved task card BEM CSS with better styling for inline mode\n- **Settings UI enhancements**\n - NLP triggers now configurable through Settings > Features tab\n - Added settings for inline task card visible properties\n - Improved appearance tab with property selector integration\n - Better organization of NLP-related settings\n- Refactored Bases views to use Component lifecycle properly\n - Views now extend Component and use onload()/onunload()\n - Automatic cleanup of event listeners via Component.registerDomEvent()\n - Improved state management and ephemeral state handling\n- Improved development experience\n - Converted ESLint errors to warnings for non-blocking development\n - Fixed various linting issues and unused imports\n\n## Removed\n\n- Removed `StatusSuggestionService` (functionality consolidated into `NaturalLanguageParser`)\n\n## Breaking Changes\n\n- **Relationships widget settings consolidated** (automatic migration)\n - Old settings removed: `showProjectSubtasks`, `projectSubtasksPosition`, `showTaskDependencies`, `taskDependenciesPosition`\n - New unified settings: `showRelationships`, `relationshipsPosition`\n - Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible\n - **Migration**: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default\n - **Bases file change**: The command mapping changed from `'project-subtasks': 'TaskNotes/Views/project-subtasks.base'` to `'relationships': 'TaskNotes/Views/relationships.base'`\n - Run \"Create Default Files\" in Settings > General to create the new `relationships.base` file\n\n","aliases":["/releases/4.0.0-beta.2/","/releases/4.0.0-beta.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"removed","text":"Removed"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

Added#

\n
    \n
  • (#1090) Portuguese (Brazil) translation
      \n
    • Full Portuguese (pt-BR) localization support
    • \n
    • A big thanks to @andysteel for the contribution
    • \n
    \n
  • \n
  • Configurable task modal fields
      \n
    • New "Modal Fields" settings tab for complete control over task creation and edit modals
    • \n
    • Configure which fields appear in creation vs edit modals independently
    • \n
    • Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom)
    • \n
    • Enable/disable individual fields (including core fields like contexts, tags, time estimate)
    • \n
    • Organize fields into groups
    • \n
    • Automatic migration of existing user-defined fields
    • \n
    • Title and details fields support visibility toggling (ordering fixed for consistency)
    • \n
    \n
  • \n
  • Rich markdown editor for NLP task creation
      \n
    • Replaced plain textarea with full CodeMirror markdown editor
    • \n
    • Live preview, syntax highlighting, and wikilink support
    • \n
    • Ctrl/Cmd+Enter keyboard shortcut to save task
    • \n
    • Esc/Tab keyboard shortcuts for modal control
    • \n
    \n
  • \n
  • Customizable NLP triggers with autocomplete
      \n
    • Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority)
    • \n
    • Supports user-defined field triggers
    • \n
    • CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab)
    • \n
    • Quote support for multi-word values in user fields
    • \n
    • Native tag suggester integration when using # trigger
    • \n
    \n
  • \n
  • Inline task link overlay enhancements
      \n
    • Configurable visible properties for inline task cards
    • \n
    • PropertySelectorModal for selecting which properties to display
    • \n
    • Improved layout: title prioritized, horizontal scrolling for metadata
    • \n
    • Real-time updates when task data changes
    • \n
    \n
  • \n
  • New utility services
      \n
    • TriggerConfigService - manages NLP trigger configurations
    • \n
    • PropertySelectorModal - reusable multi-select property picker
    • \n
    • Property helpers for consistent property handling across views
    • \n
    \n
  • \n
  • Kanban column reordering via drag and drop
      \n
    • Drag column headers to reorder columns
    • \n
    • Column order is saved per grouping property
    • \n
    • Visual feedback during drag operations
    • \n
    \n
  • \n
  • Mini calendar enhancements (in progress)
      \n
    • Week numbers column
    • \n
    • Heat map intensity visualization
    • \n
    • Note preview tooltips on hover
    • \n
    • Keyboard navigation
    • \n
    \n
  • \n
  • Unified Relationships widget
      \n
    • Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget
    • \n
    • Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban)
    • \n
    • Tabs automatically show/hide based on available relationship data
    • \n
    • Bases views handle all data updates reactively - no manual refresh needed
    • \n
    • Single configuration setting: show/hide and position (top/bottom)
    • \n
    • Significantly reduced code complexity (430 fewer lines)
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1084) Fixed word wrapping in NLP preview items
      \n
    • Thanks to @maybetm for the fix
    • \n
    \n
  • \n
  • (#975) Fixed advanced calendar list headers not respecting theme colors
      \n
    • Thanks to @hugohil for the fix
    • \n
    \n
  • \n
  • (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space
      \n
    • Embedded bases now scroll internally instead of expanding to show all tasks
    • \n
    • Consistent behavior between task list and kanban embedded views
    • \n
    • Thanks to @same774 for reporting with screenshot
    • \n
    \n
  • \n
  • Bases Calendar view options now working correctly
      \n
    • Fixed "Highlight today" toggle not applying - now properly adds/removes CSS class when toggled
    • \n
    • Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons
    • \n
    • View type is now persisted when users click month/week/day buttons in the calendar UI
    • \n
    \n
  • \n
  • (#1050) Task modal no longer adds unwanted empty contexts and projects arrays
      \n
    • FieldMapper now checks if arrays are empty before writing to frontmatter
    • \n
    • Thanks to @nightroman for reporting this issue
    • \n
    \n
  • \n
  • Inline task link overlay fixes
      \n
    • Fixed layout prioritization: title now prioritized over metadata
    • \n
    • Added horizontal scrolling for metadata to prevent overflow
    • \n
    • Fixed real-time update listeners for task data changes
    • \n
    \n
  • \n
  • Fixed group collapse/expand functionality in TaskListView
      \n
    • Re-registered click event listener for group headers using Component API
    • \n
    • Groups can now be properly collapsed and expanded
    • \n
    \n
  • \n
  • Fixed config loading race condition in KanbanView and CalendarView
      \n
    • Config is now properly loaded in onload() lifecycle method
    • \n
    • Views wait for config before rendering options
    • \n
    \n
  • \n
  • Fixed MiniCalendarView to use direct Bases API like other views
      \n
    • Consistent use of Component lifecycle methods
    • \n
    • Proper cleanup in onunload()
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • NLP system overhaul
      \n
    • Replaced StatusSuggestionService wrapper with direct NaturalLanguageParser usage
    • \n
    • Consolidated trigger configuration into unified TriggerConfigService
    • \n
    • Enhanced NaturalLanguageParser with full trigger and user field support
    • \n
    • Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger)
    • \n
    \n
  • \n
  • Task card and editor improvements
      \n
    • Simplified TaskCard interface - removed unused options (showCheckbox, showArchiveButton, groupByDate)
    • \n
    • Refactored TaskLinkWidget to use unified TaskCard component for consistency
    • \n
    • Added support for inline vs. block layout modes in task cards
    • \n
    • Improved task card BEM CSS with better styling for inline mode
    • \n
    \n
  • \n
  • Settings UI enhancements
      \n
    • NLP triggers now configurable through Settings > Features tab
    • \n
    • Added settings for inline task card visible properties
    • \n
    • Improved appearance tab with property selector integration
    • \n
    • Better organization of NLP-related settings
    • \n
    \n
  • \n
  • Refactored Bases views to use Component lifecycle properly
      \n
    • Views now extend Component and use onload()/onunload()
    • \n
    • Automatic cleanup of event listeners via Component.registerDomEvent()
    • \n
    • Improved state management and ephemeral state handling
    • \n
    \n
  • \n
  • Improved development experience
      \n
    • Converted ESLint errors to warnings for non-blocking development
    • \n
    • Fixed various linting issues and unused imports
    • \n
    \n
  • \n
\n

Removed#

\n
    \n
  • Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser)
  • \n
\n

Breaking Changes#

\n
    \n
  • Relationships widget settings consolidated (automatic migration)
      \n
    • Old settings removed: showProjectSubtasks, projectSubtasksPosition, showTaskDependencies, taskDependenciesPosition
    • \n
    • New unified settings: showRelationships, relationshipsPosition
    • \n
    • Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible
    • \n
    • Migration: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default
    • \n
    • Bases file change: The command mapping changed from 'project-subtasks': 'TaskNotes/Views/project-subtasks.base' to 'relationships': 'TaskNotes/Views/relationships.base'
    • \n
    • Run "Create Default Files" in Settings > General to create the new relationships.base file
    • \n
    \n
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# (#1090) Portuguese (Brazil) translation Full Portuguese (pt-BR) localization support A big thanks to @andysteel for the contribution Configurable task modal fields New \"Modal Fields\" settings tab for complete control over task creation and edit modals Configure which fields appear in creation vs edit modals independently Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom) Enable/disable individual fields (including core fields like contexts, tags, time estimate) Organize fields into groups Automatic migration of existing user-defined fields Title and details fields support visibility toggling (ordering fixed for consistency) Rich markdown editor for NLP task creation Replaced plain textarea with full CodeMirror markdown editor Live preview, syntax highlighting, and wikilink support Ctrl/Cmd+Enter keyboard shortcut to save task Esc/Tab keyboard shortcuts for modal control Customizable NLP triggers with autocomplete Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority) Supports user-defined field triggers CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab) Quote support for multi-word values in user fields Native tag suggester integration when using # trigger Inline task link overlay enhancements Configurable visible properties for inline task cards PropertySelectorModal for selecting which properties to display Improved layout: title prioritized, horizontal scrolling for metadata Real-time updates when task data changes New utility services TriggerConfigService - manages NLP trigger configurations PropertySelectorModal - reusable multi-select property picker Property helpers for consistent property handling across views Kanban column reordering via drag and drop Drag column headers to reorder columns Column order is saved per grouping property Visual feedback during drag operations Mini calendar enhancements (in progress) Week numbers column Heat map intensity visualization Note preview tooltips on hover Keyboard navigation Unified Relationships widget Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban) Tabs automatically show/hide based on available relationship data Bases views handle all data updates reactively - no manual refresh needed Single configuration setting: show/hide and position (top/bottom) Significantly reduced code complexity (430 fewer lines) Fixed# (#1084) Fixed word wrapping in NLP preview items Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space Embedded bases now scroll internally instead of expanding to show all tasks Consistent behavior between task list and kanban embedded views Thanks to @same774 for reporting with screenshot Bases Calendar view options now working correctly Fixed \"Highlight today\" toggle not applying - now properly adds/removes CSS class when toggled Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons View type is now persisted when users click month/week/day buttons in the calendar UI (#1050) Task modal no longer adds unwanted empty contexts and projects arrays FieldMapper now checks if arrays are empty before writing to frontmatter Thanks to @nightroman for reporting this issue Inline task link overlay fixes Fixed layout prioritization: title now prioritized over metadata Added horizontal scrolling for metadata to prevent overflow Fixed real-time update listeners for task data changes Fixed group collapse/expand functionality in TaskListView Re-registered click event listener for group headers using Component API Groups can now be properly collapsed and expanded Fixed config loading race condition in KanbanView and CalendarView Config is now properly loaded in onload() lifecycle method Views wait for config before rendering options Fixed MiniCalendarView to use direct Bases API like other views Consistent use of Component lifecycle methods Proper cleanup in onunload() Changed# NLP system overhaul Replaced StatusSuggestionService wrapper with direct NaturalLanguageParser usage Consolidated trigger configuration into unified TriggerConfigService Enhanced NaturalLanguageParser with full trigger and user field support Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger) Task card and editor improvements Simplified TaskCard interface - removed unused options (showCheckbox, showArchiveButton, groupByDate) Refactored TaskLinkWidget to use unified TaskCard component for consistency Added support for inline vs. block layout modes in task cards Improved task card BEM CSS with better styling for inline mode Settings UI enhancements NLP triggers now configurable through Settings > Features tab Added settings for inline task card visible properties Improved appearance tab with property selector integration Better organization of NLP-related settings Refactored Bases views to use Component lifecycle properly Views now extend Component and use onload()/onunload() Automatic cleanup of event listeners via Component.registerDomEvent() Improved state management and ephemeral state handling Improved development experience Converted ESLint errors to warnings for non-blocking development Fixed various linting issues and unused imports Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Breaking Changes# Relationships widget settings consolidated (automatic migration) Old settings removed: showProjectSubtasks, projectSubtasksPosition, showTaskDependencies, taskDependenciesPosition New unified settings: showRelationships, relationshipsPosition Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible Migration: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default Bases file change: The command mapping changed from 'project-subtasks': 'TaskNotes/Views/project-subtasks.base' to 'relationships': 'TaskNotes/Views/relationships.base' Run \"Create Default Files\" in Settings > General to create the new relationships.base file"},{"route":"/obsidian/releases/4.0.0-beta.3/","title":"TaskNotes 4.0.0-beta.3","description":"Beta Release","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.0-beta.3.md","namespace":"obsidian","relativePath":"releases/4.0.0-beta.3.md","raw":"# TaskNotes 4.0.0-beta.3\n\n> **Beta Release**\n>\n> You may encounter issues. Report problems on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues).\n\n## Added\n\n- Updated task card styling\n - Increased status dot size from 16px to 18px\n - Added subtle shadows and transitions to card hover states\n - Updated hover effects on status and priority dots with scaling and removed glow\n - Modified metadata pills with backdrop blur and adjusted spacing\n - Added box shadows to interactive elements (dates, projects, tags) on hover\n - Updated animations to use cubic-bezier easing\n - Added gradient accents to subtask and blocking task borders\n - Fixed subtasks appearing behind parent card hover backgrounds\n - Fixed subtask click and context menu events bubbling to parent cards\n - Fixed subtasks inheriting parent priority and status colors\n\n- (#361) Added completion-based recurrence support with `recurrence_anchor` field\n - Tasks can now recur based on completion date instead of scheduled date\n - Set `recurrence_anchor: completion` in task frontmatter to enable this behavior\n - When completing a recurring task, the next occurrence will be scheduled relative to the completion date\n - The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates\n - Defaults to `scheduled` (original behavior) if not specified\n - Useful for tasks like \"Exercise weekly\" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled\n - Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date)\n - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest\n\n- (#416) Added support for skipped recurrence instances with `skipped_instances` field\n - Recurring tasks can now have individual instances marked as \"skipped\" without completing them\n - Skipped instances are stored in the `skipped_instances` frontmatter array (e.g., `[\"2025-11-15\", \"2025-11-22\"]`)\n - Right-click on a recurring task instance in calendar views to skip/unskip it\n - Visual styling differentiates skipped instances:\n - Calendar views: Gray background with muted appearance\n - Task cards: Strike-through text with gray styling\n - Skipped instances don't affect the recurrence pattern - future instances continue as scheduled\n - Useful for holidays, vacations, or other planned exceptions to recurring tasks\n - Thanks to @mdbraber for the suggestion to use an array similar to `complete_instances`, and @jerzy-dudzic for reporting the issue\n\n\n## Fixed\n\n- (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed\n - Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years)\n - Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days)\n - Ensures the next occurrence is always found when completing recurring task instances\n - Thanks to @VenturaNotes for reporting\n\n- (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views\n - Extended the look-ahead period for yearly recurring tasks when generating calendar instances\n - Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges\n - Only displays instances that fall within the actual visible calendar range\n - Weekly recurring tasks were unaffected and continued to work correctly\n - Thanks to @bespokecomp for reporting\n\n- (#889) Fixed git merge conflicts in calendar subscription metadata\n - Calendar subscription `lastFetched` and `lastError` fields are now stored in memory instead of being saved to disk\n - Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions\n - The \"last synced\" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically\n - Thanks to @karlfrohlich for reporting\n\n- Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules\n - The custom recurrence modal now correctly parses and displays the start date and time fields\n - Fixed parser that was splitting on `=` instead of `:` for DTSTART values\n\n- (#1097) Fixed custom properties and formulas not displaying in Bases views\n - Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties\n - Formulas now work correctly using `formula.NAME` syntax\n - Custom note properties now work correctly using `note.PROPERTY` syntax\n - Thanks to @cathywu for reporting\n\n- (#1099) Fixed issues with default Bases file creation\n - Fixed double-prefix bug in relationships template that generated invalid filter expressions like `note.note.projects`\n - Fixed race condition where files created during plugin load wouldn't appear in file explorer\n - Default Bases files now generate with correct property paths and appear reliably in the file explorer\n - Thanks to @kmaustral for reporting\n\n- (#1110) Fixed open recurring tasks appearing crossed out in Tasks view\n - Removed stale `selectedDate` property that was never updated in v4\n - Tasks view now uses fresh UTC-anchored \"today\" for correct recurring task completion status\n - Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones\n - Also fixed KanbanView to use UTC-anchored dates for consistency\n - Thanks to @kmaustral for reporting\n\n- (#1118) Fixed user-defined fields not working in inline task conversion\n - User-defined fields like `>customfield value` now properly convert to frontmatter when using the \"TaskNote: Convert task to TaskNote\" command\n - Fixed fields appearing with internal IDs (e.g., `field_1761435101864`) instead of configured frontmatter key names\n - Array values are now properly joined with commas\n - Added `userFields` property to `ParsedTaskData` interface to support custom fields throughout the conversion flow\n - Thanks to @guncav for reporting\n\n- Fixed kanban column width CSS constraints not matching settings\n - Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range\n - Column width slider now works correctly across the full 200-500px range\n\n- Kanban view now shows empty columns for all user-defined statuses when grouping by status\n - Empty columns appear for custom statuses defined in settings, even when no tasks have that status\n - Allows users to drag tasks into empty status columns\n - Works in both flat kanban view and swimlane mode\n - Respects the existing \"Hide empty columns\" setting\n - Thanks to @williamcheuk03 for reporting this issue\n","aliases":["/releases/4.0.0-beta.3/","/releases/4.0.0-beta.3/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

Beta Release

\n

You may encounter issues. Report problems on GitHub Issues.

\n
\n

Added#

\n
    \n
  • Updated task card styling

    \n
      \n
    • Increased status dot size from 16px to 18px
    • \n
    • Added subtle shadows and transitions to card hover states
    • \n
    • Updated hover effects on status and priority dots with scaling and removed glow
    • \n
    • Modified metadata pills with backdrop blur and adjusted spacing
    • \n
    • Added box shadows to interactive elements (dates, projects, tags) on hover
    • \n
    • Updated animations to use cubic-bezier easing
    • \n
    • Added gradient accents to subtask and blocking task borders
    • \n
    • Fixed subtasks appearing behind parent card hover backgrounds
    • \n
    • Fixed subtask click and context menu events bubbling to parent cards
    • \n
    • Fixed subtasks inheriting parent priority and status colors
    • \n
    \n
  • \n
  • (#361) Added completion-based recurrence support with recurrence_anchor field

    \n
      \n
    • Tasks can now recur based on completion date instead of scheduled date
    • \n
    • Set recurrence_anchor: completion in task frontmatter to enable this behavior
    • \n
    • When completing a recurring task, the next occurrence will be scheduled relative to the completion date
    • \n
    • The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates
    • \n
    • Defaults to scheduled (original behavior) if not specified
    • \n
    • Useful for tasks like "Exercise weekly" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled
    • \n
    • Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date)
    • \n
    • Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest
    • \n
    \n
  • \n
  • (#416) Added support for skipped recurrence instances with skipped_instances field

    \n
      \n
    • Recurring tasks can now have individual instances marked as "skipped" without completing them
    • \n
    • Skipped instances are stored in the skipped_instances frontmatter array (e.g., ["2025-11-15", "2025-11-22"])
    • \n
    • Right-click on a recurring task instance in calendar views to skip/unskip it
    • \n
    • Visual styling differentiates skipped instances:
        \n
      • Calendar views: Gray background with muted appearance
      • \n
      • Task cards: Strike-through text with gray styling
      • \n
      \n
    • \n
    • Skipped instances don't affect the recurrence pattern - future instances continue as scheduled
    • \n
    • Useful for holidays, vacations, or other planned exceptions to recurring tasks
    • \n
    • Thanks to @mdbraber for the suggestion to use an array similar to complete_instances, and @jerzy-dudzic for reporting the issue
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed

    \n
      \n
    • Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years)
    • \n
    • Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days)
    • \n
    • Ensures the next occurrence is always found when completing recurring task instances
    • \n
    • Thanks to @VenturaNotes for reporting
    • \n
    \n
  • \n
  • (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views

    \n
      \n
    • Extended the look-ahead period for yearly recurring tasks when generating calendar instances
    • \n
    • Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges
    • \n
    • Only displays instances that fall within the actual visible calendar range
    • \n
    • Weekly recurring tasks were unaffected and continued to work correctly
    • \n
    • Thanks to @bespokecomp for reporting
    • \n
    \n
  • \n
  • (#889) Fixed git merge conflicts in calendar subscription metadata

    \n
      \n
    • Calendar subscription lastFetched and lastError fields are now stored in memory instead of being saved to disk
    • \n
    • Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions
    • \n
    • The "last synced" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically
    • \n
    • Thanks to @karlfrohlich for reporting
    • \n
    \n
  • \n
  • Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules

    \n
      \n
    • The custom recurrence modal now correctly parses and displays the start date and time fields
    • \n
    • Fixed parser that was splitting on = instead of : for DTSTART values
    • \n
    \n
  • \n
  • (#1097) Fixed custom properties and formulas not displaying in Bases views

    \n
      \n
    • Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties
    • \n
    • Formulas now work correctly using formula.NAME syntax
    • \n
    • Custom note properties now work correctly using note.PROPERTY syntax
    • \n
    • Thanks to @cathywu for reporting
    • \n
    \n
  • \n
  • (#1099) Fixed issues with default Bases file creation

    \n
      \n
    • Fixed double-prefix bug in relationships template that generated invalid filter expressions like note.note.projects
    • \n
    • Fixed race condition where files created during plugin load wouldn't appear in file explorer
    • \n
    • Default Bases files now generate with correct property paths and appear reliably in the file explorer
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#1110) Fixed open recurring tasks appearing crossed out in Tasks view

    \n
      \n
    • Removed stale selectedDate property that was never updated in v4
    • \n
    • Tasks view now uses fresh UTC-anchored "today" for correct recurring task completion status
    • \n
    • Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones
    • \n
    • Also fixed KanbanView to use UTC-anchored dates for consistency
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • (#1118) Fixed user-defined fields not working in inline task conversion

    \n
      \n
    • User-defined fields like >customfield value now properly convert to frontmatter when using the "TaskNote: Convert task to TaskNote" command
    • \n
    • Fixed fields appearing with internal IDs (e.g., field_1761435101864) instead of configured frontmatter key names
    • \n
    • Array values are now properly joined with commas
    • \n
    • Added userFields property to ParsedTaskData interface to support custom fields throughout the conversion flow
    • \n
    • Thanks to @guncav for reporting
    • \n
    \n
  • \n
  • Fixed kanban column width CSS constraints not matching settings

    \n
      \n
    • Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range
    • \n
    • Column width slider now works correctly across the full 200-500px range
    • \n
    \n
  • \n
  • Kanban view now shows empty columns for all user-defined statuses when grouping by status

    \n
      \n
    • Empty columns appear for custom statuses defined in settings, even when no tasks have that status
    • \n
    • Allows users to drag tasks into empty status columns
    • \n
    • Works in both flat kanban view and swimlane mode
    • \n
    • Respects the existing "Hide empty columns" setting
    • \n
    • Thanks to @williamcheuk03 for reporting this issue
    • \n
    \n
  • \n
\n","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Updated task card styling Increased status dot size from 16px to 18px Added subtle shadows and transitions to card hover states Updated hover effects on status and priority dots with scaling and removed glow Modified metadata pills with backdrop blur and adjusted spacing Added box shadows to interactive elements (dates, projects, tags) on hover Updated animations to use cubic-bezier easing Added gradient accents to subtask and blocking task borders Fixed subtasks appearing behind parent card hover backgrounds Fixed subtask click and context menu events bubbling to parent cards Fixed subtasks inheriting parent priority and status colors (#361) Added completion-based recurrence support with recurrence_anchor field Tasks can now recur based on completion date instead of scheduled date Set recurrence_anchor: completion in task frontmatter to enable this behavior When completing a recurring task, the next occurrence will be scheduled relative to the completion date The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates Defaults to scheduled (original behavior) if not specified Useful for tasks like \"Exercise weekly\" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date) Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Added support for skipped recurrence instances with skipped_instances field Recurring tasks can now have individual instances marked as \"skipped\" without completing them Skipped instances are stored in the skipped_instances frontmatter array (e.g., [\"2025-11-15\", \"2025-11-22\"]) Right-click on a recurring task instance in calendar views to skip/unskip it Visual styling differentiates skipped instances: Calendar views: Gray background with muted appearance Task cards: Strike-through text with gray styling Skipped instances don't affect the recurrence pattern - future instances continue as scheduled Useful for holidays, vacations, or other planned exceptions to recurring tasks Thanks to @mdbraber for the suggestion to use an array similar to complete_instances, and @jerzy-dudzic for reporting the issue Fixed# (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years) Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days) Ensures the next occurrence is always found when completing recurring task instances Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views Extended the look-ahead period for yearly recurring tasks when generating calendar instances Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges Only displays instances that fall within the actual visible calendar range Weekly recurring tasks were unaffected and continued to work correctly Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata Calendar subscription lastFetched and lastError fields are now stored in memory instead of being saved to disk Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions The \"last synced\" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules The custom recurrence modal now correctly parses and displays the start date and time fields Fixed parser that was splitting on = instead of : for DTSTART values (#1097) Fixed custom properties and formulas not displaying in Bases views Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties Formulas now work correctly using formula.NAME syntax Custom note properties now work correctly using note.PROPERTY syntax Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation Fixed double-prefix bug in relationships template that generated invalid filter expressions like note.note.projects Fixed race condition where files created during plugin load wouldn't appear in file explorer Default Bases files now generate with correct property paths and appear reliably in the file explorer Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view Removed stale selectedDate property that was never updated in v4 Tasks view now uses fresh UTC-anchored \"today\" for correct recurring task completion status Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones Also fixed KanbanView to use UTC-anchored dates for consistency Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion User-defined fields like >customfield value now properly convert to frontmatter when using the \"TaskNote: Convert task to TaskNote\" command Fixed fields appearing with internal IDs (e.g., field_1761435101864) instead of configured frontmatter key names Array values are now properly joined with commas Added userFields property to ParsedTaskData interface to support custom fields throughout the conversion flow Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range Column width slider now works correctly across the full 200-500px range Kanban view now shows empty columns for all user-defined statuses when grouping by status Empty columns appear for custom statuses defined in settings, even when no tasks have that status Allows users to drag tasks into empty status columns Works in both flat kanban view and swimlane mode Respects the existing \"Hide empty columns\" setting Thanks to @williamcheuk03 for reporting this issue"},{"route":"/obsidian/releases/4.0.1/","title":"TaskNotes 4","description":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.1.md","namespace":"obsidian","relativePath":"releases/4.0.1.md","raw":"# TaskNotes 4\n\nTaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on `.base` files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault.\n\n## Highlights\n\n**New features and improvements:**\n\n- Performance improvements\n - Virtual scrolling in Task List and Kanban views handles **30,000+ tasks** without performance degradation\n- **OAuth calendar integration**\n - Google Calendar and Microsoft Outlook bi-directional sync\n - Drag calendar events in the TaskNotes calendar to update them online\n- **Configurable modals and NLP**\n - New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals\n - Rich markdown editor and customizable NLP triggers, including autocomplete for user fields\n- **Time management features**\n - Time Entry Editor Modal \n - Improved Timeblock creation and management\n - Completion-based recurrence with `recurrence_anchor` field\n - Skippable recurrence instances\n\n**Bases architecture changes:**\n\n- **Bases-first architecture**\n - Task views ship as `.base` files inside `TaskNotes/Views/`\n - Commands and ribbon buttons now open files you control\n - Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI\n - Agenda is a dedicated list-mode calendar `.base` file for fast daily/weekly reviews\n- **Inline workflows stay in sync**\n - Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place\n - Task cards inside notes honor the same Bases filtering/grouping rules as standalone views\n\n## Why Bases?\n\nMoving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which:\n\n- Reduces maintenance overhead and improves reliability\n- Lets advanced users version-control and audit their view definitions\n- Makes saved views portable between vaults\n- Keeps TaskNotes behavior consistent with other Obsidian-native workflows\n\n## Upgrade Notes\n\n- Obsidian **1.10.1 or later** is required (Bases public API with group-by support)\n- Enable the **Bases** core plugin before opening TaskNotes views\n- Run **Settings → TaskNotes → General → Create Default Files** if you need fresh `.base` files\n- Use **Export All Saved Views to Bases** to convert any legacy FilterBar saved views into `.base` files\n- The Relationships widget uses `TaskNotes/Views/relationships.base`; adjust that file to change what appears inside notes\n\n## Breaking Changes\n\n- The old FilterBar UI has been removed—all filtering and saved views live in `.base` files\n- Legacy widget settings (`showProjectSubtasks`, `showTaskDependencies`, etc.) were replaced with `showRelationships` and `relationshipsPosition`\n- Task view commands now fail if their mapped `.base` file is missing; configure paths under **Settings → TaskNotes → General → View Commands**\n- **Priority sorting now uses alphabetical order instead of custom weights**\n - In v3, TaskNotes used priority \"weights\" to determine sort order (higher weight = higher priority)\n - In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value\n - The weight field has been removed from the settings UI\n - **Workaround**: Name your priority values to sort alphabetically in your desired order\n - Example: `1-urgent`, `2-high`, `3-medium`, `4-normal`, `5-low`\n - Or: `a-urgent`, `b-high`, `c-medium`, `d-normal`, `e-low`\n- Agenda view has been replaced by the list view in Calendar\n - Grouping is not supported in this view, so the \"Overdue\" group is no longer provided\n - A separate \"Overdue\" view is available in the \"Task List\" base file\n\n## Known Issues\n\n- Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data\n- Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views\n\n## Details\n\n### Added\n\n- Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis\n- Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing\n- Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create)\n- Kanban Swimlane Layout with horizontal grouping and configurable column widths\n- Saved View Converter button in settings to convert v3 saved filter views to `.base` files\n- Context menus for time entries and ICS events in calendar views\n- Calendar icon to ICS event titles for better visual distinction\n- Hover tooltips for timeblocks in calendar views\n- MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis\n- (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution\n- Configurable task modal fields with drag-and-drop reordering in new \"Modal Fields\" settings tab\n- Rich markdown editor for NLP task creation with syntax highlighting and wikilink support\n- Customizable NLP triggers with autocomplete and keyboard navigation\n- Inline task link overlay enhancements with configurable visible properties\n- Kanban column reordering via drag and drop with saved order per grouping property\n- Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation\n- Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs\n- Updated task card styling with improved hover effects, shadows, and gradient accents\n- (#361) Completion-based recurrence support with `recurrence_anchor` field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest\n- (#416) Support for skipped recurrence instances with `skipped_instances` field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue\n- Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups\n- Documentation for default Bases templates showing all default `.base` file templates with examples\n\n### Changed\n\n- All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with `.base` files\n- Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling\n- Reorganized settings tabs with OAuth calendar settings in Integrations tab\n- Refactored Bases integration to use public API and trust pre-sorted data\n- Refactored calendar modules to use ES6 imports instead of lazy require() calls\n- Time entry events now show task context menu on right-click\n- Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data\n- Completed internationalization with 100% translation coverage across all 6 supported languages\n- Migrated to i18n-state-manager CLI tool for improved translation management\n- Bases view templates now generate dynamically based on user settings with adaptive task filters\n- Updated Bases CalendarView to show TaskNotes in property-based events\n- NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage\n- Simplified TaskCard interface and refactored TaskLinkWidget for consistency\n- Settings UI enhancements with NLP triggers configurable through Features tab\n- Refactored Bases views to use Component lifecycle properly with automatic cleanup\n- Improved development experience by converting ESLint errors to warnings\n- Renamed \"Advanced Calendar\" to \"Calendar\" throughout the UI\n- Improved timeblock visual styling in calendar views with reduced border width and softer shadows\n- Updated \"Export All Views\" button to \"Export V3 Views\" to clarify it migrates v3 saved views\n- Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys\n- Changed default Tasks List template view order with \"All Tasks\" first and added \"Unscheduled\" view\n\n### Fixed\n\n- (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" - Thanks to @jack2game for reporting\n- Fixed dark mode calendar borders\n- Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting\n- Fixed state management bug in FilterSettingsComponent\n- Fixed timezone handling for recurring events\n- (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging\n- (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting\n- Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags\n- Fixed Bases property mapping for user-configured field names\n- Fixed Bases views not respecting user-configured visible properties\n- Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling\n- Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView\n- (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix\n- (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix\n- (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot\n- Fixed \"Highlight today\" toggle and calendar view type persistence in Bases Calendar view options\n- (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting\n- Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata\n- Fixed group collapse/expand functionality in TaskListView\n- Fixed config loading race condition in KanbanView and CalendarView\n- Fixed MiniCalendarView to use direct Bases API like other views\n- (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting\n- (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting\n- (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting\n- Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules\n- (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting\n- (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting\n- (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting\n- (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting\n- Fixed kanban column width CSS constraints not matching settings slider range\n- Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting\n- (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting\n- (#1133) Fixed empty priority columns not showing in Kanban view when \"Hide empty columns\" is disabled - Thanks to @luckb0x for reporting\n- Fixed OAuth calendar cards showing \"Unknown account\" by removing non-functional Account field - Thanks to @Oblique for reporting\n- Fixed incorrect Bases syntax in default template files with correct parameter naming\n- Fixed incorrect Bases syntax in \"Export V3 Views\" feature with correct YAML structure\n- (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting\n- (#1043) Fixed inability to set \"at time of event\" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting\n- (#1055) Fixed break sessions being logged as `type: work` when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging\n- (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting\n- (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting\n- Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration\n- (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting\n- (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting\n- (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting\n- Fixed time entries not showing in calendar view for tasks without scheduled or due dates\n- (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting\n- (#1086) Fixed calendar \"+more\" popover showing white text on white background in dark mode - Thanks to @same774 for reporting\n- (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting\n- (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information\n- (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting\n\n### Removed\n\n- Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser)\n- Removed legacy FilterBar UI - all filtering now lives in `.base` files\n- Removed legacy views\n\n","aliases":["/releases/4.0.1/","/releases/4.0.1/"],"toc":[{"level":2,"id":"highlights","text":"Highlights"},{"level":2,"id":"why-bases","text":"Why Bases?"},{"level":2,"id":"upgrade-notes","text":"Upgrade Notes"},{"level":2,"id":"breaking-changes","text":"Breaking Changes"},{"level":2,"id":"known-issues","text":"Known Issues"},{"level":2,"id":"details","text":"Details"},{"level":3,"id":"added","text":"Added"},{"level":3,"id":"changed","text":"Changed"},{"level":3,"id":"fixed","text":"Fixed"},{"level":3,"id":"removed","text":"Removed"}],"html":"

TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on .base files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault.

\n

Highlights#

\n

New features and improvements:

\n
    \n
  • Performance improvements
      \n
    • Virtual scrolling in Task List and Kanban views handles 30,000+ tasks without performance degradation
    • \n
    \n
  • \n
  • OAuth calendar integration
      \n
    • Google Calendar and Microsoft Outlook bi-directional sync
    • \n
    • Drag calendar events in the TaskNotes calendar to update them online
    • \n
    \n
  • \n
  • Configurable modals and NLP
      \n
    • New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals
    • \n
    • Rich markdown editor and customizable NLP triggers, including autocomplete for user fields
    • \n
    \n
  • \n
  • Time management features
      \n
    • Time Entry Editor Modal
    • \n
    • Improved Timeblock creation and management
    • \n
    • Completion-based recurrence with recurrence_anchor field
    • \n
    • Skippable recurrence instances
    • \n
    \n
  • \n
\n

Bases architecture changes:

\n
    \n
  • Bases-first architecture
      \n
    • Task views ship as .base files inside TaskNotes/Views/
    • \n
    • Commands and ribbon buttons now open files you control
    • \n
    • Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI
    • \n
    • Agenda is a dedicated list-mode calendar .base file for fast daily/weekly reviews
    • \n
    \n
  • \n
  • Inline workflows stay in sync
      \n
    • Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place
    • \n
    • Task cards inside notes honor the same Bases filtering/grouping rules as standalone views
    • \n
    \n
  • \n
\n

Why Bases?#

\n

Moving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which:

\n
    \n
  • Reduces maintenance overhead and improves reliability
  • \n
  • Lets advanced users version-control and audit their view definitions
  • \n
  • Makes saved views portable between vaults
  • \n
  • Keeps TaskNotes behavior consistent with other Obsidian-native workflows
  • \n
\n

Upgrade Notes#

\n
    \n
  • Obsidian 1.10.1 or later is required (Bases public API with group-by support)
  • \n
  • Enable the Bases core plugin before opening TaskNotes views
  • \n
  • Run Settings → TaskNotes → General → Create Default Files if you need fresh .base files
  • \n
  • Use Export All Saved Views to Bases to convert any legacy FilterBar saved views into .base files
  • \n
  • The Relationships widget uses TaskNotes/Views/relationships.base; adjust that file to change what appears inside notes
  • \n
\n

Breaking Changes#

\n
    \n
  • The old FilterBar UI has been removed—all filtering and saved views live in .base files
  • \n
  • Legacy widget settings (showProjectSubtasks, showTaskDependencies, etc.) were replaced with showRelationships and relationshipsPosition
  • \n
  • Task view commands now fail if their mapped .base file is missing; configure paths under Settings → TaskNotes → General → View Commands
  • \n
  • Priority sorting now uses alphabetical order instead of custom weights
      \n
    • In v3, TaskNotes used priority "weights" to determine sort order (higher weight = higher priority)
    • \n
    • In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value
    • \n
    • The weight field has been removed from the settings UI
    • \n
    • Workaround: Name your priority values to sort alphabetically in your desired order
        \n
      • Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low
      • \n
      • Or: a-urgent, b-high, c-medium, d-normal, e-low
      • \n
      \n
    • \n
    \n
  • \n
  • Agenda view has been replaced by the list view in Calendar
      \n
    • Grouping is not supported in this view, so the "Overdue" group is no longer provided
    • \n
    • A separate "Overdue" view is available in the "Task List" base file
    • \n
    \n
  • \n
\n

Known Issues#

\n
    \n
  • Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data
  • \n
  • Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views
  • \n
\n

Details#

\n

Added#

\n
    \n
  • Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis
  • \n
  • Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing
  • \n
  • Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create)
  • \n
  • Kanban Swimlane Layout with horizontal grouping and configurable column widths
  • \n
  • Saved View Converter button in settings to convert v3 saved filter views to .base files
  • \n
  • Context menus for time entries and ICS events in calendar views
  • \n
  • Calendar icon to ICS event titles for better visual distinction
  • \n
  • Hover tooltips for timeblocks in calendar views
  • \n
  • MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis
  • \n
  • (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution
  • \n
  • Configurable task modal fields with drag-and-drop reordering in new "Modal Fields" settings tab
  • \n
  • Rich markdown editor for NLP task creation with syntax highlighting and wikilink support
  • \n
  • Customizable NLP triggers with autocomplete and keyboard navigation
  • \n
  • Inline task link overlay enhancements with configurable visible properties
  • \n
  • Kanban column reordering via drag and drop with saved order per grouping property
  • \n
  • Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation
  • \n
  • Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs
  • \n
  • Updated task card styling with improved hover effects, shadows, and gradient accents
  • \n
  • (#361) Completion-based recurrence support with recurrence_anchor field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest
  • \n
  • (#416) Support for skipped recurrence instances with skipped_instances field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue
  • \n
  • Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups
  • \n
  • Documentation for default Bases templates showing all default .base file templates with examples
  • \n
\n

Changed#

\n
    \n
  • All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with .base files
  • \n
  • Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling
  • \n
  • Reorganized settings tabs with OAuth calendar settings in Integrations tab
  • \n
  • Refactored Bases integration to use public API and trust pre-sorted data
  • \n
  • Refactored calendar modules to use ES6 imports instead of lazy require() calls
  • \n
  • Time entry events now show task context menu on right-click
  • \n
  • Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data
  • \n
  • Completed internationalization with 100% translation coverage across all 6 supported languages
  • \n
  • Migrated to i18n-state-manager CLI tool for improved translation management
  • \n
  • Bases view templates now generate dynamically based on user settings with adaptive task filters
  • \n
  • Updated Bases CalendarView to show TaskNotes in property-based events
  • \n
  • NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage
  • \n
  • Simplified TaskCard interface and refactored TaskLinkWidget for consistency
  • \n
  • Settings UI enhancements with NLP triggers configurable through Features tab
  • \n
  • Refactored Bases views to use Component lifecycle properly with automatic cleanup
  • \n
  • Improved development experience by converting ESLint errors to warnings
  • \n
  • Renamed "Advanced Calendar" to "Calendar" throughout the UI
  • \n
  • Improved timeblock visual styling in calendar views with reduced border width and softer shadows
  • \n
  • Updated "Export All Views" button to "Export V3 Views" to clarify it migrates v3 saved views
  • \n
  • Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys
  • \n
  • Changed default Tasks List template view order with "All Tasks" first and added "Unscheduled" view
  • \n
\n

Fixed#

\n
    \n
  • (#843) Fixed task tag being added when "Identify tasks by" is set to "Property" - Thanks to @jack2game for reporting
  • \n
  • Fixed dark mode calendar borders
  • \n
  • Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting
  • \n
  • Fixed state management bug in FilterSettingsComponent
  • \n
  • Fixed timezone handling for recurring events
  • \n
  • (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging
  • \n
  • (#992) Fixed "Failed to resolve module specifier 'obsidian'" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting
  • \n
  • Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags
  • \n
  • Fixed Bases property mapping for user-configured field names
  • \n
  • Fixed Bases views not respecting user-configured visible properties
  • \n
  • Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling
  • \n
  • Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView
  • \n
  • (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix
  • \n
  • (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix
  • \n
  • (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot
  • \n
  • Fixed "Highlight today" toggle and calendar view type persistence in Bases Calendar view options
  • \n
  • (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting
  • \n
  • Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata
  • \n
  • Fixed group collapse/expand functionality in TaskListView
  • \n
  • Fixed config loading race condition in KanbanView and CalendarView
  • \n
  • Fixed MiniCalendarView to use direct Bases API like other views
  • \n
  • (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting
  • \n
  • (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting
  • \n
  • (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting
  • \n
  • Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules
  • \n
  • (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting
  • \n
  • (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting
  • \n
  • (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting
  • \n
  • (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting
  • \n
  • Fixed kanban column width CSS constraints not matching settings slider range
  • \n
  • Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting
  • \n
  • (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting
  • \n
  • (#1133) Fixed empty priority columns not showing in Kanban view when "Hide empty columns" is disabled - Thanks to @luckb0x for reporting
  • \n
  • Fixed OAuth calendar cards showing "Unknown account" by removing non-functional Account field - Thanks to @Oblique for reporting
  • \n
  • Fixed incorrect Bases syntax in default template files with correct parameter naming
  • \n
  • Fixed incorrect Bases syntax in "Export V3 Views" feature with correct YAML structure
  • \n
  • (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting
  • \n
  • (#1043) Fixed inability to set "at time of event" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting
  • \n
  • (#1055) Fixed break sessions being logged as type: work when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging
  • \n
  • (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting
  • \n
  • (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting
  • \n
  • Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration
  • \n
  • (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting
  • \n
  • (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting
  • \n
  • (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting
  • \n
  • Fixed time entries not showing in calendar view for tasks without scheduled or due dates
  • \n
  • (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting
  • \n
  • (#1086) Fixed calendar "+more" popover showing white text on white background in dark mode - Thanks to @same774 for reporting
  • \n
  • (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting
  • \n
  • (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information
  • \n
  • (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting
  • \n
\n

Removed#

\n
    \n
  • Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser)
  • \n
  • Removed legacy FilterBar UI - all filtering now lives in .base files
  • \n
  • Removed legacy views
  • \n
\n","text":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on .base files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault. Highlights# New features and improvements: Performance improvements Virtual scrolling in Task List and Kanban views handles 30,000+ tasks without performance degradation OAuth calendar integration Google Calendar and Microsoft Outlook bi-directional sync Drag calendar events in the TaskNotes calendar to update them online Configurable modals and NLP New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals Rich markdown editor and customizable NLP triggers, including autocomplete for user fields Time management features Time Entry Editor Modal Improved Timeblock creation and management Completion-based recurrence with recurrence_anchor field Skippable recurrence instances Bases architecture changes: Bases-first architecture Task views ship as .base files inside TaskNotes/Views/ Commands and ribbon buttons now open files you control Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI Agenda is a dedicated list-mode calendar .base file for fast daily/weekly reviews Inline workflows stay in sync Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place Task cards inside notes honor the same Bases filtering/grouping rules as standalone views Why Bases?# Moving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which: Reduces maintenance overhead and improves reliability Lets advanced users version-control and audit their view definitions Makes saved views portable between vaults Keeps TaskNotes behavior consistent with other Obsidian-native workflows Upgrade Notes# Obsidian 1.10.1 or later is required (Bases public API with group-by support) Enable the Bases core plugin before opening TaskNotes views Run Settings → TaskNotes → General → Create Default Files if you need fresh .base files Use Export All Saved Views to Bases to convert any legacy FilterBar saved views into .base files The Relationships widget uses TaskNotes/Views/relationships.base; adjust that file to change what appears inside notes Breaking Changes# The old FilterBar UI has been removed—all filtering and saved views live in .base files Legacy widget settings (showProjectSubtasks, showTaskDependencies, etc.) were replaced with showRelationships and relationshipsPosition Task view commands now fail if their mapped .base file is missing; configure paths under Settings → TaskNotes → General → View Commands Priority sorting now uses alphabetical order instead of custom weights In v3, TaskNotes used priority \"weights\" to determine sort order (higher weight = higher priority) In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value The weight field has been removed from the settings UI Workaround: Name your priority values to sort alphabetically in your desired order Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Agenda view has been replaced by the list view in Calendar Grouping is not supported in this view, so the \"Overdue\" group is no longer provided A separate \"Overdue\" view is available in the \"Task List\" base file Known Issues# Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views Details# Added# Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create) Kanban Swimlane Layout with horizontal grouping and configurable column widths Saved View Converter button in settings to convert v3 saved filter views to .base files Context menus for time entries and ICS events in calendar views Calendar icon to ICS event titles for better visual distinction Hover tooltips for timeblocks in calendar views MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution Configurable task modal fields with drag-and-drop reordering in new \"Modal Fields\" settings tab Rich markdown editor for NLP task creation with syntax highlighting and wikilink support Customizable NLP triggers with autocomplete and keyboard navigation Inline task link overlay enhancements with configurable visible properties Kanban column reordering via drag and drop with saved order per grouping property Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs Updated task card styling with improved hover effects, shadows, and gradient accents (#361) Completion-based recurrence support with recurrence_anchor field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Support for skipped recurrence instances with skipped_instances field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups Documentation for default Bases templates showing all default .base file templates with examples Changed# All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with .base files Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling Reorganized settings tabs with OAuth calendar settings in Integrations tab Refactored Bases integration to use public API and trust pre-sorted data Refactored calendar modules to use ES6 imports instead of lazy require() calls Time entry events now show task context menu on right-click Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data Completed internationalization with 100% translation coverage across all 6 supported languages Migrated to i18n-state-manager CLI tool for improved translation management Bases view templates now generate dynamically based on user settings with adaptive task filters Updated Bases CalendarView to show TaskNotes in property-based events NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage Simplified TaskCard interface and refactored TaskLinkWidget for consistency Settings UI enhancements with NLP triggers configurable through Features tab Refactored Bases views to use Component lifecycle properly with automatic cleanup Improved development experience by converting ESLint errors to warnings Renamed \"Advanced Calendar\" to \"Calendar\" throughout the UI Improved timeblock visual styling in calendar views with reduced border width and softer shadows Updated \"Export All Views\" button to \"Export V3 Views\" to clarify it migrates v3 saved views Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys Changed default Tasks List template view order with \"All Tasks\" first and added \"Unscheduled\" view Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" - Thanks to @jack2game for reporting Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags Fixed Bases property mapping for user-configured field names Fixed Bases views not respecting user-configured visible properties Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot Fixed \"Highlight today\" toggle and calendar view type persistence in Bases Calendar view options (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata Fixed group collapse/expand functionality in TaskListView Fixed config loading race condition in KanbanView and CalendarView Fixed MiniCalendarView to use direct Bases API like other views (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings slider range Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting (#1133) Fixed empty priority columns not showing in Kanban view when \"Hide empty columns\" is disabled - Thanks to @luckb0x for reporting Fixed OAuth calendar cards showing \"Unknown account\" by removing non-functional Account field - Thanks to @Oblique for reporting Fixed incorrect Bases syntax in default template files with correct parameter naming Fixed incorrect Bases syntax in \"Export V3 Views\" feature with correct YAML structure (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting (#1043) Fixed inability to set \"at time of event\" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting (#1055) Fixed break sessions being logged as type: work when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting Fixed time entries not showing in calendar view for tasks without scheduled or due dates (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting (#1086) Fixed calendar \"+more\" popover showing white text on white background in dark mode - Thanks to @same774 for reporting (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Removed legacy FilterBar UI - all filtering now lives in .base files Removed legacy views"},{"route":"/obsidian/releases/4.0.2/","title":"TaskNotes 4.0.2","description":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have repor...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.2.md","namespace":"obsidian","relativePath":"releases/4.0.2.md","raw":"# TaskNotes 4.0.2\n\nThis release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks.\n\n## Added\n\n- Added \"Not Blocked\" view to default task list template\n - Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies)\n - Uses Bases `list.filter()` to check completion status of each blocking task\n - This new view can be accessed by regenerating the Task List view, or by copying the filters from the [default base templates documentation](https://tasknotes.dev/views/default-base-templates)\n\n## Fixed\n\n- (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration\n - Default Kanban template now automatically includes `groupBy` property set to status\n - Resolves \"Kanban requires a 'Group by' property to be configured\" error on first use\n - Users no longer need to manually configure grouping through the Sort menu\n - Thanks to @randomness42 and @seepage87 for reporting\n- Fixed user-defined custom fields appearing as `user:field_xxx` in generated base templates\n - Custom fields now use their actual property names (e.g., `effort` instead of `user:field_1761435303709`)\n - Ensures Bases can properly query user-defined properties\n - Also fixed `totalTrackedTime` to correctly map to the configured `timeEntries` property name\n- (#1145) Improved Kanban error message when no 'Group by' property is configured\n - Now includes instructions: \"Click the 'Sort' button and select a property under 'Group by'\"\n - Thanks to @randomness42 for the suggestion\n- (#1139, #1141) Fixed relationships widget not appearing in project notes\n - Project references are now resolved to full file paths when indexing\n - Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths\n - Restores v3.x behavior where subtasks appear in parent project notes\n - Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing\n- Fixed dependency blocking status to be status-aware\n - \"Blocked (x)\" pill now only appears when tasks have **incomplete** blocking dependencies\n - Tasks with all completed blocking dependencies no longer show as blocked\n- Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks\n - When a task is modified, only forward dependencies are cleared (stored in its frontmatter)\n - Reverse dependencies are preserved (stored in other tasks' frontmatter)\n\n## Changed\n\n- Removed custom TaskNotes icon from task modals\n - Task creation and edit modals now use Obsidian's standard title styling \n - Thanks to @kepano for the suggestion\n- Moved default base templates documentation to `docs/views/`\n - Location: `docs/views/default-base-templates.md`\n - Added cross-references to official Obsidian Bases documentation\n - Updated code comments to reference new documentation path\n- Fixed incorrect quote escaping in default base templates documentation\n - YAML examples now use proper single quotes for strings containing double quotes\n","aliases":["/releases/4.0.2/","/releases/4.0.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks.

\n

Added#

\n
    \n
  • Added "Not Blocked" view to default task list template
      \n
    • Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies)
    • \n
    • Uses Bases list.filter() to check completion status of each blocking task
    • \n
    • This new view can be accessed by regenerating the Task List view, or by copying the filters from the default base templates documentation
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration
      \n
    • Default Kanban template now automatically includes groupBy property set to status
    • \n
    • Resolves "Kanban requires a 'Group by' property to be configured" error on first use
    • \n
    • Users no longer need to manually configure grouping through the Sort menu
    • \n
    • Thanks to @randomness42 and @seepage87 for reporting
    • \n
    \n
  • \n
  • Fixed user-defined custom fields appearing as user:field_xxx in generated base templates
      \n
    • Custom fields now use their actual property names (e.g., effort instead of user:field_1761435303709)
    • \n
    • Ensures Bases can properly query user-defined properties
    • \n
    • Also fixed totalTrackedTime to correctly map to the configured timeEntries property name
    • \n
    \n
  • \n
  • (#1145) Improved Kanban error message when no 'Group by' property is configured
      \n
    • Now includes instructions: "Click the 'Sort' button and select a property under 'Group by'"
    • \n
    • Thanks to @randomness42 for the suggestion
    • \n
    \n
  • \n
  • (#1139, #1141) Fixed relationships widget not appearing in project notes
      \n
    • Project references are now resolved to full file paths when indexing
    • \n
    • Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths
    • \n
    • Restores v3.x behavior where subtasks appear in parent project notes
    • \n
    • Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing
    • \n
    \n
  • \n
  • Fixed dependency blocking status to be status-aware
      \n
    • "Blocked (x)" pill now only appears when tasks have incomplete blocking dependencies
    • \n
    • Tasks with all completed blocking dependencies no longer show as blocked
    • \n
    \n
  • \n
  • Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks
      \n
    • When a task is modified, only forward dependencies are cleared (stored in its frontmatter)
    • \n
    • Reverse dependencies are preserved (stored in other tasks' frontmatter)
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Removed custom TaskNotes icon from task modals
      \n
    • Task creation and edit modals now use Obsidian's standard title styling
    • \n
    • Thanks to @kepano for the suggestion
    • \n
    \n
  • \n
  • Moved default base templates documentation to docs/views/
      \n
    • Location: docs/views/default-base-templates.md
    • \n
    • Added cross-references to official Obsidian Bases documentation
    • \n
    • Updated code comments to reference new documentation path
    • \n
    \n
  • \n
  • Fixed incorrect quote escaping in default base templates documentation
      \n
    • YAML examples now use proper single quotes for strings containing double quotes
    • \n
    \n
  • \n
\n","text":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks. Added# Added \"Not Blocked\" view to default task list template Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies) Uses Bases list.filter() to check completion status of each blocking task This new view can be accessed by regenerating the Task List view, or by copying the filters from the default base templates documentation Fixed# (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration Default Kanban template now automatically includes groupBy property set to status Resolves \"Kanban requires a 'Group by' property to be configured\" error on first use Users no longer need to manually configure grouping through the Sort menu Thanks to @randomness42 and @seepage87 for reporting Fixed user-defined custom fields appearing as user:field_xxx in generated base templates Custom fields now use their actual property names (e.g., effort instead of user:field_1761435303709) Ensures Bases can properly query user-defined properties Also fixed totalTrackedTime to correctly map to the configured timeEntries property name (#1145) Improved Kanban error message when no 'Group by' property is configured Now includes instructions: \"Click the 'Sort' button and select a property under 'Group by'\" Thanks to @randomness42 for the suggestion (#1139, #1141) Fixed relationships widget not appearing in project notes Project references are now resolved to full file paths when indexing Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths Restores v3.x behavior where subtasks appear in parent project notes Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing Fixed dependency blocking status to be status-aware \"Blocked (x)\" pill now only appears when tasks have incomplete blocking dependencies Tasks with all completed blocking dependencies no longer show as blocked Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks When a task is modified, only forward dependencies are cleared (stored in its frontmatter) Reverse dependencies are preserved (stored in other tasks' frontmatter) Changed# Removed custom TaskNotes icon from task modals Task creation and edit modals now use Obsidian's standard title styling Thanks to @kepano for the suggestion Moved default base templates documentation to docs/views/ Location: docs/views/default-base-templates.md Added cross-references to official Obsidian Bases documentation Updated code comments to reference new documentation path Fixed incorrect quote escaping in default base templates documentation YAML examples now use proper single quotes for strings containing double quotes"},{"route":"/obsidian/releases/4.0.3/","title":"TaskNotes 4.0.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.3.md","namespace":"obsidian","relativePath":"releases/4.0.3.md","raw":"# TaskNotes 4.0.3\n\n## Fixed\n\n- (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists\n - Changed inline task cards to use span elements instead of divs for proper inline flow\n - Added max-width constraint to prevent wrapping when tasks are wider than editor\n - Task embeds now display correctly inline with bullet points during live preview\n - Thanks to @3zra47 for reporting\n- (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar\n - Thanks to @DearHaruHaru for reporting\n- (#1161, #1162) Fixed \"unexpected scalar\" YAML parsing error in generated tasks-default.base template\n - Changed nested quotes in \"Not Blocked\" filter from double to single quotes\n - Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix\n\n## Changed\n\n- Updated task modal UI to use native Obsidian patterns for better theme compatibility\n - Thanks to @kepano for feedback\n\n","aliases":["/releases/4.0.3/","/releases/4.0.3/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists
      \n
    • Changed inline task cards to use span elements instead of divs for proper inline flow
    • \n
    • Added max-width constraint to prevent wrapping when tasks are wider than editor
    • \n
    • Task embeds now display correctly inline with bullet points during live preview
    • \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar
      \n
    • Thanks to @DearHaruHaru for reporting
    • \n
    \n
  • \n
  • (#1161, #1162) Fixed "unexpected scalar" YAML parsing error in generated tasks-default.base template
      \n
    • Changed nested quotes in "Not Blocked" filter from double to single quotes
    • \n
    • Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Updated task modal UI to use native Obsidian patterns for better theme compatibility
      \n
    • Thanks to @kepano for feedback
    • \n
    \n
  • \n
\n","text":"Fixed# (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists Changed inline task cards to use span elements instead of divs for proper inline flow Added max-width constraint to prevent wrapping when tasks are wider than editor Task embeds now display correctly inline with bullet points during live preview Thanks to @3zra47 for reporting (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar Thanks to @DearHaruHaru for reporting (#1161, #1162) Fixed \"unexpected scalar\" YAML parsing error in generated tasks-default.base template Changed nested quotes in \"Not Blocked\" filter from double to single quotes Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix Changed# Updated task modal UI to use native Obsidian patterns for better theme compatibility Thanks to @kepano for feedback"},{"route":"/obsidian/releases/4.0.4/","title":"TaskNotes 4.0.4","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.4.md","namespace":"obsidian","relativePath":"releases/4.0.4.md","raw":"# TaskNotes 4.0.4\n\n## Added\n\n- (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals\n - Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals\n - Thanks to @luckb0x, @hamlim and @nightroman for the feature requests\n\n## Fixed\n\n- (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks\n - Prevents cards from extending beyond column boundaries before virtualization activates\n - Thanks to @lomarcanys for reporting\n- (#1177) Bases views now anchor recurring completion and calendar navigation to the right date\n - Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of \"today\" (fixes complete_instances)\n - Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps\n - Thanks to @nslee123 for flagging the issue\n- Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day\n - Corrected all-day end date calculation to prevent off-by-one spans\n - Added regression test for the UTC anchor behavior\n - Thanks to KaCii for [flagging the issue](https://discord.com/channels/686053708261228577/1433165116702199880/1439757826380660767)\n\n## Changed\n\n- Refactored plugin styling to better align with Obsidian's native UI conventions\n - Replaced all `cursor: pointer` with `cursor: var(--cursor)` (100+ instances) to follow Obsidian's cursor convention\n - Removed forced `border: none; box-shadow: none` rules that were fighting against Obsidian's native button styling\n - Scoped custom `.tn-btn` button system to settings modal only (`.mod-settings`), allowing Obsidian's native button styles to work elsewhere\n - Thanks to @kepano for guidance\n","aliases":["/releases/4.0.4/","/releases/4.0.4/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Added#

\n
    \n
  • (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals
      \n
    • Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals
    • \n
    • Thanks to @luckb0x, @hamlim and @nightroman for the feature requests
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks
      \n
    • Prevents cards from extending beyond column boundaries before virtualization activates
    • \n
    • Thanks to @lomarcanys for reporting
    • \n
    \n
  • \n
  • (#1177) Bases views now anchor recurring completion and calendar navigation to the right date
      \n
    • Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of "today" (fixes complete_instances)
    • \n
    • Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps
    • \n
    • Thanks to @nslee123 for flagging the issue
    • \n
    \n
  • \n
  • Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day
      \n
    • Corrected all-day end date calculation to prevent off-by-one spans
    • \n
    • Added regression test for the UTC anchor behavior
    • \n
    • Thanks to KaCii for flagging the issue
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Refactored plugin styling to better align with Obsidian's native UI conventions
      \n
    • Replaced all cursor: pointer with cursor: var(--cursor) (100+ instances) to follow Obsidian's cursor convention
    • \n
    • Removed forced border: none; box-shadow: none rules that were fighting against Obsidian's native button styling
    • \n
    • Scoped custom .tn-btn button system to settings modal only (.mod-settings), allowing Obsidian's native button styles to work elsewhere
    • \n
    • Thanks to @kepano for guidance
    • \n
    \n
  • \n
\n","text":"Added# (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals Thanks to @luckb0x, @hamlim and @nightroman for the feature requests Fixed# (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks Prevents cards from extending beyond column boundaries before virtualization activates Thanks to @lomarcanys for reporting (#1177) Bases views now anchor recurring completion and calendar navigation to the right date Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of \"today\" (fixes complete_instances) Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps Thanks to @nslee123 for flagging the issue Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day Corrected all-day end date calculation to prevent off-by-one spans Added regression test for the UTC anchor behavior Thanks to KaCii for flagging the issue Changed# Refactored plugin styling to better align with Obsidian's native UI conventions Replaced all cursor: pointer with cursor: var(--cursor) (100+ instances) to follow Obsidian's cursor convention Removed forced border: none; box-shadow: none rules that were fighting against Obsidian's native button styling Scoped custom .tn-btn button system to settings modal only (.mod-settings), allowing Obsidian's native button styles to work elsewhere Thanks to @kepano for guidance"},{"route":"/obsidian/releases/4.0.5/","title":"TaskNotes 4.0.5","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.0.5.md","namespace":"obsidian","relativePath":"releases/4.0.5.md","raw":"# TaskNotes 4.0.5\n\n## Changed\n\n- (#790) Task edit modal now shows unresolved project links with appropriate styling\n\t- Similar to how dependencies are displayed, unresolved projects now appear with visual indication\n\t- Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved\n\t- Thanks to @aubreyz for reporting\n\n## Fixed\n\n- (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks\n\t- Project index was incorrectly adding all linked files instead of only files referenced in the projects field\n\t- Now properly parses the projects field and only indexes those specific files as projects\n\t- Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution\n\t- Thanks to @craziedde for reporting\n- (#1200) Fixed kanban drag & drop not updating task properties correctly\n\t- Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks)\n\t- Previously, kanban updates bypassed `updateProperty` and directly modified frontmatter\n\t- Thanks very much to @tvoklov for the PR\n- (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries\n\t- Configure CodeMirror tooltips to render in document.body instead of constrained editor container\n\t- Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height\n\t- Thanks to @Andrei-Ioda for reporting\n- (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor\n\t- Remove padding-left override on `.cm-line` to allow CodeMirror decorations (checkboxes, indentation) to render properly\n\t- Content padding is now handled by `.cm-content` while `.cm-line` uses natural spacing\n\t- Thanks to @nightroman for reporting\n- Fixed relationships widget not appearing on project notes without frontmatter\n\t- Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter\n- Fixed task card and relationships widgets not appearing when opening notes in source mode\n\t- Removed live preview mode restriction to allow widgets to render in both source and live preview modes\n- (#901) Fixed calendar view toolbar buttons overflowing on narrow screens\n - Added `flex-wrap: wrap` to calendar header toolbar to allow buttons to wrap to multiple lines\n - Thanks to @RumiaKitinari for reporting\n- (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings\n\t- Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences\n\t- Calendar view initialization now correctly uses `plugin.settings.calendarViewSettings` as the fallback\n\t- Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting \n- Fixed calendar to ensure that it respects user's locale\n - Tries to use calendar locale, then tries UI language, then system language, then falls back to English\n- (#1043) Fixed default reminders with \"at time of event\" (0 offset) not being applied to tasks\n\t- UI was displaying \"1\" instead of \"0\" for zero-offset reminders in settings\n\t- Thanks to @dblinnikov for reporting\n- (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords\n\t- Manually typing status trigger + label now correctly parses (e.g., `*Done` when label is `Done`)\n\t- Status values containing temporal keywords no longer misparsed as dates (e.g., `Expedite = Now`)\n\t- Thanks very much to @renatomen for the PR\n- (#1212) Fixed \"Show release notes on update\" toggle not saving correctly\n - Thanks to @Jon-dog for reporting\n- (#1197) Add Portuguese language to list of translations in general tab settings\n - Allows users to select the Portuguese translation option\n - Thanks to @andysteel for the PR\n- Fixed file properties displaying incorrectly in Bases views\n\t- File properties like `file.name`, `file.basename`, `file.size`, etc. were showing as \"Title\" or returning null\n\t- Now correctly extracts and displays all file properties from Obsidian's file metadata\n\t- Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)\n","aliases":["/releases/4.0.5/","/releases/4.0.5/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • (#790) Task edit modal now shows unresolved project links with appropriate styling
      \n
    • Similar to how dependencies are displayed, unresolved projects now appear with visual indication
    • \n
    • Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved
    • \n
    • Thanks to @aubreyz for reporting
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks
      \n
    • Project index was incorrectly adding all linked files instead of only files referenced in the projects field
    • \n
    • Now properly parses the projects field and only indexes those specific files as projects
    • \n
    • Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution
    • \n
    • Thanks to @craziedde for reporting
    • \n
    \n
  • \n
  • (#1200) Fixed kanban drag & drop not updating task properties correctly
      \n
    • Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks)
    • \n
    • Previously, kanban updates bypassed updateProperty and directly modified frontmatter
    • \n
    • Thanks very much to @tvoklov for the PR
    • \n
    \n
  • \n
  • (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries
      \n
    • Configure CodeMirror tooltips to render in document.body instead of constrained editor container
    • \n
    • Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height
    • \n
    • Thanks to @Andrei-Ioda for reporting
    • \n
    \n
  • \n
  • (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor
      \n
    • Remove padding-left override on .cm-line to allow CodeMirror decorations (checkboxes, indentation) to render properly
    • \n
    • Content padding is now handled by .cm-content while .cm-line uses natural spacing
    • \n
    • Thanks to @nightroman for reporting
    • \n
    \n
  • \n
  • Fixed relationships widget not appearing on project notes without frontmatter
      \n
    • Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter
    • \n
    \n
  • \n
  • Fixed task card and relationships widgets not appearing when opening notes in source mode
      \n
    • Removed live preview mode restriction to allow widgets to render in both source and live preview modes
    • \n
    \n
  • \n
  • (#901) Fixed calendar view toolbar buttons overflowing on narrow screens
      \n
    • Added flex-wrap: wrap to calendar header toolbar to allow buttons to wrap to multiple lines
    • \n
    • Thanks to @RumiaKitinari for reporting
    • \n
    \n
  • \n
  • (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings
      \n
    • Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences
    • \n
    • Calendar view initialization now correctly uses plugin.settings.calendarViewSettings as the fallback
    • \n
    • Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting
    • \n
    \n
  • \n
  • Fixed calendar to ensure that it respects user's locale
      \n
    • Tries to use calendar locale, then tries UI language, then system language, then falls back to English
    • \n
    \n
  • \n
  • (#1043) Fixed default reminders with "at time of event" (0 offset) not being applied to tasks
      \n
    • UI was displaying "1" instead of "0" for zero-offset reminders in settings
    • \n
    • Thanks to @dblinnikov for reporting
    • \n
    \n
  • \n
  • (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords
      \n
    • Manually typing status trigger + label now correctly parses (e.g., *Done when label is Done)
    • \n
    • Status values containing temporal keywords no longer misparsed as dates (e.g., Expedite = Now)
    • \n
    • Thanks very much to @renatomen for the PR
    • \n
    \n
  • \n
  • (#1212) Fixed "Show release notes on update" toggle not saving correctly
      \n
    • Thanks to @Jon-dog for reporting
    • \n
    \n
  • \n
  • (#1197) Add Portuguese language to list of translations in general tab settings
      \n
    • Allows users to select the Portuguese translation option
    • \n
    • Thanks to @andysteel for the PR
    • \n
    \n
  • \n
  • Fixed file properties displaying incorrectly in Bases views
      \n
    • File properties like file.name, file.basename, file.size, etc. were showing as "Title" or returning null
    • \n
    • Now correctly extracts and displays all file properties from Obsidian's file metadata
    • \n
    • Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)
    • \n
    \n
  • \n
\n","text":"Changed# (#790) Task edit modal now shows unresolved project links with appropriate styling Similar to how dependencies are displayed, unresolved projects now appear with visual indication Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved Thanks to @aubreyz for reporting Fixed# (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks Project index was incorrectly adding all linked files instead of only files referenced in the projects field Now properly parses the projects field and only indexes those specific files as projects Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution Thanks to @craziedde for reporting (#1200) Fixed kanban drag & drop not updating task properties correctly Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks) Previously, kanban updates bypassed updateProperty and directly modified frontmatter Thanks very much to @tvoklov for the PR (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries Configure CodeMirror tooltips to render in document.body instead of constrained editor container Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height Thanks to @Andrei-Ioda for reporting (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor Remove padding-left override on .cm-line to allow CodeMirror decorations (checkboxes, indentation) to render properly Content padding is now handled by .cm-content while .cm-line uses natural spacing Thanks to @nightroman for reporting Fixed relationships widget not appearing on project notes without frontmatter Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter Fixed task card and relationships widgets not appearing when opening notes in source mode Removed live preview mode restriction to allow widgets to render in both source and live preview modes (#901) Fixed calendar view toolbar buttons overflowing on narrow screens Added flex-wrap: wrap to calendar header toolbar to allow buttons to wrap to multiple lines Thanks to @RumiaKitinari for reporting (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences Calendar view initialization now correctly uses plugin.settings.calendarViewSettings as the fallback Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting Fixed calendar to ensure that it respects user's locale Tries to use calendar locale, then tries UI language, then system language, then falls back to English (#1043) Fixed default reminders with \"at time of event\" (0 offset) not being applied to tasks UI was displaying \"1\" instead of \"0\" for zero-offset reminders in settings Thanks to @dblinnikov for reporting (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords Manually typing status trigger + label now correctly parses (e.g., *Done when label is Done) Status values containing temporal keywords no longer misparsed as dates (e.g., Expedite = Now) Thanks very much to @renatomen for the PR (#1212) Fixed \"Show release notes on update\" toggle not saving correctly Thanks to @Jon-dog for reporting (#1197) Add Portuguese language to list of translations in general tab settings Allows users to select the Portuguese translation option Thanks to @andysteel for the PR Fixed file properties displaying incorrectly in Bases views File properties like file.name, file.basename, file.size, etc. were showing as \"Title\" or returning null Now correctly extracts and displays all file properties from Obsidian's file metadata Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)"},{"route":"/obsidian/releases/4.1.0/","title":"TaskNotes 4.1.0","description":"(#1245), (#793) Added custom icon support for task statuses","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.0.md","namespace":"obsidian","relativePath":"releases/4.1.0.md","raw":"# TaskNotes 4.1.0\n\n## Added\n\n- (#1245), (#793) Added custom icon support for task statuses\n - Configure a Lucide icon name (e.g., `check`, `circle`, `clock`) per status in Settings → Task Properties → Task Statuses\n - Icons display instead of the colored dot, inheriting the status color\n - Browse available icons at [lucide.dev](https://lucide.dev)\n - Improves accessibility by allowing shape-based status differentiation\n - Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators\n\n- (#1259) Added [Property Types Reference](../settings/property-types-reference.md) documentation\n - Documents expected data types (text, list, date, number) for all frontmatter properties\n - Includes format specifications, examples, and a complete YAML reference\n - Thanks to @Oblique82 for the suggestion\n\n- (#1248) Added formula property support for sub-grouping in Bases Task List view\n - Formula properties (e.g., `formula.myFormula`) now appear in the Sub-group by dropdown\n - Supports all Bases Value types including strings, numbers, booleans, dates, and lists\n - Thanks to @prayidae for the feature request\n\n- (#1070) Added formula property support for swimlanes in Bases Kanban view\n - Formula properties now appear in the Swim Lane dropdown\n - Fixed swimlanes displaying empty when grouping by formula properties\n - Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values)\n - Thanks to @cathywu for reporting\n\n- (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views\n - Shift+click to select multiple tasks\n - Right-click selected tasks to open batch context menu\n - Batch operations: change status, priority, due date, scheduled date, archive, delete\n - Drag multiple selected cards in Kanban to move them together\n - Click the selection count indicator to clear selection\n - Thanks to @jalooc and @solidabstract for the feature requests\n\n- (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar)\n - Enable via \"Enable search box\" toggle in view settings\n - Searches across title, status, priority, tags, contexts, projects, and visible custom properties\n - Press Escape or click × to clear search\n - Thanks to @renatomen for the PR\n\n- (#363) Added \"Create or open task\" command with NLP-based quick task creation\n - Open via command palette or assign a hotkey\n - Search existing tasks or type natural language to create new tasks (e.g., \"Buy groceries tomorrow #shopping\")\n - Press Enter to select an existing task, Shift+Enter to create a new task\n - Real-time preview shows parsed title, due date, priority, tags, and other metadata\n - Can be used when adding sub-tasks to create sub-tasks on-the-fly\n - Thanks to @luciolebrillante for the feature request\n\n- (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal\n - Detects modifications to any field (title, dates, priority, tags, etc.)\n - Shows confirmation dialog with Save/Discard/Keep Editing options\n - Prevents accidental data loss from clicking outside the modal or pressing Escape\n - Thanks to @renatomen for the PR and @0-BSCode for the feature request\n\n- (#904) Added visual highlighting for overdue and past dates on task cards\n - Overdue due dates now display in red text\n - Past scheduled dates now display in blue text\n - Thanks to @ras0q for the suggestion\n\n- (#1164) Added `priorityWeight` formula to all default Bases templates for priority-based sorting\n - Formula maps each priority value to a numeric weight based on your custom priority configuration\n - Sort by `formula.priorityWeight` in ascending order to get highest priority tasks first\n - Example: `if(priority==\"high\",0,if(priority==\"normal\",1,if(priority==\"low\",2,999)))`\n - Thanks to @jhedlund for the suggestion\n\n- (#1257), (#1064) Added configurable event stacking options for Bases Calendar view\n - **Allow events to overlap**: Toggle whether timed events visually overlap or display side-by-side in week/day views\n - **Max stacked events**: Limit horizontal event stacking in week/day views (0 = unlimited)\n - **Max events per day**: Limit events shown per day cell in month view (0 = auto based on cell height)\n - **Max event rows per day**: Limit event rows per day cell in month view (0 = unlimited)\n - Configure per-view in the Bases Calendar view settings under Layout\n - Thanks to @3zra47 and @hasanyilmaz for the feature requests\n\n## Changed\n\n- Improved inline task conversion to merge TasksPlugin and NLP parsing results\n - Previously, if a task had hashtags (e.g., `- [ ] Buy milk tomorrow #groceries`), NLP parsing was skipped entirely\n - Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata\n - TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values\n - Tags, contexts, and projects from both sources are combined and deduplicated\n\n- Polished task card styling for a more native Obsidian look\n - Simplified hover and focus states to use native Obsidian colors\n - Removed blur filter and shadows from metadata pills\n - Fixed subtask chevron vertical alignment with status dot\n - Reduced swimlane label column width in Kanban view\n\n- (#1151) Increased mini calendar heatmap color intensity for better visibility\n - Days with notes now show more noticeable colors, especially with low note counts\n - Intensity levels increased from 10/25/45/65% to 25/40/55/70%\n - Thanks to @arreme for the suggestion\n\n## Fixed\n\n- (#1271) Fixed custom user fields not appearing in task modals after creation\n - New custom fields are now automatically added to both creation and edit modals\n - Deleting a custom field also removes it from modal configuration\n - Updating a field's display name syncs to the modal configuration\n - Thanks to @craziedde for reporting\n\n- (#1256) Fixed links in custom properties not rendering as clickable in task cards\n - Wikilinks (`[[Note]]`) now render correctly in Bases views\n - Markdown links (`[text](url)`) now render correctly in all views\n - Links in list-type properties are also properly rendered\n - Thanks to @3zra47 for reporting\n\n- (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists\n - Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line\n - Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed\n - Thanks to @3zra47 for reporting\n\n- (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist\n - Thanks to @Anthonyhunter100 for reporting\n\n- (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column\n - Tasks with multiple values now appear in each individual column (e.g., a task with `contexts: [work, call]` appears in both \"work\" and \"call\" columns)\n - Added \"Show items in multiple columns\" option (enabled by default) to control this behavior\n - Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list\n - Fixed swimlane mode to also respect list property explosion\n - Thanks to @dictionarymouse for reporting\n\n- (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs\n - Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab\n - Added middle-click support for opening in new tab\n - Thanks to @diegomarzaa for reporting\n\n- (#1265) Fixed task edit modal corrupting markdown-style project links on save\n - Links like `[Project Name](path.md)` were being wrapped in extra brackets: `[[[Project Name](path.md)]]`\n - Plain text project names are now preserved as-is instead of being converted to wikilinks\n - Markdown-style project links now resolve properly and display as linked (not orange/unresolved)\n - Thanks to @minchinweb for reporting\n\n- (#1266) Fixed Kanban view scroll position resetting to top of column after any change\n - Clicking status dots, priority, or other task properties no longer jumps the column back to top\n - Scroll position is now preserved for both regular columns and swimlane cells\n - Thanks to @essouflenfer for reporting\n\n- (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects\n - Tags like `#investigación` were being truncated at accented characters (e.g., `#investigaci`)\n - Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., `@家`, `#杂事`, `@ознакомиться`)\n - Parser now uses Unicode-aware regex patterns to support all languages and scripts\n - Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting\n\n- (#1249) Fixed project preview in task creation modal showing quadruple brackets (`[[[[Project]]]]`)\n - Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display\n - Thanks to @2vzqwz8tvg-png for reporting\n\n- (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive\n - Priority cards are now draggable to reorder (like statuses)\n - Priorities are displayed in weight order (lowest to highest priority)\n - New priorities are added at the end (highest priority) instead of with a fixed weight\n - Thanks to @2vzqwz8tvg-png for reporting\n\n- (#1272) Fixed recurrence anchor not being saved when set to \"completion\" during task creation\n - Selecting \"completion\" as the recurrence anchor now correctly persists to the task frontmatter\n - Thanks to @blaxcky for reporting\n\n- (#1128) Fixed NLP parser not allowing slashes in context names\n - Contexts like `@shopping/groceries` were being split into `@shopping` and `/groceries`\n - Hierarchical context names now work the same as tags and projects\n - Thanks to @wealthychef1 for reporting\n\n- (#1170) Fixed `dateCreated` and `dateModified` not using custom property names when creating notes from calendar events\n - Notes created from ICS events now respect the field mapping configured in settings\n - Thanks to @maddie-m for reporting\n\n- (#1171) Fixed calendar event toggles not responding to changes after initial load\n - Toggling \"Show scheduled tasks\", \"Show due tasks\", and other event filters now correctly updates the calendar\n - Previously, changing these toggles had no effect until the view was reloaded\n - Thanks to @hangryscribe3 for reporting\n\n- (#1198) Fixed project links being created relative to the wrong file when editing from Bases views\n - Relative paths in project links are now correctly resolved relative to the task note file\n - Previously, editing a task from a Bases view would create project links relative to the `.base` file\n - Thanks to @minchinweb for reporting\n\n","aliases":["/releases/4.1.0/","/releases/4.1.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1245), (#793) Added custom icon support for task statuses

    \n
      \n
    • Configure a Lucide icon name (e.g., check, circle, clock) per status in Settings → Task Properties → Task Statuses
    • \n
    • Icons display instead of the colored dot, inheriting the status color
    • \n
    • Browse available icons at lucide.dev
    • \n
    • Improves accessibility by allowing shape-based status differentiation
    • \n
    • Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators
    • \n
    \n
  • \n
  • (#1259) Added Property Types Reference documentation

    \n
      \n
    • Documents expected data types (text, list, date, number) for all frontmatter properties
    • \n
    • Includes format specifications, examples, and a complete YAML reference
    • \n
    • Thanks to @Oblique82 for the suggestion
    • \n
    \n
  • \n
  • (#1248) Added formula property support for sub-grouping in Bases Task List view

    \n
      \n
    • Formula properties (e.g., formula.myFormula) now appear in the Sub-group by dropdown
    • \n
    • Supports all Bases Value types including strings, numbers, booleans, dates, and lists
    • \n
    • Thanks to @prayidae for the feature request
    • \n
    \n
  • \n
  • (#1070) Added formula property support for swimlanes in Bases Kanban view

    \n
      \n
    • Formula properties now appear in the Swim Lane dropdown
    • \n
    • Fixed swimlanes displaying empty when grouping by formula properties
    • \n
    • Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values)
    • \n
    • Thanks to @cathywu for reporting
    • \n
    \n
  • \n
  • (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views

    \n
      \n
    • Shift+click to select multiple tasks
    • \n
    • Right-click selected tasks to open batch context menu
    • \n
    • Batch operations: change status, priority, due date, scheduled date, archive, delete
    • \n
    • Drag multiple selected cards in Kanban to move them together
    • \n
    • Click the selection count indicator to clear selection
    • \n
    • Thanks to @jalooc and @solidabstract for the feature requests
    • \n
    \n
  • \n
  • (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar)

    \n
      \n
    • Enable via "Enable search box" toggle in view settings
    • \n
    • Searches across title, status, priority, tags, contexts, projects, and visible custom properties
    • \n
    • Press Escape or click × to clear search
    • \n
    • Thanks to @renatomen for the PR
    • \n
    \n
  • \n
  • (#363) Added "Create or open task" command with NLP-based quick task creation

    \n
      \n
    • Open via command palette or assign a hotkey
    • \n
    • Search existing tasks or type natural language to create new tasks (e.g., "Buy groceries tomorrow #shopping")
    • \n
    • Press Enter to select an existing task, Shift+Enter to create a new task
    • \n
    • Real-time preview shows parsed title, due date, priority, tags, and other metadata
    • \n
    • Can be used when adding sub-tasks to create sub-tasks on-the-fly
    • \n
    • Thanks to @luciolebrillante for the feature request
    • \n
    \n
  • \n
  • (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal

    \n
      \n
    • Detects modifications to any field (title, dates, priority, tags, etc.)
    • \n
    • Shows confirmation dialog with Save/Discard/Keep Editing options
    • \n
    • Prevents accidental data loss from clicking outside the modal or pressing Escape
    • \n
    • Thanks to @renatomen for the PR and @0-BSCode for the feature request
    • \n
    \n
  • \n
  • (#904) Added visual highlighting for overdue and past dates on task cards

    \n
      \n
    • Overdue due dates now display in red text
    • \n
    • Past scheduled dates now display in blue text
    • \n
    • Thanks to @ras0q for the suggestion
    • \n
    \n
  • \n
  • (#1164) Added priorityWeight formula to all default Bases templates for priority-based sorting

    \n
      \n
    • Formula maps each priority value to a numeric weight based on your custom priority configuration
    • \n
    • Sort by formula.priorityWeight in ascending order to get highest priority tasks first
    • \n
    • Example: if(priority=="high",0,if(priority=="normal",1,if(priority=="low",2,999)))
    • \n
    • Thanks to @jhedlund for the suggestion
    • \n
    \n
  • \n
  • (#1257), (#1064) Added configurable event stacking options for Bases Calendar view

    \n
      \n
    • Allow events to overlap: Toggle whether timed events visually overlap or display side-by-side in week/day views
    • \n
    • Max stacked events: Limit horizontal event stacking in week/day views (0 = unlimited)
    • \n
    • Max events per day: Limit events shown per day cell in month view (0 = auto based on cell height)
    • \n
    • Max event rows per day: Limit event rows per day cell in month view (0 = unlimited)
    • \n
    • Configure per-view in the Bases Calendar view settings under Layout
    • \n
    • Thanks to @3zra47 and @hasanyilmaz for the feature requests
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Improved inline task conversion to merge TasksPlugin and NLP parsing results

    \n
      \n
    • Previously, if a task had hashtags (e.g., - [ ] Buy milk tomorrow #groceries), NLP parsing was skipped entirely
    • \n
    • Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata
    • \n
    • TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values
    • \n
    • Tags, contexts, and projects from both sources are combined and deduplicated
    • \n
    \n
  • \n
  • Polished task card styling for a more native Obsidian look

    \n
      \n
    • Simplified hover and focus states to use native Obsidian colors
    • \n
    • Removed blur filter and shadows from metadata pills
    • \n
    • Fixed subtask chevron vertical alignment with status dot
    • \n
    • Reduced swimlane label column width in Kanban view
    • \n
    \n
  • \n
  • (#1151) Increased mini calendar heatmap color intensity for better visibility

    \n
      \n
    • Days with notes now show more noticeable colors, especially with low note counts
    • \n
    • Intensity levels increased from 10/25/45/65% to 25/40/55/70%
    • \n
    • Thanks to @arreme for the suggestion
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1271) Fixed custom user fields not appearing in task modals after creation

    \n
      \n
    • New custom fields are now automatically added to both creation and edit modals
    • \n
    • Deleting a custom field also removes it from modal configuration
    • \n
    • Updating a field's display name syncs to the modal configuration
    • \n
    • Thanks to @craziedde for reporting
    • \n
    \n
  • \n
  • (#1256) Fixed links in custom properties not rendering as clickable in task cards

    \n
      \n
    • Wikilinks ([[Note]]) now render correctly in Bases views
    • \n
    • Markdown links ([text](url)) now render correctly in all views
    • \n
    • Links in list-type properties are also properly rendered
    • \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists

    \n
      \n
    • Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line
    • \n
    • Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed
    • \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist

    \n
      \n
    • Thanks to @Anthonyhunter100 for reporting
    • \n
    \n
  • \n
  • (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column

    \n
      \n
    • Tasks with multiple values now appear in each individual column (e.g., a task with contexts: [work, call] appears in both "work" and "call" columns)
    • \n
    • Added "Show items in multiple columns" option (enabled by default) to control this behavior
    • \n
    • Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list
    • \n
    • Fixed swimlane mode to also respect list property explosion
    • \n
    • Thanks to @dictionarymouse for reporting
    • \n
    \n
  • \n
  • (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs

    \n
      \n
    • Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab
    • \n
    • Added middle-click support for opening in new tab
    • \n
    • Thanks to @diegomarzaa for reporting
    • \n
    \n
  • \n
  • (#1265) Fixed task edit modal corrupting markdown-style project links on save

    \n
      \n
    • Links like [Project Name](path.md) were being wrapped in extra brackets: [[[Project Name](path.md)]]
    • \n
    • Plain text project names are now preserved as-is instead of being converted to wikilinks
    • \n
    • Markdown-style project links now resolve properly and display as linked (not orange/unresolved)
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
  • (#1266) Fixed Kanban view scroll position resetting to top of column after any change

    \n
      \n
    • Clicking status dots, priority, or other task properties no longer jumps the column back to top
    • \n
    • Scroll position is now preserved for both regular columns and swimlane cells
    • \n
    • Thanks to @essouflenfer for reporting
    • \n
    \n
  • \n
  • (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects

    \n
      \n
    • Tags like #investigación were being truncated at accented characters (e.g., #investigaci)
    • \n
    • Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., @家, #杂事, @ознакомиться)
    • \n
    • Parser now uses Unicode-aware regex patterns to support all languages and scripts
    • \n
    • Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting
    • \n
    \n
  • \n
  • (#1249) Fixed project preview in task creation modal showing quadruple brackets ([[[[Project]]]])

    \n
      \n
    • Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display
    • \n
    • Thanks to @2vzqwz8tvg-png for reporting
    • \n
    \n
  • \n
  • (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive

    \n
      \n
    • Priority cards are now draggable to reorder (like statuses)
    • \n
    • Priorities are displayed in weight order (lowest to highest priority)
    • \n
    • New priorities are added at the end (highest priority) instead of with a fixed weight
    • \n
    • Thanks to @2vzqwz8tvg-png for reporting
    • \n
    \n
  • \n
  • (#1272) Fixed recurrence anchor not being saved when set to "completion" during task creation

    \n
      \n
    • Selecting "completion" as the recurrence anchor now correctly persists to the task frontmatter
    • \n
    • Thanks to @blaxcky for reporting
    • \n
    \n
  • \n
  • (#1128) Fixed NLP parser not allowing slashes in context names

    \n
      \n
    • Contexts like @shopping/groceries were being split into @shopping and /groceries
    • \n
    • Hierarchical context names now work the same as tags and projects
    • \n
    • Thanks to @wealthychef1 for reporting
    • \n
    \n
  • \n
  • (#1170) Fixed dateCreated and dateModified not using custom property names when creating notes from calendar events

    \n
      \n
    • Notes created from ICS events now respect the field mapping configured in settings
    • \n
    • Thanks to @maddie-m for reporting
    • \n
    \n
  • \n
  • (#1171) Fixed calendar event toggles not responding to changes after initial load

    \n
      \n
    • Toggling "Show scheduled tasks", "Show due tasks", and other event filters now correctly updates the calendar
    • \n
    • Previously, changing these toggles had no effect until the view was reloaded
    • \n
    • Thanks to @hangryscribe3 for reporting
    • \n
    \n
  • \n
  • (#1198) Fixed project links being created relative to the wrong file when editing from Bases views

    \n
      \n
    • Relative paths in project links are now correctly resolved relative to the task note file
    • \n
    • Previously, editing a task from a Bases view would create project links relative to the .base file
    • \n
    • Thanks to @minchinweb for reporting
    • \n
    \n
  • \n
\n","text":"Added# (#1245), (#793) Added custom icon support for task statuses Configure a Lucide icon name (e.g., check, circle, clock) per status in Settings → Task Properties → Task Statuses Icons display instead of the colored dot, inheriting the status color Browse available icons at lucide.dev Improves accessibility by allowing shape-based status differentiation Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators (#1259) Added Property Types Reference documentation Documents expected data types (text, list, date, number) for all frontmatter properties Includes format specifications, examples, and a complete YAML reference Thanks to @Oblique82 for the suggestion (#1248) Added formula property support for sub-grouping in Bases Task List view Formula properties (e.g., formula.myFormula) now appear in the Sub-group by dropdown Supports all Bases Value types including strings, numbers, booleans, dates, and lists Thanks to @prayidae for the feature request (#1070) Added formula property support for swimlanes in Bases Kanban view Formula properties now appear in the Swim Lane dropdown Fixed swimlanes displaying empty when grouping by formula properties Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values) Thanks to @cathywu for reporting (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views Shift+click to select multiple tasks Right-click selected tasks to open batch context menu Batch operations: change status, priority, due date, scheduled date, archive, delete Drag multiple selected cards in Kanban to move them together Click the selection count indicator to clear selection Thanks to @jalooc and @solidabstract for the feature requests (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar) Enable via \"Enable search box\" toggle in view settings Searches across title, status, priority, tags, contexts, projects, and visible custom properties Press Escape or click × to clear search Thanks to @renatomen for the PR (#363) Added \"Create or open task\" command with NLP-based quick task creation Open via command palette or assign a hotkey Search existing tasks or type natural language to create new tasks (e.g., \"Buy groceries tomorrow #shopping\") Press Enter to select an existing task, Shift+Enter to create a new task Real-time preview shows parsed title, due date, priority, tags, and other metadata Can be used when adding sub-tasks to create sub-tasks on-the-fly Thanks to @luciolebrillante for the feature request (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal Detects modifications to any field (title, dates, priority, tags, etc.) Shows confirmation dialog with Save/Discard/Keep Editing options Prevents accidental data loss from clicking outside the modal or pressing Escape Thanks to @renatomen for the PR and @0-BSCode for the feature request (#904) Added visual highlighting for overdue and past dates on task cards Overdue due dates now display in red text Past scheduled dates now display in blue text Thanks to @ras0q for the suggestion (#1164) Added priorityWeight formula to all default Bases templates for priority-based sorting Formula maps each priority value to a numeric weight based on your custom priority configuration Sort by formula.priorityWeight in ascending order to get highest priority tasks first Example: if(priority==\"high\",0,if(priority==\"normal\",1,if(priority==\"low\",2,999))) Thanks to @jhedlund for the suggestion (#1257), (#1064) Added configurable event stacking options for Bases Calendar view Allow events to overlap: Toggle whether timed events visually overlap or display side-by-side in week/day views Max stacked events: Limit horizontal event stacking in week/day views (0 = unlimited) Max events per day: Limit events shown per day cell in month view (0 = auto based on cell height) Max event rows per day: Limit event rows per day cell in month view (0 = unlimited) Configure per-view in the Bases Calendar view settings under Layout Thanks to @3zra47 and @hasanyilmaz for the feature requests Changed# Improved inline task conversion to merge TasksPlugin and NLP parsing results Previously, if a task had hashtags (e.g., - [ ] Buy milk tomorrow #groceries), NLP parsing was skipped entirely Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values Tags, contexts, and projects from both sources are combined and deduplicated Polished task card styling for a more native Obsidian look Simplified hover and focus states to use native Obsidian colors Removed blur filter and shadows from metadata pills Fixed subtask chevron vertical alignment with status dot Reduced swimlane label column width in Kanban view (#1151) Increased mini calendar heatmap color intensity for better visibility Days with notes now show more noticeable colors, especially with low note counts Intensity levels increased from 10/25/45/65% to 25/40/55/70% Thanks to @arreme for the suggestion Fixed# (#1271) Fixed custom user fields not appearing in task modals after creation New custom fields are now automatically added to both creation and edit modals Deleting a custom field also removes it from modal configuration Updating a field's display name syncs to the modal configuration Thanks to @craziedde for reporting (#1256) Fixed links in custom properties not rendering as clickable in task cards Wikilinks ([[Note]]) now render correctly in Bases views Markdown links ([text](url)) now render correctly in all views Links in list-type properties are also properly rendered Thanks to @3zra47 for reporting (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed Thanks to @3zra47 for reporting (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist Thanks to @Anthonyhunter100 for reporting (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column Tasks with multiple values now appear in each individual column (e.g., a task with contexts: [work, call] appears in both \"work\" and \"call\" columns) Added \"Show items in multiple columns\" option (enabled by default) to control this behavior Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list Fixed swimlane mode to also respect list property explosion Thanks to @dictionarymouse for reporting (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab Added middle-click support for opening in new tab Thanks to @diegomarzaa for reporting (#1265) Fixed task edit modal corrupting markdown-style project links on save Links like [Project Name](path.md) were being wrapped in extra brackets: [[[Project Name](path.md)]] Plain text project names are now preserved as-is instead of being converted to wikilinks Markdown-style project links now resolve properly and display as linked (not orange/unresolved) Thanks to @minchinweb for reporting (#1266) Fixed Kanban view scroll position resetting to top of column after any change Clicking status dots, priority, or other task properties no longer jumps the column back to top Scroll position is now preserved for both regular columns and swimlane cells Thanks to @essouflenfer for reporting (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects Tags like #investigación were being truncated at accented characters (e.g., #investigaci) Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., @家, #杂事, @ознакомиться) Parser now uses Unicode-aware regex patterns to support all languages and scripts Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting (#1249) Fixed project preview in task creation modal showing quadruple brackets ([[[[Project]]]]) Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display Thanks to @2vzqwz8tvg-png for reporting (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive Priority cards are now draggable to reorder (like statuses) Priorities are displayed in weight order (lowest to highest priority) New priorities are added at the end (highest priority) instead of with a fixed weight Thanks to @2vzqwz8tvg-png for reporting (#1272) Fixed recurrence anchor not being saved when set to \"completion\" during task creation Selecting \"completion\" as the recurrence anchor now correctly persists to the task frontmatter Thanks to @blaxcky for reporting (#1128) Fixed NLP parser not allowing slashes in context names Contexts like @shopping/groceries were being split into @shopping and /groceries Hierarchical context names now work the same as tags and projects Thanks to @wealthychef1 for reporting (#1170) Fixed dateCreated and dateModified not using custom property names when creating notes from calendar events Notes created from ICS events now respect the field mapping configured in settings Thanks to @maddie-m for reporting (#1171) Fixed calendar event toggles not responding to changes after initial load Toggling \"Show scheduled tasks\", \"Show due tasks\", and other event filters now correctly updates the calendar Previously, changing these toggles had no effect until the view was reloaded Thanks to @hangryscribe3 for reporting (#1198) Fixed project links being created relative to the wrong file when editing from Bases views Relative paths in project links are now correctly resolved relative to the task note file Previously, editing a task from a Bases view would create project links relative to the .base file Thanks to @minchinweb for reporting"},{"route":"/obsidian/releases/4.1.1/","title":"TaskNotes 4.1.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.1.md","namespace":"obsidian","relativePath":"releases/4.1.1.md","raw":"# TaskNotes 4.1.1\n\n## Added\n\n- (#1277) Icon autosuggestion for custom status settings\n - Type to search through all available Lucide icons\n - Thanks to @Arachnidai for the suggestion\n- New formula properties in default Base templates\n - **Date calculations**: `daysUntilDue`, `daysUntilScheduled`, `daysSinceCreated`, `daysSinceModified`\n - **Boolean helpers**: `isOverdue`, `isDueToday`, `isDueThisWeek`, `isScheduledToday`, `isRecurring`, `hasTimeEstimate`\n - **Time tracking**: `timeRemaining`, `efficiencyRatio`, `timeTrackedThisWeek`, `timeTrackedToday`, `timeTrackedFormatted`\n - **Grouping**: `dueMonth`, `dueWeek`, `scheduledMonth`, `scheduledWeek`, `dueDateCategory`, `timeEstimateCategory`, `ageCategory`, `createdMonth`, `modifiedMonth`, `priorityCategory`, `projectCount`, `contextCount`, `trackingStatus`\n - **Combined due/scheduled**: `nextDate`, `daysUntilNext`, `hasDate`, `isToday`, `isThisWeek`, `nextDateCategory`, `nextDateMonth`, `nextDateWeek` - work with whichever date comes first\n - **Sorting**: `priorityWeight`, `urgencyScore` (combines priority with date proximity)\n - **Display**: `dueDateDisplay` (relative dates like \"Today\", \"Tomorrow\", \"3d ago\")\n - Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first\n - See [Default Base Templates documentation](https://tasknotes.dev/views/default-base-templates) for full details\n - **Note**: To get these new formulas, either copy them from the documentation, or delete your `.base` files in `TaskNotes/Views/` and restart Obsidian to regenerate them\n\n## Changed\n\n- (#1282) Added spacing between task title and metadata in inline task widgets for improved readability\n - Thanks to @3zra47 for the suggestion\n- Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals)\n- Added embedded video guide for Google Calendar OAuth setup in documentation\n - Thanks to [@antoneheyward](https://www.youtube.com/@antoneheyward) for the tutorial\n\n## Fixed\n\n- (#1279) Fixed Kanban column width setting not being respected on mobile devices\n - Thanks to @guncav for reporting\n- (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening\n - The bug caused `complete_instances` to record the next day instead of the user's current calendar day\n - Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps\n\n","aliases":["/releases/4.1.1/","/releases/4.1.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1277) Icon autosuggestion for custom status settings
      \n
    • Type to search through all available Lucide icons
    • \n
    • Thanks to @Arachnidai for the suggestion
    • \n
    \n
  • \n
  • New formula properties in default Base templates
      \n
    • Date calculations: daysUntilDue, daysUntilScheduled, daysSinceCreated, daysSinceModified
    • \n
    • Boolean helpers: isOverdue, isDueToday, isDueThisWeek, isScheduledToday, isRecurring, hasTimeEstimate
    • \n
    • Time tracking: timeRemaining, efficiencyRatio, timeTrackedThisWeek, timeTrackedToday, timeTrackedFormatted
    • \n
    • Grouping: dueMonth, dueWeek, scheduledMonth, scheduledWeek, dueDateCategory, timeEstimateCategory, ageCategory, createdMonth, modifiedMonth, priorityCategory, projectCount, contextCount, trackingStatus
    • \n
    • Combined due/scheduled: nextDate, daysUntilNext, hasDate, isToday, isThisWeek, nextDateCategory, nextDateMonth, nextDateWeek - work with whichever date comes first
    • \n
    • Sorting: priorityWeight, urgencyScore (combines priority with date proximity)
    • \n
    • Display: dueDateDisplay (relative dates like "Today", "Tomorrow", "3d ago")
    • \n
    • Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first
    • \n
    • See Default Base Templates documentation for full details
    • \n
    • Note: To get these new formulas, either copy them from the documentation, or delete your .base files in TaskNotes/Views/ and restart Obsidian to regenerate them
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • (#1282) Added spacing between task title and metadata in inline task widgets for improved readability
      \n
    • Thanks to @3zra47 for the suggestion
    • \n
    \n
  • \n
  • Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals)
  • \n
  • Added embedded video guide for Google Calendar OAuth setup in documentation\n
  • \n
\n

Fixed#

\n
    \n
  • (#1279) Fixed Kanban column width setting not being respected on mobile devices
      \n
    • Thanks to @guncav for reporting
    • \n
    \n
  • \n
  • (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening
      \n
    • The bug caused complete_instances to record the next day instead of the user's current calendar day
    • \n
    • Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps
    • \n
    \n
  • \n
\n","text":"Added# (#1277) Icon autosuggestion for custom status settings Type to search through all available Lucide icons Thanks to @Arachnidai for the suggestion New formula properties in default Base templates Date calculations: daysUntilDue, daysUntilScheduled, daysSinceCreated, daysSinceModified Boolean helpers: isOverdue, isDueToday, isDueThisWeek, isScheduledToday, isRecurring, hasTimeEstimate Time tracking: timeRemaining, efficiencyRatio, timeTrackedThisWeek, timeTrackedToday, timeTrackedFormatted Grouping: dueMonth, dueWeek, scheduledMonth, scheduledWeek, dueDateCategory, timeEstimateCategory, ageCategory, createdMonth, modifiedMonth, priorityCategory, projectCount, contextCount, trackingStatus Combined due/scheduled: nextDate, daysUntilNext, hasDate, isToday, isThisWeek, nextDateCategory, nextDateMonth, nextDateWeek - work with whichever date comes first Sorting: priorityWeight, urgencyScore (combines priority with date proximity) Display: dueDateDisplay (relative dates like \"Today\", \"Tomorrow\", \"3d ago\") Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first See Default Base Templates documentation for full details Note: To get these new formulas, either copy them from the documentation, or delete your .base files in TaskNotes/Views/ and restart Obsidian to regenerate them Changed# (#1282) Added spacing between task title and metadata in inline task widgets for improved readability Thanks to @3zra47 for the suggestion Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals) Added embedded video guide for Google Calendar OAuth setup in documentation Thanks to @antoneheyward for the tutorial Fixed# (#1279) Fixed Kanban column width setting not being respected on mobile devices Thanks to @guncav for reporting (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening The bug caused complete_instances to record the next day instead of the user's current calendar day Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps"},{"route":"/obsidian/releases/4.1.2/","title":"TaskNotes 4.1.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.2.md","namespace":"obsidian","relativePath":"releases/4.1.2.md","raw":"# TaskNotes 4.1.2\n\n## Fixed\n\n- Significant performance improvements for Bases views (TaskList, Kanban, Calendar)\n - Reduced `extractDataItems` time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks)\n - Computed file properties (`file.backlinks`, `file.links`, etc.) are now fetched lazily during render instead of upfront\n - Only visible items (with virtualization) trigger expensive property computations\n - Added debouncing to `onDataUpdated` to prevent UI freezes during typing\n - Timeblock generation now uses Obsidian's metadataCache instead of file reads\n - Added date range filtering for calendar events to skip events outside visible range\n - (#1285) Calendar view uses 5-second debounce to prevent flickering while typing\n\t - Thanks to @steven-murray for reporting\n- Calendar view switching (month/week/day/list) is now much faster\n - View type is now saved on unload instead of on every change\n- Fixed task edit modal archive button being too narrow on mobile devices\n- (#1319) Added missing properties to Field Mapping settings\n - `recurrence_anchor` - now in Settings > Task Properties > Task Details\n - `skipped_instances` - now in Settings > Task Properties > Metadata Properties\n - Thanks to @kazerniel for reporting\n- (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits\n - Text that cannot fit in the filename is now preserved in the task note's body\n - Thanks to @prayidae for reporting\n- (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible\n - Thanks to @Richard-UMPV for reporting\n- (#1317) Fixed project autosuggest filters not working correctly when only \"Required Property Key\" is configured\n - NLP `+` trigger now properly filters by property existence when no property value is specified\n - Modal \"Add to project\" button now shows consistent results with inline autosuggest\n - Thanks to @JacksonMcDonaldDev for reporting\n- (#1287), (#1307) The \"New\" button in Bases views now opens the TaskNotes creation modal\n - Tasks created from Bases views now respect default properties (status, priority, etc.)\n - Tasks are now created in the configured default folder instead of the views folder\n - Thanks to @anareaty and @sylvainfct-dot for reporting\n- (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI\n - Added instructions for configuring via Azure manifest editor\n - Thanks to @PlecotusAustriacus for reporting\n\n## Added\n\n- (#803) New command \"Convert current note to task\" to add task properties to an existing note\n - Thanks to @GardarikanetS and @diegomarzaa for suggesting\n- (#1080) Custom user fields now support default values\n - Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list\n - Defaults are applied when creating tasks via modal, instant conversion, \"Create or open task\" command, or HTTP API\n - Thanks to @bradyrx for suggesting\n\n## Changed\n\n- Added documentation link to settings panel (links to tasknotes.dev)\n- Reorganized settings panel for improved discoverability\n - Removed \"Defaults\" tab - default values are now configured alongside each property in the Task Properties tab\n - Moved task filename format settings to the Title property section\n - Moved project autosuggest settings to the Projects property section\n - Body template setting moved to the Features tab\n - Added descriptions to each property explaining its purpose\n - Moved \"Folder for converted tasks\" setting to General tab under Task Storage for better discoverability\n - Updated setting description to clarify that leaving empty uses the default tasks folder\n\n","aliases":["/releases/4.1.2/","/releases/4.1.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • Significant performance improvements for Bases views (TaskList, Kanban, Calendar)
      \n
    • Reduced extractDataItems time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks)
    • \n
    • Computed file properties (file.backlinks, file.links, etc.) are now fetched lazily during render instead of upfront
    • \n
    • Only visible items (with virtualization) trigger expensive property computations
    • \n
    • Added debouncing to onDataUpdated to prevent UI freezes during typing
    • \n
    • Timeblock generation now uses Obsidian's metadataCache instead of file reads
    • \n
    • Added date range filtering for calendar events to skip events outside visible range
    • \n
    • (#1285) Calendar view uses 5-second debounce to prevent flickering while typing
        \n
      • Thanks to @steven-murray for reporting
      • \n
      \n
    • \n
    \n
  • \n
  • Calendar view switching (month/week/day/list) is now much faster
      \n
    • View type is now saved on unload instead of on every change
    • \n
    \n
  • \n
  • Fixed task edit modal archive button being too narrow on mobile devices
  • \n
  • (#1319) Added missing properties to Field Mapping settings
      \n
    • recurrence_anchor - now in Settings > Task Properties > Task Details
    • \n
    • skipped_instances - now in Settings > Task Properties > Metadata Properties
    • \n
    • Thanks to @kazerniel for reporting
    • \n
    \n
  • \n
  • (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits
      \n
    • Text that cannot fit in the filename is now preserved in the task note's body
    • \n
    • Thanks to @prayidae for reporting
    • \n
    \n
  • \n
  • (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible
      \n
    • Thanks to @Richard-UMPV for reporting
    • \n
    \n
  • \n
  • (#1317) Fixed project autosuggest filters not working correctly when only "Required Property Key" is configured
      \n
    • NLP + trigger now properly filters by property existence when no property value is specified
    • \n
    • Modal "Add to project" button now shows consistent results with inline autosuggest
    • \n
    • Thanks to @JacksonMcDonaldDev for reporting
    • \n
    \n
  • \n
  • (#1287), (#1307) The "New" button in Bases views now opens the TaskNotes creation modal
      \n
    • Tasks created from Bases views now respect default properties (status, priority, etc.)
    • \n
    • Tasks are now created in the configured default folder instead of the views folder
    • \n
    • Thanks to @anareaty and @sylvainfct-dot for reporting
    • \n
    \n
  • \n
  • (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI
      \n
    • Added instructions for configuring via Azure manifest editor
    • \n
    • Thanks to @PlecotusAustriacus for reporting
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#803) New command "Convert current note to task" to add task properties to an existing note
      \n
    • Thanks to @GardarikanetS and @diegomarzaa for suggesting
    • \n
    \n
  • \n
  • (#1080) Custom user fields now support default values
      \n
    • Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list
    • \n
    • Defaults are applied when creating tasks via modal, instant conversion, "Create or open task" command, or HTTP API
    • \n
    • Thanks to @bradyrx for suggesting
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Added documentation link to settings panel (links to tasknotes.dev)
  • \n
  • Reorganized settings panel for improved discoverability
      \n
    • Removed "Defaults" tab - default values are now configured alongside each property in the Task Properties tab
    • \n
    • Moved task filename format settings to the Title property section
    • \n
    • Moved project autosuggest settings to the Projects property section
    • \n
    • Body template setting moved to the Features tab
    • \n
    • Added descriptions to each property explaining its purpose
    • \n
    • Moved "Folder for converted tasks" setting to General tab under Task Storage for better discoverability
    • \n
    • Updated setting description to clarify that leaving empty uses the default tasks folder
    • \n
    \n
  • \n
\n","text":"Fixed# Significant performance improvements for Bases views (TaskList, Kanban, Calendar) Reduced extractDataItems time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks) Computed file properties (file.backlinks, file.links, etc.) are now fetched lazily during render instead of upfront Only visible items (with virtualization) trigger expensive property computations Added debouncing to onDataUpdated to prevent UI freezes during typing Timeblock generation now uses Obsidian's metadataCache instead of file reads Added date range filtering for calendar events to skip events outside visible range (#1285) Calendar view uses 5-second debounce to prevent flickering while typing Thanks to @steven-murray for reporting Calendar view switching (month/week/day/list) is now much faster View type is now saved on unload instead of on every change Fixed task edit modal archive button being too narrow on mobile devices (#1319) Added missing properties to Field Mapping settings recurrence_anchor - now in Settings > Task Properties > Task Details skipped_instances - now in Settings > Task Properties > Metadata Properties Thanks to @kazerniel for reporting (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits Text that cannot fit in the filename is now preserved in the task note's body Thanks to @prayidae for reporting (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible Thanks to @Richard-UMPV for reporting (#1317) Fixed project autosuggest filters not working correctly when only \"Required Property Key\" is configured NLP + trigger now properly filters by property existence when no property value is specified Modal \"Add to project\" button now shows consistent results with inline autosuggest Thanks to @JacksonMcDonaldDev for reporting (#1287), (#1307) The \"New\" button in Bases views now opens the TaskNotes creation modal Tasks created from Bases views now respect default properties (status, priority, etc.) Tasks are now created in the configured default folder instead of the views folder Thanks to @anareaty and @sylvainfct-dot for reporting (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI Added instructions for configuring via Azure manifest editor Thanks to @PlecotusAustriacus for reporting Added# (#803) New command \"Convert current note to task\" to add task properties to an existing note Thanks to @GardarikanetS and @diegomarzaa for suggesting (#1080) Custom user fields now support default values Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list Defaults are applied when creating tasks via modal, instant conversion, \"Create or open task\" command, or HTTP API Thanks to @bradyrx for suggesting Changed# Added documentation link to settings panel (links to tasknotes.dev) Reorganized settings panel for improved discoverability Removed \"Defaults\" tab - default values are now configured alongside each property in the Task Properties tab Moved task filename format settings to the Title property section Moved project autosuggest settings to the Projects property section Body template setting moved to the Features tab Added descriptions to each property explaining its purpose Moved \"Folder for converted tasks\" setting to General tab under Task Storage for better discoverability Updated setting description to clarify that leaving empty uses the default tasks folder"},{"route":"/obsidian/releases/4.1.3/","title":"TaskNotes 4.1.3","description":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.1.3.md","namespace":"obsidian","relativePath":"releases/4.1.3.md","raw":"# TaskNotes 4.1.3\n\nThis patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals. \n\n## Added\n\n- Split layout for task modals on wide screens (900px+)\n - Details editor appears in a dedicated right column when the modal is expanded\n - New setting \"Split layout on wide screens\" in Modal Fields settings tab to toggle this behavior\n - Improves usability by showing form fields and details side-by-side\n\n## Fixed\n\n- (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions\n - Initial calendar load is now immediate again\n - User interactions (drag/drop, creating timeblocks, etc.) respond instantly\n - Removed redundant date filtering (FullCalendar handles this more efficiently)\n - Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting\n","aliases":["/releases/4.1.3/","/releases/4.1.3/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable "split" view to the task creation/edit modals.

\n

Added#

\n
    \n
  • Split layout for task modals on wide screens (900px+)
      \n
    • Details editor appears in a dedicated right column when the modal is expanded
    • \n
    • New setting "Split layout on wide screens" in Modal Fields settings tab to toggle this behavior
    • \n
    • Improves usability by showing form fields and details side-by-side
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions
      \n
    • Initial calendar load is now immediate again
    • \n
    • User interactions (drag/drop, creating timeblocks, etc.) respond instantly
    • \n
    • Removed redundant date filtering (FullCalendar handles this more efficiently)
    • \n
    • Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting
    • \n
    \n
  • \n
\n","text":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals. Added# Split layout for task modals on wide screens (900px+) Details editor appears in a dedicated right column when the modal is expanded New setting \"Split layout on wide screens\" in Modal Fields settings tab to toggle this behavior Improves usability by showing form fields and details side-by-side Fixed# (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions Initial calendar load is now immediate again User interactions (drag/drop, creating timeblocks, etc.) respond instantly Removed redundant date filtering (FullCalendar handles this more efficiently) Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting"},{"route":"/obsidian/releases/4.10.0/","title":"TaskNotes 4.10.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.10.0.md","namespace":"obsidian","relativePath":"releases/4.10.0.md","raw":"# TaskNotes 4.10.0\n\n## Added\n\n- **New companion plugin:** TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See [TaskNotes Workflows](https://tasknotes.dev/companion-plugins/tasknotes-workflows/).\n - (#1530) `Auto-start time tracking` starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up.\n - (#222, #184) `Stop time tracking on complete` stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up.\n - (#265) `Stamp started timestamp` records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion.\n - (#1703) `Clear scheduled when started` clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request.\n - (#1293) `Rollover overdue scheduled tasks` moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request.\n - (#1896) `Escalate upcoming due tasks` raises priority as due dates approach. Thanks to @Neptune-Illusion for the request.\n - (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion.\n - (#1166) `Blocked task review` provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up.\n- Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See [JavaScript API](https://tasknotes.dev/javascript-api/).\n- Added documentation for the companion-plugin model. See [Companion Plugins](https://tasknotes.dev/companion-plugins/).\n- (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#materialized-occurrence-notes) and [Property Types Reference](https://tasknotes.dev/settings/property-types-reference/#materialized-occurrence-properties). Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests.\n- (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request.\n- (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs.\n\n## Changed\n\n- Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling.\n- Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's `occurrence_date` identity. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#calendar-drag-and-drop).\n- Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode.\n\n## Fixed\n\n- (#1976) Fixed embedded Calendar and Agenda Bases so \"Navigate to date from property\" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this.\n- (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this.\n- Fixed the release notes view using cramped interface typography instead of regular reading typography.\n- (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion.\n- (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events.\n- (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this.\n- (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this.\n- (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views.\n- (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue.\n","aliases":["/releases/4.10.0/","/releases/4.10.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • New companion plugin: TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See TaskNotes Workflows.
      \n
    • (#1530) Auto-start time tracking starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up.
    • \n
    • (#222, #184) Stop time tracking on complete stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up.
    • \n
    • (#265) Stamp started timestamp records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion.
    • \n
    • (#1703) Clear scheduled when started clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request.
    • \n
    • (#1293) Rollover overdue scheduled tasks moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request.
    • \n
    • (#1896) Escalate upcoming due tasks raises priority as due dates approach. Thanks to @Neptune-Illusion for the request.
    • \n
    • (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion.
    • \n
    • (#1166) Blocked task review provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up.
    • \n
    \n
  • \n
  • Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See JavaScript API.
  • \n
  • Added documentation for the companion-plugin model. See Companion Plugins.
  • \n
  • (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See Recurring Tasks and Property Types Reference. Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests.
  • \n
  • (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request.
  • \n
  • (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs.
  • \n
\n

Changed#

\n
    \n
  • Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling.
  • \n
  • Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's occurrence_date identity. See Recurring Tasks.
  • \n
  • Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode.
  • \n
\n

Fixed#

\n
    \n
  • (#1976) Fixed embedded Calendar and Agenda Bases so "Navigate to date from property" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this.
  • \n
  • (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this.
  • \n
  • Fixed the release notes view using cramped interface typography instead of regular reading typography.
  • \n
  • (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion.
  • \n
  • (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events.
  • \n
  • (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this.
  • \n
  • (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this.
  • \n
  • (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views.
  • \n
  • (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue.
  • \n
\n","text":"Added# New companion plugin: TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See TaskNotes Workflows. (#1530) Auto-start time tracking starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up. (#222, #184) Stop time tracking on complete stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up. (#265) Stamp started timestamp records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion. (#1703) Clear scheduled when started clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request. (#1293) Rollover overdue scheduled tasks moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request. (#1896) Escalate upcoming due tasks raises priority as due dates approach. Thanks to @Neptune-Illusion for the request. (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion. (#1166) Blocked task review provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up. Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See JavaScript API. Added documentation for the companion-plugin model. See Companion Plugins. (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See Recurring Tasks and Property Types Reference. Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests. (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request. (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs. Changed# Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling. Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's occurrence_date identity. See Recurring Tasks. Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode. Fixed# (#1976) Fixed embedded Calendar and Agenda Bases so \"Navigate to date from property\" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this. (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this. Fixed the release notes view using cramped interface typography instead of regular reading typography. (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion. (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events. (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this. (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this. (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views. (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue."},{"route":"/obsidian/releases/4.10.1/","title":"TaskNotes 4.10.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.10.1.md","namespace":"obsidian","relativePath":"releases/4.10.1.md","raw":"# TaskNotes 4.10.1\n\n## Added\n\n- Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser.\n- (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default `.base` files from the current TaskNotes templates. Thanks to @businessBoris for the request.\n- (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap.\n\n## Fixed\n\n- (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots.\n- (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this.\n- (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot.\n- (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting.\n- (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot.\n- (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor.\n- (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting.\n- (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this.\n","aliases":["/releases/4.10.1/","/releases/4.10.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser.
  • \n
  • (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default .base files from the current TaskNotes templates. Thanks to @businessBoris for the request.
  • \n
  • (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap.
  • \n
\n

Fixed#

\n
    \n
  • (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots.
  • \n
  • (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this.
  • \n
  • (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot.
  • \n
  • (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting.
  • \n
  • (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot.
  • \n
  • (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor.
  • \n
  • (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting.
  • \n
  • (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this.
  • \n
\n","text":"Added# Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser. (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default .base files from the current TaskNotes templates. Thanks to @businessBoris for the request. (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap. Fixed# (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots. (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this. (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting. (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor. (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting. (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this."},{"route":"/obsidian/releases/4.10.2/","title":"TaskNotes 4.10.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.10.2.md","namespace":"obsidian","relativePath":"releases/4.10.2.md","raw":"# TaskNotes 4.10.2\n\n## Fixed\n\n- (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this.\n- (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this.\n","aliases":["/releases/4.10.2/","/releases/4.10.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this.
  • \n
  • (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this.
  • \n
\n","text":"Fixed# (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this. (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this."},{"route":"/obsidian/releases/4.11.0/","title":"TaskNotes 4.11.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.11.0.md","namespace":"obsidian","relativePath":"releases/4.11.0.md","raw":"# TaskNotes 4.11.0\n\n## Added\n\n- (#730, #1897, #1942, #1998) Added [Canvas Bases](https://github.com/callumalpass/canvas-bases), an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See [Canvas Bases](https://tasknotes.dev/companion-plugins/canvas-bases/) for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion.\n- Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views.\n- Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu.\n- (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split.\n- (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level `occurrence_template` support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request.\n- (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See [Pomodoro View](https://tasknotes.dev/views/pomodoro-view/) for the timer behavior. Thanks to @abbiefalls90 for suggesting this.\n- (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See [Integrations Settings](https://tasknotes.dev/settings/integrations/#calendar-subscriptions-ics) for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion.\n\n## Changed\n\n- (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback.\n- (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this.\n- Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission.\n- Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes.\n- Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans.\n- Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened.\n\n## Fixed\n\n- (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this.\n- (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this.\n- (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this.\n- (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this.\n- (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this.\n- (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this.\n- Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped `blockedBy` property from the note.\n","aliases":["/releases/4.11.0/","/releases/4.11.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#730, #1897, #1942, #1998) Added Canvas Bases, an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See Canvas Bases for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion.
  • \n
  • Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views.
  • \n
  • Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu.
  • \n
  • (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split.
  • \n
  • (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level occurrence_template support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request.
  • \n
  • (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See Pomodoro View for the timer behavior. Thanks to @abbiefalls90 for suggesting this.
  • \n
  • (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See Integrations Settings for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion.
  • \n
\n

Changed#

\n
    \n
  • (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback.
  • \n
  • (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this.
  • \n
  • Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission.
  • \n
  • Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes.
  • \n
  • Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans.
  • \n
  • Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened.
  • \n
\n

Fixed#

\n
    \n
  • (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this.
  • \n
  • (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this.
  • \n
  • (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this.
  • \n
  • (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this.
  • \n
  • (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this.
  • \n
  • Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped blockedBy property from the note.
  • \n
\n","text":"Added# (#730, #1897, #1942, #1998) Added Canvas Bases, an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See Canvas Bases for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion. Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views. Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu. (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split. (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level occurrence_template support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request. (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See Pomodoro View for the timer behavior. Thanks to @abbiefalls90 for suggesting this. (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See Integrations Settings for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion. Changed# (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback. (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this. Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission. Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes. Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans. Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened. Fixed# (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this. (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this. (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this. (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this. (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this. (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this. Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped blockedBy property from the note."},{"route":"/obsidian/releases/4.11.1/","title":"TaskNotes 4.11.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.11.1.md","namespace":"obsidian","relativePath":"releases/4.11.1.md","raw":"# TaskNotes 4.11.1\n\n## Added\n\n- (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an **Occurrences** tab. See [Relationships Widget](https://tasknotes.dev/features/inline-tasks/#relationships-widget). Thanks to @3zra47 for requesting this.\n- (#2022) Added a **Skip instance** / **Unskip instance** action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#completion-tracking). Thanks to @AmonAmarthFTW for requesting this.\n- (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this.\n- (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this.\n- (#2060) Added date-type custom fields to the task right-click menu under **Custom dates**. Thanks to @chmac for requesting this.\n- (#2067) Added an **Edit task** action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this.\n- (#2068) Added `reminders` input support to the MCP `tasknotes_create_task` and `tasknotes_update_task` tools. Thanks to @Spirit597 for requesting this.\n- (#2069) Added an **Add project** action to the Quick Actions palette. Thanks to @chmac for requesting this.\n\n## Fixed\n\n- (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report.\n- (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this.\n- (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this.\n- (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this.\n- (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this.\n- (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this.\n- (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this.\n- (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this.\n- (#2079) Fixed the reminder modal's **Absolute** tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue.\n\n## Changed\n\n- Improved local review checks so unsafe direct `Object.prototype` method access is caught before submission.\n","aliases":["/releases/4.11.1/","/releases/4.11.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Added#

\n
    \n
  • (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an Occurrences tab. See Relationships Widget. Thanks to @3zra47 for requesting this.
  • \n
  • (#2022) Added a Skip instance / Unskip instance action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See Recurring Tasks. Thanks to @AmonAmarthFTW for requesting this.
  • \n
  • (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this.
  • \n
  • (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this.
  • \n
  • (#2060) Added date-type custom fields to the task right-click menu under Custom dates. Thanks to @chmac for requesting this.
  • \n
  • (#2067) Added an Edit task action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this.
  • \n
  • (#2068) Added reminders input support to the MCP tasknotes_create_task and tasknotes_update_task tools. Thanks to @Spirit597 for requesting this.
  • \n
  • (#2069) Added an Add project action to the Quick Actions palette. Thanks to @chmac for requesting this.
  • \n
\n

Fixed#

\n
    \n
  • (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report.
  • \n
  • (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this.
  • \n
  • (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this.
  • \n
  • (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this.
  • \n
  • (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this.
  • \n
  • (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this.
  • \n
  • (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this.
  • \n
  • (#2079) Fixed the reminder modal's Absolute tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue.
  • \n
\n

Changed#

\n
    \n
  • Improved local review checks so unsafe direct Object.prototype method access is caught before submission.
  • \n
\n","text":"Added# (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an Occurrences tab. See Relationships Widget. Thanks to @3zra47 for requesting this. (#2022) Added a Skip instance / Unskip instance action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See Recurring Tasks. Thanks to @AmonAmarthFTW for requesting this. (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this. (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this. (#2060) Added date-type custom fields to the task right-click menu under Custom dates. Thanks to @chmac for requesting this. (#2067) Added an Edit task action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this. (#2068) Added reminders input support to the MCP tasknotes_create_task and tasknotes_update_task tools. Thanks to @Spirit597 for requesting this. (#2069) Added an Add project action to the Quick Actions palette. Thanks to @chmac for requesting this. Fixed# (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report. (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this. (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this. (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this. (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this. (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this. (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this. (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this. (#2079) Fixed the reminder modal's Absolute tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue. Changed# Improved local review checks so unsafe direct Object.prototype method access is caught before submission."},{"route":"/obsidian/releases/4.12.0/","title":"TaskNotes 4.12.0","description":"[!info] TaskNotes v5 beta","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.12.0.md","namespace":"obsidian","relativePath":"releases/4.12.0.md","raw":"# TaskNotes 4.12.0\n\n> [!info] TaskNotes v5 beta\n>\n> [TaskNotes v5](https://github.com/callumalpass/tasknotes/releases/tag/5.0.0-beta.0) is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.\n>\n> The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the [TaskNotes app](https://app.tasknotes.dev/), which is also available in beta, so the same tasks can be managed through either interface.\n>\n> TaskNotes collections are built on [mdbase](https://mdbase.dev/), a Markdown-native collection format. [mdbase Connect](https://mdbase.dev/connect/) provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.\n>\n> TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and [report any problems you encounter](https://github.com/callumalpass/tasknotes/issues).\n\n## Security\n\n- Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' `data.json`, with automatic migration for existing connections. See [Calendar Integration](https://tasknotes.dev/features/calendar-integration/).\n - Thanks to @mcuste for the contribution\n- Updated bundled HTTP, address parsing, and schema validation dependencies to\n versions containing their current security fixes.\n\n## Added\n\n- Added portable task attachment references. Attachments now round-trip as an\n ordered `attachments` link list in task frontmatter and are exposed through\n the TaskNotes model and runtime API. These are collection-file references\n only; attachment bytes and binary metadata remain owned by the host.\n- (#2142) MCP `tasknotes_create_task` and `tasknotes_update_task` now accept\n `customProperties` for configured TaskNotes user fields. Thanks to\n @phillipadsmith for suggesting this.\n- (#2126, #2134) Added optional filename templates for materialized recurring\n occurrence notes, with explicit date, ISO week, month, year, and month-name\n variables plus per-parent overrides. Existing naming remains unchanged until a\n template is configured. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/#occurrence-filenames).\n Thanks to @raphaelfaouakhiri for reporting and implementing this.\n- (#2105) Added `{{projectFolder}}` and `{{projectFolders}}` folder template\n variables for storing tasks alongside linked project notes. See\n [Template Variables](https://tasknotes.dev/features/template-variables/).\n Thanks to @carypruitt for this contribution.\n\n## Changed\n\n- Generated TaskNotes type contracts now include configured natural-language\n capture triggers, allowing compatible clients to offer the same field\n suggestions.\n- Rebuilt the TaskNotes documentation with\n reorganized navigation, full-text search, mobile and accessibility\n improvements, and references generated from the current commands, settings,\n compatibility metadata, HTTP routes, and default Bases. Added practical\n guides for adopting TaskNotes in an existing vault, mobile use, custom Bases,\n and backup and recovery. See the\n [TaskNotes documentation](https://tasknotes.dev/).\n- (#2088) Convert current note to task now uses your default scheduled date when\n the note does not already have `scheduled` frontmatter, while the **None**\n default still leaves converted notes unscheduled. See\n [Task Properties](https://tasknotes.dev/settings/task-properties/#scheduled-date).\n Thanks to @e-zz for suggesting this.\n\n## Fixed\n\n- Plugin settings now recover when Obsidian briefly returns no data while\n reloading an externally changed settings file, preventing a post-reload error\n without overwriting the existing settings.\n- (#2194) Pomodoro task selection suggestions now keep rich task cards at the\n menu width, preventing task titles from wrapping one letter per line. Thanks\n to @Evilgenee for reporting this.\n- (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview\n notes, matching the behavior of directly opened Bases and Reading mode embeds.\n Thanks to @jimbo108108 for reporting this.\n- (#2198) Agenda Bases can now show overdue scheduled or due tasks on today's\n row with `showOverdueOnToday`, and regenerated default Agenda files enable\n that behavior by default. Thanks to @vicrdguez for reporting this.\n- (#2182) Checklist progress on task cards now excludes cancelled markdown\n checklist items such as `[-]` from the completed/total count. Thanks to\n @ctrl-q for reporting this.\n- (#2180) Inline task cards in Live Preview now keep their click and context menu\n handlers active on Obsidian 1.13, so clicking a rendered task link opens the\n edit modal instead of revealing the raw wikilink. Thanks to @npondel for the\n detailed diagnosis and @minchinweb for confirming the issue.\n- (#2171) Stopped recurring\n notification and status-bar scans from reading unindexed notes directly from\n disk while preserving the fallback for direct task lookups. Thanks to\n @tgrosinger for identifying and diagnosing the excessive vault reads.\n- (#2174) **Open or create occurrence note** from Quick Actions now uses the\n recurring task's scheduled occurrence date, preventing duplicate occurrence\n notes keyed to the day the action was run. Thanks to @chmac for reporting\n this.\n- (#2169) Regenerated default Base views now include tasks whose identifying\n property is stored as a list containing the configured task value. Thanks to\n @GlebYavorski for reporting this.\n- (#2166) Fixed Task List views configured to start collapsed so the first\n chevron click expands only the selected group instead of expanding every\n other group. Thanks to @renatomen for reporting and fixing this.\n- (#2165) **Convert current note to task** now reads configured field mappings,\n including list-valued title fields such as `aliases`, and preserves an\n existing aliases list when the title is unchanged. Thanks to @jkuball for\n reporting this.\n- (#2164) Flat Kanban boards now clear stale swimlane layout state when they\n rerender, preventing columns from occasionally stacking into one vertical\n strip after switching tabs. Thanks to @brienna for reporting this.\n- (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status\n property and configuration block. Rich Bases status values render as their\n configured labels, while pinned columns and saved column order are honored.\n Thanks to @kevin-4c for the detailed reports and diagnosis.\n- (#2111, #2159) Recurring task instances now remain visible through the final\n day of Calendar and Agenda ranges in positive-offset time zones, regardless\n of the configured first day of the week. Thanks to @Arachnidai and @odxn0803\n for reporting this.\n- (#2155) Regenerated default Calendar Bases now inherit the app-level time slot\n duration instead of hardcoding 30 minutes. Existing per-Base time settings\n remain intentional overrides. Thanks to @SZZ504232 for reporting this.\n- (#2154) Timed ICS events without a `TZID` now preserve their floating wall\n time in the user's local timezone instead of being interpreted as UTC. Thanks\n to @cloesophia for the reproducible calendar sample.\n- (#2152) Fixed paginated Google Calendar refreshes for calendars with many\n events so secondary calendars do not disappear after Google returns a second\n page. Thanks to @wobafett for reporting and diagnosing this.\n- (#2141) Fixed Task List groups for tasks without scheduled or due dates showing\n a raw Bases icon object instead of **None**. Thanks to @ks-studio-net for\n reporting this.\n- (#2140) The edit task modal now shows saved task-identification tags when\n hiding identification tags is disabled. Thanks to @3zra47 for reporting this.\n- (#2148) Empty list-like frontmatter values no longer become literal `\"null\"`\n entries when tasks are edited. Thanks to @minchinweb for reporting this.\n- (#2120, #2135) Long all-day event titles in Calendar week and day views now\n truncate instead of stretching the all-day row. Thanks to @same774 and\n @ks-studio-net for reporting this.\n- (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately\n after moving a task between list-valued swimlanes such as contexts. Thanks to\n @Decia-C for reporting this.\n- (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring\n task now advances the parent from the moved occurrence date instead of an\n earlier original occurrence date. Thanks to @chrabia for reporting this.\n- (#2113) Failed Google Calendar manual refreshes no longer make the next\n immediate refresh show a misleading success notice. Thanks to @JohWQ for\n reporting this.\n- (#2109) TaskNotes no longer injects instant-conversion controls into embedded\n or detached Markdown editors, preventing checkbox notes opened from unrelated\n Bases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear\n reproduction and recording.\n- (#2107, #2108) Creating tasks with **Store title in filename** enabled now\n handles duplicate or case-variant titles without failing or replacing the task\n title with a suffixed filename. Thanks to @AdmiralClackington for reporting and\n diagnosing this.\n- (#2106) Regenerated default Calendar Base files now use your configured first\n day of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly,\n @idontcode34, and @hikatamika for reporting this.\n- (#2100) Tags added while creating a task now keep the same frontmatter order as\n tags added later from the task context menu. Thanks to @mgrecar for reporting\n this.\n- (#2092) New non-recurring tasks created directly in a completed status now get\n a completed date, so completed-date views can find them immediately. Thanks\n to @Crell for reporting this.\n- (#2096) Fixed TaskNotes Kanban swimlanes falling back to **None** when the\n swimlane used a Bases formula that was not already cached by Bases. Thanks to\n @ddevaal for reporting this.\n- (#2093) TaskNotes now retries custom Bases view registration when the Bases\n core plugin is enabled after TaskNotes, preventing default views from showing\n **Unknown view type** until TaskNotes is reloaded. Thanks to @yaye-work for\n reporting this.\n- (#2084) The Relationships widget no longer prevents editor text selection from\n autoscrolling when dragging below the bottom edge of a task note. Thanks to\n @lostwildland for reporting this.\n- (#2081, #2103) Kept task card and relationships widgets visible in reading mode\n when Obsidian scroll or preview updates remove their DOM, and refreshed visible\n widgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and\n debugging this and @martin-forge for fixing it.\n- (#2064, #2066) Recurring tasks now advance correctly after their next\n scheduled date is manually adjusted, preserving due-date offsets and times\n without jumping back to an earlier occurrence. Thanks to @chmac for reporting\n and fixing this.\n- (#2018) Fixed **Hide empty columns** in Kanban views with swimlanes so columns\n with no visible tasks are hidden while pinned columns remain. Thanks to\n @scottTomaszewski for reporting and fixing this.\n- Fixed recurring all-day ICS subscription events keeping the original end date\n on later instances, which could cause calendar list views to show events under\n the wrong day. Thanks to @abbiefalls90.\n- (#2033) Fixed the project folder badge on task cards so, when expandable\n subtasks are enabled, it expands or collapses inline subtasks instead of\n showing an unavailable-action notice. Thanks to @abbiefalls90 for the fix and\n @scottkodai for the follow-up feedback.\n- (#2040, #2041) Stopped newly created tasks from filling the Google Calendar\n retry queue when calendar export is disabled. Thanks to @chmac for reporting\n and fixing this.\n- (#2046, #2051) The date and time picker now focuses the natural-language input\n when it is enabled, making keyboard-driven quick actions ready for immediate\n typing. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it.\n- (#2125, #2129) Materialized recurring occurrence notes now record the date\n they were actually completed, while the parent recurring task continues to\n track the occurrence date. Thanks to @raphaelfaouakhiri for reporting and\n fixing this.\n- (#2173, #2175) Completion-anchored recurring tasks with materialized\n occurrence notes now schedule the next occurrence from the day the occurrence\n was actually completed. Thanks to @chmac for reporting and fixing this.\n- (#1982) Preserved the Task List's own scroll position during Bases refreshes so\n long mobile lists do not jump back to the top after task updates. Thanks to\n @3zra47 for the follow-up report.\n- (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar\n IDs instead of failing local validation before contacting Microsoft Graph.\n Thanks to @fmacondray for reporting this and providing the follow-up stack\n trace.\n","aliases":["/releases/4.12.0/","/releases/4.12.0/"],"toc":[{"level":2,"id":"security","text":"Security"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

[!info] TaskNotes v5 beta

\n

TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.

\n

The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface.

\n

TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.

\n

TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter.

\n
\n

Security#

\n
    \n
  • Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' data.json, with automatic migration for existing connections. See Calendar Integration.
      \n
    • Thanks to @mcuste for the contribution
    • \n
    \n
  • \n
  • Updated bundled HTTP, address parsing, and schema validation dependencies to\nversions containing their current security fixes.
  • \n
\n

Added#

\n
    \n
  • Added portable task attachment references. Attachments now round-trip as an\nordered attachments link list in task frontmatter and are exposed through\nthe TaskNotes model and runtime API. These are collection-file references\nonly; attachment bytes and binary metadata remain owned by the host.
  • \n
  • (#2142) MCP tasknotes_create_task and tasknotes_update_task now accept\ncustomProperties for configured TaskNotes user fields. Thanks to\n@phillipadsmith for suggesting this.
  • \n
  • (#2126, #2134) Added optional filename templates for materialized recurring\noccurrence notes, with explicit date, ISO week, month, year, and month-name\nvariables plus per-parent overrides. Existing naming remains unchanged until a\ntemplate is configured. See Recurring Tasks.\nThanks to @raphaelfaouakhiri for reporting and implementing this.
  • \n
  • (#2105) Added {{projectFolder}} and {{projectFolders}} folder template\nvariables for storing tasks alongside linked project notes. See\nTemplate Variables.\nThanks to @carypruitt for this contribution.
  • \n
\n

Changed#

\n
    \n
  • Generated TaskNotes type contracts now include configured natural-language\ncapture triggers, allowing compatible clients to offer the same field\nsuggestions.
  • \n
  • Rebuilt the TaskNotes documentation with\nreorganized navigation, full-text search, mobile and accessibility\nimprovements, and references generated from the current commands, settings,\ncompatibility metadata, HTTP routes, and default Bases. Added practical\nguides for adopting TaskNotes in an existing vault, mobile use, custom Bases,\nand backup and recovery. See the\nTaskNotes documentation.
  • \n
  • (#2088) Convert current note to task now uses your default scheduled date when\nthe note does not already have scheduled frontmatter, while the None\ndefault still leaves converted notes unscheduled. See\nTask Properties.\nThanks to @e-zz for suggesting this.
  • \n
\n

Fixed#

\n
    \n
  • Plugin settings now recover when Obsidian briefly returns no data while\nreloading an externally changed settings file, preventing a post-reload error\nwithout overwriting the existing settings.
  • \n
  • (#2194) Pomodoro task selection suggestions now keep rich task cards at the\nmenu width, preventing task titles from wrapping one letter per line. Thanks\nto @Evilgenee for reporting this.
  • \n
  • (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview\nnotes, matching the behavior of directly opened Bases and Reading mode embeds.\nThanks to @jimbo108108 for reporting this.
  • \n
  • (#2198) Agenda Bases can now show overdue scheduled or due tasks on today's\nrow with showOverdueOnToday, and regenerated default Agenda files enable\nthat behavior by default. Thanks to @vicrdguez for reporting this.
  • \n
  • (#2182) Checklist progress on task cards now excludes cancelled markdown\nchecklist items such as [-] from the completed/total count. Thanks to\n@ctrl-q for reporting this.
  • \n
  • (#2180) Inline task cards in Live Preview now keep their click and context menu\nhandlers active on Obsidian 1.13, so clicking a rendered task link opens the\nedit modal instead of revealing the raw wikilink. Thanks to @npondel for the\ndetailed diagnosis and @minchinweb for confirming the issue.
  • \n
  • (#2171) Stopped recurring\nnotification and status-bar scans from reading unindexed notes directly from\ndisk while preserving the fallback for direct task lookups. Thanks to\n@tgrosinger for identifying and diagnosing the excessive vault reads.
  • \n
  • (#2174) Open or create occurrence note from Quick Actions now uses the\nrecurring task's scheduled occurrence date, preventing duplicate occurrence\nnotes keyed to the day the action was run. Thanks to @chmac for reporting\nthis.
  • \n
  • (#2169) Regenerated default Base views now include tasks whose identifying\nproperty is stored as a list containing the configured task value. Thanks to\n@GlebYavorski for reporting this.
  • \n
  • (#2166) Fixed Task List views configured to start collapsed so the first\nchevron click expands only the selected group instead of expanding every\nother group. Thanks to @renatomen for reporting and fixing this.
  • \n
  • (#2165) Convert current note to task now reads configured field mappings,\nincluding list-valued title fields such as aliases, and preserves an\nexisting aliases list when the title is unchanged. Thanks to @jkuball for\nreporting this.
  • \n
  • (#2164) Flat Kanban boards now clear stale swimlane layout state when they\nrerender, preventing columns from occasionally stacking into one vertical\nstrip after switching tabs. Thanks to @brienna for reporting this.
  • \n
  • (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status\nproperty and configuration block. Rich Bases status values render as their\nconfigured labels, while pinned columns and saved column order are honored.\nThanks to @kevin-4c for the detailed reports and diagnosis.
  • \n
  • (#2111, #2159) Recurring task instances now remain visible through the final\nday of Calendar and Agenda ranges in positive-offset time zones, regardless\nof the configured first day of the week. Thanks to @Arachnidai and @odxn0803\nfor reporting this.
  • \n
  • (#2155) Regenerated default Calendar Bases now inherit the app-level time slot\nduration instead of hardcoding 30 minutes. Existing per-Base time settings\nremain intentional overrides. Thanks to @SZZ504232 for reporting this.
  • \n
  • (#2154) Timed ICS events without a TZID now preserve their floating wall\ntime in the user's local timezone instead of being interpreted as UTC. Thanks\nto @cloesophia for the reproducible calendar sample.
  • \n
  • (#2152) Fixed paginated Google Calendar refreshes for calendars with many\nevents so secondary calendars do not disappear after Google returns a second\npage. Thanks to @wobafett for reporting and diagnosing this.
  • \n
  • (#2141) Fixed Task List groups for tasks without scheduled or due dates showing\na raw Bases icon object instead of None. Thanks to @ks-studio-net for\nreporting this.
  • \n
  • (#2140) The edit task modal now shows saved task-identification tags when\nhiding identification tags is disabled. Thanks to @3zra47 for reporting this.
  • \n
  • (#2148) Empty list-like frontmatter values no longer become literal "null"\nentries when tasks are edited. Thanks to @minchinweb for reporting this.
  • \n
  • (#2120, #2135) Long all-day event titles in Calendar week and day views now\ntruncate instead of stretching the all-day row. Thanks to @same774 and\n@ks-studio-net for reporting this.
  • \n
  • (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately\nafter moving a task between list-valued swimlanes such as contexts. Thanks to\n@Decia-C for reporting this.
  • \n
  • (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring\ntask now advances the parent from the moved occurrence date instead of an\nearlier original occurrence date. Thanks to @chrabia for reporting this.
  • \n
  • (#2113) Failed Google Calendar manual refreshes no longer make the next\nimmediate refresh show a misleading success notice. Thanks to @JohWQ for\nreporting this.
  • \n
  • (#2109) TaskNotes no longer injects instant-conversion controls into embedded\nor detached Markdown editors, preventing checkbox notes opened from unrelated\nBases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear\nreproduction and recording.
  • \n
  • (#2107, #2108) Creating tasks with Store title in filename enabled now\nhandles duplicate or case-variant titles without failing or replacing the task\ntitle with a suffixed filename. Thanks to @AdmiralClackington for reporting and\ndiagnosing this.
  • \n
  • (#2106) Regenerated default Calendar Base files now use your configured first\nday of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly,\n@idontcode34, and @hikatamika for reporting this.
  • \n
  • (#2100) Tags added while creating a task now keep the same frontmatter order as\ntags added later from the task context menu. Thanks to @mgrecar for reporting\nthis.
  • \n
  • (#2092) New non-recurring tasks created directly in a completed status now get\na completed date, so completed-date views can find them immediately. Thanks\nto @Crell for reporting this.
  • \n
  • (#2096) Fixed TaskNotes Kanban swimlanes falling back to None when the\nswimlane used a Bases formula that was not already cached by Bases. Thanks to\n@ddevaal for reporting this.
  • \n
  • (#2093) TaskNotes now retries custom Bases view registration when the Bases\ncore plugin is enabled after TaskNotes, preventing default views from showing\nUnknown view type until TaskNotes is reloaded. Thanks to @yaye-work for\nreporting this.
  • \n
  • (#2084) The Relationships widget no longer prevents editor text selection from\nautoscrolling when dragging below the bottom edge of a task note. Thanks to\n@lostwildland for reporting this.
  • \n
  • (#2081, #2103) Kept task card and relationships widgets visible in reading mode\nwhen Obsidian scroll or preview updates remove their DOM, and refreshed visible\nwidgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and\ndebugging this and @martin-forge for fixing it.
  • \n
  • (#2064, #2066) Recurring tasks now advance correctly after their next\nscheduled date is manually adjusted, preserving due-date offsets and times\nwithout jumping back to an earlier occurrence. Thanks to @chmac for reporting\nand fixing this.
  • \n
  • (#2018) Fixed Hide empty columns in Kanban views with swimlanes so columns\nwith no visible tasks are hidden while pinned columns remain. Thanks to\n@scottTomaszewski for reporting and fixing this.
  • \n
  • Fixed recurring all-day ICS subscription events keeping the original end date\non later instances, which could cause calendar list views to show events under\nthe wrong day. Thanks to @abbiefalls90.
  • \n
  • (#2033) Fixed the project folder badge on task cards so, when expandable\nsubtasks are enabled, it expands or collapses inline subtasks instead of\nshowing an unavailable-action notice. Thanks to @abbiefalls90 for the fix and\n@scottkodai for the follow-up feedback.
  • \n
  • (#2040, #2041) Stopped newly created tasks from filling the Google Calendar\nretry queue when calendar export is disabled. Thanks to @chmac for reporting\nand fixing this.
  • \n
  • (#2046, #2051) The date and time picker now focuses the natural-language input\nwhen it is enabled, making keyboard-driven quick actions ready for immediate\ntyping. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it.
  • \n
  • (#2125, #2129) Materialized recurring occurrence notes now record the date\nthey were actually completed, while the parent recurring task continues to\ntrack the occurrence date. Thanks to @raphaelfaouakhiri for reporting and\nfixing this.
  • \n
  • (#2173, #2175) Completion-anchored recurring tasks with materialized\noccurrence notes now schedule the next occurrence from the day the occurrence\nwas actually completed. Thanks to @chmac for reporting and fixing this.
  • \n
  • (#1982) Preserved the Task List's own scroll position during Bases refreshes so\nlong mobile lists do not jump back to the top after task updates. Thanks to\n@3zra47 for the follow-up report.
  • \n
  • (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar\nIDs instead of failing local validation before contacting Microsoft Graph.\nThanks to @fmacondray for reporting this and providing the follow-up stack\ntrace.
  • \n
\n","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Security# Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' data.json, with automatic migration for existing connections. See Calendar Integration. Thanks to @mcuste for the contribution Updated bundled HTTP, address parsing, and schema validation dependencies to versions containing their current security fixes. Added# Added portable task attachment references. Attachments now round-trip as an ordered attachments link list in task frontmatter and are exposed through the TaskNotes model and runtime API. These are collection-file references only; attachment bytes and binary metadata remain owned by the host. (#2142) MCP tasknotes_create_task and tasknotes_update_task now accept customProperties for configured TaskNotes user fields. Thanks to @phillipadsmith for suggesting this. (#2126, #2134) Added optional filename templates for materialized recurring occurrence notes, with explicit date, ISO week, month, year, and month-name variables plus per-parent overrides. Existing naming remains unchanged until a template is configured. See Recurring Tasks. Thanks to @raphaelfaouakhiri for reporting and implementing this. (#2105) Added {{projectFolder}} and {{projectFolders}} folder template variables for storing tasks alongside linked project notes. See Template Variables. Thanks to @carypruitt for this contribution. Changed# Generated TaskNotes type contracts now include configured natural-language capture triggers, allowing compatible clients to offer the same field suggestions. Rebuilt the TaskNotes documentation with reorganized navigation, full-text search, mobile and accessibility improvements, and references generated from the current commands, settings, compatibility metadata, HTTP routes, and default Bases. Added practical guides for adopting TaskNotes in an existing vault, mobile use, custom Bases, and backup and recovery. See the TaskNotes documentation. (#2088) Convert current note to task now uses your default scheduled date when the note does not already have scheduled frontmatter, while the None default still leaves converted notes unscheduled. See Task Properties. Thanks to @e-zz for suggesting this. Fixed# Plugin settings now recover when Obsidian briefly returns no data while reloading an externally changed settings file, preventing a post-reload error without overwriting the existing settings. (#2194) Pomodoro task selection suggestions now keep rich task cards at the menu width, preventing task titles from wrapping one letter per line. Thanks to @Evilgenee for reporting this. (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview notes, matching the behavior of directly opened Bases and Reading mode embeds. Thanks to @jimbo108108 for reporting this. (#2198) Agenda Bases can now show overdue scheduled or due tasks on today's row with showOverdueOnToday, and regenerated default Agenda files enable that behavior by default. Thanks to @vicrdguez for reporting this. (#2182) Checklist progress on task cards now excludes cancelled markdown checklist items such as [-] from the completed/total count. Thanks to @ctrl-q for reporting this. (#2180) Inline task cards in Live Preview now keep their click and context menu handlers active on Obsidian 1.13, so clicking a rendered task link opens the edit modal instead of revealing the raw wikilink. Thanks to @npondel for the detailed diagnosis and @minchinweb for confirming the issue. (#2171) Stopped recurring notification and status-bar scans from reading unindexed notes directly from disk while preserving the fallback for direct task lookups. Thanks to @tgrosinger for identifying and diagnosing the excessive vault reads. (#2174) Open or create occurrence note from Quick Actions now uses the recurring task's scheduled occurrence date, preventing duplicate occurrence notes keyed to the day the action was run. Thanks to @chmac for reporting this. (#2169) Regenerated default Base views now include tasks whose identifying property is stored as a list containing the configured task value. Thanks to @GlebYavorski for reporting this. (#2166) Fixed Task List views configured to start collapsed so the first chevron click expands only the selected group instead of expanding every other group. Thanks to @renatomen for reporting and fixing this. (#2165) Convert current note to task now reads configured field mappings, including list-valued title fields such as aliases, and preserves an existing aliases list when the title is unchanged. Thanks to @jkuball for reporting this. (#2164) Flat Kanban boards now clear stale swimlane layout state when they rerender, preventing columns from occasionally stacking into one vertical strip after switching tabs. Thanks to @brienna for reporting this. (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status property and configuration block. Rich Bases status values render as their configured labels, while pinned columns and saved column order are honored. Thanks to @kevin-4c for the detailed reports and diagnosis. (#2111, #2159) Recurring task instances now remain visible through the final day of Calendar and Agenda ranges in positive-offset time zones, regardless of the configured first day of the week. Thanks to @Arachnidai and @odxn0803 for reporting this. (#2155) Regenerated default Calendar Bases now inherit the app-level time slot duration instead of hardcoding 30 minutes. Existing per-Base time settings remain intentional overrides. Thanks to @SZZ504232 for reporting this. (#2154) Timed ICS events without a TZID now preserve their floating wall time in the user's local timezone instead of being interpreted as UTC. Thanks to @cloesophia for the reproducible calendar sample. (#2152) Fixed paginated Google Calendar refreshes for calendars with many events so secondary calendars do not disappear after Google returns a second page. Thanks to @wobafett for reporting and diagnosing this. (#2141) Fixed Task List groups for tasks without scheduled or due dates showing a raw Bases icon object instead of None. Thanks to @ks-studio-net for reporting this. (#2140) The edit task modal now shows saved task-identification tags when hiding identification tags is disabled. Thanks to @3zra47 for reporting this. (#2148) Empty list-like frontmatter values no longer become literal \"null\" entries when tasks are edited. Thanks to @minchinweb for reporting this. (#2120, #2135) Long all-day event titles in Calendar week and day views now truncate instead of stretching the all-day row. Thanks to @same774 and @ks-studio-net for reporting this. (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately after moving a task between list-valued swimlanes such as contexts. Thanks to @Decia-C for reporting this. (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring task now advances the parent from the moved occurrence date instead of an earlier original occurrence date. Thanks to @chrabia for reporting this. (#2113) Failed Google Calendar manual refreshes no longer make the next immediate refresh show a misleading success notice. Thanks to @JohWQ for reporting this. (#2109) TaskNotes no longer injects instant-conversion controls into embedded or detached Markdown editors, preventing checkbox notes opened from unrelated Bases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear reproduction and recording. (#2107, #2108) Creating tasks with Store title in filename enabled now handles duplicate or case-variant titles without failing or replacing the task title with a suffixed filename. Thanks to @AdmiralClackington for reporting and diagnosing this. (#2106) Regenerated default Calendar Base files now use your configured first day of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly, @idontcode34, and @hikatamika for reporting this. (#2100) Tags added while creating a task now keep the same frontmatter order as tags added later from the task context menu. Thanks to @mgrecar for reporting this. (#2092) New non-recurring tasks created directly in a completed status now get a completed date, so completed-date views can find them immediately. Thanks to @Crell for reporting this. (#2096) Fixed TaskNotes Kanban swimlanes falling back to None when the swimlane used a Bases formula that was not already cached by Bases. Thanks to @ddevaal for reporting this. (#2093) TaskNotes now retries custom Bases view registration when the Bases core plugin is enabled after TaskNotes, preventing default views from showing Unknown view type until TaskNotes is reloaded. Thanks to @yaye-work for reporting this. (#2084) The Relationships widget no longer prevents editor text selection from autoscrolling when dragging below the bottom edge of a task note. Thanks to @lostwildland for reporting this. (#2081, #2103) Kept task card and relationships widgets visible in reading mode when Obsidian scroll or preview updates remove their DOM, and refreshed visible widgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and debugging this and @martin-forge for fixing it. (#2064, #2066) Recurring tasks now advance correctly after their next scheduled date is manually adjusted, preserving due-date offsets and times without jumping back to an earlier occurrence. Thanks to @chmac for reporting and fixing this. (#2018) Fixed Hide empty columns in Kanban views with swimlanes so columns with no visible tasks are hidden while pinned columns remain. Thanks to @scottTomaszewski for reporting and fixing this. Fixed recurring all-day ICS subscription events keeping the original end date on later instances, which could cause calendar list views to show events under the wrong day. Thanks to @abbiefalls90. (#2033) Fixed the project folder badge on task cards so, when expandable subtasks are enabled, it expands or collapses inline subtasks instead of showing an unavailable-action notice. Thanks to @abbiefalls90 for the fix and @scottkodai for the follow-up feedback. (#2040, #2041) Stopped newly created tasks from filling the Google Calendar retry queue when calendar export is disabled. Thanks to @chmac for reporting and fixing this. (#2046, #2051) The date and time picker now focuses the natural-language input when it is enabled, making keyboard-driven quick actions ready for immediate typing. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it. (#2125, #2129) Materialized recurring occurrence notes now record the date they were actually completed, while the parent recurring task continues to track the occurrence date. Thanks to @raphaelfaouakhiri for reporting and fixing this. (#2173, #2175) Completion-anchored recurring tasks with materialized occurrence notes now schedule the next occurrence from the day the occurrence was actually completed. Thanks to @chmac for reporting and fixing this. (#1982) Preserved the Task List's own scroll position during Bases refreshes so long mobile lists do not jump back to the top after task updates. Thanks to @3zra47 for the follow-up report. (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar IDs instead of failing local validation before contacting Microsoft Graph. Thanks to @fmacondray for reporting this and providing the follow-up stack trace."},{"route":"/obsidian/releases/4.12.1/","title":"TaskNotes 4.12.1","description":"[!info] TaskNotes v5 beta","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.12.1.md","namespace":"obsidian","relativePath":"releases/4.12.1.md","raw":"# TaskNotes 4.12.1\n\n> [!info] TaskNotes v5 beta\n>\n> [TaskNotes v5](https://github.com/callumalpass/tasknotes/releases/tag/5.0.0-beta.0) is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.\n>\n> The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the [TaskNotes app](https://app.tasknotes.dev/), which is also available in beta, so the same tasks can be managed through either interface.\n>\n> TaskNotes collections are built on [mdbase](https://mdbase.dev/), a Markdown-native collection format. [mdbase Connect](https://mdbase.dev/connect/) provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.\n>\n> TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and [report any problems you encounter](https://github.com/callumalpass/tasknotes/issues).\n\n## Changed\n\n- (#2204) Public documentation is now published from the dedicated `tasknotes.dev` repository. Plugin release notes and internal documentation remain in this repository.\n- Updated compatibility with Obsidian's current plugin review and settings search.\n\n## Fixed\n\n- Fixed TaskNotes interface elements sometimes appearing in the wrong window when using Obsidian pop-out windows.\n- Improved confirmation dialogs, icons, and modal styling to use Obsidian's current interface APIs.\n","aliases":["/releases/4.12.1/","/releases/4.12.1/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

[!info] TaskNotes v5 beta

\n

TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.

\n

The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface.

\n

TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.

\n

TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter.

\n
\n

Changed#

\n
    \n
  • (#2204) Public documentation is now published from the dedicated tasknotes.dev repository. Plugin release notes and internal documentation remain in this repository.
  • \n
  • Updated compatibility with Obsidian's current plugin review and settings search.
  • \n
\n

Fixed#

\n
    \n
  • Fixed TaskNotes interface elements sometimes appearing in the wrong window when using Obsidian pop-out windows.
  • \n
  • Improved confirmation dialogs, icons, and modal styling to use Obsidian's current interface APIs.
  • \n
\n","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Changed# (#2204) Public documentation is now published from the dedicated tasknotes.dev repository. Plugin release notes and internal documentation remain in this repository. Updated compatibility with Obsidian's current plugin review and settings search. Fixed# Fixed TaskNotes interface elements sometimes appearing in the wrong window when using Obsidian pop-out windows. Improved confirmation dialogs, icons, and modal styling to use Obsidian's current interface APIs."},{"route":"/obsidian/releases/4.12.2/","title":"TaskNotes 4.12.2","description":"[!info] TaskNotes v5 beta","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.12.2.md","namespace":"obsidian","relativePath":"releases/4.12.2.md","raw":"# TaskNotes 4.12.2\n\n> [!info] TaskNotes v5 beta\n>\n> [TaskNotes v5](https://github.com/callumalpass/tasknotes/releases/tag/5.0.0-beta.0) is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.\n>\n> The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the [TaskNotes app](https://app.tasknotes.dev/), which is also available in beta, so the same tasks can be managed through either interface.\n>\n> TaskNotes collections are built on [mdbase](https://mdbase.dev/), a Markdown-native collection format. [mdbase Connect](https://mdbase.dev/connect/) provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.\n>\n> TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and [report any problems you encounter](https://github.com/callumalpass/tasknotes/issues).\n\n## Fixed\n\n- (#2212) Fixed TaskNotes settings sections appearing pushed across the Obsidian settings pane on desktop. Thanks to @RafaQNunes for reporting this.\n","aliases":["/releases/4.12.2/","/releases/4.12.2/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

[!info] TaskNotes v5 beta

\n

TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.

\n

The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface.

\n

TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.

\n

TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter.

\n
\n

Fixed#

\n
    \n
  • (#2212) Fixed TaskNotes settings sections appearing pushed across the Obsidian settings pane on desktop. Thanks to @RafaQNunes for reporting this.
  • \n
\n","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Fixed# (#2212) Fixed TaskNotes settings sections appearing pushed across the Obsidian settings pane on desktop. Thanks to @RafaQNunes for reporting this."},{"route":"/obsidian/releases/4.12.3/","title":"TaskNotes 4.12.3","description":"[!info] TaskNotes v5 beta","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.12.3.md","namespace":"obsidian","relativePath":"releases/4.12.3.md","raw":"# TaskNotes 4.12.3\n\n> [!info] TaskNotes v5 beta\n>\n> [TaskNotes v5](https://github.com/callumalpass/tasknotes/releases/tag/5.0.0-beta.0) is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.\n>\n> The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the [TaskNotes app](https://app.tasknotes.dev/), which is also available in beta, so the same tasks can be managed through either interface.\n>\n> TaskNotes collections are built on [mdbase](https://mdbase.dev/), a Markdown-native collection format. [mdbase Connect](https://mdbase.dev/connect/) provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.\n>\n> TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and [report any problems you encounter](https://github.com/callumalpass/tasknotes/issues).\n\n## Fixed\n\n- (#2212) Fixed TaskNotes settings sections appearing offscreen or blank on\n Obsidian 1.13 desktop. Thanks to @RafaQNunes for reporting this, and to\n @m4to-3pe and @matthewrishii for confirming it remained in 4.12.2.\n- (#2213) Runtime plugin-data updates now avoid writing when Obsidian cannot\n safely read an existing TaskNotes `data.json`, preventing calendar sync,\n Pomodoro, ICS, or auto-archive state writes from replacing saved settings.\n Thanks to @3zra47 for the follow-up details and file-history evidence.\n- (#2216) Fixed updated default Kanban Bases grouping every task into the\n `None` column when grouping by status. The generated Kanban templates now use\n the real status property, and existing Kanban files using `task.status` keep\n grouping from TaskNotes task data. Thanks to @Esvorst for reporting this.\n- (#2120, #2135) Long all-day event titles in Calendar week and day views now\n truncate in the all-day row instead of stretching it vertically. Thanks to\n @same774 and @ks-studio-net for reporting this, and to @Admorei for confirming\n it remained in 4.12.2.\n","aliases":["/releases/4.12.3/","/releases/4.12.3/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"
\n

[!info] TaskNotes v5 beta

\n

TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release.

\n

The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface.

\n

TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand.

\n

TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter.

\n
\n

Fixed#

\n
    \n
  • (#2212) Fixed TaskNotes settings sections appearing offscreen or blank on\nObsidian 1.13 desktop. Thanks to @RafaQNunes for reporting this, and to\n@m4to-3pe and @matthewrishii for confirming it remained in 4.12.2.
  • \n
  • (#2213) Runtime plugin-data updates now avoid writing when Obsidian cannot\nsafely read an existing TaskNotes data.json, preventing calendar sync,\nPomodoro, ICS, or auto-archive state writes from replacing saved settings.\nThanks to @3zra47 for the follow-up details and file-history evidence.
  • \n
  • (#2216) Fixed updated default Kanban Bases grouping every task into the\nNone column when grouping by status. The generated Kanban templates now use\nthe real status property, and existing Kanban files using task.status keep\ngrouping from TaskNotes task data. Thanks to @Esvorst for reporting this.
  • \n
  • (#2120, #2135) Long all-day event titles in Calendar week and day views now\ntruncate in the all-day row instead of stretching it vertically. Thanks to\n@same774 and @ks-studio-net for reporting this, and to @Admorei for confirming\nit remained in 4.12.2.
  • \n
\n","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Fixed# (#2212) Fixed TaskNotes settings sections appearing offscreen or blank on Obsidian 1.13 desktop. Thanks to @RafaQNunes for reporting this, and to @m4to-3pe and @matthewrishii for confirming it remained in 4.12.2. (#2213) Runtime plugin-data updates now avoid writing when Obsidian cannot safely read an existing TaskNotes data.json, preventing calendar sync, Pomodoro, ICS, or auto-archive state writes from replacing saved settings. Thanks to @3zra47 for the follow-up details and file-history evidence. (#2216) Fixed updated default Kanban Bases grouping every task into the None column when grouping by status. The generated Kanban templates now use the real status property, and existing Kanban files using task.status keep grouping from TaskNotes task data. Thanks to @Esvorst for reporting this. (#2120, #2135) Long all-day event titles in Calendar week and day views now truncate in the all-day row instead of stretching it vertically. Thanks to @same774 and @ks-studio-net for reporting this, and to @Admorei for confirming it remained in 4.12.2."},{"route":"/obsidian/releases/4.2.0/","title":"TaskNotes 4.2.0","description":"Added Korean (한국어) language support","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.2.0.md","namespace":"obsidian","relativePath":"releases/4.2.0.md","raw":"# TaskNotes 4.2.0\n\n## Added\n\n- Added Korean (한국어) language support\n - Full translation of all 1911 localization keys\n - Korean language option now available in Settings → General → Language\n\n- Adopted Obsidian 1.11.0 API features with backwards compatibility\n - Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+)\n - Settings sections now use native `SettingGroup` for improved visual grouping (Obsidian 1.11.0+)\n - Falls back gracefully to traditional section headers on older Obsidian versions\n\n- (#59) Added `shortYear` template variable for custom filename and folder templates\n - Use `{shortYear}` in filename templates (e.g., \"25\" for 2025)\n - Use `{{shortYear}}` in folder templates\n - Thanks to @Pixeltica for the feature request\n\n- (#1393) Option to prevent auto-creation of default Base view files on startup\n - New \"Auto-create default files\" toggle in Settings → Integrations → Bases Integration\n - When disabled, deleted sample Base files will not be recreated on plugin load\n - The manual \"Create Default Files\" button remains available for on-demand recreation\n - Thanks to @wealthychef1 for the feature request\n\n- (#1408) Shift+click on status icon to cycle backwards through statuses\n - Normal click cycles forward through status order\n - Shift+click cycles in reverse order\n - Thanks to @JerryLu086 for the feature request\n\n- (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled\n - Previously required pressing 'i' before typing when Obsidian vim mode was active\n - The modal now automatically enters insert mode on focus, allowing immediate typing\n - Thanks to @Leo310 for the feature request\n\n- Added button tooltips to calendar view toolbar\n - Hovering over navigation and view buttons now shows descriptive hints\n - Buttons include: Today, Previous, Next, Month, Week, Day, Year, List\n\n- Added tooltips to task modal action icons\n - Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover\n - Improves discoverability for new users\n\n- (#503) Settings now sync automatically across devices via Obsidian Sync\n - Changes to custom statuses, priorities, and other settings apply immediately without restart\n - Thanks to @jhedlund for the feature request and @l-mb for the implementation\n\n- (#1403) Kanban view option to consolidate status icons in column headers\n - New \"Show status icon in column header only\" toggle in Kanban view settings (disabled by default)\n - When enabled and grouped by status, shows the icon in the column header and hides it on cards\n - Reduces visual redundancy when the column already indicates the status\n - Thanks to @l-mb for the feature request and implementation\n\n- (#1401) Calendar view option to span tasks between scheduled and due dates\n - New \"Span tasks between scheduled and due dates\" toggle in Calendar view Layout settings\n - When enabled, tasks with both scheduled and due dates display as multi-day bars\n - Provides Gantt chart-style visualization for project planning\n - Thanks to @0atman for the feature request\n\n- (#1334) `{{currentNotePath}}` now works for \"Create new inline task\" command\n - The inline task folder setting with `{{currentNotePath}}` previously only worked for checkbox conversion\n - Now also applies when using the \"Create new inline task\" command from the command palette\n - Thanks to @kmaustral for the feature request\n\n- (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel\n - New \"Mobile sidebar\" setting in Settings → Features → Pomodoro Timer\n - Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar\n - Allows quick swipe access to the timer without switching notes on mobile devices\n - Thanks to @Evthestrike for the feature request\n\n- (#1220) Option to use ICS event end time as task due date\n - New \"Use ICS event end time as task due date\" toggle in Settings → Integrations → Calendar Subscriptions\n - When enabled, tasks created from calendar events will have their due date set to the event's end time\n - For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec)\n - For timed events, includes the exact end time\n - Defaults to disabled to preserve existing behavior\n - Thanks to @MiserMagus for the feature request\n\n- (#1108) Option to use task duration instead of due date for ICS calendar export\n - New \"Use task duration for event length\" toggle in Settings → Integrations → Automatic ICS Export\n - When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND\n - This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines\n - When disabled (default), preserves existing behavior using due date as DTEND\n - Thanks to @bepolymathe for the feature request\n\n## Fixed\n\n- (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified\n - Input like \"Task scheduled for tomorrow due next week\" now correctly sets both scheduled and due dates\n - Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers\n - Thanks to @wealthychef1 for reporting\n\n- (#1384) Fixed title being sanitized even when \"Store Task Title in Filename\" is disabled\n - Characters like `?`, `<`, `>`, `:`, etc. are now preserved in task titles when they won't be used in filenames\n - When `storeTitleInFilename` is false, only minimal sanitization (whitespace normalization, control character removal) is applied\n - Thanks to @allison-casey for reporting\n\n- (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view\n - Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon\n - Changed default Agenda template to disable property-based events (`showPropertyBasedEvents: false`)\n - Users can re-enable property-based events in view settings if needed for non-task date properties\n - Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting\n\n- (#1386) Fixed `timeEstimateCategory` formula showing \"Long (>2h)\" instead of \"No estimate\" for new tasks\n - The condition didn't properly handle null values when `timeEstimate` property is unset\n - Also fixed the same issue in `trackingStatus` formula\n - Thanks to @nicou for reporting and @osxisl for the PR\n\n- (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes\n - Also fixed CalendarView corrupting other view files when saving state on unload\n - Thanks to @music-soul1-1 for reporting\n\n- (#1398) Fixed overdue strikethrough showing on completed tasks\n - Completed tasks with past due dates no longer display overdue styling \n - Respects the \"Hide completed from overdue\" setting which defaults to true\n\n- (#1363) Fixed calendar view showing nothing when a task has an invalid date format\n - Tasks with malformed dates (e.g., \"262025-12-16\" instead of \"2025-12-16\") no longer crash the entire calendar\n - Invalid tasks are now skipped with a console warning, allowing other events to display normally\n - Thanks to @Erelen for reporting\n\n- Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent\n - Today's column now uses a tint of the theme accent color for consistent styling\n\n- (#1399) Fixed drag-and-drop not working in Kanban view on mobile\n - Cards and columns can now be dragged using long-press gesture on touch devices\n - Includes haptic feedback and auto-scroll when dragging near edges\n - Thanks to @l-mb for reporting and the fix\n\n- (#1381) Fixed Pomodoro \"Change Task\" menu not showing newly created tasks\n - Tasks created while the Pomodoro view was open would not appear in the task selector\n - Improved metadata cache synchronization to properly wait for new files to be indexed\n - Thanks to @Ghosthael for reporting\n\n- (#1344) Fixed \"Unsaved Changes\" popup appearing randomly when closing task edit modal\n - The popup would appear even when no changes were made to the task\n - Caused by inconsistent trailing whitespace normalization when comparing details content\n - Thanks to @hasanyilmaz for reporting\n\n- (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula\n - After editing task metadata, cards would jump to \"None\" column until Obsidian reload\n - Column assignment now uses Bases' computed grouping instead of cached formula outputs\n - Thanks to @bailob for the fix\n\n- (#1352) Fixed date context menu not preserving time when using increment options\n - Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., `2025-12-10T16:00`) now preserves the time\n - Previously the time would be stripped, changing `2025-12-10T16:00` to `2025-12-11` instead of `2025-12-11T16:00`\n - Thanks to @cathywu for the feature request\n\n- Fixed v3 saved views exporting incorrectly to Bases format\n - Title filters now correctly use `file.name` instead of `note.title`\n - Archived filters now generate valid boolean expressions instead of malformed comparisons\n - \"Is Blocked\" filters now generate correct expressions with proper operator precedence\n\n- (#1036) Due dates can now be dragged in the calendar view\n - Previously only scheduled dates were draggable; due dates were locked in place\n - Dragging a due event now updates the task's due date property\n - Thanks to @same774 for reporting\n\n- Improved calendar view responsiveness for user interactions\n - Task creation, editing, timeblock changes, and view option toggles now update immediately\n - Previously these actions waited 5 seconds due to the debounce intended for external file changes\n - The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing\n\n- Improved visual affordance for Pomodoro timer duration adjustment buttons\n - The +/- buttons below the timer now have visible backgrounds and borders\n - Hover states show accent color border for clearer interactivity feedback\n - Previously buttons were nearly invisible with transparent backgrounds\n\n- (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows\n - Drag-and-drop in Kanban view now works correctly when the view is in a new window\n - Context menus (status, priority, task) now work correctly in pop-out windows\n - Stats view drill-down modal now appears in the correct window\n - Search boxes, task cards, and grouped task lists render correctly\n - Root cause: Code was using global `document` and standard `instanceof` checks which fail across windows\n - Solution: Use `ownerDocument` for DOM operations and Obsidian's cross-window `instanceOf()` method\n - **Known limitation**: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global `document` for mouse event listeners. Use context menus or edit modals as a workaround.\n - Updated FullCalendar to v6.1.20\n - Thanks to @Snakiest, @same774, and @3zra47 for reporting\n\n- (#1337) Fixed \"Convert current note to task\" hotkey not applying default values from settings\n - When user configured default status/priority as \"None\", the modal would show \"Open\" and \"Normal\" instead\n - Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults\n - Now preserves constructor-provided task data when converting non-task files\n - Thanks to @guihasparyk for reporting\n\n- (#1304) Fixed \"Cannot find function map on type Link\" error in Blocking view\n - Error occurred when embedding the Relationships base and opening the Blocking view\n - Root cause: When `blockedBy` contained a single dependency, Bases returned it as a Link object without a `.map()` method\n - Fixed by wrapping `blockedBy` with `list()` before calling `.map()`, consistent with the Blocked By view\n - Thanks to @prayidae for reporting\n\n- (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev\n - The page existed but was not accessible from the site navigation\n - Thanks to @Arachnidai for reporting\n\n- (#1223) Fixed \"Go to today's note\" command opening wrong date in positive UTC offset timezones\n - In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note\n - Root cause: Incorrectly extracting UTC date components instead of local timezone date\n - Thanks to @BrucePlumb for reporting\n","aliases":["/releases/4.2.0/","/releases/4.2.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Added Korean (한국어) language support

    \n
      \n
    • Full translation of all 1911 localization keys
    • \n
    • Korean language option now available in Settings → General → Language
    • \n
    \n
  • \n
  • Adopted Obsidian 1.11.0 API features with backwards compatibility

    \n
      \n
    • Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+)
    • \n
    • Settings sections now use native SettingGroup for improved visual grouping (Obsidian 1.11.0+)
    • \n
    • Falls back gracefully to traditional section headers on older Obsidian versions
    • \n
    \n
  • \n
  • (#59) Added shortYear template variable for custom filename and folder templates

    \n
      \n
    • Use {shortYear} in filename templates (e.g., "25" for 2025)
    • \n
    • Use {{shortYear}} in folder templates
    • \n
    • Thanks to @Pixeltica for the feature request
    • \n
    \n
  • \n
  • (#1393) Option to prevent auto-creation of default Base view files on startup

    \n
      \n
    • New "Auto-create default files" toggle in Settings → Integrations → Bases Integration
    • \n
    • When disabled, deleted sample Base files will not be recreated on plugin load
    • \n
    • The manual "Create Default Files" button remains available for on-demand recreation
    • \n
    • Thanks to @wealthychef1 for the feature request
    • \n
    \n
  • \n
  • (#1408) Shift+click on status icon to cycle backwards through statuses

    \n
      \n
    • Normal click cycles forward through status order
    • \n
    • Shift+click cycles in reverse order
    • \n
    • Thanks to @JerryLu086 for the feature request
    • \n
    \n
  • \n
  • (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled

    \n
      \n
    • Previously required pressing 'i' before typing when Obsidian vim mode was active
    • \n
    • The modal now automatically enters insert mode on focus, allowing immediate typing
    • \n
    • Thanks to @Leo310 for the feature request
    • \n
    \n
  • \n
  • Added button tooltips to calendar view toolbar

    \n
      \n
    • Hovering over navigation and view buttons now shows descriptive hints
    • \n
    • Buttons include: Today, Previous, Next, Month, Week, Day, Year, List
    • \n
    \n
  • \n
  • Added tooltips to task modal action icons

    \n
      \n
    • Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover
    • \n
    • Improves discoverability for new users
    • \n
    \n
  • \n
  • (#503) Settings now sync automatically across devices via Obsidian Sync

    \n
      \n
    • Changes to custom statuses, priorities, and other settings apply immediately without restart
    • \n
    • Thanks to @jhedlund for the feature request and @l-mb for the implementation
    • \n
    \n
  • \n
  • (#1403) Kanban view option to consolidate status icons in column headers

    \n
      \n
    • New "Show status icon in column header only" toggle in Kanban view settings (disabled by default)
    • \n
    • When enabled and grouped by status, shows the icon in the column header and hides it on cards
    • \n
    • Reduces visual redundancy when the column already indicates the status
    • \n
    • Thanks to @l-mb for the feature request and implementation
    • \n
    \n
  • \n
  • (#1401) Calendar view option to span tasks between scheduled and due dates

    \n
      \n
    • New "Span tasks between scheduled and due dates" toggle in Calendar view Layout settings
    • \n
    • When enabled, tasks with both scheduled and due dates display as multi-day bars
    • \n
    • Provides Gantt chart-style visualization for project planning
    • \n
    • Thanks to @0atman for the feature request
    • \n
    \n
  • \n
  • (#1334) {{currentNotePath}} now works for "Create new inline task" command

    \n
      \n
    • The inline task folder setting with {{currentNotePath}} previously only worked for checkbox conversion
    • \n
    • Now also applies when using the "Create new inline task" command from the command palette
    • \n
    • Thanks to @kmaustral for the feature request
    • \n
    \n
  • \n
  • (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel

    \n
      \n
    • New "Mobile sidebar" setting in Settings → Features → Pomodoro Timer
    • \n
    • Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar
    • \n
    • Allows quick swipe access to the timer without switching notes on mobile devices
    • \n
    • Thanks to @Evthestrike for the feature request
    • \n
    \n
  • \n
  • (#1220) Option to use ICS event end time as task due date

    \n
      \n
    • New "Use ICS event end time as task due date" toggle in Settings → Integrations → Calendar Subscriptions
    • \n
    • When enabled, tasks created from calendar events will have their due date set to the event's end time
    • \n
    • For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec)
    • \n
    • For timed events, includes the exact end time
    • \n
    • Defaults to disabled to preserve existing behavior
    • \n
    • Thanks to @MiserMagus for the feature request
    • \n
    \n
  • \n
  • (#1108) Option to use task duration instead of due date for ICS calendar export

    \n
      \n
    • New "Use task duration for event length" toggle in Settings → Integrations → Automatic ICS Export
    • \n
    • When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND
    • \n
    • This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines
    • \n
    • When disabled (default), preserves existing behavior using due date as DTEND
    • \n
    • Thanks to @bepolymathe for the feature request
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified

    \n
      \n
    • Input like "Task scheduled for tomorrow due next week" now correctly sets both scheduled and due dates
    • \n
    • Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers
    • \n
    • Thanks to @wealthychef1 for reporting
    • \n
    \n
  • \n
  • (#1384) Fixed title being sanitized even when "Store Task Title in Filename" is disabled

    \n
      \n
    • Characters like ?, <, >, :, etc. are now preserved in task titles when they won't be used in filenames
    • \n
    • When storeTitleInFilename is false, only minimal sanitization (whitespace normalization, control character removal) is applied
    • \n
    • Thanks to @allison-casey for reporting
    • \n
    \n
  • \n
  • (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view

    \n
      \n
    • Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon
    • \n
    • Changed default Agenda template to disable property-based events (showPropertyBasedEvents: false)
    • \n
    • Users can re-enable property-based events in view settings if needed for non-task date properties
    • \n
    • Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting
    • \n
    \n
  • \n
  • (#1386) Fixed timeEstimateCategory formula showing "Long (>2h)" instead of "No estimate" for new tasks

    \n
      \n
    • The condition didn't properly handle null values when timeEstimate property is unset
    • \n
    • Also fixed the same issue in trackingStatus formula
    • \n
    • Thanks to @nicou for reporting and @osxisl for the PR
    • \n
    \n
  • \n
  • (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes

    \n
      \n
    • Also fixed CalendarView corrupting other view files when saving state on unload
    • \n
    • Thanks to @music-soul1-1 for reporting
    • \n
    \n
  • \n
  • (#1398) Fixed overdue strikethrough showing on completed tasks

    \n
      \n
    • Completed tasks with past due dates no longer display overdue styling
    • \n
    • Respects the "Hide completed from overdue" setting which defaults to true
    • \n
    \n
  • \n
  • (#1363) Fixed calendar view showing nothing when a task has an invalid date format

    \n
      \n
    • Tasks with malformed dates (e.g., "262025-12-16" instead of "2025-12-16") no longer crash the entire calendar
    • \n
    • Invalid tasks are now skipped with a console warning, allowing other events to display normally
    • \n
    • Thanks to @Erelen for reporting
    • \n
    \n
  • \n
  • Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent

    \n
      \n
    • Today's column now uses a tint of the theme accent color for consistent styling
    • \n
    \n
  • \n
  • (#1399) Fixed drag-and-drop not working in Kanban view on mobile

    \n
      \n
    • Cards and columns can now be dragged using long-press gesture on touch devices
    • \n
    • Includes haptic feedback and auto-scroll when dragging near edges
    • \n
    • Thanks to @l-mb for reporting and the fix
    • \n
    \n
  • \n
  • (#1381) Fixed Pomodoro "Change Task" menu not showing newly created tasks

    \n
      \n
    • Tasks created while the Pomodoro view was open would not appear in the task selector
    • \n
    • Improved metadata cache synchronization to properly wait for new files to be indexed
    • \n
    • Thanks to @Ghosthael for reporting
    • \n
    \n
  • \n
  • (#1344) Fixed "Unsaved Changes" popup appearing randomly when closing task edit modal

    \n
      \n
    • The popup would appear even when no changes were made to the task
    • \n
    • Caused by inconsistent trailing whitespace normalization when comparing details content
    • \n
    • Thanks to @hasanyilmaz for reporting
    • \n
    \n
  • \n
  • (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula

    \n
      \n
    • After editing task metadata, cards would jump to "None" column until Obsidian reload
    • \n
    • Column assignment now uses Bases' computed grouping instead of cached formula outputs
    • \n
    • Thanks to @bailob for the fix
    • \n
    \n
  • \n
  • (#1352) Fixed date context menu not preserving time when using increment options

    \n
      \n
    • Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., 2025-12-10T16:00) now preserves the time
    • \n
    • Previously the time would be stripped, changing 2025-12-10T16:00 to 2025-12-11 instead of 2025-12-11T16:00
    • \n
    • Thanks to @cathywu for the feature request
    • \n
    \n
  • \n
  • Fixed v3 saved views exporting incorrectly to Bases format

    \n
      \n
    • Title filters now correctly use file.name instead of note.title
    • \n
    • Archived filters now generate valid boolean expressions instead of malformed comparisons
    • \n
    • "Is Blocked" filters now generate correct expressions with proper operator precedence
    • \n
    \n
  • \n
  • (#1036) Due dates can now be dragged in the calendar view

    \n
      \n
    • Previously only scheduled dates were draggable; due dates were locked in place
    • \n
    • Dragging a due event now updates the task's due date property
    • \n
    • Thanks to @same774 for reporting
    • \n
    \n
  • \n
  • Improved calendar view responsiveness for user interactions

    \n
      \n
    • Task creation, editing, timeblock changes, and view option toggles now update immediately
    • \n
    • Previously these actions waited 5 seconds due to the debounce intended for external file changes
    • \n
    • The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing
    • \n
    \n
  • \n
  • Improved visual affordance for Pomodoro timer duration adjustment buttons

    \n
      \n
    • The +/- buttons below the timer now have visible backgrounds and borders
    • \n
    • Hover states show accent color border for clearer interactivity feedback
    • \n
    • Previously buttons were nearly invisible with transparent backgrounds
    • \n
    \n
  • \n
  • (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows

    \n
      \n
    • Drag-and-drop in Kanban view now works correctly when the view is in a new window
    • \n
    • Context menus (status, priority, task) now work correctly in pop-out windows
    • \n
    • Stats view drill-down modal now appears in the correct window
    • \n
    • Search boxes, task cards, and grouped task lists render correctly
    • \n
    • Root cause: Code was using global document and standard instanceof checks which fail across windows
    • \n
    • Solution: Use ownerDocument for DOM operations and Obsidian's cross-window instanceOf() method
    • \n
    • Known limitation: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global document for mouse event listeners. Use context menus or edit modals as a workaround.
    • \n
    • Updated FullCalendar to v6.1.20
    • \n
    • Thanks to @Snakiest, @same774, and @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1337) Fixed "Convert current note to task" hotkey not applying default values from settings

    \n
      \n
    • When user configured default status/priority as "None", the modal would show "Open" and "Normal" instead
    • \n
    • Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults
    • \n
    • Now preserves constructor-provided task data when converting non-task files
    • \n
    • Thanks to @guihasparyk for reporting
    • \n
    \n
  • \n
  • (#1304) Fixed "Cannot find function map on type Link" error in Blocking view

    \n
      \n
    • Error occurred when embedding the Relationships base and opening the Blocking view
    • \n
    • Root cause: When blockedBy contained a single dependency, Bases returned it as a Link object without a .map() method
    • \n
    • Fixed by wrapping blockedBy with list() before calling .map(), consistent with the Blocked By view
    • \n
    • Thanks to @prayidae for reporting
    • \n
    \n
  • \n
  • (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev

    \n
      \n
    • The page existed but was not accessible from the site navigation
    • \n
    • Thanks to @Arachnidai for reporting
    • \n
    \n
  • \n
  • (#1223) Fixed "Go to today's note" command opening wrong date in positive UTC offset timezones

    \n
      \n
    • In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note
    • \n
    • Root cause: Incorrectly extracting UTC date components instead of local timezone date
    • \n
    • Thanks to @BrucePlumb for reporting
    • \n
    \n
  • \n
\n","text":"Added# Added Korean (한국어) language support Full translation of all 1911 localization keys Korean language option now available in Settings → General → Language Adopted Obsidian 1.11.0 API features with backwards compatibility Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+) Settings sections now use native SettingGroup for improved visual grouping (Obsidian 1.11.0+) Falls back gracefully to traditional section headers on older Obsidian versions (#59) Added shortYear template variable for custom filename and folder templates Use {shortYear} in filename templates (e.g., \"25\" for 2025) Use {{shortYear}} in folder templates Thanks to @Pixeltica for the feature request (#1393) Option to prevent auto-creation of default Base view files on startup New \"Auto-create default files\" toggle in Settings → Integrations → Bases Integration When disabled, deleted sample Base files will not be recreated on plugin load The manual \"Create Default Files\" button remains available for on-demand recreation Thanks to @wealthychef1 for the feature request (#1408) Shift+click on status icon to cycle backwards through statuses Normal click cycles forward through status order Shift+click cycles in reverse order Thanks to @JerryLu086 for the feature request (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled Previously required pressing 'i' before typing when Obsidian vim mode was active The modal now automatically enters insert mode on focus, allowing immediate typing Thanks to @Leo310 for the feature request Added button tooltips to calendar view toolbar Hovering over navigation and view buttons now shows descriptive hints Buttons include: Today, Previous, Next, Month, Week, Day, Year, List Added tooltips to task modal action icons Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover Improves discoverability for new users (#503) Settings now sync automatically across devices via Obsidian Sync Changes to custom statuses, priorities, and other settings apply immediately without restart Thanks to @jhedlund for the feature request and @l-mb for the implementation (#1403) Kanban view option to consolidate status icons in column headers New \"Show status icon in column header only\" toggle in Kanban view settings (disabled by default) When enabled and grouped by status, shows the icon in the column header and hides it on cards Reduces visual redundancy when the column already indicates the status Thanks to @l-mb for the feature request and implementation (#1401) Calendar view option to span tasks between scheduled and due dates New \"Span tasks between scheduled and due dates\" toggle in Calendar view Layout settings When enabled, tasks with both scheduled and due dates display as multi-day bars Provides Gantt chart-style visualization for project planning Thanks to @0atman for the feature request (#1334) {{currentNotePath}} now works for \"Create new inline task\" command The inline task folder setting with {{currentNotePath}} previously only worked for checkbox conversion Now also applies when using the \"Create new inline task\" command from the command palette Thanks to @kmaustral for the feature request (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel New \"Mobile sidebar\" setting in Settings → Features → Pomodoro Timer Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar Allows quick swipe access to the timer without switching notes on mobile devices Thanks to @Evthestrike for the feature request (#1220) Option to use ICS event end time as task due date New \"Use ICS event end time as task due date\" toggle in Settings → Integrations → Calendar Subscriptions When enabled, tasks created from calendar events will have their due date set to the event's end time For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec) For timed events, includes the exact end time Defaults to disabled to preserve existing behavior Thanks to @MiserMagus for the feature request (#1108) Option to use task duration instead of due date for ICS calendar export New \"Use task duration for event length\" toggle in Settings → Integrations → Automatic ICS Export When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines When disabled (default), preserves existing behavior using due date as DTEND Thanks to @bepolymathe for the feature request Fixed# (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified Input like \"Task scheduled for tomorrow due next week\" now correctly sets both scheduled and due dates Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers Thanks to @wealthychef1 for reporting (#1384) Fixed title being sanitized even when \"Store Task Title in Filename\" is disabled Characters like ?, <, >, :, etc. are now preserved in task titles when they won't be used in filenames When storeTitleInFilename is false, only minimal sanitization (whitespace normalization, control character removal) is applied Thanks to @allison-casey for reporting (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon Changed default Agenda template to disable property-based events (showPropertyBasedEvents: false) Users can re-enable property-based events in view settings if needed for non-task date properties Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting (#1386) Fixed timeEstimateCategory formula showing \"Long (>2h)\" instead of \"No estimate\" for new tasks The condition didn't properly handle null values when timeEstimate property is unset Also fixed the same issue in trackingStatus formula Thanks to @nicou for reporting and @osxisl for the PR (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes Also fixed CalendarView corrupting other view files when saving state on unload Thanks to @music-soul1-1 for reporting (#1398) Fixed overdue strikethrough showing on completed tasks Completed tasks with past due dates no longer display overdue styling Respects the \"Hide completed from overdue\" setting which defaults to true (#1363) Fixed calendar view showing nothing when a task has an invalid date format Tasks with malformed dates (e.g., \"262025-12-16\" instead of \"2025-12-16\") no longer crash the entire calendar Invalid tasks are now skipped with a console warning, allowing other events to display normally Thanks to @Erelen for reporting Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent Today's column now uses a tint of the theme accent color for consistent styling (#1399) Fixed drag-and-drop not working in Kanban view on mobile Cards and columns can now be dragged using long-press gesture on touch devices Includes haptic feedback and auto-scroll when dragging near edges Thanks to @l-mb for reporting and the fix (#1381) Fixed Pomodoro \"Change Task\" menu not showing newly created tasks Tasks created while the Pomodoro view was open would not appear in the task selector Improved metadata cache synchronization to properly wait for new files to be indexed Thanks to @Ghosthael for reporting (#1344) Fixed \"Unsaved Changes\" popup appearing randomly when closing task edit modal The popup would appear even when no changes were made to the task Caused by inconsistent trailing whitespace normalization when comparing details content Thanks to @hasanyilmaz for reporting (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula After editing task metadata, cards would jump to \"None\" column until Obsidian reload Column assignment now uses Bases' computed grouping instead of cached formula outputs Thanks to @bailob for the fix (#1352) Fixed date context menu not preserving time when using increment options Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., 2025-12-10T16:00) now preserves the time Previously the time would be stripped, changing 2025-12-10T16:00 to 2025-12-11 instead of 2025-12-11T16:00 Thanks to @cathywu for the feature request Fixed v3 saved views exporting incorrectly to Bases format Title filters now correctly use file.name instead of note.title Archived filters now generate valid boolean expressions instead of malformed comparisons \"Is Blocked\" filters now generate correct expressions with proper operator precedence (#1036) Due dates can now be dragged in the calendar view Previously only scheduled dates were draggable; due dates were locked in place Dragging a due event now updates the task's due date property Thanks to @same774 for reporting Improved calendar view responsiveness for user interactions Task creation, editing, timeblock changes, and view option toggles now update immediately Previously these actions waited 5 seconds due to the debounce intended for external file changes The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing Improved visual affordance for Pomodoro timer duration adjustment buttons The +/- buttons below the timer now have visible backgrounds and borders Hover states show accent color border for clearer interactivity feedback Previously buttons were nearly invisible with transparent backgrounds (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows Drag-and-drop in Kanban view now works correctly when the view is in a new window Context menus (status, priority, task) now work correctly in pop-out windows Stats view drill-down modal now appears in the correct window Search boxes, task cards, and grouped task lists render correctly Root cause: Code was using global document and standard instanceof checks which fail across windows Solution: Use ownerDocument for DOM operations and Obsidian's cross-window instanceOf() method Known limitation: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global document for mouse event listeners. Use context menus or edit modals as a workaround. Updated FullCalendar to v6.1.20 Thanks to @Snakiest, @same774, and @3zra47 for reporting (#1337) Fixed \"Convert current note to task\" hotkey not applying default values from settings When user configured default status/priority as \"None\", the modal would show \"Open\" and \"Normal\" instead Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults Now preserves constructor-provided task data when converting non-task files Thanks to @guihasparyk for reporting (#1304) Fixed \"Cannot find function map on type Link\" error in Blocking view Error occurred when embedding the Relationships base and opening the Blocking view Root cause: When blockedBy contained a single dependency, Bases returned it as a Link object without a .map() method Fixed by wrapping blockedBy with list() before calling .map(), consistent with the Blocked By view Thanks to @prayidae for reporting (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev The page existed but was not accessible from the site navigation Thanks to @Arachnidai for reporting (#1223) Fixed \"Go to today's note\" command opening wrong date in positive UTC offset timezones In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note Root cause: Incorrectly extracting UTC date components instead of local timezone date Thanks to @BrucePlumb for reporting"},{"route":"/obsidian/releases/4.2.1/","title":"TaskNotes 4.2.1","description":"(#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.2.1.md","namespace":"obsidian","relativePath":"releases/4.2.1.md","raw":"# TaskNotes 4.2.1\n\n## Added\n\n- New Calendars API endpoint for access to calendar data\n - Access calendar provider information and connection status\n - Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions\n - Filter events by date range\n - [`tasknotes-cli`](https://github.com/callumalpass/tasknotes-cli) has been updated to make use of this endpoint\n\n## Fixed\n\n- (#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder\n - \"Create New Task\" now correctly uses the configured default task folder\n - \"Create New Inline Task\" continues to use the inline task folder setting\n - Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming\n\n- (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified\n - Entering something like \"task due Jan 9 at Jan 9\" now correctly sets both the due date and scheduled date\n - Thanks to @wealthychef1 and @dblinnikov for reporting\n\n- (#1410) Fixed vim insert mode not activating in task creation modal\n - The modal now correctly enters insert mode when vim keybindings are enabled\n - Thanks to @Leo310 for the feature request\n\n- (#1422) Fixed tags with dashes not being parsed correctly\n - Tags like `#my-tag` were being truncated to `#my`\n - Thanks to @JerryLu086 for reporting\n\n- (#1419) Fixed custom statuses and priorities not saving in settings\n - Values entered in text fields were sometimes lost when closing the settings modal\n - Thanks to @s33a for reporting\n","aliases":["/releases/4.2.1/","/releases/4.2.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • New Calendars API endpoint for access to calendar data
      \n
    • Access calendar provider information and connection status
    • \n
    • Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions
    • \n
    • Filter events by date range
    • \n
    • tasknotes-cli has been updated to make use of this endpoint
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1424) Fixed "Create New Task" command creating tasks in active folder instead of default folder

    \n
      \n
    • "Create New Task" now correctly uses the configured default task folder
    • \n
    • "Create New Inline Task" continues to use the inline task folder setting
    • \n
    • Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming
    • \n
    \n
  • \n
  • (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified

    \n
      \n
    • Entering something like "task due Jan 9 at Jan 9" now correctly sets both the due date and scheduled date
    • \n
    • Thanks to @wealthychef1 and @dblinnikov for reporting
    • \n
    \n
  • \n
  • (#1410) Fixed vim insert mode not activating in task creation modal

    \n
      \n
    • The modal now correctly enters insert mode when vim keybindings are enabled
    • \n
    • Thanks to @Leo310 for the feature request
    • \n
    \n
  • \n
  • (#1422) Fixed tags with dashes not being parsed correctly

    \n
      \n
    • Tags like #my-tag were being truncated to #my
    • \n
    • Thanks to @JerryLu086 for reporting
    • \n
    \n
  • \n
  • (#1419) Fixed custom statuses and priorities not saving in settings

    \n
      \n
    • Values entered in text fields were sometimes lost when closing the settings modal
    • \n
    • Thanks to @s33a for reporting
    • \n
    \n
  • \n
\n","text":"Added# New Calendars API endpoint for access to calendar data Access calendar provider information and connection status Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions Filter events by date range tasknotes-cli has been updated to make use of this endpoint Fixed# (#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder \"Create New Task\" now correctly uses the configured default task folder \"Create New Inline Task\" continues to use the inline task folder setting Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified Entering something like \"task due Jan 9 at Jan 9\" now correctly sets both the due date and scheduled date Thanks to @wealthychef1 and @dblinnikov for reporting (#1410) Fixed vim insert mode not activating in task creation modal The modal now correctly enters insert mode when vim keybindings are enabled Thanks to @Leo310 for the feature request (#1422) Fixed tags with dashes not being parsed correctly Tags like #my-tag were being truncated to #my Thanks to @JerryLu086 for reporting (#1419) Fixed custom statuses and priorities not saving in settings Values entered in text fields were sometimes lost when closing the settings modal Thanks to @s33a for reporting"},{"route":"/obsidian/releases/4.3.0/","title":"TaskNotes 4.3.0","description":"(#1361) Option to disable inline task overlay for aliased wikilinks","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.0.md","namespace":"obsidian","relativePath":"releases/4.3.0.md","raw":"# TaskNotes 4.3.0\n\n## Changed\n\n- (#1437) Unified template variable syntax and available variables across filename and body templates\n - Both systems now use double-brace `{{variable}}` syntax consistently\n - Single-brace `{variable}` syntax remains supported for backwards compatibility but is deprecated\n - Settings UI shows a warning when deprecated single-brace syntax is detected\n - Filename templates gain body template variables: `{{contexts}}`, `{{tags}}`, `{{hashtags}}`, `{{timeEstimate}}`, `{{details}}`, `{{parentNote}}`\n - Body templates gain filename template variables: `{{zettel}}`, `{{nano}}`, and all extended date/time variables\n - Thanks to @23maverick23 for reporting\n\n## Added\n\n- (#1361) Option to disable inline task overlay for aliased wikilinks\n - New setting in Features → Inline Tasks: \"Disable overlay for aliased links\"\n - When enabled, links with aliases like `[[Task|Check Status]]` render as plain links\n - Links without aliases continue to show the interactive task widget\n - Useful when embedding tasks in prose where the widget would be disruptive\n - Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117\n\n- (#1199, #1205) Google Calendar export for tasks\n - Sync tasks to Google Calendar based on scheduled or due dates\n - Automatic sync on task create, update, complete, and delete\n - Configurable event title templates with placeholders (`{{title}}`, `{{status}}`, `{{priority}}`, etc.)\n - Event descriptions include task metadata and optional Obsidian deep link\n - Support for all-day or timed events with customizable duration\n - Event color customization using Google Calendar's color palette\n - Default reminder setting for popup notifications\n - Bulk sync and unlink actions in settings\n - Task-event linking stored in frontmatter (`googleCalendarEventId`)\n - Recurring tasks sync as Google Calendar recurring events\n - Completed or skipped recurring instances are automatically excluded\n - Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input\n\n## Fixed\n\n- (#1413) Fixed angle-bracket links and project title display\n - Angle-bracket links like `[Spec]()` now resolve correctly\n - Project links display frontmatter `title` instead of raw filename/path when available\n - Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants\n - Many thanks to @normenmueller for the contribution\n\n- (#1414) Kanban column headers now display configured priority labels instead of raw values\n - Many thanks to @normenmueller for the contribution\n\n- (#1416) Fixed property-based task identification mutating tags unexpectedly\n - Tags are only written when explicitly changed by the user\n - Task tag is only added in tag-based identification mode\n - Fixes #1391\n - Thanks to @loukandr for reporting and @normenmueller for the fix\n\n- (#1187) Fixed \"Unknown view types\" error when opening Bases views after upgrading from pre-V4\n - Users who had disabled Bases support in earlier versions could not open Bases views after upgrading\n - Settings migration now automatically re-enables Bases support since the toggle was removed in V4\n - Thanks to @MiracleXYZ for reporting\n\n- (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs\n - The top-level task filter was excluding non-task files from the Projects view\n - Projects can be any file type (not just tasks), so the filter is now applied per-view\n - Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not\n - Users with existing relationships.base files should delete and regenerate them to get the fix\n - Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution\n\n- Fixed calendar view type not persisting or applying when changed\n - View type changes via header buttons (week/day/month) are now saved to the .base file\n - View type changes via Bases settings panel now apply immediately without reload\n\n- (#1441) Fixed task dragging broken with \"Span tasks between scheduled and due dates\" enabled\n - Span events can now be dragged to move tasks in time\n - Dragging shifts both scheduled and due dates proportionally, preserving the span duration\n - Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position\n - Thanks to @Peeeet for reporting\n","aliases":["/releases/4.3.0/","/releases/4.3.0/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • (#1437) Unified template variable syntax and available variables across filename and body templates
      \n
    • Both systems now use double-brace {{variable}} syntax consistently
    • \n
    • Single-brace {variable} syntax remains supported for backwards compatibility but is deprecated
    • \n
    • Settings UI shows a warning when deprecated single-brace syntax is detected
    • \n
    • Filename templates gain body template variables: {{contexts}}, {{tags}}, {{hashtags}}, {{timeEstimate}}, {{details}}, {{parentNote}}
    • \n
    • Body templates gain filename template variables: {{zettel}}, {{nano}}, and all extended date/time variables
    • \n
    • Thanks to @23maverick23 for reporting
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#1361) Option to disable inline task overlay for aliased wikilinks

    \n
      \n
    • New setting in Features → Inline Tasks: "Disable overlay for aliased links"
    • \n
    • When enabled, links with aliases like [[Task|Check Status]] render as plain links
    • \n
    • Links without aliases continue to show the interactive task widget
    • \n
    • Useful when embedding tasks in prose where the widget would be disruptive
    • \n
    • Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117
    • \n
    \n
  • \n
  • (#1199, #1205) Google Calendar export for tasks

    \n
      \n
    • Sync tasks to Google Calendar based on scheduled or due dates
    • \n
    • Automatic sync on task create, update, complete, and delete
    • \n
    • Configurable event title templates with placeholders ({{title}}, {{status}}, {{priority}}, etc.)
    • \n
    • Event descriptions include task metadata and optional Obsidian deep link
    • \n
    • Support for all-day or timed events with customizable duration
    • \n
    • Event color customization using Google Calendar's color palette
    • \n
    • Default reminder setting for popup notifications
    • \n
    • Bulk sync and unlink actions in settings
    • \n
    • Task-event linking stored in frontmatter (googleCalendarEventId)
    • \n
    • Recurring tasks sync as Google Calendar recurring events
    • \n
    • Completed or skipped recurring instances are automatically excluded
    • \n
    • Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1413) Fixed angle-bracket links and project title display

    \n
      \n
    • Angle-bracket links like [Spec](<Projects/Client X/Spec.md>) now resolve correctly
    • \n
    • Project links display frontmatter title instead of raw filename/path when available
    • \n
    • Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants
    • \n
    • Many thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1414) Kanban column headers now display configured priority labels instead of raw values

    \n
      \n
    • Many thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1416) Fixed property-based task identification mutating tags unexpectedly

    \n
      \n
    • Tags are only written when explicitly changed by the user
    • \n
    • Task tag is only added in tag-based identification mode
    • \n
    • Fixes #1391
    • \n
    • Thanks to @loukandr for reporting and @normenmueller for the fix
    • \n
    \n
  • \n
  • (#1187) Fixed "Unknown view types" error when opening Bases views after upgrading from pre-V4

    \n
      \n
    • Users who had disabled Bases support in earlier versions could not open Bases views after upgrading
    • \n
    • Settings migration now automatically re-enables Bases support since the toggle was removed in V4
    • \n
    • Thanks to @MiracleXYZ for reporting
    • \n
    \n
  • \n
  • (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs

    \n
      \n
    • The top-level task filter was excluding non-task files from the Projects view
    • \n
    • Projects can be any file type (not just tasks), so the filter is now applied per-view
    • \n
    • Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not
    • \n
    • Users with existing relationships.base files should delete and regenerate them to get the fix
    • \n
    • Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution
    • \n
    \n
  • \n
  • Fixed calendar view type not persisting or applying when changed

    \n
      \n
    • View type changes via header buttons (week/day/month) are now saved to the .base file
    • \n
    • View type changes via Bases settings panel now apply immediately without reload
    • \n
    \n
  • \n
  • (#1441) Fixed task dragging broken with "Span tasks between scheduled and due dates" enabled

    \n
      \n
    • Span events can now be dragged to move tasks in time
    • \n
    • Dragging shifts both scheduled and due dates proportionally, preserving the span duration
    • \n
    • Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position
    • \n
    • Thanks to @Peeeet for reporting
    • \n
    \n
  • \n
\n","text":"Changed# (#1437) Unified template variable syntax and available variables across filename and body templates Both systems now use double-brace {{variable}} syntax consistently Single-brace {variable} syntax remains supported for backwards compatibility but is deprecated Settings UI shows a warning when deprecated single-brace syntax is detected Filename templates gain body template variables: {{contexts}}, {{tags}}, {{hashtags}}, {{timeEstimate}}, {{details}}, {{parentNote}} Body templates gain filename template variables: {{zettel}}, {{nano}}, and all extended date/time variables Thanks to @23maverick23 for reporting Added# (#1361) Option to disable inline task overlay for aliased wikilinks New setting in Features → Inline Tasks: \"Disable overlay for aliased links\" When enabled, links with aliases like [[Task|Check Status]] render as plain links Links without aliases continue to show the interactive task widget Useful when embedding tasks in prose where the widget would be disruptive Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117 (#1199, #1205) Google Calendar export for tasks Sync tasks to Google Calendar based on scheduled or due dates Automatic sync on task create, update, complete, and delete Configurable event title templates with placeholders ({{title}}, {{status}}, {{priority}}, etc.) Event descriptions include task metadata and optional Obsidian deep link Support for all-day or timed events with customizable duration Event color customization using Google Calendar's color palette Default reminder setting for popup notifications Bulk sync and unlink actions in settings Task-event linking stored in frontmatter (googleCalendarEventId) Recurring tasks sync as Google Calendar recurring events Completed or skipped recurring instances are automatically excluded Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input Fixed# (#1413) Fixed angle-bracket links and project title display Angle-bracket links like [Spec]() now resolve correctly Project links display frontmatter title instead of raw filename/path when available Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants Many thanks to @normenmueller for the contribution (#1414) Kanban column headers now display configured priority labels instead of raw values Many thanks to @normenmueller for the contribution (#1416) Fixed property-based task identification mutating tags unexpectedly Tags are only written when explicitly changed by the user Task tag is only added in tag-based identification mode Fixes #1391 Thanks to @loukandr for reporting and @normenmueller for the fix (#1187) Fixed \"Unknown view types\" error when opening Bases views after upgrading from pre-V4 Users who had disabled Bases support in earlier versions could not open Bases views after upgrading Settings migration now automatically re-enables Bases support since the toggle was removed in V4 Thanks to @MiracleXYZ for reporting (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs The top-level task filter was excluding non-task files from the Projects view Projects can be any file type (not just tasks), so the filter is now applied per-view Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not Users with existing relationships.base files should delete and regenerate them to get the fix Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution Fixed calendar view type not persisting or applying when changed View type changes via header buttons (week/day/month) are now saved to the .base file View type changes via Bases settings panel now apply immediately without reload (#1441) Fixed task dragging broken with \"Span tasks between scheduled and due dates\" enabled Span events can now be dragged to move tasks in time Dragging shifts both scheduled and due dates proportionally, preserving the span duration Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position Thanks to @Peeeet for reporting"},{"route":"/obsidian/releases/4.3.1/","title":"TaskNotes 4.3.1","description":"(#1546) Added sticky kanban column headers that remain visible while scrolling","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.1.md","namespace":"obsidian","relativePath":"releases/4.3.1.md","raw":"# TaskNotes 4.3.1\n\n## Added\n\n- (#1546) Added sticky kanban column headers that remain visible while scrolling\n - Thanks to @normenmueller for the contribution\n\n- (#1458) Added CSS color classes to context tags for custom styling\n - Each context tag now receives a unique CSS class based on its name (e.g., `context-tag--color-0` through `context-tag--color-19`)\n - Enables styling individual contexts via CSS snippets\n - Thanks to @phortx for the contribution\n\n- Added [mdbase-spec](https://mdbase.dev) type definition generation\n - New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (`mdbase.yaml` and `_types/task.md`) at the vault root\n - Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change\n - Enables interoperability with other tools that support the mdbase-spec format\n\n## Fixed\n\n- (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter\n - Dependencies now retain their `[[wikilink]]` format when saved, preventing them from breaking on file rename\n - Thanks to @renekalff for reporting\n\n- (#1443) Fixed default status/priority not updating when the referenced custom value is deleted\n - Deleting a custom status or priority that was set as the default now resets the default to the first available value\n - Thanks to @l-mb for the contribution\n\n- (#1448) Fixed project removals not persisting from the task edit modal\n - Removing all projects from a task now correctly clears the projects field\n - Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection\n - Thanks to @normenmueller for the contribution\n\n- (#1514), (#1517) Fixed task reminders not syncing to Google Calendar\n - Task-specific reminders (both relative and absolute) now sync to Google Calendar\n - Previously only the global default reminder setting was used, ignoring per-task reminders\n - Thanks to @christenbc for the contribution\n\n- (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked\n - Status dot, checkbox, and card styling now update instantly when cycling status\n - Thanks to @christenbc for the contribution\n\n- (#1537) Fixed Google Calendar errors during bulk sync\n - Added rate limiting to space out API calls, preventing errors when syncing many tasks at once\n - Thanks to @Lorite for the contribution\n\n- (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar\n - Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day\n - Clearing recurrence from a task now also removes it from the synced Google Calendar event\n - Thanks to @christenbc for the contribution\n\n- (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., `#project/sub-project`) being truncated in link text\n - Tags containing slashes, hyphens, and Unicode characters now render correctly\n - Thanks to @normenmueller for the contribution and @ysafonov for reporting\n\n- (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart\n - The dropdown now re-populates once calendars are fetched during startup\n - Thanks to @N-HEDGER for reporting\n\n- (#1567) Fixed inline task card widgets disappearing momentarily\n - When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link\n - Thanks to @scztt for reporting\n\n- (#1568) Fixed deleted tasks not being removed from Google Calendar\n - When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically\n - Thanks to @kmaustral for reporting\n\n- Fixed Integrations tab spacing and layout issues\n - Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections\n","aliases":["/releases/4.3.1/","/releases/4.3.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1546) Added sticky kanban column headers that remain visible while scrolling

    \n
      \n
    • Thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1458) Added CSS color classes to context tags for custom styling

    \n
      \n
    • Each context tag now receives a unique CSS class based on its name (e.g., context-tag--color-0 through context-tag--color-19)
    • \n
    • Enables styling individual contexts via CSS snippets
    • \n
    • Thanks to @phortx for the contribution
    • \n
    \n
  • \n
  • Added mdbase-spec type definition generation

    \n
      \n
    • New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (mdbase.yaml and _types/task.md) at the vault root
    • \n
    • Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change
    • \n
    • Enables interoperability with other tools that support the mdbase-spec format
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter

    \n
      \n
    • Dependencies now retain their [[wikilink]] format when saved, preventing them from breaking on file rename
    • \n
    • Thanks to @renekalff for reporting
    • \n
    \n
  • \n
  • (#1443) Fixed default status/priority not updating when the referenced custom value is deleted

    \n
      \n
    • Deleting a custom status or priority that was set as the default now resets the default to the first available value
    • \n
    • Thanks to @l-mb for the contribution
    • \n
    \n
  • \n
  • (#1448) Fixed project removals not persisting from the task edit modal

    \n
      \n
    • Removing all projects from a task now correctly clears the projects field
    • \n
    • Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection
    • \n
    • Thanks to @normenmueller for the contribution
    • \n
    \n
  • \n
  • (#1514), (#1517) Fixed task reminders not syncing to Google Calendar

    \n
      \n
    • Task-specific reminders (both relative and absolute) now sync to Google Calendar
    • \n
    • Previously only the global default reminder setting was used, ignoring per-task reminders
    • \n
    • Thanks to @christenbc for the contribution
    • \n
    \n
  • \n
  • (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked

    \n
      \n
    • Status dot, checkbox, and card styling now update instantly when cycling status
    • \n
    • Thanks to @christenbc for the contribution
    • \n
    \n
  • \n
  • (#1537) Fixed Google Calendar errors during bulk sync

    \n
      \n
    • Added rate limiting to space out API calls, preventing errors when syncing many tasks at once
    • \n
    • Thanks to @Lorite for the contribution
    • \n
    \n
  • \n
  • (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar

    \n
      \n
    • Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day
    • \n
    • Clearing recurrence from a task now also removes it from the synced Google Calendar event
    • \n
    • Thanks to @christenbc for the contribution
    • \n
    \n
  • \n
  • (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., #project/sub-project) being truncated in link text

    \n
      \n
    • Tags containing slashes, hyphens, and Unicode characters now render correctly
    • \n
    • Thanks to @normenmueller for the contribution and @ysafonov for reporting
    • \n
    \n
  • \n
  • (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart

    \n
      \n
    • The dropdown now re-populates once calendars are fetched during startup
    • \n
    • Thanks to @N-HEDGER for reporting
    • \n
    \n
  • \n
  • (#1567) Fixed inline task card widgets disappearing momentarily

    \n
      \n
    • When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link
    • \n
    • Thanks to @scztt for reporting
    • \n
    \n
  • \n
  • (#1568) Fixed deleted tasks not being removed from Google Calendar

    \n
      \n
    • When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically
    • \n
    • Thanks to @kmaustral for reporting
    • \n
    \n
  • \n
  • Fixed Integrations tab spacing and layout issues

    \n
      \n
    • Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections
    • \n
    \n
  • \n
\n","text":"Added# (#1546) Added sticky kanban column headers that remain visible while scrolling Thanks to @normenmueller for the contribution (#1458) Added CSS color classes to context tags for custom styling Each context tag now receives a unique CSS class based on its name (e.g., context-tag--color-0 through context-tag--color-19) Enables styling individual contexts via CSS snippets Thanks to @phortx for the contribution Added mdbase-spec type definition generation New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (mdbase.yaml and _types/task.md) at the vault root Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change Enables interoperability with other tools that support the mdbase-spec format Fixed# (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter Dependencies now retain their [[wikilink]] format when saved, preventing them from breaking on file rename Thanks to @renekalff for reporting (#1443) Fixed default status/priority not updating when the referenced custom value is deleted Deleting a custom status or priority that was set as the default now resets the default to the first available value Thanks to @l-mb for the contribution (#1448) Fixed project removals not persisting from the task edit modal Removing all projects from a task now correctly clears the projects field Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection Thanks to @normenmueller for the contribution (#1514), (#1517) Fixed task reminders not syncing to Google Calendar Task-specific reminders (both relative and absolute) now sync to Google Calendar Previously only the global default reminder setting was used, ignoring per-task reminders Thanks to @christenbc for the contribution (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked Status dot, checkbox, and card styling now update instantly when cycling status Thanks to @christenbc for the contribution (#1537) Fixed Google Calendar errors during bulk sync Added rate limiting to space out API calls, preventing errors when syncing many tasks at once Thanks to @Lorite for the contribution (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day Clearing recurrence from a task now also removes it from the synced Google Calendar event Thanks to @christenbc for the contribution (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., #project/sub-project) being truncated in link text Tags containing slashes, hyphens, and Unicode characters now render correctly Thanks to @normenmueller for the contribution and @ysafonov for reporting (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart The dropdown now re-populates once calendars are fetched during startup Thanks to @N-HEDGER for reporting (#1567) Fixed inline task card widgets disappearing momentarily When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link Thanks to @scztt for reporting (#1568) Fixed deleted tasks not being removed from Google Calendar When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically Thanks to @kmaustral for reporting Fixed Integrations tab spacing and layout issues Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections"},{"route":"/obsidian/releases/4.3.2/","title":"TaskNotes 4.3.2","description":"(#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.2.md","namespace":"obsidian","relativePath":"releases/4.3.2.md","raw":"# TaskNotes 4.3.2\n\n## Added\n\n- (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus\n - Previously required typing at least one character before suggestions appeared\n - Already-selected values are excluded from the suggestion list\n - Thanks to @Glint-Eye for the suggestion\n\n- (#1506) Added setting to configure the default color for new timeblocks\n - New color picker in Settings > Features > Timeblocking\n - Previously hardcoded to indigo; now user-configurable\n - Thanks to @phillipadsmith for the suggestion\n\n## Fixed\n\n- Fixed [mdbase-spec](https://mdbase.dev) type definition generation not triggering when settings change\n\n- (#1456) Fixed inline tasks jumping visually when marked as completed\n - Thanks to @3zra47 for reporting\n\n- (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances\n - Thanks to @slipstyle for reporting\n\n- (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time\n - All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder\n - Thanks to @Jomo94 for reporting\n\n- (#1470) Fixed cursor showing as default instead of pointer on interactive elements\n - Thanks to @TheFrostedDev for reporting\n\n- (#1491) Fixed boolean property values being quoted as strings in Bases filter generation\n - When using a boolean property (e.g. `tasknote: true`) for task identification, the filter now correctly handles the value\n - Thanks to @denisgorod for reporting\n\n- (#1494) Fixed Kanban swimlane resetting to \"None\" on initial load and after navigation\n - Thanks to @tnguyen2018 for reporting\n\n- (#1555) Fixed \"Folder already exists\" error when creating tasks or converting inline tasks\n - Thanks to @jkune5 for reporting\n\n- (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height\n - Thanks to @willfanguy for reporting\n\n- (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view\n - Thanks to @karenchoe428 for reporting\n\n- (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large\n - Thanks to @kazerniel for reporting\n\n- (#1492) Fixed hardcoded \"open\" status leaking into filenames, recurring task displays, and parsing fallbacks\n - Users with custom default statuses (e.g. \"inbox\") no longer see \"open\" where their configured default should appear\n - Recurring tasks now show their actual configured status instead of always displaying \"open\" when not completed\n - Thanks to @macdrifter for reporting\n\n- (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view\n - Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior\n - Added today indicator highlighting to list view day headers\n - Thanks to @Robubble for the suggestion\n","aliases":["/releases/4.3.2/","/releases/4.3.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus

    \n
      \n
    • Previously required typing at least one character before suggestions appeared
    • \n
    • Already-selected values are excluded from the suggestion list
    • \n
    • Thanks to @Glint-Eye for the suggestion
    • \n
    \n
  • \n
  • (#1506) Added setting to configure the default color for new timeblocks

    \n
      \n
    • New color picker in Settings > Features > Timeblocking
    • \n
    • Previously hardcoded to indigo; now user-configurable
    • \n
    • Thanks to @phillipadsmith for the suggestion
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed mdbase-spec type definition generation not triggering when settings change

    \n
  • \n
  • (#1456) Fixed inline tasks jumping visually when marked as completed

    \n
      \n
    • Thanks to @3zra47 for reporting
    • \n
    \n
  • \n
  • (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances

    \n
      \n
    • Thanks to @slipstyle for reporting
    • \n
    \n
  • \n
  • (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time

    \n
      \n
    • All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder
    • \n
    • Thanks to @Jomo94 for reporting
    • \n
    \n
  • \n
  • (#1470) Fixed cursor showing as default instead of pointer on interactive elements

    \n
      \n
    • Thanks to @TheFrostedDev for reporting
    • \n
    \n
  • \n
  • (#1491) Fixed boolean property values being quoted as strings in Bases filter generation

    \n
      \n
    • When using a boolean property (e.g. tasknote: true) for task identification, the filter now correctly handles the value
    • \n
    • Thanks to @denisgorod for reporting
    • \n
    \n
  • \n
  • (#1494) Fixed Kanban swimlane resetting to "None" on initial load and after navigation

    \n
      \n
    • Thanks to @tnguyen2018 for reporting
    • \n
    \n
  • \n
  • (#1555) Fixed "Folder already exists" error when creating tasks or converting inline tasks

    \n
      \n
    • Thanks to @jkune5 for reporting
    • \n
    \n
  • \n
  • (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height

    \n
      \n
    • Thanks to @willfanguy for reporting
    • \n
    \n
  • \n
  • (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view

    \n
      \n
    • Thanks to @karenchoe428 for reporting
    • \n
    \n
  • \n
  • (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large

    \n
      \n
    • Thanks to @kazerniel for reporting
    • \n
    \n
  • \n
  • (#1492) Fixed hardcoded "open" status leaking into filenames, recurring task displays, and parsing fallbacks

    \n
      \n
    • Users with custom default statuses (e.g. "inbox") no longer see "open" where their configured default should appear
    • \n
    • Recurring tasks now show their actual configured status instead of always displaying "open" when not completed
    • \n
    • Thanks to @macdrifter for reporting
    • \n
    \n
  • \n
  • (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view

    \n
      \n
    • Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior
    • \n
    • Added today indicator highlighting to list view day headers
    • \n
    • Thanks to @Robubble for the suggestion
    • \n
    \n
  • \n
\n","text":"Added# (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus Previously required typing at least one character before suggestions appeared Already-selected values are excluded from the suggestion list Thanks to @Glint-Eye for the suggestion (#1506) Added setting to configure the default color for new timeblocks New color picker in Settings > Features > Timeblocking Previously hardcoded to indigo; now user-configurable Thanks to @phillipadsmith for the suggestion Fixed# Fixed mdbase-spec type definition generation not triggering when settings change (#1456) Fixed inline tasks jumping visually when marked as completed Thanks to @3zra47 for reporting (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances Thanks to @slipstyle for reporting (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder Thanks to @Jomo94 for reporting (#1470) Fixed cursor showing as default instead of pointer on interactive elements Thanks to @TheFrostedDev for reporting (#1491) Fixed boolean property values being quoted as strings in Bases filter generation When using a boolean property (e.g. tasknote: true) for task identification, the filter now correctly handles the value Thanks to @denisgorod for reporting (#1494) Fixed Kanban swimlane resetting to \"None\" on initial load and after navigation Thanks to @tnguyen2018 for reporting (#1555) Fixed \"Folder already exists\" error when creating tasks or converting inline tasks Thanks to @jkune5 for reporting (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height Thanks to @willfanguy for reporting (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view Thanks to @karenchoe428 for reporting (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large Thanks to @kazerniel for reporting (#1492) Fixed hardcoded \"open\" status leaking into filenames, recurring task displays, and parsing fallbacks Users with custom default statuses (e.g. \"inbox\") no longer see \"open\" where their configured default should appear Recurring tasks now show their actual configured status instead of always displaying \"open\" when not completed Thanks to @macdrifter for reporting (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior Added today indicator highlighting to list view day headers Thanks to @Robubble for the suggestion"},{"route":"/obsidian/releases/4.3.3/","title":"TaskNotes 4.3.3","description":"Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.3.3.md","namespace":"obsidian","relativePath":"releases/4.3.3.md","raw":"# TaskNotes 4.3.3\n\n## Changed\n\n- Published [`mdbase-tasknotes`](https://github.com/callumalpass/mdbase-tasknotes) (`mtn`), a standalone CLI for managing tasks in markdown files via mdbase\n - Works on the same vault and `_types/task.md` schema that TaskNotes generates, without requiring the plugin or HTTP API\n - Preferable over [tasknotes-cli](https://github.com/callumalpass/tasknotes-cli) as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments\n - Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL\n\n- Extracted shared natural language parsing logic into the standalone npm package [`tasknotes-nlp-core`](https://github.com/callumalpass/tasknotes-nlp-core)\n - The NLP parser and related language configuration are now shared through this package\n - This keeps behavior consistent between the plugin and CLI tools\n\n## Added\n\n- (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed\n - When enabled, all checked checkboxes (`- [x]`) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled\n - Useful for recurring tasks with subtask checklists that need to be repeated each instance\n - Configurable via Settings > Features > Recurring Tasks > \"Reset checkboxes on recurrence\"\n - Thanks to @phortx for the feature request\n\n- (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view\n - When clicking or dragging to select a time slot, a new \"Create calendar event\" option appears in the context menu\n - Opens a modal to enter event title, description, location, and select which calendar to create on\n - Supports both Google Calendar and Microsoft Calendar providers\n - Thanks to @Robubble for the feature request\n\n- (#1597) Added MCP server for AI agent integration\n - Exposes TaskNotes tools at `/mcp` endpoint, gated behind `enableMCP` setting\n - Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics\n - Thanks to @dstotijn for the contribution\n\n## Fixed\n\n- Fixed generated [mdbase](https://mdbase.dev) type definitions for task dependencies using the wrong field type\n - In `_types/task.md`, `blockedBy[].uid` now uses `type: link` (was `type: string`)\n - Better matches how dependency links are serialized in task frontmatter (`[[...]]`)\n\n- Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data\n - In `_types/task.md`, `reminders[].type` now uses enum values `absolute|relative`\n - `reminders[].relatedTo` now uses enum values `due|scheduled`\n - `reminders[].absoluteTime` now uses `type: datetime` (was `type: string`)\n\n- (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data\n - Thanks to @dstotijn for the fix\n\n- (#1581) Fixed Pomodoro starting break instead of work session after app restart\n - After completing a work session and restarting, pressing Start would incorrectly start a break\n - Now properly resets `nextSessionType` when clearing stale sessions or stopping the timer\n - Thanks to @Sirnii for the detailed bug report and root cause analysis\n\n- (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height\n - Added vertical scroll to modal content area while keeping buttons pinned at bottom\n - Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion\n\n- (#1600) Fixed kanban view grouping not working when more than 20 views exist\n - The `getGroupByPropertyId()` method had a hardcoded loop limit of 20 iterations\n - Views at index 20 or higher would not be found, causing groupBy to return null\n - Thanks to @IHaveNoShame for reporting\n\n- (#1595) Fixed task modal floating buttons blocking content on mobile\n - Added mobile-specific (`body.is-mobile`) CSS to ensure proper flex layout\n - Button container now stays pinned at bottom without overlapping scrollable content\n - Thanks to @Jomo94 for reporting\n\n- (#1590) Fixed HTTP API not allowing `blockedBy` dependencies when creating tasks\n - Added `blockedBy` field support to `TaskService.createTask()`\n - Updated API documentation with `blockedBy`, `recurrence`, and `reminders` fields\n - Thanks to @hGriff0n for reporting\n\n- (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones\n - Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11)\n - Fixed date boundary comparisons in both `generateRecurringInstances()` and `generateRecurringTaskInstances()` to compare dates only, not timestamps\n - Thanks to @benefitbug for reporting\n\n- (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message\n - When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: \"Failed to refresh google token: Request failed, status 400\"\n - Now detects irrecoverable token errors (`invalid_grant`, `invalid_client`) and automatically disconnects the OAuth connection\n - Shows actionable error message: \"Google Calendar connection expired. Please reconnect in Settings > Integrations.\"\n - Prevents repeated failed refresh attempts and error message spam\n - Thanks to @osxisl for reporting and @Naesue for helping in discussion\n\n- (#1584) Fixed DOMTokenList error when task status values contain spaces\n - Clicking the status ring on a task card threw an error when status contained spaces (e.g., \"In Progress\")\n - Status and priority values are now sanitized before being used as CSS class names\n - Thanks to @omber for reporting\n","aliases":["/releases/4.3.3/","/releases/4.3.3/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase

    \n
      \n
    • Works on the same vault and _types/task.md schema that TaskNotes generates, without requiring the plugin or HTTP API
    • \n
    • Preferable over tasknotes-cli as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments
    • \n
    • Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL
    • \n
    \n
  • \n
  • Extracted shared natural language parsing logic into the standalone npm package tasknotes-nlp-core

    \n
      \n
    • The NLP parser and related language configuration are now shared through this package
    • \n
    • This keeps behavior consistent between the plugin and CLI tools
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed

    \n
      \n
    • When enabled, all checked checkboxes (- [x]) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled
    • \n
    • Useful for recurring tasks with subtask checklists that need to be repeated each instance
    • \n
    • Configurable via Settings > Features > Recurring Tasks > "Reset checkboxes on recurrence"
    • \n
    • Thanks to @phortx for the feature request
    • \n
    \n
  • \n
  • (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view

    \n
      \n
    • When clicking or dragging to select a time slot, a new "Create calendar event" option appears in the context menu
    • \n
    • Opens a modal to enter event title, description, location, and select which calendar to create on
    • \n
    • Supports both Google Calendar and Microsoft Calendar providers
    • \n
    • Thanks to @Robubble for the feature request
    • \n
    \n
  • \n
  • (#1597) Added MCP server for AI agent integration

    \n
      \n
    • Exposes TaskNotes tools at /mcp endpoint, gated behind enableMCP setting
    • \n
    • Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics
    • \n
    • Thanks to @dstotijn for the contribution
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed generated mdbase type definitions for task dependencies using the wrong field type

    \n
      \n
    • In _types/task.md, blockedBy[].uid now uses type: link (was type: string)
    • \n
    • Better matches how dependency links are serialized in task frontmatter ([[...]])
    • \n
    \n
  • \n
  • Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data

    \n
      \n
    • In _types/task.md, reminders[].type now uses enum values absolute|relative
    • \n
    • reminders[].relatedTo now uses enum values due|scheduled
    • \n
    • reminders[].absoluteTime now uses type: datetime (was type: string)
    • \n
    \n
  • \n
  • (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data

    \n
      \n
    • Thanks to @dstotijn for the fix
    • \n
    \n
  • \n
  • (#1581) Fixed Pomodoro starting break instead of work session after app restart

    \n
      \n
    • After completing a work session and restarting, pressing Start would incorrectly start a break
    • \n
    • Now properly resets nextSessionType when clearing stale sessions or stopping the timer
    • \n
    • Thanks to @Sirnii for the detailed bug report and root cause analysis
    • \n
    \n
  • \n
  • (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height

    \n
      \n
    • Added vertical scroll to modal content area while keeping buttons pinned at bottom
    • \n
    • Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion
    • \n
    \n
  • \n
  • (#1600) Fixed kanban view grouping not working when more than 20 views exist

    \n
      \n
    • The getGroupByPropertyId() method had a hardcoded loop limit of 20 iterations
    • \n
    • Views at index 20 or higher would not be found, causing groupBy to return null
    • \n
    • Thanks to @IHaveNoShame for reporting
    • \n
    \n
  • \n
  • (#1595) Fixed task modal floating buttons blocking content on mobile

    \n
      \n
    • Added mobile-specific (body.is-mobile) CSS to ensure proper flex layout
    • \n
    • Button container now stays pinned at bottom without overlapping scrollable content
    • \n
    • Thanks to @Jomo94 for reporting
    • \n
    \n
  • \n
  • (#1590) Fixed HTTP API not allowing blockedBy dependencies when creating tasks

    \n
      \n
    • Added blockedBy field support to TaskService.createTask()
    • \n
    • Updated API documentation with blockedBy, recurrence, and reminders fields
    • \n
    • Thanks to @hGriff0n for reporting
    • \n
    \n
  • \n
  • (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones

    \n
      \n
    • Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11)
    • \n
    • Fixed date boundary comparisons in both generateRecurringInstances() and generateRecurringTaskInstances() to compare dates only, not timestamps
    • \n
    • Thanks to @benefitbug for reporting
    • \n
    \n
  • \n
  • (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message

    \n
      \n
    • When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: "Failed to refresh google token: Request failed, status 400"
    • \n
    • Now detects irrecoverable token errors (invalid_grant, invalid_client) and automatically disconnects the OAuth connection
    • \n
    • Shows actionable error message: "Google Calendar connection expired. Please reconnect in Settings > Integrations."
    • \n
    • Prevents repeated failed refresh attempts and error message spam
    • \n
    • Thanks to @osxisl for reporting and @Naesue for helping in discussion
    • \n
    \n
  • \n
  • (#1584) Fixed DOMTokenList error when task status values contain spaces

    \n
      \n
    • Clicking the status ring on a task card threw an error when status contained spaces (e.g., "In Progress")
    • \n
    • Status and priority values are now sanitized before being used as CSS class names
    • \n
    • Thanks to @omber for reporting
    • \n
    \n
  • \n
\n","text":"Changed# Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase Works on the same vault and _types/task.md schema that TaskNotes generates, without requiring the plugin or HTTP API Preferable over tasknotes-cli as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL Extracted shared natural language parsing logic into the standalone npm package tasknotes-nlp-core The NLP parser and related language configuration are now shared through this package This keeps behavior consistent between the plugin and CLI tools Added# (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed When enabled, all checked checkboxes (- [x]) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled Useful for recurring tasks with subtask checklists that need to be repeated each instance Configurable via Settings > Features > Recurring Tasks > \"Reset checkboxes on recurrence\" Thanks to @phortx for the feature request (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view When clicking or dragging to select a time slot, a new \"Create calendar event\" option appears in the context menu Opens a modal to enter event title, description, location, and select which calendar to create on Supports both Google Calendar and Microsoft Calendar providers Thanks to @Robubble for the feature request (#1597) Added MCP server for AI agent integration Exposes TaskNotes tools at /mcp endpoint, gated behind enableMCP setting Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics Thanks to @dstotijn for the contribution Fixed# Fixed generated mdbase type definitions for task dependencies using the wrong field type In _types/task.md, blockedBy[].uid now uses type: link (was type: string) Better matches how dependency links are serialized in task frontmatter ([[...]]) Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data In _types/task.md, reminders[].type now uses enum values absolute|relative reminders[].relatedTo now uses enum values due|scheduled reminders[].absoluteTime now uses type: datetime (was type: string) (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data Thanks to @dstotijn for the fix (#1581) Fixed Pomodoro starting break instead of work session after app restart After completing a work session and restarting, pressing Start would incorrectly start a break Now properly resets nextSessionType when clearing stale sessions or stopping the timer Thanks to @Sirnii for the detailed bug report and root cause analysis (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height Added vertical scroll to modal content area while keeping buttons pinned at bottom Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion (#1600) Fixed kanban view grouping not working when more than 20 views exist The getGroupByPropertyId() method had a hardcoded loop limit of 20 iterations Views at index 20 or higher would not be found, causing groupBy to return null Thanks to @IHaveNoShame for reporting (#1595) Fixed task modal floating buttons blocking content on mobile Added mobile-specific (body.is-mobile) CSS to ensure proper flex layout Button container now stays pinned at bottom without overlapping scrollable content Thanks to @Jomo94 for reporting (#1590) Fixed HTTP API not allowing blockedBy dependencies when creating tasks Added blockedBy field support to TaskService.createTask() Updated API documentation with blockedBy, recurrence, and reminders fields Thanks to @hGriff0n for reporting (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11) Fixed date boundary comparisons in both generateRecurringInstances() and generateRecurringTaskInstances() to compare dates only, not timestamps Thanks to @benefitbug for reporting (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: \"Failed to refresh google token: Request failed, status 400\" Now detects irrecoverable token errors (invalid_grant, invalid_client) and automatically disconnects the OAuth connection Shows actionable error message: \"Google Calendar connection expired. Please reconnect in Settings > Integrations.\" Prevents repeated failed refresh attempts and error message spam Thanks to @osxisl for reporting and @Naesue for helping in discussion (#1584) Fixed DOMTokenList error when task status values contain spaces Clicking the status ring on a task card threw an error when status contained spaces (e.g., \"In Progress\") Status and priority values are now sanitized before being used as CSS class names Thanks to @omber for reporting"},{"route":"/obsidian/releases/4.4.0/","title":"TaskNotes 4.4.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.4.0.md","namespace":"obsidian","relativePath":"releases/4.4.0.md","raw":"# TaskNotes 4.4.0\n\n## Added\n\n- [Mdbase](https://mdbase.dev) type generation now includes `tn_role` annotations so external tools can identify each field's role even when frontmatter names are customized\n- (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed\n - Thanks to @jimbo108108 for reporting\n- Mdbase type status fields now include `tn_completed_values` so external tools can reliably identify which status values count as completed\n- (#1576) Added an optional `Checklist Progress` task-card property that renders a compact progress bar and `completed/total` count from top-level markdown checkboxes\n - Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps\n - In Bases views, map `tasks` (`file.tasks`) to `Checklist Progress`\n - Existing `.base` files need `file.tasks` added to the view `order` YAML manually\n - Newly generated `.base` templates now include `file.tasks` in view `order` by default\n - Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion\n\n## Changed\n\n- Mdbase type generation no longer overwrites `mdbase.yaml` if the file already exists, preserving user customisations\n- Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP\n- Webhook runtime state now syncs automatically when plugin settings change\n- Shared HTTP response/body parsing utilities are now consolidated in a dedicated `httpUtils` module\n- Release notes now include a reminder on every release page that default generated `.base` template changes never overwrite existing user `.base` files, and that users can regenerate templates from Settings to pick up updates\n\n## Fixed\n\n- (#1608) Fixed task title frontmatter being removed when `storeTitleInFilename` is enabled\n - `title` is now retained in frontmatter while filename derivation from title remains unchanged\n - Thanks to @victoraraujo105 for the PR\n- (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View\n - Updated range calculations to use local calendar-day boundaries consistently\n- (#1602) Fixed inconsistent `timeEntries` timestamp formats across create/edit/drag/resize flows\n - Time entry timestamps are now written in canonical UTC ISO format (`toISOString()` with `Z`) across all write paths\n- (#1602) Fixed denormalized `timeEntries.duration` drift after edits\n - Time tracking calculations now derive duration from `startTime`/`endTime`\n - Time entry save paths now strip legacy `duration` values instead of persisting them\n - Thanks to @dy66 for opening #1602\n","aliases":["/releases/4.4.0/","/releases/4.4.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • Mdbase type generation now includes tn_role annotations so external tools can identify each field's role even when frontmatter names are customized
  • \n
  • (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed
      \n
    • Thanks to @jimbo108108 for reporting
    • \n
    \n
  • \n
  • Mdbase type status fields now include tn_completed_values so external tools can reliably identify which status values count as completed
  • \n
  • (#1576) Added an optional Checklist Progress task-card property that renders a compact progress bar and completed/total count from top-level markdown checkboxes
      \n
    • Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps
    • \n
    • In Bases views, map tasks (file.tasks) to Checklist Progress
    • \n
    • Existing .base files need file.tasks added to the view order YAML manually
    • \n
    • Newly generated .base templates now include file.tasks in view order by default
    • \n
    • Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Mdbase type generation no longer overwrites mdbase.yaml if the file already exists, preserving user customisations
  • \n
  • Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP
  • \n
  • Webhook runtime state now syncs automatically when plugin settings change
  • \n
  • Shared HTTP response/body parsing utilities are now consolidated in a dedicated httpUtils module
  • \n
  • Release notes now include a reminder on every release page that default generated .base template changes never overwrite existing user .base files, and that users can regenerate templates from Settings to pick up updates
  • \n
\n

Fixed#

\n
    \n
  • (#1608) Fixed task title frontmatter being removed when storeTitleInFilename is enabled
      \n
    • title is now retained in frontmatter while filename derivation from title remains unchanged
    • \n
    • Thanks to @victoraraujo105 for the PR
    • \n
    \n
  • \n
  • (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View
      \n
    • Updated range calculations to use local calendar-day boundaries consistently
    • \n
    \n
  • \n
  • (#1602) Fixed inconsistent timeEntries timestamp formats across create/edit/drag/resize flows
      \n
    • Time entry timestamps are now written in canonical UTC ISO format (toISOString() with Z) across all write paths
    • \n
    \n
  • \n
  • (#1602) Fixed denormalized timeEntries.duration drift after edits
      \n
    • Time tracking calculations now derive duration from startTime/endTime
    • \n
    • Time entry save paths now strip legacy duration values instead of persisting them
    • \n
    • Thanks to @dy66 for opening #1602
    • \n
    \n
  • \n
\n","text":"Added# Mdbase type generation now includes tn_role annotations so external tools can identify each field's role even when frontmatter names are customized (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed Thanks to @jimbo108108 for reporting Mdbase type status fields now include tn_completed_values so external tools can reliably identify which status values count as completed (#1576) Added an optional Checklist Progress task-card property that renders a compact progress bar and completed/total count from top-level markdown checkboxes Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps In Bases views, map tasks (file.tasks) to Checklist Progress Existing .base files need file.tasks added to the view order YAML manually Newly generated .base templates now include file.tasks in view order by default Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion Changed# Mdbase type generation no longer overwrites mdbase.yaml if the file already exists, preserving user customisations Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP Webhook runtime state now syncs automatically when plugin settings change Shared HTTP response/body parsing utilities are now consolidated in a dedicated httpUtils module Release notes now include a reminder on every release page that default generated .base template changes never overwrite existing user .base files, and that users can regenerate templates from Settings to pick up updates Fixed# (#1608) Fixed task title frontmatter being removed when storeTitleInFilename is enabled title is now retained in frontmatter while filename derivation from title remains unchanged Thanks to @victoraraujo105 for the PR (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View Updated range calculations to use local calendar-day boundaries consistently (#1602) Fixed inconsistent timeEntries timestamp formats across create/edit/drag/resize flows Time entry timestamps are now written in canonical UTC ISO format (toISOString() with Z) across all write paths (#1602) Fixed denormalized timeEntries.duration drift after edits Time tracking calculations now derive duration from startTime/endTime Time entry save paths now strip legacy duration values instead of persisting them Thanks to @dy66 for opening #1602"},{"route":"/obsidian/releases/4.5.0/","title":"TaskNotes 4.5.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.0.md","namespace":"obsidian","relativePath":"releases/4.5.0.md","raw":"# TaskNotes 4.5.0\n\n## Fixed\n\n- (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled\n - Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports\n- (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup\n - Applied the same protection to task cards so overlapping refreshes are coalesced there too\n - Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior\n- (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events\n - Thanks to @bepolymathe for the request and interoperability details\n- (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task\n - Added a per-view \"Expanded relationships\" option so you can switch between inherited filters and showing all related tasks\n - Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion\n- Improved custom view and search-pane activation when reopening deferred tabs\n- (#1720) Fixed Bases Task List cards showing icon tokens such as `clock` instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs\n - Thanks to @Sirnii for reporting\n- (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs\n - Thanks to @Sarryaz for reporting\n- (#1651) Fixed date `is` query filtering so date-only searches also match timed `scheduled` and `due` values during prefiltering\n - Thanks to @36mimu36 for reporting\n- (#1644) Fixed generated default task views so recurring tasks without a `complete_instances` property still appear as incomplete where appropriate\n - Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior\n- (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today\n - In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere\n - Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix\n- Fixed documentation deployment CI failures caused by `docs-builder/src/js/main.js` being excluded by a broad `.gitignore` rule\n- Reduced background calendar-sync overhead when persisting sync tokens\n- Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads\n- Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened\n- (#1630) Fixed TaskNote inline task cards ignoring centered \"Readable line length\" layout in the Minimal theme\n - Thanks to @martin-forge for reporting\n- Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings\n- Fixed docs site links so internal Markdown links resolve to app routes instead of broken `.md` paths\n- Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar\n\n## Added\n\n- (#1704) Added an option to widen the current day column in multi-day calendar time-grid views\n - You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both\n - Thanks to @dictionarymouse for the feature request\n- Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control\n - Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands\n- (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available\n - Thanks to @hokfujow for the feature request\n- (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views\n - Supports grouped Task List moves, manual ordering via the `tasknotes_manual_order` property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls\n - To use it, sort the view by the Manual Order field (`tasknotes_manual_order` by default), or regenerate the built-in `.base` templates from **Settings → TaskNotes → General → Create Default Files**\n - Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR\n- Added a standalone [TaskNotes Specification](https://github.com/callumalpass/tasknotes-spec) repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests\n- Added [tasknotes-tui](https://github.com/callumalpass/tasknotes-tui), a terminal UI for working with TaskNotes vaults\n - Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette\n\n## Changed\n\n- Refactored several internal modules to reduce coupling and make maintenance safer\n- Updated generated `_types/task.md` output so `dateCreated` and `dateModified` include generated timestamp values, and `recurrence_anchor` defaults to `scheduled`\n- Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy\n- Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations\n","aliases":["/releases/4.5.0/","/releases/4.5.0/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled
      \n
    • Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports
    • \n
    \n
  • \n
  • (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup
      \n
    • Applied the same protection to task cards so overlapping refreshes are coalesced there too
    • \n
    • Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior
    • \n
    \n
  • \n
  • (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events
      \n
    • Thanks to @bepolymathe for the request and interoperability details
    • \n
    \n
  • \n
  • (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task
      \n
    • Added a per-view "Expanded relationships" option so you can switch between inherited filters and showing all related tasks
    • \n
    • Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion
    • \n
    \n
  • \n
  • Improved custom view and search-pane activation when reopening deferred tabs
  • \n
  • (#1720) Fixed Bases Task List cards showing icon tokens such as clock instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs
      \n
    • Thanks to @Sirnii for reporting
    • \n
    \n
  • \n
  • (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs
      \n
    • Thanks to @Sarryaz for reporting
    • \n
    \n
  • \n
  • (#1651) Fixed date is query filtering so date-only searches also match timed scheduled and due values during prefiltering
      \n
    • Thanks to @36mimu36 for reporting
    • \n
    \n
  • \n
  • (#1644) Fixed generated default task views so recurring tasks without a complete_instances property still appear as incomplete where appropriate
      \n
    • Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior
    • \n
    \n
  • \n
  • (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today
      \n
    • In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere
    • \n
    • Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix
    • \n
    \n
  • \n
  • Fixed documentation deployment CI failures caused by docs-builder/src/js/main.js being excluded by a broad .gitignore rule
  • \n
  • Reduced background calendar-sync overhead when persisting sync tokens
  • \n
  • Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads
  • \n
  • Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened
  • \n
  • (#1630) Fixed TaskNote inline task cards ignoring centered "Readable line length" layout in the Minimal theme
      \n
    • Thanks to @martin-forge for reporting
    • \n
    \n
  • \n
  • Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings
  • \n
  • Fixed docs site links so internal Markdown links resolve to app routes instead of broken .md paths
  • \n
  • Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar
  • \n
\n

Added#

\n
    \n
  • (#1704) Added an option to widen the current day column in multi-day calendar time-grid views
      \n
    • You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both
    • \n
    • Thanks to @dictionarymouse for the feature request
    • \n
    \n
  • \n
  • Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control
      \n
    • Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands
    • \n
    \n
  • \n
  • (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available
      \n
    • Thanks to @hokfujow for the feature request
    • \n
    \n
  • \n
  • (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views
      \n
    • Supports grouped Task List moves, manual ordering via the tasknotes_manual_order property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls
    • \n
    • To use it, sort the view by the Manual Order field (tasknotes_manual_order by default), or regenerate the built-in .base templates from Settings → TaskNotes → General → Create Default Files
    • \n
    • Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR
    • \n
    \n
  • \n
  • Added a standalone TaskNotes Specification repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests
  • \n
  • Added tasknotes-tui, a terminal UI for working with TaskNotes vaults
      \n
    • Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Refactored several internal modules to reduce coupling and make maintenance safer
  • \n
  • Updated generated _types/task.md output so dateCreated and dateModified include generated timestamp values, and recurrence_anchor defaults to scheduled
  • \n
  • Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy
  • \n
  • Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations
  • \n
\n","text":"Fixed# (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup Applied the same protection to task cards so overlapping refreshes are coalesced there too Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events Thanks to @bepolymathe for the request and interoperability details (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task Added a per-view \"Expanded relationships\" option so you can switch between inherited filters and showing all related tasks Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion Improved custom view and search-pane activation when reopening deferred tabs (#1720) Fixed Bases Task List cards showing icon tokens such as clock instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs Thanks to @Sirnii for reporting (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs Thanks to @Sarryaz for reporting (#1651) Fixed date is query filtering so date-only searches also match timed scheduled and due values during prefiltering Thanks to @36mimu36 for reporting (#1644) Fixed generated default task views so recurring tasks without a complete_instances property still appear as incomplete where appropriate Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix Fixed documentation deployment CI failures caused by docs-builder/src/js/main.js being excluded by a broad .gitignore rule Reduced background calendar-sync overhead when persisting sync tokens Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened (#1630) Fixed TaskNote inline task cards ignoring centered \"Readable line length\" layout in the Minimal theme Thanks to @martin-forge for reporting Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings Fixed docs site links so internal Markdown links resolve to app routes instead of broken .md paths Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar Added# (#1704) Added an option to widen the current day column in multi-day calendar time-grid views You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both Thanks to @dictionarymouse for the feature request Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available Thanks to @hokfujow for the feature request (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views Supports grouped Task List moves, manual ordering via the tasknotes_manual_order property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls To use it, sort the view by the Manual Order field (tasknotes_manual_order by default), or regenerate the built-in .base templates from Settings → TaskNotes → General → Create Default Files Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR Added a standalone TaskNotes Specification repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests Added tasknotes-tui, a terminal UI for working with TaskNotes vaults Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette Changed# Refactored several internal modules to reduce coupling and make maintenance safer Updated generated _types/task.md output so dateCreated and dateModified include generated timestamp values, and recurrence_anchor defaults to scheduled Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations"},{"route":"/obsidian/releases/4.5.1/","title":"TaskNotes 4.5.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.1.md","namespace":"obsidian","relativePath":"releases/4.5.1.md","raw":"# TaskNotes 4.5.1\n\n## Fixed\n\n- (#1672) Fixed custom date ranges in the MCP time summary tool so `from` and `to` dates work as expected\n - Thanks to @pib for the fix\n- (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward\n - Thanks to @ysafonov for the report and screenshot\n","aliases":["/releases/4.5.1/","/releases/4.5.1/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1672) Fixed custom date ranges in the MCP time summary tool so from and to dates work as expected
      \n
    • Thanks to @pib for the fix
    • \n
    \n
  • \n
  • (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward
      \n
    • Thanks to @ysafonov for the report and screenshot
    • \n
    \n
  • \n
\n","text":"Fixed# (#1672) Fixed custom date ranges in the MCP time summary tool so from and to dates work as expected Thanks to @pib for the fix (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward Thanks to @ysafonov for the report and screenshot"},{"route":"/obsidian/releases/4.5.2/","title":"TaskNotes 4.5.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.2.md","namespace":"obsidian","relativePath":"releases/4.5.2.md","raw":"# TaskNotes 4.5.2\n\n## Added\n\n- (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal.\n - Thanks to @fastrick for the request and @renatomen for the PR.\n- (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values.\n - Thanks to @Treygec for the request and PR.\n- (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior.\n - Thanks to @P-Sc for the PR.\n\n## Changed\n\n- Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations.\n- Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully.\n\n## Fixed\n\n- (#1778) Fixed MCP initialize requests using newer protocol versions such as `2025-11-25` failing instead of negotiating down to TaskNotes' supported MCP version.\n - Thanks to @SakulaPor for reporting.\n- (#1781) Fixed duplicate metadata properties on Bases task cards when bare and `note.`-prefixed property IDs map to the same TaskNotes field.\n - Thanks to @loukandr for reporting and tracing the issue.\n- (#1787) Removed the \"(click to change)\" helper text from recurrence tooltips on task cards.\n - Thanks to @kazerniel for reporting.\n- (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects.\n - Thanks to @prepare4robots for reporting.\n- (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections.\n - Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus.\n - Thanks to @3zra47 for reporting.\n- (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled.\n - Thanks to @spiv for reporting.\n- (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone.\n - Thanks to @3zra47 for reporting and following up.\n- (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes.\n - Thanks to @3zra47 for reporting and following up.\n- (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation.\n - Thanks to @renatomen for the PR.\n- (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling.\n - Thanks to @sigma7863 for the PR.\n- (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties.\n - Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue.\n- (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations.\n - Thanks to @berzernberg for reporting Russian translation gaps.\n- (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder.\n - Thanks to @martin-forge for reporting and the PR.\n- (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date.\n - Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues.\n- (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency.\n - Thanks to @martin-forge for reporting.\n- Published [`mdbase-tasknotes`](https://github.com/callumalpass/mdbase-tasknotes) 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas.\n - Includes clearer create-path diagnostics, natural-language `mtn list --due` filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct `mtn --version` reporting.\n - Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR.\n- (#1667) Fixed NLP scheduled-date parsing so standalone `scheduled` and `start` triggers can set scheduled dates alongside due dates.\n - Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR.\n- Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases.\n- (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight.\n - Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone.\n - Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date.\n - Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758.\n- (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick.\n - Pomodoro stats now refresh on initial render and session completion instead of once per second.\n - Pomodoro daily-note stats now read the relevant date/range instead of routing through all history.\n - Native Pomodoro notifications now respect the notification setting and granted permission before showing.\n - Thanks to @Szu-Szu for reporting and @its-thex for confirming.\n- (#1744) Fixed Bases Task List views so changing the per-view `Expanded relationships` option takes effect on re-render.\n - Restores the expected `show-all` behavior for setups that hide subtasks at the top level with `note.projects.isEmpty()`.\n - Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow.\n- Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards.\n","aliases":["/releases/4.5.2/","/releases/4.5.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal.
      \n
    • Thanks to @fastrick for the request and @renatomen for the PR.
    • \n
    \n
  • \n
  • (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values.
      \n
    • Thanks to @Treygec for the request and PR.
    • \n
    \n
  • \n
  • (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior.
      \n
    • Thanks to @P-Sc for the PR.
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations.
  • \n
  • Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully.
  • \n
\n

Fixed#

\n
    \n
  • (#1778) Fixed MCP initialize requests using newer protocol versions such as 2025-11-25 failing instead of negotiating down to TaskNotes' supported MCP version.
      \n
    • Thanks to @SakulaPor for reporting.
    • \n
    \n
  • \n
  • (#1781) Fixed duplicate metadata properties on Bases task cards when bare and note.-prefixed property IDs map to the same TaskNotes field.
      \n
    • Thanks to @loukandr for reporting and tracing the issue.
    • \n
    \n
  • \n
  • (#1787) Removed the "(click to change)" helper text from recurrence tooltips on task cards.
      \n
    • Thanks to @kazerniel for reporting.
    • \n
    \n
  • \n
  • (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects.
      \n
    • Thanks to @prepare4robots for reporting.
    • \n
    \n
  • \n
  • (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections.
      \n
    • Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus.
    • \n
    • Thanks to @3zra47 for reporting.
    • \n
    \n
  • \n
  • (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled.
      \n
    • Thanks to @spiv for reporting.
    • \n
    \n
  • \n
  • (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone.
      \n
    • Thanks to @3zra47 for reporting and following up.
    • \n
    \n
  • \n
  • (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes.
      \n
    • Thanks to @3zra47 for reporting and following up.
    • \n
    \n
  • \n
  • (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation.
      \n
    • Thanks to @renatomen for the PR.
    • \n
    \n
  • \n
  • (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling.
      \n
    • Thanks to @sigma7863 for the PR.
    • \n
    \n
  • \n
  • (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties.
      \n
    • Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue.
    • \n
    \n
  • \n
  • (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations.
      \n
    • Thanks to @berzernberg for reporting Russian translation gaps.
    • \n
    \n
  • \n
  • (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder.
      \n
    • Thanks to @martin-forge for reporting and the PR.
    • \n
    \n
  • \n
  • (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date.
      \n
    • Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues.
    • \n
    \n
  • \n
  • (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency.
      \n
    • Thanks to @martin-forge for reporting.
    • \n
    \n
  • \n
  • Published mdbase-tasknotes 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas.
      \n
    • Includes clearer create-path diagnostics, natural-language mtn list --due filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct mtn --version reporting.
    • \n
    • Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR.
    • \n
    \n
  • \n
  • (#1667) Fixed NLP scheduled-date parsing so standalone scheduled and start triggers can set scheduled dates alongside due dates.
      \n
    • Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR.
    • \n
    \n
  • \n
  • Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases.
  • \n
  • (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight.
      \n
    • Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone.
    • \n
    • Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date.
    • \n
    • Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758.
    • \n
    \n
  • \n
  • (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick.
      \n
    • Pomodoro stats now refresh on initial render and session completion instead of once per second.
    • \n
    • Pomodoro daily-note stats now read the relevant date/range instead of routing through all history.
    • \n
    • Native Pomodoro notifications now respect the notification setting and granted permission before showing.
    • \n
    • Thanks to @Szu-Szu for reporting and @its-thex for confirming.
    • \n
    \n
  • \n
  • (#1744) Fixed Bases Task List views so changing the per-view Expanded relationships option takes effect on re-render.
      \n
    • Restores the expected show-all behavior for setups that hide subtasks at the top level with note.projects.isEmpty().
    • \n
    • Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow.
    • \n
    \n
  • \n
  • Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards.
  • \n
\n","text":"Added# (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal. Thanks to @fastrick for the request and @renatomen for the PR. (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values. Thanks to @Treygec for the request and PR. (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior. Thanks to @P-Sc for the PR. Changed# Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations. Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully. Fixed# (#1778) Fixed MCP initialize requests using newer protocol versions such as 2025-11-25 failing instead of negotiating down to TaskNotes' supported MCP version. Thanks to @SakulaPor for reporting. (#1781) Fixed duplicate metadata properties on Bases task cards when bare and note.-prefixed property IDs map to the same TaskNotes field. Thanks to @loukandr for reporting and tracing the issue. (#1787) Removed the \"(click to change)\" helper text from recurrence tooltips on task cards. Thanks to @kazerniel for reporting. (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects. Thanks to @prepare4robots for reporting. (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections. Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus. Thanks to @3zra47 for reporting. (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled. Thanks to @spiv for reporting. (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone. Thanks to @3zra47 for reporting and following up. (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes. Thanks to @3zra47 for reporting and following up. (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation. Thanks to @renatomen for the PR. (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling. Thanks to @sigma7863 for the PR. (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties. Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue. (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations. Thanks to @berzernberg for reporting Russian translation gaps. (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder. Thanks to @martin-forge for reporting and the PR. (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date. Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues. (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency. Thanks to @martin-forge for reporting. Published mdbase-tasknotes 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas. Includes clearer create-path diagnostics, natural-language mtn list --due filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct mtn --version reporting. Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR. (#1667) Fixed NLP scheduled-date parsing so standalone scheduled and start triggers can set scheduled dates alongside due dates. Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR. Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases. (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight. Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone. Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date. Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758. (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick. Pomodoro stats now refresh on initial render and session completion instead of once per second. Pomodoro daily-note stats now read the relevant date/range instead of routing through all history. Native Pomodoro notifications now respect the notification setting and granted permission before showing. Thanks to @Szu-Szu for reporting and @its-thex for confirming. (#1744) Fixed Bases Task List views so changing the per-view Expanded relationships option takes effect on re-render. Restores the expected show-all behavior for setups that hide subtasks at the top level with note.projects.isEmpty(). Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow. Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards."},{"route":"/obsidian/releases/4.5.3/","title":"TaskNotes 4.5.3","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.5.3.md","namespace":"obsidian","relativePath":"releases/4.5.3.md","raw":"# TaskNotes 4.5.3\n\n## Fixed\n\n- (#1834, #1847) Fixed empty Bases formula and custom properties showing `null` or `undefined` on TaskNotes task cards.\n - A big thanks to @Glint-Eye and @3zra47 for reporting.\n- (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates.\n - A big thanks to @kmaustral for reporting.\n","aliases":["/releases/4.5.3/","/releases/4.5.3/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Fixed#

\n
    \n
  • (#1834, #1847) Fixed empty Bases formula and custom properties showing null or undefined on TaskNotes task cards.
      \n
    • A big thanks to @Glint-Eye and @3zra47 for reporting.
    • \n
    \n
  • \n
  • (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates.
      \n
    • A big thanks to @kmaustral for reporting.
    • \n
    \n
  • \n
\n","text":"Fixed# (#1834, #1847) Fixed empty Bases formula and custom properties showing null or undefined on TaskNotes task cards. A big thanks to @Glint-Eye and @3zra47 for reporting. (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates. A big thanks to @kmaustral for reporting."},{"route":"/obsidian/releases/4.6.0/","title":"TaskNotes 4.6.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.6.0.md","namespace":"obsidian","relativePath":"releases/4.6.0.md","raw":"# TaskNotes 4.6.0\n\n## Changed\n\n- TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin.\n- Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes.\n\n## Fixed\n\n- Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file.\n","aliases":["/releases/4.6.0/","/releases/4.6.0/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Changed#

\n
    \n
  • TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin.
  • \n
  • Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes.
  • \n
\n

Fixed#

\n
    \n
  • Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file.
  • \n
\n","text":"Changed# TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin. Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes. Fixed# Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file."},{"route":"/obsidian/releases/4.7.0/","title":"TaskNotes 4.7.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.7.0.md","namespace":"obsidian","relativePath":"releases/4.7.0.md","raw":"# TaskNotes 4.7.0\n\n## Changed\n\n- Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit `any` usage.\n- Clarified privacy documentation for optional integrations that make periodic background network refreshes.\n- Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views.\n- (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date\n - Thanks to @loukandr for the contribution\n\n## Fixed\n\n- Fixed project autocomplete searches so non-empty `+` queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows.\n- (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as `2025-08-12 18:00`\n - Thanks to @bepolymathe for requesting this and @m4to-3pe for following up\n- Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing.\n- (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as `{{project}}` before moving the file\n - Thanks to @OXI-717 for reporting\n- (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title\n - Thanks to @Sineapple for reporting\n- (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks\n - Thanks to @macbikegeek for reporting\n- (#1880) Fixed the status bar time-tracking label for task titles that contain a dash\n - Thanks to @ubidev for reporting\n- (#1854) Fixed modal task completion so completed tasks receive a completed date consistently\n - Thanks to @misolex for reporting\n- (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons\n - Thanks to @kmaustral for reporting and @loukandr for the fix\n\n## Removed\n\n- Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported.\n","aliases":["/releases/4.7.0/","/releases/4.7.0/"],"toc":[{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"removed","text":"Removed"}],"html":"

Changed#

\n
    \n
  • Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit any usage.
  • \n
  • Clarified privacy documentation for optional integrations that make periodic background network refreshes.
  • \n
  • Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views.
  • \n
  • (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date
      \n
    • Thanks to @loukandr for the contribution
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed project autocomplete searches so non-empty + queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows.
  • \n
  • (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as 2025-08-12 18:00
      \n
    • Thanks to @bepolymathe for requesting this and @m4to-3pe for following up
    • \n
    \n
  • \n
  • Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing.
  • \n
  • (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as {{project}} before moving the file
      \n
    • Thanks to @OXI-717 for reporting
    • \n
    \n
  • \n
  • (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title
      \n
    • Thanks to @Sineapple for reporting
    • \n
    \n
  • \n
  • (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks
      \n
    • Thanks to @macbikegeek for reporting
    • \n
    \n
  • \n
  • (#1880) Fixed the status bar time-tracking label for task titles that contain a dash
      \n
    • Thanks to @ubidev for reporting
    • \n
    \n
  • \n
  • (#1854) Fixed modal task completion so completed tasks receive a completed date consistently
      \n
    • Thanks to @misolex for reporting
    • \n
    \n
  • \n
  • (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons
      \n
    • Thanks to @kmaustral for reporting and @loukandr for the fix
    • \n
    \n
  • \n
\n

Removed#

\n
    \n
  • Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported.
  • \n
\n","text":"Changed# Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit any usage. Clarified privacy documentation for optional integrations that make periodic background network refreshes. Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views. (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date Thanks to @loukandr for the contribution Fixed# Fixed project autocomplete searches so non-empty + queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows. (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as 2025-08-12 18:00 Thanks to @bepolymathe for requesting this and @m4to-3pe for following up Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing. (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as {{project}} before moving the file Thanks to @OXI-717 for reporting (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title Thanks to @Sineapple for reporting (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks Thanks to @macbikegeek for reporting (#1880) Fixed the status bar time-tracking label for task titles that contain a dash Thanks to @ubidev for reporting (#1854) Fixed modal task completion so completed tasks receive a completed date consistently Thanks to @misolex for reporting (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons Thanks to @kmaustral for reporting and @loukandr for the fix Removed# Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported."},{"route":"/obsidian/releases/4.7.1/","title":"TaskNotes 4.7.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.7.1.md","namespace":"obsidian","relativePath":"releases/4.7.1.md","raw":"# TaskNotes 4.7.1\n\n## Changed\n\n- Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of `main.js`, `manifest.json`, and `styles.css`.\n","aliases":["/releases/4.7.1/","/releases/4.7.1/"],"toc":[{"level":2,"id":"changed","text":"Changed"}],"html":"

Changed#

\n
    \n
  • Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of main.js, manifest.json, and styles.css.
  • \n
\n","text":"Changed# Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of main.js, manifest.json, and styles.css."},{"route":"/obsidian/releases/4.7.2/","title":"TaskNotes 4.7.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.7.2.md","namespace":"obsidian","relativePath":"releases/4.7.2.md","raw":"# TaskNotes 4.7.2\n\n## Changed\n\n- Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission.\n- Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance.\n- Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup.\n- Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals.\n- Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions.\n- Prevented a console error when plugin listeners are cleaned up after reloads.\n- Added a local lint check to prevent interval-based polling in files that also perform network requests.\n","aliases":["/releases/4.7.2/","/releases/4.7.2/"],"toc":[{"level":2,"id":"changed","text":"Changed"}],"html":"

Changed#

\n
    \n
  • Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission.
  • \n
  • Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance.
  • \n
  • Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup.
  • \n
  • Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals.
  • \n
  • Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions.
  • \n
  • Prevented a console error when plugin listeners are cleaned up after reloads.
  • \n
  • Added a local lint check to prevent interval-based polling in files that also perform network requests.
  • \n
\n","text":"Changed# Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission. Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance. Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup. Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals. Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions. Prevented a console error when plugin listeners are cleaned up after reloads. Added a local lint check to prevent interval-based polling in files that also perform network requests."},{"route":"/obsidian/releases/4.8.0/","title":"TaskNotes 4.8.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.8.0.md","namespace":"obsidian","relativePath":"releases/4.8.0.md","raw":"# TaskNotes 4.8.0\n\n## Added\n\n- (#353) Added a `Has Subtasks` filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this.\n- (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this.\n- (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up.\n- (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this.\n- (#1052) Added a public JavaScript API for in-vault scripts at `app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text)`, so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this.\n- (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this.\n- (#1254) Added `../` and `./` normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as `{{currentNotePath}}/../Tasks`. Thanks to @rdick for suggesting this.\n- (#1267) Added Daily Notes-style date tokens such as `YYYY`, `MM`, `DD`, `MMMM`, and `dddd` to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this.\n- (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this.\n- (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this.\n- (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this.\n- (#1376) Added backslash escapes for NLP trigger tokens, so text like `\\@context`, `\\*done`, or `\\tomorrow` can stay in the task title. Thanks to @JerryLu086 for suggesting this.\n- (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this.\n- (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up.\n- (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this.\n- (#144) Added an \"Open note in new tab\" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback.\n- (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback.\n- (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up.\n- (#1541) Added `{{currentNotePath}}` and `{{currentNoteTitle}}` support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback.\n- (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback.\n- (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case.\n- (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case.\n- (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this.\n- (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this.\n- (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as \"tomorrow at 3pm\" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this.\n- (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.\n- (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this.\n- (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this.\n- (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this.\n- (#1625) Added `Shift` + `Cmd`/`Ctrl` + `Enter` in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this.\n- (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this.\n- (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short `projectId`. Thanks to @bendavis987 for the contribution.\n- (#923) Added `{{projectFilePath}}` and `{{projectFilePaths}}` folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this.\n- (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this.\n- (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback.\n- (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this.\n- (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this.\n- (#1776) Allowed calendar timeline end times after midnight, such as `26:00` for a 2 AM next-day end. Thanks to @chrabia for suggesting this.\n- (#1784, #1833) Added a per-view `pinnedColumns` option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this.\n- (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this.\n- (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up.\n- (#1808) Added advanced Kanban swimlane ordering through `swimLaneOrder`, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback.\n- (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this.\n- (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this.\n- (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this.\n- (#561) Added a \"Last day\" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up.\n- (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this.\n- (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this.\n- (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this.\n- (#1176) Added advanced Kanban WIP limits through `wipLimits`, so column headers can show `(current/limit)` counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this.\n- (#914) Added a generated `Due in` countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this.\n- (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this.\n- (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this.\n- (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback.\n- (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this.\n- (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions.\n- (#791) Added a UUID v4 task filename format and `{{uuid}}` custom filename template variable. Thanks to @bangbangbanggit for suggesting this.\n- (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback.\n- (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this.\n- (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this.\n- (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback.\n- (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this.\n- Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes.\n\n## Changed\n\n- Expanded the bug report template to ask for Obsidian \"Show debug info\" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots.\n- Release notes now show the default `.base` file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes.\n- Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project.\n- (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion.\n- (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up.\n- Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards.\n- Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected.\n- Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage.\n- (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this.\n- (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this.\n- Made task-card priority dots and configured priority icons slightly larger for better visibility.\n- (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this.\n- (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this.\n- (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this.\n- (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this.\n- (#1392) Made TaskNotes date fields accept compact `YYYYMMDD` typing and pasted dates. Thanks to @kazerniel for suggesting this.\n- (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this.\n- (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this.\n- (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this.\n- Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers.\n- (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first picker where clicking a date saves immediately, with time entry still available in the picker. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.\n- (#1642) Made completion-based custom recurrence use flexible weekly, monthly, and yearly intervals without forcing a fixed weekday, month day, or month. Thanks to @Volker-brdb for suggesting this.\n- (#1724) Moved recurring task complete/skip instance actions into the date area of the task context menu. Thanks to @prepare4robots for suggesting this.\n- (#1762) Used the configured Google Calendar task export target as the default calendar when creating manual external calendar events. Thanks to @chrabia for suggesting this.\n- (#1774) Made expandable project chevrons visible and easier to tap on mobile. Thanks to @sh0nuff for suggesting this.\n- (#190) Made task-card and inline task-link action controls easier to tap on mobile, including always-visible task options on touch layouts. Thanks to @Poly-0000 for suggesting this.\n- (#518, #1710, #1785) Added an opt-in setting for Create subtask to inherit the parent task's projects, contexts, priority, and non-identifying tags while always keeping the parent-task project link. Thanks to @bepolymathe, @Jalpara, and @poulpoulsen for reporting this, and to @tomsymonds, @AndyEveritt, @wedgen, @lindsaylearns, and @hokfujow for the follow-up feedback.\n- (#1790) Extended the identifying-tag hiding setting to task modal tag suggestions, and kept hidden identifying tag children in place when editing other tags. Thanks to @loukandr for suggesting this.\n- (#1804) Made the inline-created task folder setting visible even when instant conversion is disabled, and clarified that leaving it empty uses the default tasks folder. Thanks to @CaFeZn for suggesting this.\n- (#1822) Matched the Task Edit Modal subtask list order to the existing relationship sort, so active and higher-priority subtasks appear ahead of completed ones. Thanks to @Glint-Eye for suggesting this.\n- (#1233, #1339) Added an Appearance setting to expand project subtasks by default in task cards, while still letting individual cards be collapsed. Thanks to @n1njaznutz and @hasanyilmaz for suggesting this and @kazerniel and @benmartinek for the follow-up.\n- (#763) Made the Relationships widget appear on project notes that match Project Autosuggest tag or property filters, even before any tasks link to the project. Thanks to @ChadHattabaugh for suggesting this.\n- (#732) Remembered the Task & Project Statistics filters between openings, including the selected date range, custom dates, and minimum time filter. Thanks to @RumiaKitinari for suggesting this.\n- (#1335) Added optional default times for new task scheduled and due dates, so default-dated tasks can appear as timed calendar events instead of all-day events. Thanks to @echo-saurav for suggesting this.\n- (#1327) Made TaskNotes Bases search match any word in a multi-word search instead of requiring the whole phrase. Thanks to @craziedde for suggesting this.\n- (#1318) Made aliased inline task links use the alias text inside the task widget, so `[[Task title|short label]]` can display as `short label`. Thanks to @3zra47 for suggesting this and @kazerniel for the follow-up.\n- (#1325) Added `./` and `../` support to Include folders filters for project and file autosuggest, resolved from the active note's folder. Thanks to @EpolPers for suggesting this.\n- (#1313) Added generated `llms.txt` and `llms-full.txt` files to the documentation site, so the primary docs can be shared with LLM tools more easily. Thanks to @JacksonMcDonaldDev for suggesting this.\n- (#1308) Added a Calendar view option to stop date links from creating missing daily notes, while still opening existing daily notes. Thanks to @Arachnidai for suggesting this.\n- (#1300) Allowed priority, status, calendar subscription, and timeblock color settings to use Obsidian theme color names such as `red`, `blue`, and `cyan`. Thanks to @thestrike72 for suggesting this.\n- (#1299) Added a command that creates or opens a task and immediately starts time tracking for it. Thanks to @slipstyle for suggesting this.\n- (#1284) Added an exact-match option for hiding task identification tags, so `#task` can be hidden while nested tags such as `#task/project` remain visible. Thanks to @3zra47 for suggesting this.\n- (#1009) Added a confirmed Delete button to the Edit Task modal, so unwanted task notes can be removed without first opening the note file. Thanks to @jalooc for suggesting this.\n- Improved the internal structure of Calendar, Kanban, Bases, task cards, and task modals to make future changes easier to test and maintain.\n\n## Fixed\n\n- (#697, #1374) Recognized manually authored task notes that use a single scalar tag such as `tags: task`, so they appear in TaskNotes views and menus like notes using YAML list tags. Thanks to @aubreyz and @phortx for reporting this, and to @jleewastaken for the follow-up.\n- Removed the upward hover shift from calendar events while keeping the hover shadow feedback.\n- Made same-column manual-order drops in TaskNotes Kanban settle immediately when the local order patch is safe, including virtual columns through a stable reorder path that avoids layout jumps.\n- Made single-card cross-column drops in TaskNotes Kanban settle through a local state patch when the move is safe, reducing the wait for the full Bases refresh.\n- Fixed Calendar timeblocks created from a selected time range so they appear as soon as Obsidian indexes the daily note update, instead of waiting for a later refresh.\n- Replaced the external calendar event emoji marker with the calendar icon and kept it in the same top-right event corner.\n- Restored Task List group toggles and recurring calendar month controls to compact icon buttons instead of inherited boxed theme buttons.\n- Refined the settings tab navigation styling so tabs read as quieter inline navigation instead of default buttons.\n- (#263) Made the instant inline task conversion button respond to touch/pointer activation, so mobile multi-line selections can be converted into TaskNotes. Thanks to @cathywu for reporting this.\n- (#216) Preserved `@context` markers when converting Tasks-plugin-style checkbox tasks into TaskNotes, while keeping those contexts out of the created task title. Thanks to @ksdavidc for suggesting this, and to @hangryscribe3, @nayatiuh, and @natleahh for the follow-up feedback.\n- (#508) Showed project note names instead of full project paths in grouped Kanban and Task List headings, while keeping the headings linked to the project note. Thanks to @elvarb for reporting this and @dmodify for confirming it in Task List.\n- (#408) Used the task title as the native system notification title for task reminders instead of always showing `TaskNotes Reminder`. Thanks to @DudeThatsErin for reporting this and @phillipadsmith for the follow-up.\n- (#385) Let Mini Calendar month controls shrink and wrap cleanly in narrow sidebars. Thanks to @iholston for reporting this.\n- Fixed Calendar List view task cards so they use the available row width without duplicate list cells, row-hover backgrounds, or linked-hover styling.\n- (#552) Made instant task convert buttons appear for checkbox tasks inside callouts, and kept converted links inside the callout list. Thanks to @Oblique82 for reporting this and @ksdavidc for the follow-up.\n- (#559) Treated notes linked to one loaded recurring calendar event instance as related to the other instances in that series. Thanks to @cathywu for reporting this and @mdbraber for the implementation notes.\n- (#685) Made Calendar list views respect the All-day slot option by hiding all-day events from the list when that option is turned off. Thanks to @RumiaKitinari for reporting this.\n- (#643) Stopped custom filename templates such as `task-{year}{month}{day}{hour}{minute}` from incorrectly showing the \"filename shortened\" notice when creating tasks. Thanks to @minchinweb for reporting this.\n- (#722) Made Skip Break reset a queued Pomodoro break back to the next focus timer without starting a session. Thanks to @Goossiii for reporting this and @YIRU69 for the follow-up.\n- (#782) Made recurrence weekday choices follow the configured first day of week, and made the quick \"Weekdays only\" recurrence use locale weekend data instead of assuming Monday through Friday everywhere. Thanks to @BKSalman for reporting this.\n- (#872) Made note-level task cards appear immediately, and stay visible while editing, when a task note is embedded as a Canvas file node. Thanks to @bangbangbanggit for reporting this and @benmartinek for the follow-up.\n- (#856) Fixed filters for number custom fields so numeric task values match equivalent filter values entered as text. Thanks to @thoughtcipher for reporting this.\n- (#1039) Restored clearer TaskNotes Bases grouping for nested project paths, and made the Calendar refresh control an icon button again. Thanks to @dblinnikov for reporting this.\n- (#1034) Let embedded TaskNotes Calendar views size to their content by default, so month, week, and day embeds no longer reserve full-pane proportions inside notes. Thanks to @same774 for reporting this.\n- (#1023) Kept task modal custom fields scrollable above the iPhone keyboard while creating or editing tasks. Thanks to @3zra47 for reporting this.\n- (#1019) Kept active Pomodoro and time-tracking task references working after the tracked task file is renamed. Thanks to @AndreMonthy for reporting this.\n- (#1037) Let embedded TaskNotes Calendar year views size to their content and kept the year title from wrapping vertically. Thanks to @same774 for reporting this.\n- (#1047) Wrapped long file paths in the Edit Task modal metadata section, so narrow mobile screens no longer get a sideways scrollbar from the File row. Thanks to @3zra47 for reporting this.\n- (#1051) Preserved extra values on a property-based task identification field when saving a task, so list properties such as `class: [task, habit]` no longer get collapsed to only the identifying value. Thanks to @WhoIsSeanGalt for reporting this.\n- (#1060) Reused and revealed an already-open Calendar/Base view when running view commands, so a view kept in the sidebar no longer reopens in a new main tab. Thanks to @kmaustral for reporting this.\n- (#1075) Hid the native WebKit date-input label that could appear as `Label` when editing scheduled dates on macOS. Thanks to @3zra47 for reporting this.\n- (#1076) Allowed timeblocks to end at midnight using `00:00`, and accepted `24:00` as an explicit end-of-day value in timeblock validation. Thanks to @skoove for reporting this and @gregor202 for the follow-up.\n- (#1086) Fixed the Calendar `+ more` control in dark mode so expanded all-day task groups stay readable. Thanks to @same774 for reporting this.\n- (#1100) Applied Advanced Calendar View search and title filters to the tasks used for calendar rendering, so filtering controls affect which tasks appear on the calendar. Thanks to @quiet-coder-io for reporting this.\n- (#1147) Added a delete action for recent Pomodoro statistics sessions, so erroneous Pomodoro history can be removed without editing plugin storage or daily-note frontmatter manually. Thanks to @RumiaKitinari for reporting this and @BrucePlumb for the follow-up.\n- (#1150) Kept recurring tasks' due dates visible in Calendar Bases views, and showed their scheduled date when recurrence instances are hidden. Thanks to @thomatino for reporting this and @BrucePlumb for the follow-up.\n- (#1159) Softened Calendar time-entry styling so recorded time blocks no longer visually outweigh task events. Thanks to @hatespinach for reporting this.\n- (#1191) Aligned the task-card and relationships widgets inside notes with Obsidian's editor margins, including readable-line-width layouts. Thanks to @minchinweb for reporting this.\n- (#1183) Kept the Calendar create menu open after drag-selecting a time range, so the selected duration can be used when creating a task. Thanks to @randomness42 for reporting this.\n- (#1179) Stopped Calendar Bases views from repainting after unrelated note updates when the visible calendar data has not changed. Thanks to @same774 for reporting this.\n- (#1156) Kept property-based task identification through the `tags` property from rewriting task tags as a plain text value, and generated default Bases now use tag membership for that setting. Thanks to @seepage87 for the detailed migration report and @chrsdk for the follow-up.\n- (#1232) Fixed generated Task List Base date filters so recurring tasks scheduled for today appear in the Today view, and today's completed recurring instances stay hidden. Thanks to @mvichosfm for reporting this and @ArthurGideon and @VarunNikam22 for the follow-up.\n- (#1231) Fixed the generated Task List Base Overdue view so tasks with scheduled dates in the past appear alongside tasks with due dates in the past. Thanks to @Lorite for reporting this and @dictionarymouse for the follow-up.\n- (#1228) Matched the task details editor's Markdown heading colors to the active Obsidian theme, including themes that customize heading colors. Thanks to @BrucePlumb for requesting this.\n- (#1227) Refreshed the relationships widget when project references are indexed or updated so project notes can show related tasks automatically again. Thanks to @luckb0x for reporting this.\n- (#1219) Fixed Kanban drags that start on an expanded subtask card so they move that subtask instead of dragging the parent card. Thanks to @craziedde for reporting this.\n- (#990) Treated one-item status lists written by Obsidian Properties as the same status value in TaskNotes Kanban, so they no longer create duplicate columns. Thanks to @mlevison for reporting this.\n- (#983) Let Agenda Calendar views wrap their header controls and task titles inside narrow sidebars, so Today and refresh controls and task icons remain visible without sideways scrolling. Thanks to @3zra47 for reporting this.\n- (#982) Made TaskNotes task-card typography scale from Obsidian's text font size setting, so Bases and Agenda task text follows larger mobile font settings. Thanks to @3zra47 for suggesting this and @chrsdk and @scottaltham-payroc for the follow-up.\n- (#966) Made reminder delete buttons larger and always visible on mobile, so reminders can be removed from the Manage All Reminders modal on iPad. Thanks to @PSG2017 for reporting this.\n- (#964) Made Pomodoro and time-tracking task selection use the current recurring instance status, so a recurring task can still be selected after an earlier instance was completed. Thanks to @lomarcanys for reporting this.\n- (#944) Preserved number and boolean custom field values when moving tasks between grouped Kanban or Task List columns, and when creating a task from a grouped Kanban column. Thanks to @thoughtcipher for reporting this.\n- (#935) Fixed Task List priority sorting so descending order puts higher-weighted priorities first, and due dates are used before scheduled dates when priority values tie. Thanks to @Glint-Eye for reporting this and @kacoroski for the follow-up.\n- (#922) Made the `Blocked` task-card pill expand the blocker tasks, and rendered `blockedBy` dependencies as clickable links when that property is shown on cards. Thanks to @prayidae for reporting this and following up.\n- (#919) Fixed exported ICS task events so they use valid calendar event statuses and can be imported by stricter calendar apps. Thanks to @benoitjadinon for reporting this.\n- (#1213) Fixed embedded Task List Bases in Obsidian pop-out windows so typing below the embed no longer leaves a large blank gap. Thanks to @same774 for reporting this.\n- (#1243) Removed quoted multi-word custom field NLP expressions from created task titles after saving the custom field value. Thanks to @Arachnidai for reporting this.\n- (#1252) Hardened the calendar-first task date picker for iPad taps so date buttons use direct touch manipulation. Thanks to @alxandrharris for reporting this.\n- (#1261) Removed the extra Task List Base scrollbar when an embedded task list note is placed in a sidebar, while keeping normal embedded task lists scrollable in the main note area. Thanks to @cathywu for reporting this.\n- (#1347) Lowered TaskNotes task-card tag CSS specificity so hierarchical tag colors from Obsidian themes and tag-color plugins can apply correctly. Thanks to @3Fish for reporting this.\n- (#1374) Recognized status and priority labels entered through Obsidian Properties or Bases as their configured TaskNotes values. Thanks to @phortx for reporting this.\n- (#1373) Parsed numeric natural-language dates with the configured calendar locale, so `en-GB` treats `11/06/2026` as 11 June instead of November 6, and `YYYY/MM/DD` works consistently. Thanks to @AleMunin for reporting this and @imsuck for the follow-up.\n- (#1370) Prevented recurring task series from being queued for auto-archive when their parent status uses auto-archive, so ongoing recurring tasks are not moved away after completing an occurrence. Thanks to @Jomo94 for reporting this and @martin-forge for the follow-up discussion.\n- (#1367) Made recurring task completion counts use the total expected instances for finite `COUNT` or `UNTIL` recurrences, and stopped showing a made-up percentage for unbounded recurrences. Thanks to @saurinni for reporting this.\n- (#1365) Preserved email and other URI links from converted inline task titles by moving the original links into the new task body, and rendered `message:`/`mailto:` markdown links as external links in TaskNotes surfaces. Thanks to @phillipadsmith for reporting this and @hasanyilmaz for the follow-up.\n- (#1350) Refreshed inline task widgets in Reading mode after task property edits, so changed dates and other visible properties no longer stay stale until the note is reopened. Thanks to @tmsbn for reporting this.\n- (#1329) Pulled the relationships widget up to the end of the note content without removing its normal spacing, and kept that placement updated while editing and on load so it no longer covers the editor. Thanks to @Volker-brdb for reporting this.\n- (#1326) Treated empty task frontmatter values as missing, so empty titles fall back to the filename and blank date, priority, and recurrence fields are ignored. Thanks to @craziedde for suggesting this.\n- (#1316) Stopped stale Workspace state from overriding the configured Calendar view mode, so switching Workspaces no longer forces an old Day/Week/List choice over the view default. Thanks to @kmaustral for reporting this and following up.\n- (#1302) Read task frontmatter directly from the task file when Obsidian has not indexed its metadata yet, so visible tasks can still be opened, updated, and selected instead of reporting \"Task not found\". Thanks to @WorldTeacher for reporting this and @Steven-AA for confirming it.\n- Kept just-written task data available while Obsidian's metadata cache catches up, so immediate reads after task edits no longer briefly return stale values.\n- (#1297) Made the Create or open task footer tappable, so mobile users can create the typed task without needing the Shift+Enter shortcut. Thanks to @slipstyle for reporting this.\n- (#1288) Allowed formula properties to appear in Calendar property-based event start and end date selectors. Thanks to @hasanyilmaz for reporting this.\n- Made TaskNotes Kanban drags show a lightweight held-card preview, so the dragged card remains easy to track while the source column opens the drop slot.\n- (#1423) Refreshed TaskNotes Bases views when subtasks are deleted, so expanded project cards drop removed subtasks and stop showing project controls when the last subtask is gone. Thanks to @normenmueller for reporting this.\n- (#1419) Kept custom user field name, key, and default-value edits in Task Properties settings when closing settings without first blurring the field. Thanks to @s33a for reporting this and @kacoroski for the follow-up.\n- Reduced redundant settings writes by coalescing overlapping saves, so settings changes made in quick succession finish with the latest values without repeating every intermediate save cycle.\n- (#1331, #1411) Made Agenda Calendar Bases respect the Base sort order within each day instead of falling back to alphabetical title order. Thanks to @bane73 and @ky1ejs for reporting this.\n- (#1383) Made task modal markdown editors expose the active editor API expected by plugins such as Templater. Thanks to @tomsymonds for reporting this.\n- Fixed the first-run Create/Edit Task modal so the default fields appear immediately after installing TaskNotes, without needing to open Modal Fields settings or restart Obsidian.\n- (#1895) Restored the natural-language preview in the Create Task modal. Thanks to @ssonhub for reporting this.\n- (#1898) Cleared stale Calendar time-axis column widths when switching views, so Day, Week, and 3-day views keep the time labels anchored on the left. Thanks to @ddevaal for reporting this.\n- (#1439) Fixed generated Bases dependency filters so `blockedBy` entries stored as links, strings, or dependency objects are handled consistently in Not Blocked and Relationships views. Thanks to @prayidae for reporting this and following up.\n- (#1435) Prevented malformed task dependency, status, or priority values from breaking the task context menu. Thanks to @23maverick23 for reporting this.\n- (#1434) Kept older filename-titled tasks readable after turning off \"Store title in filename\" by falling back to the filename when a task has no usable title property. Thanks to @hujuDev for reporting this.\n- (#1433) Made the Due date and Scheduled date weekday picker follow the configured first day of week. Thanks to @sandchipper for reporting this.\n- (#1430) Showed custom user-field property keys in Modal Fields settings instead of internal field IDs. Thanks to @JerryLu086 for reporting this.\n- (#1427) Fixed project autosuggest Required Tags filters so frontmatter tags parsed by Obsidian are handled the same way as direct tag-property filters. Thanks to @ProHaller for reporting this.\n- (#1495) Added an Update default files action for generated Bases views, so task-tag or task-identification setting changes can refresh existing `.base` filters without deleting files manually. Thanks to @Liya430 for reporting this.\n- (#1512) Prevented the split Create/Edit Task modal details pane from collapsing to a one-character-wide column under the Minimal theme. Thanks to @willfanguy for reporting this and sharing detailed CSS notes.\n- (#1524) Fixed task-card font sizes shrinking when a Bases view is opened in an Obsidian pop-out window. Thanks to @Glint-Eye for reporting this.\n- (#1535) Fixed the generated Relationships Base Subtasks filter so single project links do not trigger a Bases `contains` error. Thanks to @DanaKyle for reporting this.\n- (#1102) Refreshed task cards when a task status is edited directly in Obsidian frontmatter, so the card no longer stays on the old status until it is clicked. Thanks to @Wayment9504 for reporting this.\n- (#1105) Added an explicit Close action to the mobile task options menu, so iPhone users do not need to tap near the top system bar to dismiss it. Thanks to @J-R-Troutman for reporting this.\n- (#1550) Prevented mobile Calendar event drags from opening the task context menu before the drag can begin. Thanks to @stil-sudo for suggesting this.\n- (#1563) Removed duplicate entries from Calendar event related notes when the same linked file is also a TaskNote. Thanks to @VarunNikam22 for reporting this.\n- (#1566) Rendered grouped multi-project values as individual links when a Bases group title contains multiple project links. Thanks to @ptsouchlos for suggesting this.\n- (#1569) Allowed local ICS calendar paths inside the vault to be pasted as absolute filesystem paths, and showed a clearer error when the file is outside the vault. Thanks to @Photon89 for reporting this and following up.\n- (#1584) Sanitized task-card status and priority class names, so custom values with spaces no longer create invalid CSS classes. Thanks to @omber for reporting this.\n- (#1587) Stored dependencies added from the task context menu as wikilinks, matching the Edit Task modal. Thanks to @mgrecar for reporting this.\n- (#1590) Clarified HTTP API task creation docs and OpenAPI schema for writable `blockedBy` dependencies, and marked `blocking` as a read-only derived relationship. Thanks to @hGriff0n for reporting this.\n- (#1591) Added a startup guard that avoids saving default settings over an existing settings file if Obsidian temporarily returns no plugin data during an update. Thanks to @GGlider for reporting this.\n- (#1593) Made the New button in TaskNotes Bases views open the TaskNotes create task modal again, so new tasks respect the configured default tasks folder. Thanks to @katlandreth for reporting this.\n- (#1594) Made task cards inside recurring task notes complete the task's current scheduled occurrence instead of today's date when no calendar or view date is supplied. Thanks to @ngraham20 for reporting this.\n- (#1601) Prevented overlapping Live Preview relationship-widget injections from leaving duplicate subtask/relationship sections in a note. Thanks to @wealthychef1 for reporting this and @benmartinek for confirming it.\n- (#1610) Made expanded subtasks in TaskNotes Bases views follow the current view's sorted task order instead of a fixed fallback order. Thanks to @MrZzard for reporting this and @slipstyle for confirming it.\n- (#1609) Restored scrolling in wide split-layout task edit modals when the form content is taller than the modal. Thanks to @3zra47 for reporting this.\n- (#1614) Wrote unchecked boolean custom user-field defaults to new task frontmatter, including tasks created through instant conversion. Thanks to @kobalteule for reporting this.\n- (#1611) Made generated default Bases urgency scores fall back safely when the next-date distance is missing. Thanks to @benoitjadinon for reporting this and suggesting the formula fix.\n- (#1623) Honored \"Store title in filename\" across task creation and edits, so the mapped title property is omitted from frontmatter and stale title fields are removed on save. Thanks to @VenturaNotes for reporting this, and to @Ender367, @slipstyle, and @loukandr for confirming and tracing affected paths.\n- (#1621) Made Kanban swimlane labels stop freezing on mobile and kept their label column compact, leaving more room for task cards while horizontally scrolling. Thanks to @karenchoe428 for reporting this.\n- (#1615) Detected Obsidian custom multi-text properties exposed through `widget: \"multitext\"` as list properties, so Kanban can split those values into multiple columns. Thanks to @konton71 for reporting this.\n- (#1626) Expanded recurring ICS subscription events through the one-year subscription window for high-frequency recurring calendars. Thanks to @pib for reporting this.\n- (#1628) Refreshed Calendar Bases views promptly when switching between filtered Agenda views, so the previous view's task set does not stay visible until the delayed refresh. Thanks to @Lanalangz for reporting this.\n- (#1629) Saved `blockedBy` dependencies selected in the Create Task modal. Thanks to @obsilover for reporting this.\n- (#1634) Aligned custom status icons in inline tasks with the default inline status circle. Thanks to @ttlaylor for reporting this and @basbarten for confirming it.\n- (#1636) Restored the active styling for the Calendar list-view toolbar button. Thanks to @vroablec for reporting this.\n- (#1493, #1638) Kept task time tracking consistent when switching or clearing tasks during an active Pomodoro. Thanks to @ROS-SDN and @katonapng for reporting this, and to @anomatomato for confirming it.\n- (#1639) Respected the aliased-link overlay exclusion in Reading mode even when the alias text matches the task title. Thanks to @MiracleXYZ for reporting this.\n- Fixed actively tracked task cards so the blue time-tracking outline stays visible along the card edges.\n- (#1657) Preserved Bases view defaults when creating tasks from the TaskNotes Kanban/List view New button, so project-scoped views can pass their project assignment into the create task modal. Thanks to @casualQuads122 for reporting this.\n- (#728, #1831) Preserved frontmatter defaults supplied by Obsidian's Bases New action when opening the TaskNotes create task modal from custom Bases views, so filtered views can prefill matching tags, projects, contexts, and custom fields. Thanks to @DillPickle80 and @echo-saurav for suggesting this, and to @prayidae and @renatomen for the detailed follow-up.\n- (#726) Added an instant-conversion option to use the closest heading above the converted line as a project, so checkbox tasks under project headings can inherit that project automatically. Thanks to @ghelton for suggesting this.\n- (#1662) Preserved frontmatter from ICS event note templates when quoted event variables or Templater expressions are used. Thanks to @victorhg for reporting this.\n- (#1663) Fixed Japanese and other Unicode tags on task cards so Kanban tag pills keep the same rounded styling as ASCII tags. Thanks to @kutty-1119 for reporting this.\n- (#1649) Restored daily-note navigation from the Calendar Day view date header. Thanks to @BaccanoMob for reporting this.\n- (#1648, #1665) Fixed the API endpoint list in Integrations settings so it uses the configured bearer token when API authentication is enabled, instead of reporting the running local server as inaccessible. Thanks to @npondel and @warm-july for reporting this.\n- (#1668) Fixed the Create Task magic wand so NLP-triggered custom field values are copied into the custom property inputs before saving. Thanks to @hokfujow for reporting this.\n- (#1669) Stopped the startup settings migration check from rewriting `data.json` just because saved calendar defaults are `false`, `0`, empty, or `null`, reducing unnecessary sync churn. Thanks to @thehyperadvisor for reporting this.\n- (#1674) Improved the timeblock creation error when Daily Notes cannot read its configured folder, so the modal notice points to the Daily Notes core plugin settings instead of only logging the folder lookup failure. Thanks to @Ender367 for reporting this.\n- (#1680) Fixed TaskNotes Calendar Bases options stored under `options`, so Agenda views respect `showPropertyBasedEvents: false` and no longer show duplicate property-based rows for the same task. Thanks to @xiaoyaozhu1991 for reporting this and @KondrotM for confirming it.\n- (#1681) Reduced the cost of inline checkbox convert buttons by only scanning the visible editor range instead of the full document. Thanks to @en-ot for reporting this and @hokfujow for the follow-up.\n- (#1689) Fixed task reminders added or rescheduled through direct frontmatter edits so the notification queue refreshes immediately and relative reminders recalculate from the latest task dates. Thanks to @garzonjav for reporting this.\n- (#1693) Fixed generated default Bases formulas so empty due and scheduled dates are checked with `.isEmpty()` instead of date-field truthiness. Thanks to @benoitjadinon for reporting this.\n- (#1702) Removed the forced bottom gap under TaskNotes custom Bases views, so calendar and other TaskNotes views can fill the available pane height. Thanks to @AudreyLooby for reporting this.\n- (#1719) Fixed task cards in reading mode so Obsidian 1.12.x header changes no longer place the card above the title and properties or drop it after returning to a tab. Thanks to @tholbrook9 for reporting this and tracing the DOM change.\n- (#1722) Saved the source note immediately after converting an inline checkbox task to a TaskNote, so Kanban views do not keep showing the stale inline task alongside the new task file. Thanks to @literallydope for reporting this and sharing screenshots.\n- (#1750) Fixed generated default Bases filters for property-based task identification when the identifying property name contains spaces. Thanks to @Igorgro for reporting this.\n- (#1745) Clarified the inline task documentation so `Create new inline task` is distinguished from current-line conversion. Thanks to @yvos for reporting the mismatch.\n- (#1485) Stopped Google Calendar manual refresh from showing a success notice after token refresh or calendar-list failures. Thanks to @ebanDev for reporting this.\n- (#1474) Made priority-based Kanban swimlanes follow the configured priority order instead of alphabetical task data order. Thanks to @kanzaki1201 for reporting this and @SoTHISIsFitness for the follow-up investigation.\n- (#1470) Restored pointer cursors on TaskNotes interactive elements under Obsidian themes that set `--cursor` to the default cursor. Thanks to @TheFrostedDev for reporting this.\n- (#1463) Documented the supported `FilterQuery` payload for `POST /api/tasks/query`, including context filtering examples and generated API schema details. Thanks to @tcb678 for reporting this and @soloidx for sharing a working query example.\n- (#1464) Made `context` on `GET /api/tasks` follow the same filtering guidance as `project`, so the API now points clients to `POST /api/tasks/query` instead of ignoring the parameter. Thanks to @tcb678 for suggesting this.\n- (#1457) Rendered scheduled-to-due calendar spans with scheduled times as daily timed events instead of moving them to the all-day section. Thanks to @atos2212-blip for reporting this and @rayvermey for confirming it.\n- (#1450) Returned configured user fields in HTTP API task responses under `customProperties`, while keeping the configured frontmatter keys available on each task. Thanks to @Admorei for reporting this and @nschenone for the follow-up.\n- (#1449) Let embedded Agenda views use auto-height sizing by default, so one-day list embeds no longer reserve a large empty calendar block. Thanks to @GlebYavorski for reporting this.\n- (#1446) Kept custom Kanban columns from `columnOrder` available when they are empty, so `hideEmptyColumns: false` can show drop targets for custom grouped values. Thanks to @akhtsang for reporting this.\n- (#1459) Avoided double \"Failed to create task\" prefixes in task creation error notices. Thanks to @Sineapple for reporting this, and to @slipstyle and @Stockemer for the follow-up investigation.\n- (#1469) Fixed Convert current note to task so saving the untouched edit modal writes the task frontmatter instead of reporting no changes. Thanks to @slipstyle for reporting this, and to @jhoogeboom and @ngraham20 for confirming it.\n- (#1466) Prefilled the current note as the project when creating a task from an embedded Subtasks/Relationships Base filtered with `this.file.asLink()`. Thanks to @jhoogeboom for reporting this, and to @cybersader, @fsmontenegro, and @benmartinek for the follow-up discussion.\n- (#1476) Showed linked parent-task project titles instead of timestamp filenames in project stats and grouped task views when the linked task has a frontmatter title. Thanks to @RumiaKitinari for reporting this.\n- (#1487) Let Calendar task event titles wrap instead of clipping long names, and removed the redundant due-date prefix from due task events. Thanks to @Alexander-Bergmann for reporting this.\n- (#1488, #1739) Enabled Kanban touch dragging on touch-capable desktop and convertible devices, not only mobile Obsidian. Thanks to @tmoyland001 and @mgsima for reporting the drag failures, and @SoTHISIsFitness for investigating related task-property cases.\n- (#1738) Fixed Outlook calendar subscriptions whose event timezones reference the base Windows timezone name while the feed defines a suffixed timezone name. Thanks to @Mirrimo for reporting this, @rafavital for confirming it, and @rogerfsh for tracing the ICS timezone mismatch.\n- (#1734) Fixed dependency picker search when task priority values are stored as non-string frontmatter values. Thanks to @MatthewClarkeDev for reporting this and identifying the stack trace.\n- (#1733) Preserved wikilinks in task titles and rendered them as clickable links on task cards. Thanks to @bitscorch for suggesting this.\n- (#1728) Applied the \"Use parent note as project\" default when creating a new task from the command palette or ribbon. Thanks to @greatEmily for reporting this.\n- (#1759) Advanced stale due dates when recurring tasks move to their next scheduled occurrence, so work-window tasks do not remain overdue after completion. Thanks to @MattPryze for reporting this.\n- (#1766) Fixed Calendar Bases date navigation from custom note properties, so embedded calendar views can open on the date stored in the selected property instead of falling back to today. Thanks to @chrabia for reporting this.\n- (#1767) Aligned the start and end time rows in the timeblock creation modal. Thanks to @loiveli for reporting this.\n- (#1783) Replaced the default browser drag ghost for Kanban cards so dragging a card no longer makes the next card look semi-transparent. Thanks to @loukandr for reporting this and tracing the drag image behavior.\n- (#1796) Restored expanded subtasks immediately after renaming a parent task file and updating links. Thanks to @bung69 for reporting this.\n- (#1797) Improved manual ordering so long Kanban columns remain scrollable while dragging, mobile Kanban drops can place a card relative to another card, Kanban/Task List drops resolve the final drop position more reliably, generated manual-order ranks match Bases sorting, and manual-order properties such as `sort_order` render on task cards when enabled. Thanks to @SKIERZZ for reporting this and sharing videos.\n- (#1812) Separated Microsoft OAuth token status from calendar sync status, and surfaced Microsoft calendar fetch errors in the integrations settings card instead of leaving them console-only. Thanks to @henninger80 for the detailed report.\n- (#1814) Restored NLP project autosuggest in the Create or Open Task command, so `+` project suggestions use the same filtered project lookup as the Create Task modal. Thanks to @adammahad for reporting this.\n- (#1820) Kept API-created tasks readable immediately after creation even if Obsidian has not finished indexing the new file metadata yet. Thanks to @vadminas for reporting and tracing the cache desync.\n- (#1823) Prevented zero-duration timed external calendar events from rendering under more than one day in list-style calendar views. Thanks to @martin-forge for reporting and tracing the Google Calendar case.\n- (#1841) Prevented Kanban boards from duplicating columns when wikilinked status values are grouped through Bases. Thanks to @lendamico for reporting and sharing the screen recording.\n- (#1846) Saved NLP-triggered boolean custom fields as real booleans instead of quoted strings, so they match checkbox-created values and Bases filters. Thanks to @DevOps-Toast for reporting and sharing screenshots.\n- (#1849) Prevented repeated clicks on task-card scheduled and due date labels from stacking duplicate date menus when Obsidian native menus are disabled. Thanks to @3zra47 for reporting.\n- (#1850) Added mobile bottom spacing to TaskNotes list views so the final task can scroll above Obsidian's floating mobile controls. Thanks to @AlejandroRigau for reporting and sharing the iPhone screenshot.\n- (#1852) Improved mobile timed calendar event rendering with shorter time labels, tighter spacing, and event-colored task/calendar blocks. Thanks to @redrumthebum for reporting and sharing screenshots.\n- (#1757, #1853, #1775) Respected an existing `mdbase.yaml` `types_folder` when regenerating mdbase task type definitions, so the generated `task.md` can live outside the vault-root `_types` folder. Thanks to @aldrichtr for the original request and implementation exploration, and @hangryscribe3 for the follow-up request.\n- (#1858) Included task body details in single-task HTTP API and MCP reads. Thanks to @vanillaflava for reporting and outlining the expected behavior.\n- (#1859) Clarified the Google Calendar setup guide for OAuth testing-mode `access_denied` errors. Thanks to @PE-Boy for reporting and @tiagoarroz for the workaround.\n- (#1860) Preserved accented characters in tags when converting checkbox tasks to TaskNotes. Thanks to @e-zz for reporting.\n- (#1869) Preserved Calendar Month View scroll position after task updates. Thanks to @sisyowo for reporting and linking the earlier Kanban fix.\n- (#1873) Prevented Calendar Bases from rendering in Obsidian pop-out windows because restoring FullCalendar there can freeze Obsidian. Thanks to @misolex for reporting.\n- (#1497, #1870) Fixed NLP file suggestions for custom fields so selected wikilinks are captured as custom field values, including list-type fields. Thanks to @Naesue and @Sineapple for reporting this, and to @bradleyed and @Xananax for the follow-up details.\n- (#1888) Allowed project autosuggest required property filters to match any comma-separated value, such as `project, area`. Thanks to @BrianHicks for suggesting.\n- (#1886) Added a command to postpone active overdue scheduled tasks to today. Thanks to @chrabia for the suggestion.\n- (#1889) Fixed Kanban swimlanes for list-valued properties so tags and contexts use individual list items instead of comma-joined values. Thanks to @pkropotin for reporting.\n- (#1890) Fixed scheduled-date Kanban columns dropping tasks when date-only and timed tasks on the same day are sorted by a scheduled-time formula. Thanks to @chrabia for reporting and investigating.\n- (#773) Added ICS export filters for archived tasks, completed tasks, due dates, and scheduled dates. Thanks to @ras0q for suggesting this and @slipstyle for the scheduled-date follow-up.\n- (#765) Reduced side-pane gutters around embedded TaskNotes Bases views, so embedded task lists use about the same horizontal space as directly opened Bases views. Thanks to @TonyAtlas for suggesting this.\n- (#1892) Fixed nested Markdown list indentation in the Task Edit Modal details editor. Thanks to @Glint-Eye for reporting.\n- (#1891) Fixed TaskNotes modal markdown editors collapsing to one-character-wide lines when Pretty Properties is installed. Thanks to @bkennedy-improving for reporting.\n- (#1499) Respected excluded folders when opening tasks directly from view results and when building dependency/project indexes, so template-folder tasks no longer appear through TaskNotes views. Thanks to @Liya430 for reporting.\n- (#136, #1500) Made the Pomodoro countdown derive remaining time from the session clock instead of from counted interval ticks, so delayed, backgrounded, or screen-off ticks catch up cleanly without over-recording a completed session. Thanks to @Poly-0000 for reporting and documenting the original background timer issue, @Totobal5 for the earlier worker-based fix, and @CoffeaUrbana for the Android screen-off report.\n- Restored padding in task modal Markdown editors.\n- Made the markdown editor areas in task modals easier to click and focus.\n- Strengthened local CSS linting to catch unscoped selectors, unknown CSS, and fixed-position overlays before review.\n- Reduced false-positive plugin review warnings by making background auto-export and auto-archive schedulers non-overlapping and tightening type/string conversion paths.\n- (#1882) Made Google Calendar task descriptions use mobile-friendly plain text for Obsidian links and display labels for wiki-style project/context links. Thanks to @martin-forge for the contribution.\n- (#1883) Improved Google Calendar task sync recovery so failed deletions, offline sync requests, reconnects, and quick create/update races are retried more reliably. Thanks to @martin-forge for the contribution.\n","aliases":["/releases/4.8.0/","/releases/4.8.0/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"changed","text":"Changed"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#353) Added a Has Subtasks filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this.
  • \n
  • (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this.
  • \n
  • (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up.
  • \n
  • (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this.
  • \n
  • (#1052) Added a public JavaScript API for in-vault scripts at app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text), so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this.
  • \n
  • (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this.
  • \n
  • (#1254) Added ../ and ./ normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as {{currentNotePath}}/../Tasks. Thanks to @rdick for suggesting this.
  • \n
  • (#1267) Added Daily Notes-style date tokens such as YYYY, MM, DD, MMMM, and dddd to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this.
  • \n
  • (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this.
  • \n
  • (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this.
  • \n
  • (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this.
  • \n
  • (#1376) Added backslash escapes for NLP trigger tokens, so text like \\@context, \\*done, or \\tomorrow can stay in the task title. Thanks to @JerryLu086 for suggesting this.
  • \n
  • (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this.
  • \n
  • (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up.
  • \n
  • (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this.
  • \n
  • (#144) Added an "Open note in new tab" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback.
  • \n
  • (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback.
  • \n
  • (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up.
  • \n
  • (#1541) Added {{currentNotePath}} and {{currentNoteTitle}} support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback.
  • \n
  • (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback.
  • \n
  • (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case.
  • \n
  • (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case.
  • \n
  • (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this.
  • \n
  • (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this.
  • \n
  • (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as "tomorrow at 3pm" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this.
  • \n
  • (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.
  • \n
  • (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this.
  • \n
  • (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this.
  • \n
  • (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this.
  • \n
  • (#1625) Added Shift + Cmd/Ctrl + Enter in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this.
  • \n
  • (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this.
  • \n
  • (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short projectId. Thanks to @bendavis987 for the contribution.
  • \n
  • (#923) Added {{projectFilePath}} and {{projectFilePaths}} folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this.
  • \n
  • (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this.
  • \n
  • (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback.
  • \n
  • (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this.
  • \n
  • (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this.
  • \n
  • (#1776) Allowed calendar timeline end times after midnight, such as 26:00 for a 2 AM next-day end. Thanks to @chrabia for suggesting this.
  • \n
  • (#1784, #1833) Added a per-view pinnedColumns option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this.
  • \n
  • (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this.
  • \n
  • (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up.
  • \n
  • (#1808) Added advanced Kanban swimlane ordering through swimLaneOrder, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback.
  • \n
  • (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this.
  • \n
  • (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this.
  • \n
  • (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this.
  • \n
  • (#561) Added a "Last day" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up.
  • \n
  • (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this.
  • \n
  • (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this.
  • \n
  • (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this.
  • \n
  • (#1176) Added advanced Kanban WIP limits through wipLimits, so column headers can show (current/limit) counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this.
  • \n
  • (#914) Added a generated Due in countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this.
  • \n
  • (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this.
  • \n
  • (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this.
  • \n
  • (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback.
  • \n
  • (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this.
  • \n
  • (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions.
  • \n
  • (#791) Added a UUID v4 task filename format and {{uuid}} custom filename template variable. Thanks to @bangbangbanggit for suggesting this.
  • \n
  • (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback.
  • \n
  • (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this.
  • \n
  • (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this.
  • \n
  • (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback.
  • \n
  • (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this.
  • \n
  • Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes.
  • \n
\n

Changed#

\n
    \n
  • Expanded the bug report template to ask for Obsidian "Show debug info" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots.
  • \n
  • Release notes now show the default .base file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes.
  • \n
  • Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project.
  • \n
  • (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion.
  • \n
  • (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up.
  • \n
  • Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards.
  • \n
  • Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected.
  • \n
  • Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage.
  • \n
  • (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this.
  • \n
  • (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this.
  • \n
  • Made task-card priority dots and configured priority icons slightly larger for better visibility.
  • \n
  • (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this.
  • \n
  • (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this.
  • \n
  • (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this.
  • \n
  • (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this.
  • \n
  • (#1392) Made TaskNotes date fields accept compact YYYYMMDD typing and pasted dates. Thanks to @kazerniel for suggesting this.
  • \n
  • (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this.
  • \n
  • (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this.
  • \n
  • (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this.
  • \n
  • Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers.
  • \n
  • (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first picker where clicking a date saves immediately, with time entry still available in the picker. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback.
  • \n
  • (#1642) Made completion-based custom recurrence use flexible weekly, monthly, and yearly intervals without forcing a fixed weekday, month day, or month. Thanks to @Volker-brdb for suggesting this.
  • \n
  • (#1724) Moved recurring task complete/skip instance actions into the date area of the task context menu. Thanks to @prepare4robots for suggesting this.
  • \n
  • (#1762) Used the configured Google Calendar task export target as the default calendar when creating manual external calendar events. Thanks to @chrabia for suggesting this.
  • \n
  • (#1774) Made expandable project chevrons visible and easier to tap on mobile. Thanks to @sh0nuff for suggesting this.
  • \n
  • (#190) Made task-card and inline task-link action controls easier to tap on mobile, including always-visible task options on touch layouts. Thanks to @Poly-0000 for suggesting this.
  • \n
  • (#518, #1710, #1785) Added an opt-in setting for Create subtask to inherit the parent task's projects, contexts, priority, and non-identifying tags while always keeping the parent-task project link. Thanks to @bepolymathe, @Jalpara, and @poulpoulsen for reporting this, and to @tomsymonds, @AndyEveritt, @wedgen, @lindsaylearns, and @hokfujow for the follow-up feedback.
  • \n
  • (#1790) Extended the identifying-tag hiding setting to task modal tag suggestions, and kept hidden identifying tag children in place when editing other tags. Thanks to @loukandr for suggesting this.
  • \n
  • (#1804) Made the inline-created task folder setting visible even when instant conversion is disabled, and clarified that leaving it empty uses the default tasks folder. Thanks to @CaFeZn for suggesting this.
  • \n
  • (#1822) Matched the Task Edit Modal subtask list order to the existing relationship sort, so active and higher-priority subtasks appear ahead of completed ones. Thanks to @Glint-Eye for suggesting this.
  • \n
  • (#1233, #1339) Added an Appearance setting to expand project subtasks by default in task cards, while still letting individual cards be collapsed. Thanks to @n1njaznutz and @hasanyilmaz for suggesting this and @kazerniel and @benmartinek for the follow-up.
  • \n
  • (#763) Made the Relationships widget appear on project notes that match Project Autosuggest tag or property filters, even before any tasks link to the project. Thanks to @ChadHattabaugh for suggesting this.
  • \n
  • (#732) Remembered the Task & Project Statistics filters between openings, including the selected date range, custom dates, and minimum time filter. Thanks to @RumiaKitinari for suggesting this.
  • \n
  • (#1335) Added optional default times for new task scheduled and due dates, so default-dated tasks can appear as timed calendar events instead of all-day events. Thanks to @echo-saurav for suggesting this.
  • \n
  • (#1327) Made TaskNotes Bases search match any word in a multi-word search instead of requiring the whole phrase. Thanks to @craziedde for suggesting this.
  • \n
  • (#1318) Made aliased inline task links use the alias text inside the task widget, so [[Task title|short label]] can display as short label. Thanks to @3zra47 for suggesting this and @kazerniel for the follow-up.
  • \n
  • (#1325) Added ./ and ../ support to Include folders filters for project and file autosuggest, resolved from the active note's folder. Thanks to @EpolPers for suggesting this.
  • \n
  • (#1313) Added generated llms.txt and llms-full.txt files to the documentation site, so the primary docs can be shared with LLM tools more easily. Thanks to @JacksonMcDonaldDev for suggesting this.
  • \n
  • (#1308) Added a Calendar view option to stop date links from creating missing daily notes, while still opening existing daily notes. Thanks to @Arachnidai for suggesting this.
  • \n
  • (#1300) Allowed priority, status, calendar subscription, and timeblock color settings to use Obsidian theme color names such as red, blue, and cyan. Thanks to @thestrike72 for suggesting this.
  • \n
  • (#1299) Added a command that creates or opens a task and immediately starts time tracking for it. Thanks to @slipstyle for suggesting this.
  • \n
  • (#1284) Added an exact-match option for hiding task identification tags, so #task can be hidden while nested tags such as #task/project remain visible. Thanks to @3zra47 for suggesting this.
  • \n
  • (#1009) Added a confirmed Delete button to the Edit Task modal, so unwanted task notes can be removed without first opening the note file. Thanks to @jalooc for suggesting this.
  • \n
  • Improved the internal structure of Calendar, Kanban, Bases, task cards, and task modals to make future changes easier to test and maintain.
  • \n
\n

Fixed#

\n
    \n
  • (#697, #1374) Recognized manually authored task notes that use a single scalar tag such as tags: task, so they appear in TaskNotes views and menus like notes using YAML list tags. Thanks to @aubreyz and @phortx for reporting this, and to @jleewastaken for the follow-up.
  • \n
  • Removed the upward hover shift from calendar events while keeping the hover shadow feedback.
  • \n
  • Made same-column manual-order drops in TaskNotes Kanban settle immediately when the local order patch is safe, including virtual columns through a stable reorder path that avoids layout jumps.
  • \n
  • Made single-card cross-column drops in TaskNotes Kanban settle through a local state patch when the move is safe, reducing the wait for the full Bases refresh.
  • \n
  • Fixed Calendar timeblocks created from a selected time range so they appear as soon as Obsidian indexes the daily note update, instead of waiting for a later refresh.
  • \n
  • Replaced the external calendar event emoji marker with the calendar icon and kept it in the same top-right event corner.
  • \n
  • Restored Task List group toggles and recurring calendar month controls to compact icon buttons instead of inherited boxed theme buttons.
  • \n
  • Refined the settings tab navigation styling so tabs read as quieter inline navigation instead of default buttons.
  • \n
  • (#263) Made the instant inline task conversion button respond to touch/pointer activation, so mobile multi-line selections can be converted into TaskNotes. Thanks to @cathywu for reporting this.
  • \n
  • (#216) Preserved @context markers when converting Tasks-plugin-style checkbox tasks into TaskNotes, while keeping those contexts out of the created task title. Thanks to @ksdavidc for suggesting this, and to @hangryscribe3, @nayatiuh, and @natleahh for the follow-up feedback.
  • \n
  • (#508) Showed project note names instead of full project paths in grouped Kanban and Task List headings, while keeping the headings linked to the project note. Thanks to @elvarb for reporting this and @dmodify for confirming it in Task List.
  • \n
  • (#408) Used the task title as the native system notification title for task reminders instead of always showing TaskNotes Reminder. Thanks to @DudeThatsErin for reporting this and @phillipadsmith for the follow-up.
  • \n
  • (#385) Let Mini Calendar month controls shrink and wrap cleanly in narrow sidebars. Thanks to @iholston for reporting this.
  • \n
  • Fixed Calendar List view task cards so they use the available row width without duplicate list cells, row-hover backgrounds, or linked-hover styling.
  • \n
  • (#552) Made instant task convert buttons appear for checkbox tasks inside callouts, and kept converted links inside the callout list. Thanks to @Oblique82 for reporting this and @ksdavidc for the follow-up.
  • \n
  • (#559) Treated notes linked to one loaded recurring calendar event instance as related to the other instances in that series. Thanks to @cathywu for reporting this and @mdbraber for the implementation notes.
  • \n
  • (#685) Made Calendar list views respect the All-day slot option by hiding all-day events from the list when that option is turned off. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#643) Stopped custom filename templates such as task-{year}{month}{day}{hour}{minute} from incorrectly showing the "filename shortened" notice when creating tasks. Thanks to @minchinweb for reporting this.
  • \n
  • (#722) Made Skip Break reset a queued Pomodoro break back to the next focus timer without starting a session. Thanks to @Goossiii for reporting this and @YIRU69 for the follow-up.
  • \n
  • (#782) Made recurrence weekday choices follow the configured first day of week, and made the quick "Weekdays only" recurrence use locale weekend data instead of assuming Monday through Friday everywhere. Thanks to @BKSalman for reporting this.
  • \n
  • (#872) Made note-level task cards appear immediately, and stay visible while editing, when a task note is embedded as a Canvas file node. Thanks to @bangbangbanggit for reporting this and @benmartinek for the follow-up.
  • \n
  • (#856) Fixed filters for number custom fields so numeric task values match equivalent filter values entered as text. Thanks to @thoughtcipher for reporting this.
  • \n
  • (#1039) Restored clearer TaskNotes Bases grouping for nested project paths, and made the Calendar refresh control an icon button again. Thanks to @dblinnikov for reporting this.
  • \n
  • (#1034) Let embedded TaskNotes Calendar views size to their content by default, so month, week, and day embeds no longer reserve full-pane proportions inside notes. Thanks to @same774 for reporting this.
  • \n
  • (#1023) Kept task modal custom fields scrollable above the iPhone keyboard while creating or editing tasks. Thanks to @3zra47 for reporting this.
  • \n
  • (#1019) Kept active Pomodoro and time-tracking task references working after the tracked task file is renamed. Thanks to @AndreMonthy for reporting this.
  • \n
  • (#1037) Let embedded TaskNotes Calendar year views size to their content and kept the year title from wrapping vertically. Thanks to @same774 for reporting this.
  • \n
  • (#1047) Wrapped long file paths in the Edit Task modal metadata section, so narrow mobile screens no longer get a sideways scrollbar from the File row. Thanks to @3zra47 for reporting this.
  • \n
  • (#1051) Preserved extra values on a property-based task identification field when saving a task, so list properties such as class: [task, habit] no longer get collapsed to only the identifying value. Thanks to @WhoIsSeanGalt for reporting this.
  • \n
  • (#1060) Reused and revealed an already-open Calendar/Base view when running view commands, so a view kept in the sidebar no longer reopens in a new main tab. Thanks to @kmaustral for reporting this.
  • \n
  • (#1075) Hid the native WebKit date-input label that could appear as Label when editing scheduled dates on macOS. Thanks to @3zra47 for reporting this.
  • \n
  • (#1076) Allowed timeblocks to end at midnight using 00:00, and accepted 24:00 as an explicit end-of-day value in timeblock validation. Thanks to @skoove for reporting this and @gregor202 for the follow-up.
  • \n
  • (#1086) Fixed the Calendar + more control in dark mode so expanded all-day task groups stay readable. Thanks to @same774 for reporting this.
  • \n
  • (#1100) Applied Advanced Calendar View search and title filters to the tasks used for calendar rendering, so filtering controls affect which tasks appear on the calendar. Thanks to @quiet-coder-io for reporting this.
  • \n
  • (#1147) Added a delete action for recent Pomodoro statistics sessions, so erroneous Pomodoro history can be removed without editing plugin storage or daily-note frontmatter manually. Thanks to @RumiaKitinari for reporting this and @BrucePlumb for the follow-up.
  • \n
  • (#1150) Kept recurring tasks' due dates visible in Calendar Bases views, and showed their scheduled date when recurrence instances are hidden. Thanks to @thomatino for reporting this and @BrucePlumb for the follow-up.
  • \n
  • (#1159) Softened Calendar time-entry styling so recorded time blocks no longer visually outweigh task events. Thanks to @hatespinach for reporting this.
  • \n
  • (#1191) Aligned the task-card and relationships widgets inside notes with Obsidian's editor margins, including readable-line-width layouts. Thanks to @minchinweb for reporting this.
  • \n
  • (#1183) Kept the Calendar create menu open after drag-selecting a time range, so the selected duration can be used when creating a task. Thanks to @randomness42 for reporting this.
  • \n
  • (#1179) Stopped Calendar Bases views from repainting after unrelated note updates when the visible calendar data has not changed. Thanks to @same774 for reporting this.
  • \n
  • (#1156) Kept property-based task identification through the tags property from rewriting task tags as a plain text value, and generated default Bases now use tag membership for that setting. Thanks to @seepage87 for the detailed migration report and @chrsdk for the follow-up.
  • \n
  • (#1232) Fixed generated Task List Base date filters so recurring tasks scheduled for today appear in the Today view, and today's completed recurring instances stay hidden. Thanks to @mvichosfm for reporting this and @ArthurGideon and @VarunNikam22 for the follow-up.
  • \n
  • (#1231) Fixed the generated Task List Base Overdue view so tasks with scheduled dates in the past appear alongside tasks with due dates in the past. Thanks to @Lorite for reporting this and @dictionarymouse for the follow-up.
  • \n
  • (#1228) Matched the task details editor's Markdown heading colors to the active Obsidian theme, including themes that customize heading colors. Thanks to @BrucePlumb for requesting this.
  • \n
  • (#1227) Refreshed the relationships widget when project references are indexed or updated so project notes can show related tasks automatically again. Thanks to @luckb0x for reporting this.
  • \n
  • (#1219) Fixed Kanban drags that start on an expanded subtask card so they move that subtask instead of dragging the parent card. Thanks to @craziedde for reporting this.
  • \n
  • (#990) Treated one-item status lists written by Obsidian Properties as the same status value in TaskNotes Kanban, so they no longer create duplicate columns. Thanks to @mlevison for reporting this.
  • \n
  • (#983) Let Agenda Calendar views wrap their header controls and task titles inside narrow sidebars, so Today and refresh controls and task icons remain visible without sideways scrolling. Thanks to @3zra47 for reporting this.
  • \n
  • (#982) Made TaskNotes task-card typography scale from Obsidian's text font size setting, so Bases and Agenda task text follows larger mobile font settings. Thanks to @3zra47 for suggesting this and @chrsdk and @scottaltham-payroc for the follow-up.
  • \n
  • (#966) Made reminder delete buttons larger and always visible on mobile, so reminders can be removed from the Manage All Reminders modal on iPad. Thanks to @PSG2017 for reporting this.
  • \n
  • (#964) Made Pomodoro and time-tracking task selection use the current recurring instance status, so a recurring task can still be selected after an earlier instance was completed. Thanks to @lomarcanys for reporting this.
  • \n
  • (#944) Preserved number and boolean custom field values when moving tasks between grouped Kanban or Task List columns, and when creating a task from a grouped Kanban column. Thanks to @thoughtcipher for reporting this.
  • \n
  • (#935) Fixed Task List priority sorting so descending order puts higher-weighted priorities first, and due dates are used before scheduled dates when priority values tie. Thanks to @Glint-Eye for reporting this and @kacoroski for the follow-up.
  • \n
  • (#922) Made the Blocked task-card pill expand the blocker tasks, and rendered blockedBy dependencies as clickable links when that property is shown on cards. Thanks to @prayidae for reporting this and following up.
  • \n
  • (#919) Fixed exported ICS task events so they use valid calendar event statuses and can be imported by stricter calendar apps. Thanks to @benoitjadinon for reporting this.
  • \n
  • (#1213) Fixed embedded Task List Bases in Obsidian pop-out windows so typing below the embed no longer leaves a large blank gap. Thanks to @same774 for reporting this.
  • \n
  • (#1243) Removed quoted multi-word custom field NLP expressions from created task titles after saving the custom field value. Thanks to @Arachnidai for reporting this.
  • \n
  • (#1252) Hardened the calendar-first task date picker for iPad taps so date buttons use direct touch manipulation. Thanks to @alxandrharris for reporting this.
  • \n
  • (#1261) Removed the extra Task List Base scrollbar when an embedded task list note is placed in a sidebar, while keeping normal embedded task lists scrollable in the main note area. Thanks to @cathywu for reporting this.
  • \n
  • (#1347) Lowered TaskNotes task-card tag CSS specificity so hierarchical tag colors from Obsidian themes and tag-color plugins can apply correctly. Thanks to @3Fish for reporting this.
  • \n
  • (#1374) Recognized status and priority labels entered through Obsidian Properties or Bases as their configured TaskNotes values. Thanks to @phortx for reporting this.
  • \n
  • (#1373) Parsed numeric natural-language dates with the configured calendar locale, so en-GB treats 11/06/2026 as 11 June instead of November 6, and YYYY/MM/DD works consistently. Thanks to @AleMunin for reporting this and @imsuck for the follow-up.
  • \n
  • (#1370) Prevented recurring task series from being queued for auto-archive when their parent status uses auto-archive, so ongoing recurring tasks are not moved away after completing an occurrence. Thanks to @Jomo94 for reporting this and @martin-forge for the follow-up discussion.
  • \n
  • (#1367) Made recurring task completion counts use the total expected instances for finite COUNT or UNTIL recurrences, and stopped showing a made-up percentage for unbounded recurrences. Thanks to @saurinni for reporting this.
  • \n
  • (#1365) Preserved email and other URI links from converted inline task titles by moving the original links into the new task body, and rendered message:/mailto: markdown links as external links in TaskNotes surfaces. Thanks to @phillipadsmith for reporting this and @hasanyilmaz for the follow-up.
  • \n
  • (#1350) Refreshed inline task widgets in Reading mode after task property edits, so changed dates and other visible properties no longer stay stale until the note is reopened. Thanks to @tmsbn for reporting this.
  • \n
  • (#1329) Pulled the relationships widget up to the end of the note content without removing its normal spacing, and kept that placement updated while editing and on load so it no longer covers the editor. Thanks to @Volker-brdb for reporting this.
  • \n
  • (#1326) Treated empty task frontmatter values as missing, so empty titles fall back to the filename and blank date, priority, and recurrence fields are ignored. Thanks to @craziedde for suggesting this.
  • \n
  • (#1316) Stopped stale Workspace state from overriding the configured Calendar view mode, so switching Workspaces no longer forces an old Day/Week/List choice over the view default. Thanks to @kmaustral for reporting this and following up.
  • \n
  • (#1302) Read task frontmatter directly from the task file when Obsidian has not indexed its metadata yet, so visible tasks can still be opened, updated, and selected instead of reporting "Task not found". Thanks to @WorldTeacher for reporting this and @Steven-AA for confirming it.
  • \n
  • Kept just-written task data available while Obsidian's metadata cache catches up, so immediate reads after task edits no longer briefly return stale values.
  • \n
  • (#1297) Made the Create or open task footer tappable, so mobile users can create the typed task without needing the Shift+Enter shortcut. Thanks to @slipstyle for reporting this.
  • \n
  • (#1288) Allowed formula properties to appear in Calendar property-based event start and end date selectors. Thanks to @hasanyilmaz for reporting this.
  • \n
  • Made TaskNotes Kanban drags show a lightweight held-card preview, so the dragged card remains easy to track while the source column opens the drop slot.
  • \n
  • (#1423) Refreshed TaskNotes Bases views when subtasks are deleted, so expanded project cards drop removed subtasks and stop showing project controls when the last subtask is gone. Thanks to @normenmueller for reporting this.
  • \n
  • (#1419) Kept custom user field name, key, and default-value edits in Task Properties settings when closing settings without first blurring the field. Thanks to @s33a for reporting this and @kacoroski for the follow-up.
  • \n
  • Reduced redundant settings writes by coalescing overlapping saves, so settings changes made in quick succession finish with the latest values without repeating every intermediate save cycle.
  • \n
  • (#1331, #1411) Made Agenda Calendar Bases respect the Base sort order within each day instead of falling back to alphabetical title order. Thanks to @bane73 and @ky1ejs for reporting this.
  • \n
  • (#1383) Made task modal markdown editors expose the active editor API expected by plugins such as Templater. Thanks to @tomsymonds for reporting this.
  • \n
  • Fixed the first-run Create/Edit Task modal so the default fields appear immediately after installing TaskNotes, without needing to open Modal Fields settings or restart Obsidian.
  • \n
  • (#1895) Restored the natural-language preview in the Create Task modal. Thanks to @ssonhub for reporting this.
  • \n
  • (#1898) Cleared stale Calendar time-axis column widths when switching views, so Day, Week, and 3-day views keep the time labels anchored on the left. Thanks to @ddevaal for reporting this.
  • \n
  • (#1439) Fixed generated Bases dependency filters so blockedBy entries stored as links, strings, or dependency objects are handled consistently in Not Blocked and Relationships views. Thanks to @prayidae for reporting this and following up.
  • \n
  • (#1435) Prevented malformed task dependency, status, or priority values from breaking the task context menu. Thanks to @23maverick23 for reporting this.
  • \n
  • (#1434) Kept older filename-titled tasks readable after turning off "Store title in filename" by falling back to the filename when a task has no usable title property. Thanks to @hujuDev for reporting this.
  • \n
  • (#1433) Made the Due date and Scheduled date weekday picker follow the configured first day of week. Thanks to @sandchipper for reporting this.
  • \n
  • (#1430) Showed custom user-field property keys in Modal Fields settings instead of internal field IDs. Thanks to @JerryLu086 for reporting this.
  • \n
  • (#1427) Fixed project autosuggest Required Tags filters so frontmatter tags parsed by Obsidian are handled the same way as direct tag-property filters. Thanks to @ProHaller for reporting this.
  • \n
  • (#1495) Added an Update default files action for generated Bases views, so task-tag or task-identification setting changes can refresh existing .base filters without deleting files manually. Thanks to @Liya430 for reporting this.
  • \n
  • (#1512) Prevented the split Create/Edit Task modal details pane from collapsing to a one-character-wide column under the Minimal theme. Thanks to @willfanguy for reporting this and sharing detailed CSS notes.
  • \n
  • (#1524) Fixed task-card font sizes shrinking when a Bases view is opened in an Obsidian pop-out window. Thanks to @Glint-Eye for reporting this.
  • \n
  • (#1535) Fixed the generated Relationships Base Subtasks filter so single project links do not trigger a Bases contains error. Thanks to @DanaKyle for reporting this.
  • \n
  • (#1102) Refreshed task cards when a task status is edited directly in Obsidian frontmatter, so the card no longer stays on the old status until it is clicked. Thanks to @Wayment9504 for reporting this.
  • \n
  • (#1105) Added an explicit Close action to the mobile task options menu, so iPhone users do not need to tap near the top system bar to dismiss it. Thanks to @J-R-Troutman for reporting this.
  • \n
  • (#1550) Prevented mobile Calendar event drags from opening the task context menu before the drag can begin. Thanks to @stil-sudo for suggesting this.
  • \n
  • (#1563) Removed duplicate entries from Calendar event related notes when the same linked file is also a TaskNote. Thanks to @VarunNikam22 for reporting this.
  • \n
  • (#1566) Rendered grouped multi-project values as individual links when a Bases group title contains multiple project links. Thanks to @ptsouchlos for suggesting this.
  • \n
  • (#1569) Allowed local ICS calendar paths inside the vault to be pasted as absolute filesystem paths, and showed a clearer error when the file is outside the vault. Thanks to @Photon89 for reporting this and following up.
  • \n
  • (#1584) Sanitized task-card status and priority class names, so custom values with spaces no longer create invalid CSS classes. Thanks to @omber for reporting this.
  • \n
  • (#1587) Stored dependencies added from the task context menu as wikilinks, matching the Edit Task modal. Thanks to @mgrecar for reporting this.
  • \n
  • (#1590) Clarified HTTP API task creation docs and OpenAPI schema for writable blockedBy dependencies, and marked blocking as a read-only derived relationship. Thanks to @hGriff0n for reporting this.
  • \n
  • (#1591) Added a startup guard that avoids saving default settings over an existing settings file if Obsidian temporarily returns no plugin data during an update. Thanks to @GGlider for reporting this.
  • \n
  • (#1593) Made the New button in TaskNotes Bases views open the TaskNotes create task modal again, so new tasks respect the configured default tasks folder. Thanks to @katlandreth for reporting this.
  • \n
  • (#1594) Made task cards inside recurring task notes complete the task's current scheduled occurrence instead of today's date when no calendar or view date is supplied. Thanks to @ngraham20 for reporting this.
  • \n
  • (#1601) Prevented overlapping Live Preview relationship-widget injections from leaving duplicate subtask/relationship sections in a note. Thanks to @wealthychef1 for reporting this and @benmartinek for confirming it.
  • \n
  • (#1610) Made expanded subtasks in TaskNotes Bases views follow the current view's sorted task order instead of a fixed fallback order. Thanks to @MrZzard for reporting this and @slipstyle for confirming it.
  • \n
  • (#1609) Restored scrolling in wide split-layout task edit modals when the form content is taller than the modal. Thanks to @3zra47 for reporting this.
  • \n
  • (#1614) Wrote unchecked boolean custom user-field defaults to new task frontmatter, including tasks created through instant conversion. Thanks to @kobalteule for reporting this.
  • \n
  • (#1611) Made generated default Bases urgency scores fall back safely when the next-date distance is missing. Thanks to @benoitjadinon for reporting this and suggesting the formula fix.
  • \n
  • (#1623) Honored "Store title in filename" across task creation and edits, so the mapped title property is omitted from frontmatter and stale title fields are removed on save. Thanks to @VenturaNotes for reporting this, and to @Ender367, @slipstyle, and @loukandr for confirming and tracing affected paths.
  • \n
  • (#1621) Made Kanban swimlane labels stop freezing on mobile and kept their label column compact, leaving more room for task cards while horizontally scrolling. Thanks to @karenchoe428 for reporting this.
  • \n
  • (#1615) Detected Obsidian custom multi-text properties exposed through widget: "multitext" as list properties, so Kanban can split those values into multiple columns. Thanks to @konton71 for reporting this.
  • \n
  • (#1626) Expanded recurring ICS subscription events through the one-year subscription window for high-frequency recurring calendars. Thanks to @pib for reporting this.
  • \n
  • (#1628) Refreshed Calendar Bases views promptly when switching between filtered Agenda views, so the previous view's task set does not stay visible until the delayed refresh. Thanks to @Lanalangz for reporting this.
  • \n
  • (#1629) Saved blockedBy dependencies selected in the Create Task modal. Thanks to @obsilover for reporting this.
  • \n
  • (#1634) Aligned custom status icons in inline tasks with the default inline status circle. Thanks to @ttlaylor for reporting this and @basbarten for confirming it.
  • \n
  • (#1636) Restored the active styling for the Calendar list-view toolbar button. Thanks to @vroablec for reporting this.
  • \n
  • (#1493, #1638) Kept task time tracking consistent when switching or clearing tasks during an active Pomodoro. Thanks to @ROS-SDN and @katonapng for reporting this, and to @anomatomato for confirming it.
  • \n
  • (#1639) Respected the aliased-link overlay exclusion in Reading mode even when the alias text matches the task title. Thanks to @MiracleXYZ for reporting this.
  • \n
  • Fixed actively tracked task cards so the blue time-tracking outline stays visible along the card edges.
  • \n
  • (#1657) Preserved Bases view defaults when creating tasks from the TaskNotes Kanban/List view New button, so project-scoped views can pass their project assignment into the create task modal. Thanks to @casualQuads122 for reporting this.
  • \n
  • (#728, #1831) Preserved frontmatter defaults supplied by Obsidian's Bases New action when opening the TaskNotes create task modal from custom Bases views, so filtered views can prefill matching tags, projects, contexts, and custom fields. Thanks to @DillPickle80 and @echo-saurav for suggesting this, and to @prayidae and @renatomen for the detailed follow-up.
  • \n
  • (#726) Added an instant-conversion option to use the closest heading above the converted line as a project, so checkbox tasks under project headings can inherit that project automatically. Thanks to @ghelton for suggesting this.
  • \n
  • (#1662) Preserved frontmatter from ICS event note templates when quoted event variables or Templater expressions are used. Thanks to @victorhg for reporting this.
  • \n
  • (#1663) Fixed Japanese and other Unicode tags on task cards so Kanban tag pills keep the same rounded styling as ASCII tags. Thanks to @kutty-1119 for reporting this.
  • \n
  • (#1649) Restored daily-note navigation from the Calendar Day view date header. Thanks to @BaccanoMob for reporting this.
  • \n
  • (#1648, #1665) Fixed the API endpoint list in Integrations settings so it uses the configured bearer token when API authentication is enabled, instead of reporting the running local server as inaccessible. Thanks to @npondel and @warm-july for reporting this.
  • \n
  • (#1668) Fixed the Create Task magic wand so NLP-triggered custom field values are copied into the custom property inputs before saving. Thanks to @hokfujow for reporting this.
  • \n
  • (#1669) Stopped the startup settings migration check from rewriting data.json just because saved calendar defaults are false, 0, empty, or null, reducing unnecessary sync churn. Thanks to @thehyperadvisor for reporting this.
  • \n
  • (#1674) Improved the timeblock creation error when Daily Notes cannot read its configured folder, so the modal notice points to the Daily Notes core plugin settings instead of only logging the folder lookup failure. Thanks to @Ender367 for reporting this.
  • \n
  • (#1680) Fixed TaskNotes Calendar Bases options stored under options, so Agenda views respect showPropertyBasedEvents: false and no longer show duplicate property-based rows for the same task. Thanks to @xiaoyaozhu1991 for reporting this and @KondrotM for confirming it.
  • \n
  • (#1681) Reduced the cost of inline checkbox convert buttons by only scanning the visible editor range instead of the full document. Thanks to @en-ot for reporting this and @hokfujow for the follow-up.
  • \n
  • (#1689) Fixed task reminders added or rescheduled through direct frontmatter edits so the notification queue refreshes immediately and relative reminders recalculate from the latest task dates. Thanks to @garzonjav for reporting this.
  • \n
  • (#1693) Fixed generated default Bases formulas so empty due and scheduled dates are checked with .isEmpty() instead of date-field truthiness. Thanks to @benoitjadinon for reporting this.
  • \n
  • (#1702) Removed the forced bottom gap under TaskNotes custom Bases views, so calendar and other TaskNotes views can fill the available pane height. Thanks to @AudreyLooby for reporting this.
  • \n
  • (#1719) Fixed task cards in reading mode so Obsidian 1.12.x header changes no longer place the card above the title and properties or drop it after returning to a tab. Thanks to @tholbrook9 for reporting this and tracing the DOM change.
  • \n
  • (#1722) Saved the source note immediately after converting an inline checkbox task to a TaskNote, so Kanban views do not keep showing the stale inline task alongside the new task file. Thanks to @literallydope for reporting this and sharing screenshots.
  • \n
  • (#1750) Fixed generated default Bases filters for property-based task identification when the identifying property name contains spaces. Thanks to @Igorgro for reporting this.
  • \n
  • (#1745) Clarified the inline task documentation so Create new inline task is distinguished from current-line conversion. Thanks to @yvos for reporting the mismatch.
  • \n
  • (#1485) Stopped Google Calendar manual refresh from showing a success notice after token refresh or calendar-list failures. Thanks to @ebanDev for reporting this.
  • \n
  • (#1474) Made priority-based Kanban swimlanes follow the configured priority order instead of alphabetical task data order. Thanks to @kanzaki1201 for reporting this and @SoTHISIsFitness for the follow-up investigation.
  • \n
  • (#1470) Restored pointer cursors on TaskNotes interactive elements under Obsidian themes that set --cursor to the default cursor. Thanks to @TheFrostedDev for reporting this.
  • \n
  • (#1463) Documented the supported FilterQuery payload for POST /api/tasks/query, including context filtering examples and generated API schema details. Thanks to @tcb678 for reporting this and @soloidx for sharing a working query example.
  • \n
  • (#1464) Made context on GET /api/tasks follow the same filtering guidance as project, so the API now points clients to POST /api/tasks/query instead of ignoring the parameter. Thanks to @tcb678 for suggesting this.
  • \n
  • (#1457) Rendered scheduled-to-due calendar spans with scheduled times as daily timed events instead of moving them to the all-day section. Thanks to @atos2212-blip for reporting this and @rayvermey for confirming it.
  • \n
  • (#1450) Returned configured user fields in HTTP API task responses under customProperties, while keeping the configured frontmatter keys available on each task. Thanks to @Admorei for reporting this and @nschenone for the follow-up.
  • \n
  • (#1449) Let embedded Agenda views use auto-height sizing by default, so one-day list embeds no longer reserve a large empty calendar block. Thanks to @GlebYavorski for reporting this.
  • \n
  • (#1446) Kept custom Kanban columns from columnOrder available when they are empty, so hideEmptyColumns: false can show drop targets for custom grouped values. Thanks to @akhtsang for reporting this.
  • \n
  • (#1459) Avoided double "Failed to create task" prefixes in task creation error notices. Thanks to @Sineapple for reporting this, and to @slipstyle and @Stockemer for the follow-up investigation.
  • \n
  • (#1469) Fixed Convert current note to task so saving the untouched edit modal writes the task frontmatter instead of reporting no changes. Thanks to @slipstyle for reporting this, and to @jhoogeboom and @ngraham20 for confirming it.
  • \n
  • (#1466) Prefilled the current note as the project when creating a task from an embedded Subtasks/Relationships Base filtered with this.file.asLink(). Thanks to @jhoogeboom for reporting this, and to @cybersader, @fsmontenegro, and @benmartinek for the follow-up discussion.
  • \n
  • (#1476) Showed linked parent-task project titles instead of timestamp filenames in project stats and grouped task views when the linked task has a frontmatter title. Thanks to @RumiaKitinari for reporting this.
  • \n
  • (#1487) Let Calendar task event titles wrap instead of clipping long names, and removed the redundant due-date prefix from due task events. Thanks to @Alexander-Bergmann for reporting this.
  • \n
  • (#1488, #1739) Enabled Kanban touch dragging on touch-capable desktop and convertible devices, not only mobile Obsidian. Thanks to @tmoyland001 and @mgsima for reporting the drag failures, and @SoTHISIsFitness for investigating related task-property cases.
  • \n
  • (#1738) Fixed Outlook calendar subscriptions whose event timezones reference the base Windows timezone name while the feed defines a suffixed timezone name. Thanks to @Mirrimo for reporting this, @rafavital for confirming it, and @rogerfsh for tracing the ICS timezone mismatch.
  • \n
  • (#1734) Fixed dependency picker search when task priority values are stored as non-string frontmatter values. Thanks to @MatthewClarkeDev for reporting this and identifying the stack trace.
  • \n
  • (#1733) Preserved wikilinks in task titles and rendered them as clickable links on task cards. Thanks to @bitscorch for suggesting this.
  • \n
  • (#1728) Applied the "Use parent note as project" default when creating a new task from the command palette or ribbon. Thanks to @greatEmily for reporting this.
  • \n
  • (#1759) Advanced stale due dates when recurring tasks move to their next scheduled occurrence, so work-window tasks do not remain overdue after completion. Thanks to @MattPryze for reporting this.
  • \n
  • (#1766) Fixed Calendar Bases date navigation from custom note properties, so embedded calendar views can open on the date stored in the selected property instead of falling back to today. Thanks to @chrabia for reporting this.
  • \n
  • (#1767) Aligned the start and end time rows in the timeblock creation modal. Thanks to @loiveli for reporting this.
  • \n
  • (#1783) Replaced the default browser drag ghost for Kanban cards so dragging a card no longer makes the next card look semi-transparent. Thanks to @loukandr for reporting this and tracing the drag image behavior.
  • \n
  • (#1796) Restored expanded subtasks immediately after renaming a parent task file and updating links. Thanks to @bung69 for reporting this.
  • \n
  • (#1797) Improved manual ordering so long Kanban columns remain scrollable while dragging, mobile Kanban drops can place a card relative to another card, Kanban/Task List drops resolve the final drop position more reliably, generated manual-order ranks match Bases sorting, and manual-order properties such as sort_order render on task cards when enabled. Thanks to @SKIERZZ for reporting this and sharing videos.
  • \n
  • (#1812) Separated Microsoft OAuth token status from calendar sync status, and surfaced Microsoft calendar fetch errors in the integrations settings card instead of leaving them console-only. Thanks to @henninger80 for the detailed report.
  • \n
  • (#1814) Restored NLP project autosuggest in the Create or Open Task command, so + project suggestions use the same filtered project lookup as the Create Task modal. Thanks to @adammahad for reporting this.
  • \n
  • (#1820) Kept API-created tasks readable immediately after creation even if Obsidian has not finished indexing the new file metadata yet. Thanks to @vadminas for reporting and tracing the cache desync.
  • \n
  • (#1823) Prevented zero-duration timed external calendar events from rendering under more than one day in list-style calendar views. Thanks to @martin-forge for reporting and tracing the Google Calendar case.
  • \n
  • (#1841) Prevented Kanban boards from duplicating columns when wikilinked status values are grouped through Bases. Thanks to @lendamico for reporting and sharing the screen recording.
  • \n
  • (#1846) Saved NLP-triggered boolean custom fields as real booleans instead of quoted strings, so they match checkbox-created values and Bases filters. Thanks to @DevOps-Toast for reporting and sharing screenshots.
  • \n
  • (#1849) Prevented repeated clicks on task-card scheduled and due date labels from stacking duplicate date menus when Obsidian native menus are disabled. Thanks to @3zra47 for reporting.
  • \n
  • (#1850) Added mobile bottom spacing to TaskNotes list views so the final task can scroll above Obsidian's floating mobile controls. Thanks to @AlejandroRigau for reporting and sharing the iPhone screenshot.
  • \n
  • (#1852) Improved mobile timed calendar event rendering with shorter time labels, tighter spacing, and event-colored task/calendar blocks. Thanks to @redrumthebum for reporting and sharing screenshots.
  • \n
  • (#1757, #1853, #1775) Respected an existing mdbase.yaml types_folder when regenerating mdbase task type definitions, so the generated task.md can live outside the vault-root _types folder. Thanks to @aldrichtr for the original request and implementation exploration, and @hangryscribe3 for the follow-up request.
  • \n
  • (#1858) Included task body details in single-task HTTP API and MCP reads. Thanks to @vanillaflava for reporting and outlining the expected behavior.
  • \n
  • (#1859) Clarified the Google Calendar setup guide for OAuth testing-mode access_denied errors. Thanks to @PE-Boy for reporting and @tiagoarroz for the workaround.
  • \n
  • (#1860) Preserved accented characters in tags when converting checkbox tasks to TaskNotes. Thanks to @e-zz for reporting.
  • \n
  • (#1869) Preserved Calendar Month View scroll position after task updates. Thanks to @sisyowo for reporting and linking the earlier Kanban fix.
  • \n
  • (#1873) Prevented Calendar Bases from rendering in Obsidian pop-out windows because restoring FullCalendar there can freeze Obsidian. Thanks to @misolex for reporting.
  • \n
  • (#1497, #1870) Fixed NLP file suggestions for custom fields so selected wikilinks are captured as custom field values, including list-type fields. Thanks to @Naesue and @Sineapple for reporting this, and to @bradleyed and @Xananax for the follow-up details.
  • \n
  • (#1888) Allowed project autosuggest required property filters to match any comma-separated value, such as project, area. Thanks to @BrianHicks for suggesting.
  • \n
  • (#1886) Added a command to postpone active overdue scheduled tasks to today. Thanks to @chrabia for the suggestion.
  • \n
  • (#1889) Fixed Kanban swimlanes for list-valued properties so tags and contexts use individual list items instead of comma-joined values. Thanks to @pkropotin for reporting.
  • \n
  • (#1890) Fixed scheduled-date Kanban columns dropping tasks when date-only and timed tasks on the same day are sorted by a scheduled-time formula. Thanks to @chrabia for reporting and investigating.
  • \n
  • (#773) Added ICS export filters for archived tasks, completed tasks, due dates, and scheduled dates. Thanks to @ras0q for suggesting this and @slipstyle for the scheduled-date follow-up.
  • \n
  • (#765) Reduced side-pane gutters around embedded TaskNotes Bases views, so embedded task lists use about the same horizontal space as directly opened Bases views. Thanks to @TonyAtlas for suggesting this.
  • \n
  • (#1892) Fixed nested Markdown list indentation in the Task Edit Modal details editor. Thanks to @Glint-Eye for reporting.
  • \n
  • (#1891) Fixed TaskNotes modal markdown editors collapsing to one-character-wide lines when Pretty Properties is installed. Thanks to @bkennedy-improving for reporting.
  • \n
  • (#1499) Respected excluded folders when opening tasks directly from view results and when building dependency/project indexes, so template-folder tasks no longer appear through TaskNotes views. Thanks to @Liya430 for reporting.
  • \n
  • (#136, #1500) Made the Pomodoro countdown derive remaining time from the session clock instead of from counted interval ticks, so delayed, backgrounded, or screen-off ticks catch up cleanly without over-recording a completed session. Thanks to @Poly-0000 for reporting and documenting the original background timer issue, @Totobal5 for the earlier worker-based fix, and @CoffeaUrbana for the Android screen-off report.
  • \n
  • Restored padding in task modal Markdown editors.
  • \n
  • Made the markdown editor areas in task modals easier to click and focus.
  • \n
  • Strengthened local CSS linting to catch unscoped selectors, unknown CSS, and fixed-position overlays before review.
  • \n
  • Reduced false-positive plugin review warnings by making background auto-export and auto-archive schedulers non-overlapping and tightening type/string conversion paths.
  • \n
  • (#1882) Made Google Calendar task descriptions use mobile-friendly plain text for Obsidian links and display labels for wiki-style project/context links. Thanks to @martin-forge for the contribution.
  • \n
  • (#1883) Improved Google Calendar task sync recovery so failed deletions, offline sync requests, reconnects, and quick create/update races are retried more reliably. Thanks to @martin-forge for the contribution.
  • \n
\n","text":"Added# (#353) Added a Has Subtasks filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this. (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this. (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up. (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this. (#1052) Added a public JavaScript API for in-vault scripts at app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text), so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this. (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this. (#1254) Added ../ and ./ normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as {{currentNotePath}}/../Tasks. Thanks to @rdick for suggesting this. (#1267) Added Daily Notes-style date tokens such as YYYY, MM, DD, MMMM, and dddd to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this. (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this. (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this. (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this. (#1376) Added backslash escapes for NLP trigger tokens, so text like \\@context, \\*done, or \\tomorrow can stay in the task title. Thanks to @JerryLu086 for suggesting this. (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this. (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up. (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this. (#144) Added an \"Open note in new tab\" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback. (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback. (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up. (#1541) Added {{currentNotePath}} and {{currentNoteTitle}} support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback. (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback. (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case. (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case. (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this. (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this. (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as \"tomorrow at 3pm\" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this. (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback. (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this. (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this. (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this. (#1625) Added Shift + Cmd/Ctrl + Enter in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this. (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this. (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short projectId. Thanks to @bendavis987 for the contribution. (#923) Added {{projectFilePath}} and {{projectFilePaths}} folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this. (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this. (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback. (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this. (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this. (#1776) Allowed calendar timeline end times after midnight, such as 26:00 for a 2 AM next-day end. Thanks to @chrabia for suggesting this. (#1784, #1833) Added a per-view pinnedColumns option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this. (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this. (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up. (#1808) Added advanced Kanban swimlane ordering through swimLaneOrder, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback. (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this. (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this. (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this. (#561) Added a \"Last day\" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up. (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this. (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this. (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this. (#1176) Added advanced Kanban WIP limits through wipLimits, so column headers can show (current/limit) counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this. (#914) Added a generated Due in countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this. (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this. (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this. (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback. (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this. (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions. (#791) Added a UUID v4 task filename format and {{uuid}} custom filename template variable. Thanks to @bangbangbanggit for suggesting this. (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback. (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this. (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this. (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback. (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this. Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes. Changed# Expanded the bug report template to ask for Obsidian \"Show debug info\" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots. Release notes now show the default .base file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes. Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project. (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion. (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up. Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards. Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected. Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage. (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this. (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this. Made task-card priority dots and configured priority icons slightly larger for better visibility. (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this. (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this. (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this. (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this. (#1392) Made TaskNotes date fields accept compact YYYYMMDD typing and pasted dates. Thanks to @kazerniel for suggesting this. (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this. (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this. (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this. Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers. (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first "},{"route":"/obsidian/releases/4.8.1/","title":"TaskNotes 4.8.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.8.1.md","namespace":"obsidian","relativePath":"releases/4.8.1.md","raw":"# TaskNotes 4.8.1\n\n## Fixed\n\n- (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space.\n - Thanks to @3zra47 for reporting the issue and sharing the screen recording.\n- (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices.\n - Thanks to @pxxush for reporting the issue.\n- (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00.\n - Thanks to @AndreMonthy for the report.\n- (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views.\n - Thanks to @kmaustral for reporting the issue.\n- (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like `high` or `low`.\n - Thanks to @RumiaKitinari for reporting the issue.\n- (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards.\n - Long tag pills can now wrap across lines and break within very long tag names on narrow screens.\n - Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution.\n- (#1901) Fixed the task context menu creating an `undefined` property when adding or removing tags.\n - Hardened task property updates so invalid frontmatter property names are rejected instead of written.\n - Thanks to @mgrecar for reporting the issue.\n- (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages.\n - Thanks to @minchinweb for reporting the issue.\n\n## Changed\n\n- Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain.\n","aliases":["/releases/4.8.1/","/releases/4.8.1/"],"toc":[{"level":2,"id":"fixed","text":"Fixed"},{"level":2,"id":"changed","text":"Changed"}],"html":"

Fixed#

\n
    \n
  • (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space.
      \n
    • Thanks to @3zra47 for reporting the issue and sharing the screen recording.
    • \n
    \n
  • \n
  • (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices.
      \n
    • Thanks to @pxxush for reporting the issue.
    • \n
    \n
  • \n
  • (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00.
      \n
    • Thanks to @AndreMonthy for the report.
    • \n
    \n
  • \n
  • (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views.
      \n
    • Thanks to @kmaustral for reporting the issue.
    • \n
    \n
  • \n
  • (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like high or low.
      \n
    • Thanks to @RumiaKitinari for reporting the issue.
    • \n
    \n
  • \n
  • (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards.
      \n
    • Long tag pills can now wrap across lines and break within very long tag names on narrow screens.
    • \n
    • Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution.
    • \n
    \n
  • \n
  • (#1901) Fixed the task context menu creating an undefined property when adding or removing tags.
      \n
    • Hardened task property updates so invalid frontmatter property names are rejected instead of written.
    • \n
    • Thanks to @mgrecar for reporting the issue.
    • \n
    \n
  • \n
  • (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages.
      \n
    • Thanks to @minchinweb for reporting the issue.
    • \n
    \n
  • \n
\n

Changed#

\n
    \n
  • Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain.
  • \n
\n","text":"Fixed# (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space. Thanks to @3zra47 for reporting the issue and sharing the screen recording. (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices. Thanks to @pxxush for reporting the issue. (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00. Thanks to @AndreMonthy for the report. (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views. Thanks to @kmaustral for reporting the issue. (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like high or low. Thanks to @RumiaKitinari for reporting the issue. (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards. Long tag pills can now wrap across lines and break within very long tag names on narrow screens. Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution. (#1901) Fixed the task context menu creating an undefined property when adding or removing tags. Hardened task property updates so invalid frontmatter property names are rejected instead of written. Thanks to @mgrecar for reporting the issue. (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages. Thanks to @minchinweb for reporting the issue. Changed# Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain."},{"route":"/obsidian/releases/4.9.0/","title":"TaskNotes 4.9.0","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.9.0.md","namespace":"obsidian","relativePath":"releases/4.9.0.md","raw":"# TaskNotes 4.9.0\n\n## Security\n\n- (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins.\n - Thanks to @martin-forge for reporting.\n\n## Added\n\n- (#1932) Added middle-click support for opening task cards in a new tab.\n - Thanks to @imsuck for the request.\n\n## Fixed\n\n- (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views.\n - Thanks to @KittehBit for reporting.\n- (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find.\n - Thanks to @rayvermey for reporting.\n- (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening.\n - Thanks to @sumiyalairu03 for reporting.\n- (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task.\n - Thanks to @sumiyalairu03 for reporting.\n- (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes.\n - Thanks to @rchaklashiya for reporting and following up with the embed case.\n- (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields.\n - Thanks to @AndreMonthy for reporting.\n- (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects.\n - Thanks to @martin-forge for reporting and verifying the direct-edit reproduction.\n- (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes.\n - Thanks to @RumiaKitinari for reporting.\n- (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views.\n - Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1.\n- (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid.\n - Thanks to @benmartinek for suggesting this.\n- Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens.\n- (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay.\n - Thanks to @minchinweb for reporting.\n- (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view.\n - Thanks to @mikhailmarka for reporting.\n- (#1912) Fixed \"Create subtask\" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text.\n - Thanks to @pkuehne for reporting and @benmartinek for confirming.\n","aliases":["/releases/4.9.0/","/releases/4.9.0/"],"toc":[{"level":2,"id":"security","text":"Security"},{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Security#

\n
    \n
  • (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins.
      \n
    • Thanks to @martin-forge for reporting.
    • \n
    \n
  • \n
\n

Added#

\n
    \n
  • (#1932) Added middle-click support for opening task cards in a new tab.
      \n
    • Thanks to @imsuck for the request.
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views.
      \n
    • Thanks to @KittehBit for reporting.
    • \n
    \n
  • \n
  • (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find.
      \n
    • Thanks to @rayvermey for reporting.
    • \n
    \n
  • \n
  • (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening.
      \n
    • Thanks to @sumiyalairu03 for reporting.
    • \n
    \n
  • \n
  • (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task.
      \n
    • Thanks to @sumiyalairu03 for reporting.
    • \n
    \n
  • \n
  • (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes.
      \n
    • Thanks to @rchaklashiya for reporting and following up with the embed case.
    • \n
    \n
  • \n
  • (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields.
      \n
    • Thanks to @AndreMonthy for reporting.
    • \n
    \n
  • \n
  • (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects.
      \n
    • Thanks to @martin-forge for reporting and verifying the direct-edit reproduction.
    • \n
    \n
  • \n
  • (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes.
      \n
    • Thanks to @RumiaKitinari for reporting.
    • \n
    \n
  • \n
  • (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views.
      \n
    • Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1.
    • \n
    \n
  • \n
  • (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid.
      \n
    • Thanks to @benmartinek for suggesting this.
    • \n
    \n
  • \n
  • Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens.
  • \n
  • (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay.
      \n
    • Thanks to @minchinweb for reporting.
    • \n
    \n
  • \n
  • (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view.
      \n
    • Thanks to @mikhailmarka for reporting.
    • \n
    \n
  • \n
  • (#1912) Fixed "Create subtask" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text.
      \n
    • Thanks to @pkuehne for reporting and @benmartinek for confirming.
    • \n
    \n
  • \n
\n","text":"Security# (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins. Thanks to @martin-forge for reporting. Added# (#1932) Added middle-click support for opening task cards in a new tab. Thanks to @imsuck for the request. Fixed# (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views. Thanks to @KittehBit for reporting. (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find. Thanks to @rayvermey for reporting. (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening. Thanks to @sumiyalairu03 for reporting. (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task. Thanks to @sumiyalairu03 for reporting. (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes. Thanks to @rchaklashiya for reporting and following up with the embed case. (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields. Thanks to @AndreMonthy for reporting. (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects. Thanks to @martin-forge for reporting and verifying the direct-edit reproduction. (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes. Thanks to @RumiaKitinari for reporting. (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views. Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1. (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid. Thanks to @benmartinek for suggesting this. Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens. (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay. Thanks to @minchinweb for reporting. (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view. Thanks to @mikhailmarka for reporting. (#1912) Fixed \"Create subtask\" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming."},{"route":"/obsidian/releases/4.9.1/","title":"TaskNotes 4.9.1","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.9.1.md","namespace":"obsidian","relativePath":"releases/4.9.1.md","raw":"# TaskNotes 4.9.1\n\n## Added\n\n- (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active.\n - Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea.\n\n## Fixed\n\n- (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions.\n - Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case.\n- (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date.\n - Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event.\n - Thanks to @martin-forge for reporting and contributing the fix.\n- (#1912) Fixed \"Create subtask\" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text.\n - Thanks to @pkuehne for reporting and @benmartinek for confirming.\n- (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits.\n - TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup.\n - Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes.\n - Thanks to @martin-forge for reporting and contributing the fix.\n- (#1938) Fixed partial HTTP API task updates rewriting native tags with `#` prefixes or duplicate task tags.\n - Thanks to @joseluisgonzalezdelgado-ctrl for reporting.\n- (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back.\n - Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact.\n- Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled.\n- (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable.\n - Thanks to @pxxush for reporting.\n- (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts.\n - Thanks to @jordankbartos for reporting and proposing a fix in #1944.\n- (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up.\n - Thanks to @martin-forge for reporting and contributing the fix.\n- (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar.\n - Thanks to @3zra47 for reporting.\n- (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row.\n - Thanks to @Jomo94 for reporting.\n- (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern.\n - Thanks to @Jomo94 for reporting.\n","aliases":["/releases/4.9.1/","/releases/4.9.1/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active.
      \n
    • Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea.
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions.
      \n
    • Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case.
    • \n
    \n
  • \n
  • (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date.
      \n
    • Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event.
    • \n
    • Thanks to @martin-forge for reporting and contributing the fix.
    • \n
    \n
  • \n
  • (#1912) Fixed "Create subtask" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text.
      \n
    • Thanks to @pkuehne for reporting and @benmartinek for confirming.
    • \n
    \n
  • \n
  • (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits.
      \n
    • TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup.
    • \n
    • Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes.
    • \n
    • Thanks to @martin-forge for reporting and contributing the fix.
    • \n
    \n
  • \n
  • (#1938) Fixed partial HTTP API task updates rewriting native tags with # prefixes or duplicate task tags.
      \n
    • Thanks to @joseluisgonzalezdelgado-ctrl for reporting.
    • \n
    \n
  • \n
  • (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back.
      \n
    • Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact.
    • \n
    \n
  • \n
  • Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled.
  • \n
  • (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable.
      \n
    • Thanks to @pxxush for reporting.
    • \n
    \n
  • \n
  • (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts.
      \n
    • Thanks to @jordankbartos for reporting and proposing a fix in #1944.
    • \n
    \n
  • \n
  • (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up.
      \n
    • Thanks to @martin-forge for reporting and contributing the fix.
    • \n
    \n
  • \n
  • (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar.
      \n
    • Thanks to @3zra47 for reporting.
    • \n
    \n
  • \n
  • (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row.
      \n
    • Thanks to @Jomo94 for reporting.
    • \n
    \n
  • \n
  • (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern.
      \n
    • Thanks to @Jomo94 for reporting.
    • \n
    \n
  • \n
\n","text":"Added# (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active. Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea. Fixed# (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions. Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case. (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date. Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event. Thanks to @martin-forge for reporting and contributing the fix. (#1912) Fixed \"Create subtask\" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming. (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits. TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup. Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes. Thanks to @martin-forge for reporting and contributing the fix. (#1938) Fixed partial HTTP API task updates rewriting native tags with # prefixes or duplicate task tags. Thanks to @joseluisgonzalezdelgado-ctrl for reporting. (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back. Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact. Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled. (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable. Thanks to @pxxush for reporting. (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts. Thanks to @jordankbartos for reporting and proposing a fix in #1944. (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up. Thanks to @martin-forge for reporting and contributing the fix. (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar. Thanks to @3zra47 for reporting. (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row. Thanks to @Jomo94 for reporting. (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern. Thanks to @Jomo94 for reporting."},{"route":"/obsidian/releases/4.9.2/","title":"TaskNotes 4.9.2","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/4.9.2.md","namespace":"obsidian","relativePath":"releases/4.9.2.md","raw":"# TaskNotes 4.9.2\n\n## Added\n\n- (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option.\n - Thanks to @renatomen for the contribution.\n\n## Fixed\n\n- Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes.\n- (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps.\n - Thanks to @thechonta for reporting.\n- (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards.\n - Thanks to @sruiz-savia for reporting.\n- (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata.\n - Thanks to @christenbc for reporting.\n- (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use.\n - Thanks to @chmac for reporting.\n- (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility.\n - Thanks to @christenbc for reporting.\n- (#1959) Fixed the MCP `tasknotes_list_tasks` tool so circular internal task data and live Obsidian object references no longer break task-list responses.\n - Thanks to @kmaustral for reporting.\n- (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short.\n - Thanks to @sumiyalairu03 for reporting.\n- (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark.\n - Thanks to @jacksoluke for reporting.\n- (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text.\n - Thanks to @bgk0018 for reporting.\n- (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering.\n - Thanks to @KFrancoD for reporting.\n- (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact `YYYYMMDD` entry when a date is already set.\n - Thanks to @kazerniel for reporting and following up.\n- (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile.\n - Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem.\n","aliases":["/releases/4.9.2/","/releases/4.9.2/"],"toc":[{"level":2,"id":"added","text":"Added"},{"level":2,"id":"fixed","text":"Fixed"}],"html":"

Added#

\n
    \n
  • (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option.
      \n
    • Thanks to @renatomen for the contribution.
    • \n
    \n
  • \n
\n

Fixed#

\n
    \n
  • Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes.
  • \n
  • (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps.
      \n
    • Thanks to @thechonta for reporting.
    • \n
    \n
  • \n
  • (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards.
      \n
    • Thanks to @sruiz-savia for reporting.
    • \n
    \n
  • \n
  • (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata.
      \n
    • Thanks to @christenbc for reporting.
    • \n
    \n
  • \n
  • (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use.
      \n
    • Thanks to @chmac for reporting.
    • \n
    \n
  • \n
  • (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility.
      \n
    • Thanks to @christenbc for reporting.
    • \n
    \n
  • \n
  • (#1959) Fixed the MCP tasknotes_list_tasks tool so circular internal task data and live Obsidian object references no longer break task-list responses.
      \n
    • Thanks to @kmaustral for reporting.
    • \n
    \n
  • \n
  • (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short.
      \n
    • Thanks to @sumiyalairu03 for reporting.
    • \n
    \n
  • \n
  • (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark.
      \n
    • Thanks to @jacksoluke for reporting.
    • \n
    \n
  • \n
  • (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text.
      \n
    • Thanks to @bgk0018 for reporting.
    • \n
    \n
  • \n
  • (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering.
      \n
    • Thanks to @KFrancoD for reporting.
    • \n
    \n
  • \n
  • (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact YYYYMMDD entry when a date is already set.
      \n
    • Thanks to @kazerniel for reporting and following up.
    • \n
    \n
  • \n
  • (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile.
      \n
    • Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem.
    • \n
    \n
  • \n
\n","text":"Added# (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option. Thanks to @renatomen for the contribution. Fixed# Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes. (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps. Thanks to @thechonta for reporting. (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards. Thanks to @sruiz-savia for reporting. (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata. Thanks to @christenbc for reporting. (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use. Thanks to @chmac for reporting. (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility. Thanks to @christenbc for reporting. (#1959) Fixed the MCP tasknotes_list_tasks tool so circular internal task data and live Obsidian object references no longer break task-list responses. Thanks to @kmaustral for reporting. (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short. Thanks to @sumiyalairu03 for reporting. (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark. Thanks to @jacksoluke for reporting. (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text. Thanks to @bgk0018 for reporting. (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering. Thanks to @KFrancoD for reporting. (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact YYYYMMDD entry when a date is already set. Thanks to @kazerniel for reporting and following up. (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile. Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem."},{"route":"/obsidian/releases/unreleased/","title":"TaskNotes - Unreleased","description":"TaskNotes documentation.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes:docs/releases/unreleased.md","namespace":"obsidian","relativePath":"releases/unreleased.md","raw":"# TaskNotes - Unreleased\n\n\n","aliases":["/releases/unreleased/","/releases/unreleased/"],"toc":[],"html":"\n","text":""},{"route":"/obsidian/settings/","title":"Settings","description":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings.md","namespace":"obsidian","relativePath":"settings.md","raw":"# Settings\n\nTaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.\n\n\n## General\n\nThe General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures.\n\nFor more information, see the [General Settings](settings/general.md) documentation.\n\n## Task Properties\n\nTask Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration.\n\nFor more detailed information, see the [Task Properties Settings](settings/task-properties.md) documentation.\n\n## Modal Fields\n\nModal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise.\n\nFor more information, see the [Modal Fields Settings](settings/modal-fields.md) documentation.\n\n## Appearance & UI\n\nAppearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance.\n\nFor more detailed information, see the [Appearance & UI Settings](settings/appearance.md) documentation.\n\n## Features\n\nFeatures groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults.\n\nFor more information, see the [Features Settings](settings/features.md) documentation.\n\n## Integrations\n\nIntegrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints.\n\nFor more detailed information, see the [Integrations Settings](settings/integrations.md) documentation.\n","aliases":["/settings/"],"toc":[{"level":2,"id":"general","text":"General"},{"level":2,"id":"task-properties","text":"Task Properties"},{"level":2,"id":"modal-fields","text":"Modal Fields"},{"level":2,"id":"appearance-ui","text":"Appearance & UI"},{"level":2,"id":"features","text":"Features"},{"level":2,"id":"integrations","text":"Integrations"}],"html":"

TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.

\n

General#

\n

The General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures.

\n

For more information, see the General Settings documentation.

\n

Task Properties#

\n

Task Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration.

\n

For more detailed information, see the Task Properties Settings documentation.

\n

Modal Fields#

\n

Modal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise.

\n

For more information, see the Modal Fields Settings documentation.

\n

Appearance & UI#

\n

Appearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance.

\n

For more detailed information, see the Appearance & UI Settings documentation.

\n

Features#

\n

Features groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults.

\n

For more information, see the Features Settings documentation.

\n

Integrations#

\n

Integrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints.

\n

For more detailed information, see the Integrations Settings documentation.

\n","text":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior. General# The General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures. For more information, see the General Settings documentation. Task Properties# Task Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration. For more detailed information, see the Task Properties Settings documentation. Modal Fields# Modal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise. For more information, see the Modal Fields Settings documentation. Appearance & UI# Appearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance. For more detailed information, see the Appearance & UI Settings documentation. Features# Features groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults. For more information, see the Features Settings documentation. Integrations# Integrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints. For more detailed information, see the Integrations Settings documentation."},{"route":"/obsidian/settings/appearance/","title":"Appearance & UI Settings","description":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/appearance.md","namespace":"obsidian","relativePath":"settings/appearance.md","raw":"# Appearance & UI Settings\n\nThese settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.\n\n\n![Appearance Settings](../assets/settings-appearance.png)\n\n## Task Cards\n\nUse **Default visible properties** to decide what metadata appears on task cards without opening each task. This is the primary control for card density.\n\nChecklist progress is available as a visible property in task cards. In Bases view `order` arrays, the corresponding source property is `file.tasks` (shown as `tasks` in Bases property pickers once present in the view `order` list).\n\nNested task cards use CSS variables for their indentation. Add a CSS snippet if\nyou want a denser hierarchy than the default:\n\n```css\n.tasknotes-plugin {\n --tn-nested-task-indent: 12px;\n --tn-nested-task-padding: 8px;\n}\n\nbody.is-mobile .tasknotes-plugin {\n --tn-nested-task-indent: 8px;\n --tn-nested-task-padding: 6px;\n}\n```\n\nIf task links inside normal markdown lists feel visually doubled with both a\nlist marker and the task status indicator, a CSS snippet can hide those markers\nfor task-link lines:\n\n```css\n.markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker {\n content: \"\";\n}\n\n.markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list {\n display: none;\n}\n```\n\n## Display Formatting\n\nUse **Time format** to switch between 12-hour and 24-hour display across all TaskNotes surfaces.\n\n## Calendar View\n\nCalendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. **Selection mirror** controls whether drag selections show a visual preview before committing.\n\nUse **Calendar locale** for region-specific formatting and calendar systems (for example `en`, `de`, or `fa`). Leave it empty to use automatic detection.\n\n## Default Event Visibility\n\nThis section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events.\n\n## Time Settings\n\nTime settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape.\n\n## UI Elements\n\nUI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button.\n\n## Related Settings\n\nSome appearance-related settings are configured elsewhere:\n\n- **Task filename format**: Configured in [Task Properties](task-properties.md) → Title card\n- **Project autosuggest display**: Configured in [Task Properties](task-properties.md) → Projects card\n","aliases":["/settings/appearance/"],"toc":[{"level":2,"id":"task-cards","text":"Task Cards"},{"level":2,"id":"display-formatting","text":"Display Formatting"},{"level":2,"id":"calendar-view","text":"Calendar View"},{"level":2,"id":"default-event-visibility","text":"Default Event Visibility"},{"level":2,"id":"time-settings","text":"Time Settings"},{"level":2,"id":"ui-elements","text":"UI Elements"},{"level":2,"id":"related-settings","text":"Related Settings"}],"html":"

These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.

\n

\"Appearance

\n

Task Cards#

\n

Use Default visible properties to decide what metadata appears on task cards without opening each task. This is the primary control for card density.

\n

Checklist progress is available as a visible property in task cards. In Bases view order arrays, the corresponding source property is file.tasks (shown as tasks in Bases property pickers once present in the view order list).

\n

Nested task cards use CSS variables for their indentation. Add a CSS snippet if\nyou want a denser hierarchy than the default:

\n
.tasknotes-plugin {\n  --tn-nested-task-indent: 12px;\n  --tn-nested-task-padding: 8px;\n}\n\nbody.is-mobile .tasknotes-plugin {\n  --tn-nested-task-indent: 8px;\n  --tn-nested-task-padding: 6px;\n}\n

If task links inside normal markdown lists feel visually doubled with both a\nlist marker and the task status indicator, a CSS snippet can hide those markers\nfor task-link lines:

\n
.markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker {\n  content: "";\n}\n\n.markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list {\n  display: none;\n}\n

Display Formatting#

\n

Use Time format to switch between 12-hour and 24-hour display across all TaskNotes surfaces.

\n

Calendar View#

\n

Calendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. Selection mirror controls whether drag selections show a visual preview before committing.

\n

Use Calendar locale for region-specific formatting and calendar systems (for example en, de, or fa). Leave it empty to use automatic detection.

\n

Default Event Visibility#

\n

This section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events.

\n

Time Settings#

\n

Time settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape.

\n

UI Elements#

\n

UI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button.

\n

Related Settings#

\n

Some appearance-related settings are configured elsewhere:

\n\n","text":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements. Task Cards# Use Default visible properties to decide what metadata appears on task cards without opening each task. This is the primary control for card density. Checklist progress is available as a visible property in task cards. In Bases view order arrays, the corresponding source property is file.tasks (shown as tasks in Bases property pickers once present in the view order list). Nested task cards use CSS variables for their indentation. Add a CSS snippet if you want a denser hierarchy than the default: .tasknotes-plugin { --tn-nested-task-indent: 12px; --tn-nested-task-padding: 8px; } body.is-mobile .tasknotes-plugin { --tn-nested-task-indent: 8px; --tn-nested-task-padding: 6px; } If task links inside normal markdown lists feel visually doubled with both a list marker and the task status indicator, a CSS snippet can hide those markers for task-link lines: .markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker { content: \"\"; } .markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list { display: none; } Display Formatting# Use Time format to switch between 12-hour and 24-hour display across all TaskNotes surfaces. Calendar View# Calendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. Selection mirror controls whether drag selections show a visual preview before committing. Use Calendar locale for region-specific formatting and calendar systems (for example en, de, or fa). Leave it empty to use automatic detection. Default Event Visibility# This section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events. Time Settings# Time settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape. UI Elements# UI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button. Related Settings# Some appearance-related settings are configured elsewhere: Task filename format: Configured in Task Properties → Title card Project autosuggest display: Configured in Task Properties → Projects card"},{"route":"/obsidian/settings/features/","title":"Features Settings","description":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notific...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/features.md","namespace":"obsidian","relativePath":"settings/features.md","raw":"# Features Settings\n\nThese settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications.\n\n\n![Features Settings](../assets/settings-features.png)\n\n## Inline Tasks\n\nInline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. **Task link overlay** enables the Live Preview card behavior for task links, while **Instant task convert** surfaces conversion buttons next to list items and checkboxes. **Keep checkbox when converting** leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, **Inline task convert folder** sets destination behavior and supports `{{currentNotePath}}`, and **Use task defaults on instant convert** applies your default task values at conversion time.\n\nThe separate **Convert current note to task** command keeps the current note body as the task details. If the note has no `scheduled` frontmatter, the command uses the Scheduled Date default from **Task Properties**; it does not apply body templates.\n\n## Body Template\n\nBody template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like `{{title}}`, `{{date}}`, `{{time}}`, `{{priority}}`, `{{status}}`, `{{contexts}}`, `{{tags}}`, and `{{projects}}`.\n\nMaterialized occurrence notes can use a separate template. Set **Occurrence note template file** to provide a global fallback for occurrence notes; a recurring task's `occurrence_template` frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior.\n\n## Natural Language Processing\n\nNLP settings define how text input is interpreted during task capture. **Enable natural language task input** activates date and metadata parsing, **Default to scheduled** changes ambiguous date handling, **NLP language** selects parsing patterns, and **Status suggestion trigger** controls optional status autocomplete activation.\n\nWrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, `BIO \"123H\" - HW1` keeps `123H` in the title instead of treating it as a 123-hour estimate, while `Review \"Today\" notes` keeps `Today` as text instead of parsing it as a date.\n\n## Pomodoro Timer\n\nPomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. **Pomodoro data storage** chooses whether history is kept in plugin data or daily notes.\n\n## Notifications\n\nUse this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control.\n\n## Performance & Behavior\n\nPerformance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing.\n\n## Time Tracking\n\nTime tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification.\n\n## Recurring Tasks\n\nUse **Maintain due date offset in recurring tasks** to keep due/scheduled spacing consistent when recurring tasks roll forward.\n\nOccurrence note behavior is configured per recurring task from the task context menu: open **Recurrence → Occurrence notes** to choose manual creation or automatic creation of the next materialized occurrence after completion. See [Recurring Tasks](../features/recurring-tasks.md#materialized-occurrence-notes) for the workflow and storage model.\n\n## Timeblocking\n\nTimeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views.\n\n### Usage\n\nIn the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select \"Create timeblock\" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration.\n","aliases":["/settings/features/"],"toc":[{"level":2,"id":"inline-tasks","text":"Inline Tasks"},{"level":2,"id":"body-template","text":"Body Template"},{"level":2,"id":"natural-language-processing","text":"Natural Language Processing"},{"level":2,"id":"pomodoro-timer","text":"Pomodoro Timer"},{"level":2,"id":"notifications","text":"Notifications"},{"level":2,"id":"performance-behavior","text":"Performance & Behavior"},{"level":2,"id":"time-tracking","text":"Time Tracking"},{"level":2,"id":"recurring-tasks","text":"Recurring Tasks"},{"level":2,"id":"timeblocking","text":"Timeblocking"},{"level":3,"id":"usage","text":"Usage"}],"html":"

These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications.

\n

\"Features

\n

Inline Tasks#

\n

Inline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. Task link overlay enables the Live Preview card behavior for task links, while Instant task convert surfaces conversion buttons next to list items and checkboxes. Keep checkbox when converting leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, Inline task convert folder sets destination behavior and supports {{currentNotePath}}, and Use task defaults on instant convert applies your default task values at conversion time.

\n

The separate Convert current note to task command keeps the current note body as the task details. If the note has no scheduled frontmatter, the command uses the Scheduled Date default from Task Properties; it does not apply body templates.

\n

Body Template#

\n

Body template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, {{contexts}}, {{tags}}, and {{projects}}.

\n

Materialized occurrence notes can use a separate template. Set Occurrence note template file to provide a global fallback for occurrence notes; a recurring task's occurrence_template frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior.

\n

Natural Language Processing#

\n

NLP settings define how text input is interpreted during task capture. Enable natural language task input activates date and metadata parsing, Default to scheduled changes ambiguous date handling, NLP language selects parsing patterns, and Status suggestion trigger controls optional status autocomplete activation.

\n

Wrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, BIO "123H" - HW1 keeps 123H in the title instead of treating it as a 123-hour estimate, while Review "Today" notes keeps Today as text instead of parsing it as a date.

\n

Pomodoro Timer#

\n

Pomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. Pomodoro data storage chooses whether history is kept in plugin data or daily notes.

\n

Notifications#

\n

Use this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control.

\n

Performance & Behavior#

\n

Performance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing.

\n

Time Tracking#

\n

Time tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification.

\n

Recurring Tasks#

\n

Use Maintain due date offset in recurring tasks to keep due/scheduled spacing consistent when recurring tasks roll forward.

\n

Occurrence note behavior is configured per recurring task from the task context menu: open Recurrence → Occurrence notes to choose manual creation or automatic creation of the next materialized occurrence after completion. See Recurring Tasks for the workflow and storage model.

\n

Timeblocking#

\n

Timeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views.

\n

Usage#

\n

In the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select "Create timeblock" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration.

\n","text":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications. Inline Tasks# Inline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. Task link overlay enables the Live Preview card behavior for task links, while Instant task convert surfaces conversion buttons next to list items and checkboxes. Keep checkbox when converting leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, Inline task convert folder sets destination behavior and supports {{currentNotePath}}, and Use task defaults on instant convert applies your default task values at conversion time. The separate Convert current note to task command keeps the current note body as the task details. If the note has no scheduled frontmatter, the command uses the Scheduled Date default from Task Properties; it does not apply body templates. Body Template# Body template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, {{contexts}}, {{tags}}, and {{projects}}. Materialized occurrence notes can use a separate template. Set Occurrence note template file to provide a global fallback for occurrence notes; a recurring task's occurrence_template frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior. Natural Language Processing# NLP settings define how text input is interpreted during task capture. Enable natural language task input activates date and metadata parsing, Default to scheduled changes ambiguous date handling, NLP language selects parsing patterns, and Status suggestion trigger controls optional status autocomplete activation. Wrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, BIO \"123H\" - HW1 keeps 123H in the title instead of treating it as a 123-hour estimate, while Review \"Today\" notes keeps Today as text instead of parsing it as a date. Pomodoro Timer# Pomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. Pomodoro data storage chooses whether history is kept in plugin data or daily notes. Notifications# Use this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control. Performance & Behavior# Performance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing. Time Tracking# Time tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification. Recurring Tasks# Use Maintain due date offset in recurring tasks to keep due/scheduled spacing consistent when recurring tasks roll forward. Occurrence note behavior is configured per recurring task from the task context menu: open Recurrence → Occurrence notes to choose manual creation or automatic creation of the next materialized occurrence after completion. See Recurring Tasks for the workflow and storage model. Timeblocking# Timeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views. Usage# In the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select \"Create timeblock\" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration."},{"route":"/obsidian/settings/general/","title":"General Settings","description":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/general.md","namespace":"obsidian","relativePath":"settings/general.md","raw":"# General Settings\n\nThese settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.\n\n\n![General Settings](../assets/settings-general.png)\n\n## Task Storage\n\nTask storage settings define where new and inline-created task files are created and how archived tasks are relocated. **Default tasks folder** sets the base location and supports folder template variables, including `{{currentNotePath}}` and `{{currentNoteTitle}}` for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as `{{year}}` and Daily Notes-style date tokens such as `YYYY/MM/DD`. **Folder for inline-created tasks** controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use `{{currentNotePath}}` and `{{currentNoteTitle}}` placeholders for contextual routing. Relative path segments such as `../` are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder.\n\n## Task Identification\n\nTaskNotes can identify task notes using either a tag or a frontmatter property.\n\nUse **Identify tasks by** to select a strategy.\n\n- **Tag mode** uses a configured task tag (for example `task`) and can optionally hide that identifying tag in card displays.\n- **Property mode** matches a property/value pair (for example `isTask: true` or `category: task`) and is useful when you avoid tag-based identification.\n\nIf you change the task tag after creating default Base views, existing `.base` filters will still point at the old tag until you update the default Base files or edit those filters.\n\n### Hide Identification Tags\n\nWhen using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter.\n\nThe **Hide identification tags in task cards** setting allows you to do this. When enabled:\n\n- Tags that exactly match your task identification tag (e.g., `#task`) will be hidden\n- Hierarchical child tags (e.g., `#task/project`, `#task/work/urgent`) will also be hidden\n- Other tags that don't match the identification pattern will still be displayed\n- The setting only affects the visual display—tags remain in the frontmatter\n\n![Hide identification tags demo](../assets/demo-hide-identification-tags.gif)\n\n**Example:**\n\nIf your task identification tag is `task` and a task has the tags `#task`, `#task/project`, `#important`, and `#review`:\n\n- With the setting **disabled** (default): All tags are shown: `#task`, `#task/project`, `#important`, `#review`\n- With the setting **enabled**: Only non-identifying tags are shown: `#important`, `#review`\n\n## Folder Management\n\nUse **Excluded folders** to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing.\n\n## Views & Base Files\n\nTaskNotes uses Obsidian Bases files (`.base`) to power its task views. By default, missing view files are created automatically on startup.\n\nUse **Create files** to generate missing default files in `TaskNotes/Views/` without overwriting existing files. Use **Update files** to overwrite the configured default files with templates generated from your current TaskNotes settings.\n\n## Frontmatter\n\nThis section only appears when you have markdown links enabled globally in Obsidian settings.\n\n**Use markdown links in frontmatter** switches project/dependency serialization from wikilinks (`[[path]]`) to markdown links (`[text](path)`). This requires the `obsidian-frontmatter-markdown-links` plugin.\n\n## Task Interaction\n\nTask interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click).\n\n## Release Notes\n\n**View release notes** opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette.\n","aliases":["/settings/general/"],"toc":[{"level":2,"id":"task-storage","text":"Task Storage"},{"level":2,"id":"task-identification","text":"Task Identification"},{"level":3,"id":"hide-identification-tags","text":"Hide Identification Tags"},{"level":2,"id":"folder-management","text":"Folder Management"},{"level":2,"id":"views-base-files","text":"Views & Base Files"},{"level":2,"id":"frontmatter","text":"Frontmatter"},{"level":2,"id":"task-interaction","text":"Task Interaction"},{"level":2,"id":"release-notes","text":"Release Notes"}],"html":"

These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.

\n

\"General

\n

Task Storage#

\n

Task storage settings define where new and inline-created task files are created and how archived tasks are relocated. Default tasks folder sets the base location and supports folder template variables, including {{currentNotePath}} and {{currentNoteTitle}} for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as {{year}} and Daily Notes-style date tokens such as YYYY/MM/DD. Folder for inline-created tasks controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use {{currentNotePath}} and {{currentNoteTitle}} placeholders for contextual routing. Relative path segments such as ../ are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder.

\n

Task Identification#

\n

TaskNotes can identify task notes using either a tag or a frontmatter property.

\n

Use Identify tasks by to select a strategy.

\n
    \n
  • Tag mode uses a configured task tag (for example task) and can optionally hide that identifying tag in card displays.
  • \n
  • Property mode matches a property/value pair (for example isTask: true or category: task) and is useful when you avoid tag-based identification.
  • \n
\n

If you change the task tag after creating default Base views, existing .base filters will still point at the old tag until you update the default Base files or edit those filters.

\n

Hide Identification Tags#

\n

When using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter.

\n

The Hide identification tags in task cards setting allows you to do this. When enabled:

\n
    \n
  • Tags that exactly match your task identification tag (e.g., #task) will be hidden
  • \n
  • Hierarchical child tags (e.g., #task/project, #task/work/urgent) will also be hidden
  • \n
  • Other tags that don't match the identification pattern will still be displayed
  • \n
  • The setting only affects the visual display—tags remain in the frontmatter
  • \n
\n

\"Hide

\n

Example:

\n

If your task identification tag is task and a task has the tags #task, #task/project, #important, and #review:

\n
    \n
  • With the setting disabled (default): All tags are shown: #task, #task/project, #important, #review
  • \n
  • With the setting enabled: Only non-identifying tags are shown: #important, #review
  • \n
\n

Folder Management#

\n

Use Excluded folders to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing.

\n

Views & Base Files#

\n

TaskNotes uses Obsidian Bases files (.base) to power its task views. By default, missing view files are created automatically on startup.

\n

Use Create files to generate missing default files in TaskNotes/Views/ without overwriting existing files. Use Update files to overwrite the configured default files with templates generated from your current TaskNotes settings.

\n

Frontmatter#

\n

This section only appears when you have markdown links enabled globally in Obsidian settings.

\n

Use markdown links in frontmatter switches project/dependency serialization from wikilinks ([[path]]) to markdown links ([text](path)). This requires the obsidian-frontmatter-markdown-links plugin.

\n

Task Interaction#

\n

Task interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click).

\n

Release Notes#

\n

View release notes opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette.

\n","text":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior. Task Storage# Task storage settings define where new and inline-created task files are created and how archived tasks are relocated. Default tasks folder sets the base location and supports folder template variables, including {{currentNotePath}} and {{currentNoteTitle}} for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as {{year}} and Daily Notes-style date tokens such as YYYY/MM/DD. Folder for inline-created tasks controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use {{currentNotePath}} and {{currentNoteTitle}} placeholders for contextual routing. Relative path segments such as ../ are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder. Task Identification# TaskNotes can identify task notes using either a tag or a frontmatter property. Use Identify tasks by to select a strategy. Tag mode uses a configured task tag (for example task) and can optionally hide that identifying tag in card displays. Property mode matches a property/value pair (for example isTask: true or category: task) and is useful when you avoid tag-based identification. If you change the task tag after creating default Base views, existing .base filters will still point at the old tag until you update the default Base files or edit those filters. Hide Identification Tags# When using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter. The Hide identification tags in task cards setting allows you to do this. When enabled: Tags that exactly match your task identification tag (e.g., #task) will be hidden Hierarchical child tags (e.g., #task/project, #task/work/urgent) will also be hidden Other tags that don't match the identification pattern will still be displayed The setting only affects the visual display—tags remain in the frontmatter Example: If your task identification tag is task and a task has the tags #task, #task/project, #important, and #review: With the setting disabled (default): All tags are shown: #task, #task/project, #important, #review With the setting enabled: Only non-identifying tags are shown: #important, #review Folder Management# Use Excluded folders to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing. Views & Base Files# TaskNotes uses Obsidian Bases files (.base) to power its task views. By default, missing view files are created automatically on startup. Use Create files to generate missing default files in TaskNotes/Views/ without overwriting existing files. Use Update files to overwrite the configured default files with templates generated from your current TaskNotes settings. Frontmatter# This section only appears when you have markdown links enabled globally in Obsidian settings. Use markdown links in frontmatter switches project/dependency serialization from wikilinks ([[path]]) to markdown links ([text](path)). This requires the obsidian-frontmatter-markdown-links plugin. Task Interaction# Task interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click). Release Notes# View release notes opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette."},{"route":"/obsidian/settings/integrations/","title":"Integrations Settings","description":"These settings control the integration with other plugins and services, such as Bases and external calendars.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/integrations.md","namespace":"obsidian","relativePath":"settings/integrations.md","raw":"# Integrations Settings\n\nThese settings control the integration with other plugins and services, such as Bases and external calendars.\n\n\n![Integrations Settings](../assets/settings-integrations.png)\n\n## Bases\n\nTaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see [Core Concepts](../core-concepts.md#bases-integration).\n\n### View Commands Configuration\n\nView command settings map TaskNotes commands and ribbon actions to specific `.base` files. This is useful when you maintain custom variants of the default views and want first-class command access to those files.\n\nAccess these settings in **Settings → TaskNotes → General → Views & base files**.\n\nDefault mappings:\n\n- **Open Mini Calendar View** → `TaskNotes/Views/mini-calendar-default.base`\n- **Open Kanban View** → `TaskNotes/Views/kanban-default.base`\n- **Open Tasks View** → `TaskNotes/Views/tasks-default.base`\n- **Open Calendar View** → `TaskNotes/Views/calendar-default.base`\n- **Open Agenda View** → `TaskNotes/Views/agenda-default.base`\n- **Pomodoro Statistics Base** → `TaskNotes/Views/pomodoro-stats.base`\n- **Relationships Widget** → `TaskNotes/Views/relationships.base`\n\nEach command allows you to specify a custom `.base` file path and includes a reset button to restore the default path.\n\n**Auto-create default files**: When enabled, TaskNotes creates missing default `.base` files automatically on startup.\n\n**Create files**: Button to generate all default `.base` files in the `TaskNotes/Views/` directory. Existing files are not overwritten.\n\nThe generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from **Settings → TaskNotes → Features** before using that Base file.\n\n## OAuth Calendar Integration\n\nConnect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule).\n\nEnable **Disable calendar integrations on mobile** when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally.\n\n### Setup Requirements\n\nOAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider.\n\n**Setup Guide**: See [Calendar Integration Setup](../calendar-setup.md) for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal.\n\n### Google Calendar\n\nProvide **Client ID** and **Client Secret** from Google Cloud Console, then use **Connect Google Calendar** to complete OAuth loopback authentication. **Disconnect** revokes account tokens while retaining the OAuth app credentials for reconnection. Use **Forget saved credentials** to remove the client ID and client secret.\n\nThe **Target calendar** setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar.\n\nFor timed task exports, **Default reminder** accepts one or more minute offsets separated by commas, such as `60, 1440`. All-day task exports use the target Google Calendar's default reminder settings.\n\nWhen connected, displays:\n- Connected account email\n- Connection time\n- Last sync time\n- Manual refresh button\n\n### Microsoft Outlook Calendar\n\nProvide **Client ID** and **Client Secret** from Azure App Registration, then use **Connect Microsoft Calendar** to authenticate. **Disconnect** revokes account tokens while retaining the OAuth app credentials for reconnection. Use **Forget saved credentials** to remove the client ID and client secret.\n\nWhen connected, displays:\n- Connected account email\n- Connection time\n- Last sync time\n\n### Security\n\n- OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system\n- OAuth credentials and account tokens are not written to TaskNotes' `data.json`\n- Access tokens refresh automatically\n- Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers)\n- Disconnect at any time to revoke account access; use **Forget saved credentials** to remove the OAuth app credentials\n\n## Calendar subscriptions (ICS)\n\nICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use **Add Calendar Subscription** to register URLs or local files, and **Refresh all subscriptions** for manual synchronization.\n\n**Recurring event related notes** controls how notes linked from recurring external calendar events are matched. **Series-wide** keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. **Selected instance only** limits related notes and counts to the exact recurrence instance that was linked.\n\n## Automatic ICS export\n\nAutomatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use **Export now** for immediate output.\n\nExport filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates.\n\n## HTTP API\n\nHTTP API settings control the local server lifecycle, listening port, and request authentication token.\n\nChanges to API enablement or port require an Obsidian restart to take effect.\n\n!!! warning\n The HTTP API binds to loopback only and browser CORS is limited to loopback origins. If the authentication token is empty, local API requests are still unauthenticated. Set a token unless your local environment is fully trusted.\n\n## Webhooks\n\n- **Add Webhook**: Register a new webhook endpoint.\n","aliases":["/settings/integrations/"],"toc":[{"level":2,"id":"bases","text":"Bases"},{"level":3,"id":"view-commands-configuration","text":"View Commands Configuration"},{"level":2,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"setup-requirements","text":"Setup Requirements"},{"level":3,"id":"google-calendar","text":"Google Calendar"},{"level":3,"id":"microsoft-outlook-calendar","text":"Microsoft Outlook Calendar"},{"level":3,"id":"security","text":"Security"},{"level":2,"id":"calendar-subscriptions-ics","text":"Calendar subscriptions (ICS)"},{"level":2,"id":"automatic-ics-export","text":"Automatic ICS export"},{"level":2,"id":"http-api","text":"HTTP API"},{"level":2,"id":"webhooks","text":"Webhooks"}],"html":"

These settings control the integration with other plugins and services, such as Bases and external calendars.

\n

\"Integrations

\n

Bases#

\n

TaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see Core Concepts.

\n

View Commands Configuration#

\n

View command settings map TaskNotes commands and ribbon actions to specific .base files. This is useful when you maintain custom variants of the default views and want first-class command access to those files.

\n

Access these settings in Settings → TaskNotes → General → Views & base files.

\n

Default mappings:

\n
    \n
  • Open Mini Calendar View → TaskNotes/Views/mini-calendar-default.base
  • \n
  • Open Kanban View → TaskNotes/Views/kanban-default.base
  • \n
  • Open Tasks View → TaskNotes/Views/tasks-default.base
  • \n
  • Open Calendar View → TaskNotes/Views/calendar-default.base
  • \n
  • Open Agenda View → TaskNotes/Views/agenda-default.base
  • \n
  • Pomodoro Statistics Base → TaskNotes/Views/pomodoro-stats.base
  • \n
  • Relationships Widget → TaskNotes/Views/relationships.base
  • \n
\n

Each command allows you to specify a custom .base file path and includes a reset button to restore the default path.

\n

Auto-create default files: When enabled, TaskNotes creates missing default .base files automatically on startup.

\n

Create files: Button to generate all default .base files in the TaskNotes/Views/ directory. Existing files are not overwritten.

\n

The generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from Settings → TaskNotes → Features before using that Base file.

\n

OAuth Calendar Integration#

\n

Connect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule).

\n

Enable Disable calendar integrations on mobile when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally.

\n

Setup Requirements#

\n

OAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider.

\n

Setup Guide: See Calendar Integration Setup for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal.

\n

Google Calendar#

\n

Provide Client ID and Client Secret from Google Cloud Console, then use Connect Google Calendar to complete OAuth loopback authentication. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret.

\n

The Target calendar setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar.

\n

For timed task exports, Default reminder accepts one or more minute offsets separated by commas, such as 60, 1440. All-day task exports use the target Google Calendar's default reminder settings.

\n

When connected, displays:

\n
    \n
  • Connected account email
  • \n
  • Connection time
  • \n
  • Last sync time
  • \n
  • Manual refresh button
  • \n
\n

Microsoft Outlook Calendar#

\n

Provide Client ID and Client Secret from Azure App Registration, then use Connect Microsoft Calendar to authenticate. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret.

\n

When connected, displays:

\n
    \n
  • Connected account email
  • \n
  • Connection time
  • \n
  • Last sync time
  • \n
\n

Security#

\n
    \n
  • OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system
  • \n
  • OAuth credentials and account tokens are not written to TaskNotes' data.json
  • \n
  • Access tokens refresh automatically
  • \n
  • Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers)
  • \n
  • Disconnect at any time to revoke account access; use Forget saved credentials to remove the OAuth app credentials
  • \n
\n

Calendar subscriptions (ICS)#

\n

ICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use Add Calendar Subscription to register URLs or local files, and Refresh all subscriptions for manual synchronization.

\n

Recurring event related notes controls how notes linked from recurring external calendar events are matched. Series-wide keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. Selected instance only limits related notes and counts to the exact recurrence instance that was linked.

\n

Automatic ICS export#

\n

Automatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use Export now for immediate output.

\n

Export filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates.

\n

HTTP API#

\n

HTTP API settings control the local server lifecycle, listening port, and request authentication token.

\n

Changes to API enablement or port require an Obsidian restart to take effect.

\n\n

Webhooks#

\n
    \n
  • Add Webhook: Register a new webhook endpoint.
  • \n
\n","text":"These settings control the integration with other plugins and services, such as Bases and external calendars. Bases# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see Core Concepts. View Commands Configuration# View command settings map TaskNotes commands and ribbon actions to specific .base files. This is useful when you maintain custom variants of the default views and want first-class command access to those files. Access these settings in Settings → TaskNotes → General → Views & base files. Default mappings: Open Mini Calendar View → TaskNotes/Views/mini-calendar-default.base Open Kanban View → TaskNotes/Views/kanban-default.base Open Tasks View → TaskNotes/Views/tasks-default.base Open Calendar View → TaskNotes/Views/calendar-default.base Open Agenda View → TaskNotes/Views/agenda-default.base Pomodoro Statistics Base → TaskNotes/Views/pomodoro-stats.base Relationships Widget → TaskNotes/Views/relationships.base Each command allows you to specify a custom .base file path and includes a reset button to restore the default path. Auto-create default files: When enabled, TaskNotes creates missing default .base files automatically on startup. Create files: Button to generate all default .base files in the TaskNotes/Views/ directory. Existing files are not overwritten. The generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from Settings → TaskNotes → Features before using that Base file. OAuth Calendar Integration# Connect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule). Enable Disable calendar integrations on mobile when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally. Setup Requirements# OAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider. Setup Guide: See Calendar Integration Setup for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal. Google Calendar# Provide Client ID and Client Secret from Google Cloud Console, then use Connect Google Calendar to complete OAuth loopback authentication. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. The Target calendar setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar. For timed task exports, Default reminder accepts one or more minute offsets separated by commas, such as 60, 1440. All-day task exports use the target Google Calendar's default reminder settings. When connected, displays: Connected account email Connection time Last sync time Manual refresh button Microsoft Outlook Calendar# Provide Client ID and Client Secret from Azure App Registration, then use Connect Microsoft Calendar to authenticate. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. When connected, displays: Connected account email Connection time Last sync time Security# OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system OAuth credentials and account tokens are not written to TaskNotes' data.json Access tokens refresh automatically Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers) Disconnect at any time to revoke account access; use Forget saved credentials to remove the OAuth app credentials Calendar subscriptions (ICS)# ICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use Add Calendar Subscription to register URLs or local files, and Refresh all subscriptions for manual synchronization. Recurring event related notes controls how notes linked from recurring external calendar events are matched. Series-wide keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. Selected instance only limits related notes and counts to the exact recurrence instance that was linked. Automatic ICS export# Automatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use Export now for immediate output. Export filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates. HTTP API# HTTP API settings control the local server lifecycle, listening port, and request authentication token. Changes to API enablement or port require an Obsidian restart to take effect. WarningThe HTTP API binds to loopback only and browser CORS is limited to loopback origins. If the authentication token is empty, local API requests are still unauthenticated. Set a token unless your local environment is fully trusted. Webhooks# Add Webhook: Register a new webhook endpoint."},{"route":"/obsidian/settings/modal-fields/","title":"Modal Fields Settings","description":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/modal-fields.md","namespace":"obsidian","relativePath":"settings/modal-fields.md","raw":"# Modal Fields Settings\n\nThe Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open **Settings → TaskNotes → Modal Fields** to manage the configuration.\n\n![Modal Fields Settings](../assets/settings-modal-fields.png)\n\n## Field Groups\n\nFields are organized into draggable groups:\n\n- **Basic Information** – Title and Details\n- **Metadata** – Contexts, Tags, Time Estimate\n- **Organization** – Projects and Subtasks\n- **Dependencies** – Blocked By and Blocking\n- **Custom Fields** – Any user-defined fields that you add through Task Properties\n\nEach group can be collapsed, and their order in the manager matches the order shown in the modal.\n\n## Managing Fields\n\nEvery field entry includes:\n\n- **Visibility toggles** for creation and edit modals\n- **Enable/disable** checkbox\n- **Drag handle** for ordering within its group\n- **Required** toggle (where applicable, e.g., Title)\n\nChanges are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow.\n\n## Syncing User Fields\n\nThe **Sync User Fields** button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields.\n\n## Resetting to Defaults\n\nSelect **Reset to Defaults** to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility.\n","aliases":["/settings/modal-fields/"],"toc":[{"level":2,"id":"field-groups","text":"Field Groups"},{"level":2,"id":"managing-fields","text":"Managing Fields"},{"level":2,"id":"syncing-user-fields","text":"Syncing User Fields"},{"level":2,"id":"resetting-to-defaults","text":"Resetting to Defaults"}],"html":"

The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration.

\n

\"Modal

\n

Field Groups#

\n

Fields are organized into draggable groups:

\n
    \n
  • Basic Information – Title and Details
  • \n
  • Metadata – Contexts, Tags, Time Estimate
  • \n
  • Organization – Projects and Subtasks
  • \n
  • Dependencies – Blocked By and Blocking
  • \n
  • Custom Fields – Any user-defined fields that you add through Task Properties
  • \n
\n

Each group can be collapsed, and their order in the manager matches the order shown in the modal.

\n

Managing Fields#

\n

Every field entry includes:

\n
    \n
  • Visibility toggles for creation and edit modals
  • \n
  • Enable/disable checkbox
  • \n
  • Drag handle for ordering within its group
  • \n
  • Required toggle (where applicable, e.g., Title)
  • \n
\n

Changes are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow.

\n

Syncing User Fields#

\n

The Sync User Fields button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields.

\n

Resetting to Defaults#

\n

Select Reset to Defaults to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility.

\n","text":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration. Field Groups# Fields are organized into draggable groups: Basic Information – Title and Details Metadata – Contexts, Tags, Time Estimate Organization – Projects and Subtasks Dependencies – Blocked By and Blocking Custom Fields – Any user-defined fields that you add through Task Properties Each group can be collapsed, and their order in the manager matches the order shown in the modal. Managing Fields# Every field entry includes: Visibility toggles for creation and edit modals Enable/disable checkbox Drag handle for ordering within its group Required toggle (where applicable, e.g., Title) Changes are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow. Syncing User Fields# The Sync User Fields button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields. Resetting to Defaults# Select Reset to Defaults to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility."},{"route":"/obsidian/settings/property-identification/","title":"Property-based Task Identification","description":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/property-identification.md","namespace":"obsidian","relativePath":"settings/property-identification.md","raw":"# Property-based Task Identification\n\nWhen you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.\n\n## Boolean values\n- Enter the setting value as true or false (without quotes) in the settings UI.\n- Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly:\n - \"true\" in settings matches frontmatter boolean true\n - \"false\" in settings matches frontmatter boolean false\n - Arrays are supported (e.g., property: [false, true])\n\nTip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent.\n\n## Examples\n- Setting: Property Name = isTask, Property Value = true\n - Matches: `isTask: true`\n - Does not match: `isTask: false`\n- Setting: Property Name = isTask, Property Value = false\n - Matches: `isTask: false`\n - Does not match: `isTask: true`\n\nFor related configuration details, see [Task Properties](task-properties.md).\n","aliases":["/settings/property-identification/"],"toc":[{"level":2,"id":"boolean-values","text":"Boolean values"},{"level":2,"id":"examples","text":"Examples"}],"html":"

When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.

\n

Boolean values#

\n
    \n
  • Enter the setting value as true or false (without quotes) in the settings UI.
  • \n
  • Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly:
      \n
    • "true" in settings matches frontmatter boolean true
    • \n
    • "false" in settings matches frontmatter boolean false
    • \n
    • Arrays are supported (e.g., property: [false, true])
    • \n
    \n
  • \n
\n

Tip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent.

\n

Examples#

\n
    \n
  • Setting: Property Name = isTask, Property Value = true
      \n
    • Matches: isTask: true
    • \n
    • Does not match: isTask: false
    • \n
    \n
  • \n
  • Setting: Property Name = isTask, Property Value = false
      \n
    • Matches: isTask: false
    • \n
    • Does not match: isTask: true
    • \n
    \n
  • \n
\n

For related configuration details, see Task Properties.

\n","text":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value. Boolean values# Enter the setting value as true or false (without quotes) in the settings UI. Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly: \"true\" in settings matches frontmatter boolean true \"false\" in settings matches frontmatter boolean false Arrays are supported (e.g., property: [false, true]) Tip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent. Examples# Setting: Property Name = isTask, Property Value = true Matches: isTask: true Does not match: isTask: false Setting: Property Name = isTask, Property Value = false Matches: isTask: false Does not match: isTask: true For related configuration details, see Task Properties."},{"route":"/obsidian/settings/property-types-reference/","title":"Property Types Reference","description":"This reference documents the expected data types for each frontmatter property that TaskNotes uses.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/property-types-reference.md","namespace":"obsidian","relativePath":"settings/property-types-reference.md","raw":"# Property Types Reference\n\nThis reference documents the expected data types for each frontmatter property that TaskNotes uses.\n\n\n## Quick Reference\n\n| Property | Type | Example |\n|----------|------|---------|\n| title | text | `\"My Task\"` |\n| status | text | `\"open\"`, `\"in-progress\"`, `\"done\"` |\n| priority | text | `\"low\"`, `\"normal\"`, `\"high\"` |\n| due | text (date) | `\"2025-01-15\"` |\n| scheduled | text (date) | `\"2025-01-10\"` |\n| completedDate | text (date) | `\"2025-01-20\"` |\n| dateCreated | text (datetime) | `\"2025-01-01T08:00:00Z\"` |\n| dateModified | text (datetime) | `\"2025-01-15T10:30:00Z\"` |\n| tags | list | `[\"work\", \"urgent\"]` |\n| contexts | list | `[\"office\", \"home\"]` |\n| projects | list | `[\"[[Project A]]\"]` |\n| timeEstimate | number | `120` (minutes) |\n| recurrence | text | `\"FREQ=WEEKLY;BYDAY=MO\"` |\n| recurrence_anchor | text | `\"scheduled\"` or `\"completion\"` |\n| timeEntries | list (objects) | See [Time Entries](#time-entries) |\n| blockedBy | list (objects) | See [Dependencies](#dependencies-blockedby) |\n| reminders | list (objects) | See [Reminders](#reminders) |\n| complete_instances | list | `[\"2025-01-08\", \"2025-01-15\"]` |\n| skipped_instances | list | `[\"2025-01-22\"]` |\n| recurrence_parent | text (link/path) | `\"[[Tasks/Weekly review]]\"` |\n| occurrence_date | text (date) | `\"2025-01-15\"` |\n| occurrence_materialization | text | `\"manual\"` or `\"on_completion\"` |\n| occurrence_next_trigger | text | `\"completion\"` or `\"completion_or_skip\"` |\n| occurrence_template | text (link/path) | `\"[[Templates/Occurrence]]\"` |\n| occurrence_past_horizon | text (duration) | `\"P7D\"` |\n| occurrence_future_horizon | text (duration) | `\"P14D\"` |\n| icsEventId | list | `[\"event-abc123\"]` |\n\nUse this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values.\n\n---\n\n## Property Details\n\nThe sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct.\n\n### Text Properties\n\n#### title\n- **Type:** text (string)\n- **Description:** The task's title or name\n- **Example:** `title: \"Complete project documentation\"`\n\n#### status\n- **Type:** text (string)\n- **Description:** The task's current status. Must match one of the status values configured in your settings.\n- **Default values:** `\"open\"`, `\"in-progress\"`, `\"done\"`\n- **Example:** `status: \"in-progress\"`\n- **Note:** Also supports boolean values (`true`/`false`) for Obsidian checkbox compatibility. See [Boolean Status Values](task-properties.md#boolean-status-values).\n\n#### priority\n- **Type:** text (string)\n- **Description:** The task's priority level. Must match one of the priority values configured in your settings.\n- **Default values:** `\"low\"`, `\"normal\"`, `\"high\"`\n- **Example:** `priority: \"high\"`\n\n---\n\n### Date Properties\n\nAll date properties are stored as **text strings** in your frontmatter. TaskNotes expects specific formats:\nWhen in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently.\n\n#### due\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD` or ISO 8601 timestamp\n- **Description:** The task's due date\n- **Examples:**\n\n ```yaml\n due: \"2025-01-15\"\n due: \"2025-01-15T17:00:00\"\n ```\n\n#### scheduled\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD` or ISO 8601 timestamp\n- **Description:** When the task is scheduled to be worked on\n- **Examples:**\n\n ```yaml\n scheduled: \"2025-01-10\"\n scheduled: \"2025-01-10T09:00:00\"\n ```\n\n#### completedDate\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD`\n- **Description:** The date when the task was completed\n- **Example:** `completedDate: \"2025-01-20\"`\n\n#### dateCreated\n\n- **Type:** text (datetime string)\n- **Format:** ISO 8601 timestamp\n- **Description:** When the task was created\n- **Example:** `dateCreated: \"2025-01-01T08:00:00Z\"`\n\n#### dateModified\n\n- **Type:** text (datetime string)\n- **Format:** ISO 8601 timestamp\n- **Description:** When the task was last modified\n- **Example:** `dateModified: \"2025-01-15T10:30:00Z\"`\n\n---\n\n### List Properties\n\nList properties must be arrays, even when containing a single value.\nSingle-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics.\n\n#### tags\n\n- **Type:** list (array of strings)\n- **Description:** Tags associated with the task\n- **Examples:**\n\n ```yaml\n tags: [\"work\", \"documentation\"]\n tags:\n - work\n - documentation\n ```\n\n#### contexts\n\n- **Type:** list (array of strings)\n- **Description:** Context labels for the task\n- **Examples:**\n\n ```yaml\n contexts: [\"office\", \"computer\"]\n contexts:\n - \"office\"\n - \"computer\"\n ```\n\n#### projects\n\n- **Type:** list (array of strings)\n- **Description:** Project references (typically wiki-links)\n- **Examples:**\n\n ```yaml\n projects: [\"[[Website Redesign]]\", \"[[Q1 Planning]]\"]\n projects:\n - \"[[Website Redesign]]\"\n - \"[[Q1 Planning]]\"\n ```\n\n---\n\n### Numeric Properties\n\n#### timeEstimate\n- **Type:** number\n- **Unit:** minutes\n- **Description:** Estimated time to complete the task\n- **Example:** `timeEstimate: 120` (2 hours)\n\n---\n\n### Recurrence Properties\n\n#### recurrence\n\n- **Type:** text (string)\n- **Format:** RFC 5545 RRULE format\n- **Description:** Defines how the task repeats\n- **Examples:**\n\n ```yaml\n recurrence: \"FREQ=DAILY\"\n recurrence: \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"\n recurrence: \"FREQ=MONTHLY;BYMONTHDAY=1\"\n ```\n\n#### recurrence_anchor\n\n- **Type:** text (string)\n- **Valid values:** `\"scheduled\"` or `\"completion\"`\n- **Description:** Determines whether the next occurrence is calculated from the scheduled date or when the task was completed\n- **Example:** `recurrence_anchor: \"scheduled\"`\n\n#### complete_instances\n\n- **Type:** list (array of date strings)\n- **Format:** `YYYY-MM-DD`\n- **Description:** Dates when recurring task instances were completed\n- **Example:**\n\n ```yaml\n complete_instances:\n - \"2025-01-08\"\n - \"2025-01-15\"\n ```\n\n#### skipped_instances\n\n- **Type:** list (array of date strings)\n- **Format:** `YYYY-MM-DD`\n- **Description:** Dates when recurring task instances were skipped\n- **Example:**\n\n ```yaml\n skipped_instances:\n - \"2025-01-22\"\n ```\n\n### Materialized Occurrence Properties\n\nMaterialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments.\n\nWhen an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as `recurrence`, `complete_instances`, `skipped_instances`, `completedDate`, provider event IDs, or `timeEntries`.\n\n#### recurrence_parent\n\n- **Type:** text (link or path string)\n- **Description:** Parent recurring task for a materialized occurrence note\n- **Example:** `recurrence_parent: \"[[Tasks/Weekly review]]\"`\n\n#### occurrence_date\n\n- **Type:** text (date string)\n- **Format:** `YYYY-MM-DD`\n- **Description:** Target recurrence date represented by a materialized occurrence note\n- **Example:** `occurrence_date: \"2025-01-15\"`\n\n#### occurrence_materialization\n\n- **Type:** text (string)\n- **Valid values:** `\"manual\"`, `\"on_completion\"`, `\"rolling\"`\n- **Description:** Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet.\n- **Example:** `occurrence_materialization: \"on_completion\"`\n\n#### occurrence_next_trigger\n\n- **Type:** text (string)\n- **Valid values:** `\"completion\"` or `\"completion_or_skip\"`\n- **Description:** Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to `on_completion`\n- **Example:** `occurrence_next_trigger: \"completion_or_skip\"`\n\n#### occurrence_template\n\n- **Type:** text (link or path string)\n- **Description:** Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings.\n- **Example:** `occurrence_template: \"[[Templates/Weekly occurrence]]\"`\n\n#### occurrence_past_horizon and occurrence_future_horizon\n\n- **Type:** text (ISO 8601 duration string)\n- **Description:** Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin.\n- **Examples:**\n\n ```yaml\n occurrence_past_horizon: \"P7D\"\n occurrence_future_horizon: \"P14D\"\n ```\n\n---\n\n### Complex Properties\n\nThese properties contain structured data with multiple fields.\nFor these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks.\n\n#### Time Entries\n\n- **Type:** list (array of objects)\n- **Description:** Time tracking entries for the task\n- **Structure:**\n\n ```yaml\n timeEntries:\n - startTime: \"2025-01-15T10:30:00Z\" # Required: ISO 8601 timestamp\n endTime: \"2025-01-15T11:15:00Z\" # Optional: ISO 8601 timestamp\n description: \"Initial work\" # Optional: text\n ```\n\n#### Dependencies (blockedBy)\n\n- **Type:** list (array of objects)\n- **Description:** Tasks that must be completed before this task can start\n- **Structure:**\n\n ```yaml\n blockedBy:\n - uid: \"path/to/blocking-task.md\" # Required: path to blocking task\n reltype: \"FINISHTOSTART\" # Required: relationship type\n gap: \"P1D\" # Optional: ISO 8601 duration offset\n ```\n\n- **Relationship types accepted in stored data:** `FINISHTOSTART`, `STARTTOSTART`, `FINISHTOFINISH`, `STARTTOFINISH`\n- **Current behavior:** Dependencies created from the UI use `FINISHTOSTART`. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different `reltype` values or `gap`.\n\n#### Reminders\n\n- **Type:** list (array of objects)\n- **Description:** Reminder notifications for the task\n- **Structure for relative reminders:**\n\n ```yaml\n reminders:\n - id: \"rem_1\" # Required: unique identifier\n type: \"relative\" # Required: \"relative\" or \"absolute\"\n relatedTo: \"due\" # Required for relative: \"due\" or \"scheduled\"\n offset: \"-PT1H\" # Required for relative: ISO 8601 duration\n description: \"1 hour before due\" # Optional: description\n ```\n\n- **Structure for absolute reminders:**\n\n ```yaml\n reminders:\n - id: \"rem_2\"\n type: \"absolute\"\n absoluteTime: \"2025-01-15T09:00:00Z\" # Required for absolute: ISO 8601 timestamp\n description: \"Morning reminder\"\n ```\n\n#### icsEventId\n\n- **Type:** list (array of strings)\n- **Description:** ICS calendar event IDs linked to this task\n- **Example:**\n \n ```yaml\n icsEventId:\n - \"event-abc123\"\n - \"event-def456\"\n ```\n\n\n---\n\n## Complete Example\n\nHere's a complete task with all property types:\n\n```yaml\n---\ntitle: \"Complete quarterly report\"\nstatus: \"in-progress\"\npriority: \"high\"\ndue: \"2025-01-31\"\nscheduled: \"2025-01-25\"\ntags:\n - work\n - reports\ncontexts:\n - office\nprojects:\n - \"[[Q1 Planning]]\"\ntimeEstimate: 240\ndateCreated: \"2025-01-01T08:00:00Z\"\ndateModified: \"2025-01-20T14:30:00Z\"\ntimeEntries:\n - startTime: \"2025-01-20T10:00:00Z\"\n endTime: \"2025-01-20T11:30:00Z\"\nblockedBy:\n - uid: \"tasks/gather-data.md\"\n reltype: \"FINISHTOSTART\"\nreminders:\n - id: \"rem_1\"\n type: \"relative\"\n relatedTo: \"due\"\n offset: \"-P1D\"\n description: \"Due tomorrow\"\n---\n```\n\n---\n\n## Field Mapping\n\nAll property names can be customized via **Settings → Task Properties → Field Mapping**. If you change a field mapping, TaskNotes will read and write using your custom property name.\n\nCustom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as `note[\"TN-status\"]` or `note[\"Task Type\"]` instead of dot notation. Dot notation only works reliably for simple identifier-style names.\n\nFor example, if you map `due` to `dueDate`, TaskNotes will expect:\n\n```yaml\ndueDate: \"2025-01-15\"\n```\n\nSee [Task Properties settings](task-properties.md) for configuration details.\n\n---\n\n## Custom User Fields\n\nYou can define additional properties with these types:\n\n- **text** - Single text value\n- **number** - Numeric value\n- **date** - Date string (YYYY-MM-DD)\n- **boolean** - true/false\n- **list** - Array of values\n\nSee [Custom User Fields](task-properties.md#custom-user-fields) for configuration details.\n","aliases":["/settings/property-types-reference/"],"toc":[{"level":2,"id":"quick-reference","text":"Quick Reference"},{"level":2,"id":"property-details","text":"Property Details"},{"level":3,"id":"text-properties","text":"Text Properties"},{"level":3,"id":"date-properties","text":"Date Properties"},{"level":3,"id":"list-properties","text":"List Properties"},{"level":3,"id":"numeric-properties","text":"Numeric Properties"},{"level":3,"id":"recurrence-properties","text":"Recurrence Properties"},{"level":3,"id":"materialized-occurrence-properties","text":"Materialized Occurrence Properties"},{"level":3,"id":"complex-properties","text":"Complex Properties"},{"level":2,"id":"complete-example","text":"Complete Example"},{"level":2,"id":"field-mapping","text":"Field Mapping"},{"level":2,"id":"custom-user-fields","text":"Custom User Fields"}],"html":"

This reference documents the expected data types for each frontmatter property that TaskNotes uses.

\n

Quick Reference#

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PropertyTypeExample
titletext"My Task"
statustext"open", "in-progress", "done"
prioritytext"low", "normal", "high"
duetext (date)"2025-01-15"
scheduledtext (date)"2025-01-10"
completedDatetext (date)"2025-01-20"
dateCreatedtext (datetime)"2025-01-01T08:00:00Z"
dateModifiedtext (datetime)"2025-01-15T10:30:00Z"
tagslist["work", "urgent"]
contextslist["office", "home"]
projectslist["[[Project A]]"]
timeEstimatenumber120 (minutes)
recurrencetext"FREQ=WEEKLY;BYDAY=MO"
recurrence_anchortext"scheduled" or "completion"
timeEntrieslist (objects)See Time Entries
blockedBylist (objects)See Dependencies
reminderslist (objects)See Reminders
complete_instanceslist["2025-01-08", "2025-01-15"]
skipped_instanceslist["2025-01-22"]
recurrence_parenttext (link/path)"[[Tasks/Weekly review]]"
occurrence_datetext (date)"2025-01-15"
occurrence_materializationtext"manual" or "on_completion"
occurrence_next_triggertext"completion" or "completion_or_skip"
occurrence_templatetext (link/path)"[[Templates/Occurrence]]"
occurrence_past_horizontext (duration)"P7D"
occurrence_future_horizontext (duration)"P14D"
icsEventIdlist["event-abc123"]
\n

Use this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values.

\n
\n

Property Details#

\n

The sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct.

\n

Text Properties#

\n

title#

\n
    \n
  • Type: text (string)
  • \n
  • Description: The task's title or name
  • \n
  • Example: title: "Complete project documentation"
  • \n
\n

status#

\n
    \n
  • Type: text (string)
  • \n
  • Description: The task's current status. Must match one of the status values configured in your settings.
  • \n
  • Default values: "open", "in-progress", "done"
  • \n
  • Example: status: "in-progress"
  • \n
  • Note: Also supports boolean values (true/false) for Obsidian checkbox compatibility. See Boolean Status Values.
  • \n
\n

priority#

\n
    \n
  • Type: text (string)
  • \n
  • Description: The task's priority level. Must match one of the priority values configured in your settings.
  • \n
  • Default values: "low", "normal", "high"
  • \n
  • Example: priority: "high"
  • \n
\n
\n

Date Properties#

\n

All date properties are stored as text strings in your frontmatter. TaskNotes expects specific formats:\nWhen in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently.

\n

due#

\n
    \n
  • Type: text (date string)

    \n
  • \n
  • Format: YYYY-MM-DD or ISO 8601 timestamp

    \n
  • \n
  • Description: The task's due date

    \n
  • \n
  • Examples:

    \n
    due: "2025-01-15"\ndue: "2025-01-15T17:00:00"\n
  • \n
\n

scheduled#

\n
    \n
  • Type: text (date string)

    \n
  • \n
  • Format: YYYY-MM-DD or ISO 8601 timestamp

    \n
  • \n
  • Description: When the task is scheduled to be worked on

    \n
  • \n
  • Examples:

    \n
    scheduled: "2025-01-10"\nscheduled: "2025-01-10T09:00:00"\n
  • \n
\n

completedDate#

\n
    \n
  • Type: text (date string)
  • \n
  • Format: YYYY-MM-DD
  • \n
  • Description: The date when the task was completed
  • \n
  • Example: completedDate: "2025-01-20"
  • \n
\n

dateCreated#

\n
    \n
  • Type: text (datetime string)
  • \n
  • Format: ISO 8601 timestamp
  • \n
  • Description: When the task was created
  • \n
  • Example: dateCreated: "2025-01-01T08:00:00Z"
  • \n
\n

dateModified#

\n
    \n
  • Type: text (datetime string)
  • \n
  • Format: ISO 8601 timestamp
  • \n
  • Description: When the task was last modified
  • \n
  • Example: dateModified: "2025-01-15T10:30:00Z"
  • \n
\n
\n

List Properties#

\n

List properties must be arrays, even when containing a single value.\nSingle-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics.

\n

tags#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: Tags associated with the task

    \n
  • \n
  • Examples:

    \n
    tags: ["work", "documentation"]\ntags:\n  - work\n  - documentation\n
  • \n
\n

contexts#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: Context labels for the task

    \n
  • \n
  • Examples:

    \n
    contexts: ["office", "computer"]\ncontexts:\n  - "office"\n  - "computer"\n
  • \n
\n

projects#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: Project references (typically wiki-links)

    \n
  • \n
  • Examples:

    \n
    projects: ["[[Website Redesign]]", "[[Q1 Planning]]"]\nprojects:\n  - "[[Website Redesign]]"\n  - "[[Q1 Planning]]"\n
  • \n
\n
\n

Numeric Properties#

\n

timeEstimate#

\n
    \n
  • Type: number
  • \n
  • Unit: minutes
  • \n
  • Description: Estimated time to complete the task
  • \n
  • Example: timeEstimate: 120 (2 hours)
  • \n
\n
\n

Recurrence Properties#

\n

recurrence#

\n
    \n
  • Type: text (string)

    \n
  • \n
  • Format: RFC 5545 RRULE format

    \n
  • \n
  • Description: Defines how the task repeats

    \n
  • \n
  • Examples:

    \n
    recurrence: "FREQ=DAILY"\nrecurrence: "FREQ=WEEKLY;BYDAY=MO,WE,FR"\nrecurrence: "FREQ=MONTHLY;BYMONTHDAY=1"\n
  • \n
\n

recurrence_anchor#

\n
    \n
  • Type: text (string)
  • \n
  • Valid values: "scheduled" or "completion"
  • \n
  • Description: Determines whether the next occurrence is calculated from the scheduled date or when the task was completed
  • \n
  • Example: recurrence_anchor: "scheduled"
  • \n
\n

complete_instances#

\n
    \n
  • Type: list (array of date strings)

    \n
  • \n
  • Format: YYYY-MM-DD

    \n
  • \n
  • Description: Dates when recurring task instances were completed

    \n
  • \n
  • Example:

    \n
    complete_instances:\n  - "2025-01-08"\n  - "2025-01-15"\n
  • \n
\n

skipped_instances#

\n
    \n
  • Type: list (array of date strings)

    \n
  • \n
  • Format: YYYY-MM-DD

    \n
  • \n
  • Description: Dates when recurring task instances were skipped

    \n
  • \n
  • Example:

    \n
    skipped_instances:\n  - "2025-01-22"\n
  • \n
\n

Materialized Occurrence Properties#

\n

Materialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments.

\n

When an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as recurrence, complete_instances, skipped_instances, completedDate, provider event IDs, or timeEntries.

\n

recurrence_parent#

\n
    \n
  • Type: text (link or path string)
  • \n
  • Description: Parent recurring task for a materialized occurrence note
  • \n
  • Example: recurrence_parent: "[[Tasks/Weekly review]]"
  • \n
\n

occurrence_date#

\n
    \n
  • Type: text (date string)
  • \n
  • Format: YYYY-MM-DD
  • \n
  • Description: Target recurrence date represented by a materialized occurrence note
  • \n
  • Example: occurrence_date: "2025-01-15"
  • \n
\n

occurrence_materialization#

\n
    \n
  • Type: text (string)
  • \n
  • Valid values: "manual", "on_completion", "rolling"
  • \n
  • Description: Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet.
  • \n
  • Example: occurrence_materialization: "on_completion"
  • \n
\n

occurrence_next_trigger#

\n
    \n
  • Type: text (string)
  • \n
  • Valid values: "completion" or "completion_or_skip"
  • \n
  • Description: Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to on_completion
  • \n
  • Example: occurrence_next_trigger: "completion_or_skip"
  • \n
\n

occurrence_template#

\n
    \n
  • Type: text (link or path string)
  • \n
  • Description: Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings.
  • \n
  • Example: occurrence_template: "[[Templates/Weekly occurrence]]"
  • \n
\n

occurrence_past_horizon and occurrence_future_horizon#

\n
    \n
  • Type: text (ISO 8601 duration string)

    \n
  • \n
  • Description: Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin.

    \n
  • \n
  • Examples:

    \n
    occurrence_past_horizon: "P7D"\noccurrence_future_horizon: "P14D"\n
  • \n
\n
\n

Complex Properties#

\n

These properties contain structured data with multiple fields.\nFor these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks.

\n

Time Entries#

\n
    \n
  • Type: list (array of objects)

    \n
  • \n
  • Description: Time tracking entries for the task

    \n
  • \n
  • Structure:

    \n
    timeEntries:\n  - startTime: "2025-01-15T10:30:00Z"    # Required: ISO 8601 timestamp\n    endTime: "2025-01-15T11:15:00Z"      # Optional: ISO 8601 timestamp\n    description: "Initial work"          # Optional: text\n
  • \n
\n

Dependencies (blockedBy)#

\n
    \n
  • Type: list (array of objects)

    \n
  • \n
  • Description: Tasks that must be completed before this task can start

    \n
  • \n
  • Structure:

    \n
    blockedBy:\n  - uid: "path/to/blocking-task.md"    # Required: path to blocking task\n    reltype: "FINISHTOSTART"           # Required: relationship type\n    gap: "P1D"                         # Optional: ISO 8601 duration offset\n
  • \n
  • Relationship types accepted in stored data: FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH

    \n
  • \n
  • Current behavior: Dependencies created from the UI use FINISHTOSTART. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different reltype values or gap.

    \n
  • \n
\n

Reminders#

\n
    \n
  • Type: list (array of objects)

    \n
  • \n
  • Description: Reminder notifications for the task

    \n
  • \n
  • Structure for relative reminders:

    \n
    reminders:\n  - id: "rem_1"                        # Required: unique identifier\n    type: "relative"                   # Required: "relative" or "absolute"\n    relatedTo: "due"                   # Required for relative: "due" or "scheduled"\n    offset: "-PT1H"                    # Required for relative: ISO 8601 duration\n    description: "1 hour before due"   # Optional: description\n
  • \n
  • Structure for absolute reminders:

    \n
    reminders:\n  - id: "rem_2"\n    type: "absolute"\n    absoluteTime: "2025-01-15T09:00:00Z"  # Required for absolute: ISO 8601 timestamp\n    description: "Morning reminder"\n
  • \n
\n

icsEventId#

\n
    \n
  • Type: list (array of strings)

    \n
  • \n
  • Description: ICS calendar event IDs linked to this task

    \n
  • \n
  • Example:

    \n
    icsEventId:\n  - "event-abc123"\n  - "event-def456"\n
  • \n
\n
\n

Complete Example#

\n

Here's a complete task with all property types:

\n
---\ntitle: "Complete quarterly report"\nstatus: "in-progress"\npriority: "high"\ndue: "2025-01-31"\nscheduled: "2025-01-25"\ntags:\n  - work\n  - reports\ncontexts:\n  - office\nprojects:\n  - "[[Q1 Planning]]"\ntimeEstimate: 240\ndateCreated: "2025-01-01T08:00:00Z"\ndateModified: "2025-01-20T14:30:00Z"\ntimeEntries:\n  - startTime: "2025-01-20T10:00:00Z"\n    endTime: "2025-01-20T11:30:00Z"\nblockedBy:\n  - uid: "tasks/gather-data.md"\n    reltype: "FINISHTOSTART"\nreminders:\n  - id: "rem_1"\n    type: "relative"\n    relatedTo: "due"\n    offset: "-P1D"\n    description: "Due tomorrow"\n---\n

\n

Field Mapping#

\n

All property names can be customized via Settings → Task Properties → Field Mapping. If you change a field mapping, TaskNotes will read and write using your custom property name.

\n

Custom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as note["TN-status"] or note["Task Type"] instead of dot notation. Dot notation only works reliably for simple identifier-style names.

\n

For example, if you map due to dueDate, TaskNotes will expect:

\n
dueDate: "2025-01-15"\n

See Task Properties settings for configuration details.

\n
\n

Custom User Fields#

\n

You can define additional properties with these types:

\n
    \n
  • text - Single text value
  • \n
  • number - Numeric value
  • \n
  • date - Date string (YYYY-MM-DD)
  • \n
  • boolean - true/false
  • \n
  • list - Array of values
  • \n
\n

See Custom User Fields for configuration details.

\n","text":"This reference documents the expected data types for each frontmatter property that TaskNotes uses. Quick Reference# Property Type Example title text \"My Task\" status text \"open\", \"in-progress\", \"done\" priority text \"low\", \"normal\", \"high\" due text (date) \"2025-01-15\" scheduled text (date) \"2025-01-10\" completedDate text (date) \"2025-01-20\" dateCreated text (datetime) \"2025-01-01T08:00:00Z\" dateModified text (datetime) \"2025-01-15T10:30:00Z\" tags list [\"work\", \"urgent\"] contexts list [\"office\", \"home\"] projects list [\"[[Project A]]\"] timeEstimate number 120 (minutes) recurrence text \"FREQ=WEEKLY;BYDAY=MO\" recurrence_anchor text \"scheduled\" or \"completion\" timeEntries list (objects) See Time Entries blockedBy list (objects) See Dependencies reminders list (objects) See Reminders complete_instances list [\"2025-01-08\", \"2025-01-15\"] skipped_instances list [\"2025-01-22\"] recurrence_parent text (link/path) \"[[Tasks/Weekly review]]\" occurrence_date text (date) \"2025-01-15\" occurrence_materialization text \"manual\" or \"on_completion\" occurrence_next_trigger text \"completion\" or \"completion_or_skip\" occurrence_template text (link/path) \"[[Templates/Occurrence]]\" occurrence_past_horizon text (duration) \"P7D\" occurrence_future_horizon text (duration) \"P14D\" icsEventId list [\"event-abc123\"] Use this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values. Property Details# The sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct. Text Properties# title# Type: text (string) Description: The task's title or name Example: title: \"Complete project documentation\" status# Type: text (string) Description: The task's current status. Must match one of the status values configured in your settings. Default values: \"open\", \"in-progress\", \"done\" Example: status: \"in-progress\" Note: Also supports boolean values (true/false) for Obsidian checkbox compatibility. See Boolean Status Values. priority# Type: text (string) Description: The task's priority level. Must match one of the priority values configured in your settings. Default values: \"low\", \"normal\", \"high\" Example: priority: \"high\" Date Properties# All date properties are stored as text strings in your frontmatter. TaskNotes expects specific formats: When in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently. due# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: The task's due date Examples: due: \"2025-01-15\" due: \"2025-01-15T17:00:00\" scheduled# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: When the task is scheduled to be worked on Examples: scheduled: \"2025-01-10\" scheduled: \"2025-01-10T09:00:00\" completedDate# Type: text (date string) Format: YYYY-MM-DD Description: The date when the task was completed Example: completedDate: \"2025-01-20\" dateCreated# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was created Example: dateCreated: \"2025-01-01T08:00:00Z\" dateModified# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was last modified Example: dateModified: \"2025-01-15T10:30:00Z\" List Properties# List properties must be arrays, even when containing a single value. Single-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics. tags# Type: list (array of strings) Description: Tags associated with the task Examples: tags: [\"work\", \"documentation\"] tags: - work - documentation contexts# Type: list (array of strings) Description: Context labels for the task Examples: contexts: [\"office\", \"computer\"] contexts: - \"office\" - \"computer\" projects# Type: list (array of strings) Description: Project references (typically wiki-links) Examples: projects: [\"[[Website Redesign]]\", \"[[Q1 Planning]]\"] projects: - \"[[Website Redesign]]\" - \"[[Q1 Planning]]\" Numeric Properties# timeEstimate# Type: number Unit: minutes Description: Estimated time to complete the task Example: timeEstimate: 120 (2 hours) Recurrence Properties# recurrence# Type: text (string) Format: RFC 5545 RRULE format Description: Defines how the task repeats Examples: recurrence: \"FREQ=DAILY\" recurrence: \"FREQ=WEEKLY;BYDAY=MO,WE,FR\" recurrence: \"FREQ=MONTHLY;BYMONTHDAY=1\" recurrence_anchor# Type: text (string) Valid values: \"scheduled\" or \"completion\" Description: Determines whether the next occurrence is calculated from the scheduled date or when the task was completed Example: recurrence_anchor: \"scheduled\" complete_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were completed Example: complete_instances: - \"2025-01-08\" - \"2025-01-15\" skipped_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were skipped Example: skipped_instances: - \"2025-01-22\" Materialized Occurrence Properties# Materialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments. When an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as recurrence, complete_instances, skipped_instances, completedDate, provider event IDs, or timeEntries. recurrence_parent# Type: text (link or path string) Description: Parent recurring task for a materialized occurrence note Example: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date# Type: text (date string) Format: YYYY-MM-DD Description: Target recurrence date represented by a materialized occurrence note Example: occurrence_date: \"2025-01-15\" occurrence_materialization# Type: text (string) Valid values: \"manual\", \"on_completion\", \"rolling\" Description: Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet. Example: occurrence_materialization: \"on_completion\" occurrence_next_trigger# Type: text (string) Valid values: \"completion\" or \"completion_or_skip\" Description: Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to on_completion Example: occurrence_next_trigger: \"completion_or_skip\" occurrence_template# Type: text (link or path string) Description: Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings. Example: occurrence_template: \"[[Templates/Weekly occurrence]]\" occurrence_past_horizon and occurrence_future_horizon# Type: text (ISO 8601 duration string) Description: Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin. Examples: occurrence_past_horizon: \"P7D\" occurrence_future_horizon: \"P14D\" Complex Properties# These properties contain structured data with multiple fields. For these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks. Time Entries# Type: list (array of objects) Description: Time tracking entries for the task Structure: timeEntries: - startTime: \"2025-01-15T10:30:00Z\" # Required: ISO 8601 timestamp endTime: \"2025-01-15T11:15:00Z\" # Optional: ISO 8601 timestamp description: \"Initial work\" # Optional: text Dependencies (blockedBy)# Type: list (array of objects) Description: Tasks that must be completed before this task can start Structure: blockedBy: - uid: \"path/to/blocking-task.md\" # Required: path to blocking task reltype: \"FINISHTOSTART\" # Required: relationship type gap: \"P1D\" # Optional: ISO 8601 duration offset Relationship types accepted in stored data: FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH Current behavior: Dependencies created from the UI use FINISHTOSTART. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different reltype values or gap. Reminders# Type: list (array of objects) Description: Reminder notifications for the task Structure for relative reminders: reminders: - id: \"rem_1\" # Required: unique identifier type: \"relative\" # Required: \"relative\" or \"absolute\" relatedTo: \"due\" # Required for relative: \"due\" or \"scheduled\" offset: \"-PT1H\" # Required for relative: ISO 8601 duration description: \"1 hour before due\" # Optional: description Structure for absolute reminders: reminders: - id: \"rem_2\" type: \"absolute\" absoluteTime: \"2025-01-15T09:00:00Z\" # Required for absolute: ISO 8601 timestamp description: \"Morning reminder\" icsEventId# Type: list (array of strings) Description: ICS calendar event IDs linked to this task Example: icsEventId: - \"event-abc123\" - \"event-def456\" Complete Example# Here's a complete task with all property types: --- title: \"Complete quarterly report\" status: \"in-progress\" priority: \"high\" due: \"2025-01-31\" scheduled: \"2025-01-25\" tags: - work - reports contexts: - office projects: - \"[[Q1 Planning]]\" timeEstimate: 240 dateCreated: \"2025-01-01T08:00:00Z\" dateModified: \"2025-01-20T14:30:00Z\" timeEntries: - startTime: \"2025-01-20T10:00:00Z\" endTime: \"2025-01-20T11:30:00Z\" blockedBy: - uid: \"tasks/gather-data.md\" reltype: \"FINISHTOSTART\" reminders: - id: \"rem_1\" type: \"relative\" relatedTo: \"due\" offset: \"-P1D\" description: \"Due tomorrow\" --- Field Mapping# All property names can be customized via Settings → Task Properties → Field Mapping. If you change a field mapping, TaskNotes will read and write using your custom property name. Custom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as note[\"TN-status\"] or note[\"Task Type\"] instead of dot notation. Dot notation only works reliably for simple identifier-style names. For example, if you map due to dueDate, TaskNotes will expect: dueDate: \"2025-01-15\" See Task Properties settings for configuration details. Custom User Fields# You can define additional properties with these types: text - Single text value number - Numeric value date - Date string (YYYY-MM-DD) boolean - true/false list - Array of values See Custom User Fields for configuration details."},{"route":"/obsidian/settings/task-properties/","title":"Task Properties Settings","description":"This tab configures all task properties. Each property is displayed as a card containing its configuration options.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/settings/task-properties.md","namespace":"obsidian","relativePath":"settings/task-properties.md","raw":"# Task Properties Settings\n\nThis tab configures all task properties. Each property is displayed as a card containing its configuration options.\n\n\n![Task Properties Settings](../assets/settings-task-properties.png)\n\n!!! tip \"Looking for property type documentation?\"\n See the [Property Types Reference](property-types-reference.md) for detailed documentation on the expected data types (text, list, date, etc.) for each frontmatter property.\n\n## Property Card Structure\n\nEach property card contains:\n\n- **Property key**: The frontmatter field name used to store this property\n- **Default**: The default value applied to new tasks (where applicable)\n- **NLP trigger**: Toggle and character configuration for natural language parsing (where applicable)\n- **Property-specific settings**: Additional configuration options specific to that property\nThis tab defines the task schema used by creation flows, NLP parsing, views, and API payloads.\n\nProperty keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example `note[\"TN-status\"]`, rather than dot syntax such as `note.TN-status`.\n\n## Core Properties\n\n### Title\n\nThe task title property. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `title`)\n- **Store title in filename**: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes.\n- **Filename format**: When \"Store title in filename\" is disabled, choose how filenames are generated:\n - Title-based\n - Zettelkasten-style\n - Timestamp-based\n - UUID v4\n - Custom template\n- **Custom template**: Define a custom filename pattern using variables (shown when \"custom\" format is selected)\n\n### Status\n\nTask completion state. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `status`)\n- **Default**: Default status for new tasks\n- **NLP trigger**: Character that triggers status parsing (default: `*`)\n- **Status Values**: Expandable section containing individual status cards\n\nEach status value has:\n\n- **Value**: Internal identifier stored in frontmatter (e.g., \"in-progress\")\n- **Label**: Display name shown in the interface (e.g., \"In Progress\")\n- **Color**: Visual indicator color\n- **Icon**: Optional icon identifier\n- **Completed**: Whether this status represents a finished task\n- **Skip when cycling**: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits\n- **Next status**: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence\n- **Auto-archive**: Automatically archive tasks after a delay (1-1440 minutes)\n\nStatus cards support drag-and-drop reordering.\n\nUse the **Value** field as the stable stored identifier and the **Label** field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored **Value**, so use prefixes such as `1-open`, `2-doing`, `3-done` if you need predictable native Bases order.\n\n#### Boolean Status Values\n\nTaskNotes supports using boolean values (`true` and `false`) as status values, which integrates with Obsidian's native checkbox property format:\n\n- When you set a task's status to `\"true\"` or `\"false\"` (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter\n- When reading tasks with boolean status values from frontmatter, they are converted back to the strings `\"true\"` or `\"false\"`\n- This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes\n\n**Example:**\n```yaml\n---\nstatus: true # Boolean checkbox in Obsidian\n---\n```\n\n### Priority\n\nTask priority level. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `priority`)\n- **Default**: Default priority for new tasks (can be set to \"No default\")\n- **NLP trigger**: Character that triggers priority parsing (default: `!`, disabled by default)\n- **Priority Values**: Expandable section containing individual priority cards\n\nEach priority value has:\n\n- **Value**: Internal identifier stored in frontmatter (e.g., \"high\")\n- **Label**: Display name shown in the interface (e.g., \"High Priority\")\n- **Color**: Visual indicator color\n\nPriority cards support drag-and-drop reordering.\nStatus and priority values are stored in frontmatter; renaming them later may require migration of existing task files.\n\n> **Note for Bases plugin users:** Obsidian's Bases plugin sorts priorities alphabetically by their **Value**. To control sort order, name values to sort alphabetically in the desired order:\n> - Example: `1-urgent`, `2-high`, `3-medium`, `4-normal`, `5-low`\n> - Or: `a-urgent`, `b-high`, `c-medium`, `d-normal`, `e-low`\n\n## Date Properties\n\n### Due Date\n\nWhen the task must be completed. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `due`)\n- **Default**: Default due date for new tasks (None, Today, Tomorrow, Next Week)\n\n### Scheduled Date\n\nWhen to work on the task. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `scheduled`)\n- **Default**: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week)\n\nWhen you use **Convert current note to task**, this default is also applied if the source note does not already have `scheduled` frontmatter. Choose **None** to keep converted notes unscheduled by default.\n\n`due` tracks commitment deadlines, while `scheduled` tracks intended execution time.\n\n## Organization Properties\n\n### Contexts\n\nWhere or how the task can be done. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `contexts`)\n- **Default**: Comma-separated list of default contexts (e.g., @home, @work)\n- **NLP trigger**: Character that triggers context parsing (default: `@`)\n\n### Projects\n\nProjects the task belongs to. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `projects`)\n- **Default projects**: Select project notes to automatically link to new tasks\n- **Use active note for new tasks**: Automatically link the active note as a project when opening task creation from the command palette or ribbon\n- **Use parent note for inline/instant conversion**: Automatically link the source note as a project when using inline task creation or instant task conversion\n- **NLP trigger**: Character that triggers project parsing (default: `+`)\n- **Autosuggest Filters**: Expandable section to filter which notes appear in project suggestions\n- **Customize Display**: Expandable section to configure how project suggestions appear\n\n#### Autosuggest Filters\n\nControl which notes appear when selecting projects:\n\n- **Required tags**: Comma-separated list of tags (shows notes with ANY of these tags)\n- **Include folders**: Comma-separated list of folder paths (shows notes in ANY of these folders)\n- **Required property key**: Frontmatter property that must exist\n- **Required property value**: Expected value for the property (optional)\nThese filters reduce suggestion noise in large vaults.\n\nA \"Filters On\" badge appears when any filters are configured.\n\n#### Customize Display\n\nConfigure project suggestion appearance:\n\n- **Enable fuzzy matching**: Allow typos and partial matches in project search\n- **Row 1, 2, 3**: Configure up to 3 lines of information for each project suggestion\n\n### Tags\n\nObsidian tags for categorization. Configuration options:\n\n- **Default**: Comma-separated list of default tags (without #)\n- **NLP trigger**: Character that triggers tag parsing (default: `#`)\n\nNote: Tags use native Obsidian tags and do not have a separate property key setting.\n\n## Task Details\n\n### Time Estimate\n\nEstimated time to complete the task. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `timeEstimate`)\n- **Default**: Default time estimate in minutes (0 = no default)\n\n### Recurrence\n\nPattern for repeating tasks. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `recurrence`)\n- **Default**: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly)\n\nRecurring tasks also use the **Recurrence anchor** metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under **Recurrence → Occurrence notes** rather than as a global default.\n\n### Reminders\n\nNotifications before task deadlines. Configuration options:\n\n- **Property key**: Frontmatter field name (default: `reminders`)\n- **Default Reminders**: Expandable section containing default reminder cards\n\nEach default reminder can be:\n\n**Relative reminders** (triggered relative to due or scheduled date):\n\n- Anchor date (due date or scheduled date)\n- Offset amount and unit (minutes, hours, days)\n- Direction (before or after)\n- Description\n\n**Absolute reminders** (triggered at specific times):\n\n- Date\n- Time\n- Description\n\n## Metadata Properties\n\nThese properties are system-managed and typically only require property key configuration:\n\n- **Date Created**: When the task was created\n- **Date Modified**: When the task was last modified\n- **Completed Date**: When the task was completed\n- **Archive Tag**: Tag used to mark archived tasks\n- **Time Entries**: Time tracking entries for the task\n- **Complete Instances**: Completion history for recurring tasks\n- **Skipped Instances**: Skip history for recurring tasks\n- **Recurrence Anchor**: Whether recurring progression is based on scheduled date or completion date\n- **Blocked By**: Tasks that must be completed first\n\nMaterialized occurrence notes also use system-managed frontmatter fields such as `recurrence_parent`, `occurrence_date`, `occurrence_materialization`, `occurrence_next_trigger`, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the [Property Types Reference](property-types-reference.md#materialized-occurrence-properties) and are normally changed through recurrence and occurrence-note controls instead of by hand.\n\n## Feature Properties\n\nThese properties are used by specific TaskNotes features and are not stored in task frontmatter:\n\n- **Pomodoros**: Property key for Pomodoro session counts. When Pomodoro data storage is set to \"Daily notes\", this property is written to daily notes rather than task files.\n- **ICS Event ID**: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event.\n- **ICS Event Tag**: Property key for calendar event tags. Added to notes created from ICS calendar events for identification.\n\n## Custom User Fields\n\nDefine custom frontmatter properties to appear as filter options across views. Configuration options for each field:\n\n- **Display Name**: How the field appears in the UI\n- **Property Key**: The frontmatter property name\n- **Type**: Data type (text, number, boolean, date, or list)\n- **Default Value**: Pre-fill value for new tasks (format varies by type)\n- **NLP trigger**: Toggle and character for natural language parsing\n- **Autosuggest Filters**: Filter which files appear when using `[[` wikilink autocomplete\nCustom fields are most maintainable when they map to repeated workflow decisions (for example `effort`, `owner`, or `client`).\n\n### Link Values\n\nUse a **Text** custom field for a single link and a **List** custom field for multiple links. Task cards render `[[wikilinks]]`, `[label](https://example.com)`, ``, and bare `https://example.com` values as clickable links.\n\nAutosuggest filters work with text and list fields when entering `[[` wikilinks, so a field such as `Related Note` can suggest only files from a chosen folder or tag.\n\n### Default Values\n\nEach field type has a different input format for default values:\n\n- **Text**: Enter the default text value\n- **Number**: Enter the default number\n- **Boolean**: Toggle switch to set default checked/unchecked state\n- **Date**: Select from presets (None, Today, Tomorrow, Next Week)\n- **List**: Enter comma-separated default values\n\nDefault values are applied when creating tasks via:\n\n- Task creation modal\n- Instant task conversion\n- \"Create or open task\" command\n- HTTP API (when using task creation defaults)\n\n### Autosuggestion Filters\n\nEach custom field can configure filters to control which files appear in wikilink suggestions:\n\n- **Required tags**: Comma-separated list of tags (shows files with ANY of these tags)\n- **Include folders**: Comma-separated list of folder paths (shows files in ANY of these folders)\n- **Required property key**: Frontmatter property that must exist\n- **Required property value**: Expected value for the property (optional)\n\nA \"Filters On\" badge appears when filters are configured.\n\nSee [User Fields Feature Documentation](../features/user-fields.md#file-suggestion-filtering-advanced) for detailed examples.\n","aliases":["/settings/task-properties/"],"toc":[{"level":2,"id":"property-card-structure","text":"Property Card Structure"},{"level":2,"id":"core-properties","text":"Core Properties"},{"level":3,"id":"title","text":"Title"},{"level":3,"id":"status","text":"Status"},{"level":3,"id":"priority","text":"Priority"},{"level":2,"id":"date-properties","text":"Date Properties"},{"level":3,"id":"due-date","text":"Due Date"},{"level":3,"id":"scheduled-date","text":"Scheduled Date"},{"level":2,"id":"organization-properties","text":"Organization Properties"},{"level":3,"id":"contexts","text":"Contexts"},{"level":3,"id":"projects","text":"Projects"},{"level":3,"id":"tags","text":"Tags"},{"level":2,"id":"task-details","text":"Task Details"},{"level":3,"id":"time-estimate","text":"Time Estimate"},{"level":3,"id":"recurrence","text":"Recurrence"},{"level":3,"id":"reminders","text":"Reminders"},{"level":2,"id":"metadata-properties","text":"Metadata Properties"},{"level":2,"id":"feature-properties","text":"Feature Properties"},{"level":2,"id":"custom-user-fields","text":"Custom User Fields"},{"level":3,"id":"link-values","text":"Link Values"},{"level":3,"id":"default-values","text":"Default Values"},{"level":3,"id":"autosuggestion-filters","text":"Autosuggestion Filters"}],"html":"

This tab configures all task properties. Each property is displayed as a card containing its configuration options.

\n

\"Task

\n\n

Property Card Structure#

\n

Each property card contains:

\n
    \n
  • Property key: The frontmatter field name used to store this property
  • \n
  • Default: The default value applied to new tasks (where applicable)
  • \n
  • NLP trigger: Toggle and character configuration for natural language parsing (where applicable)
  • \n
  • Property-specific settings: Additional configuration options specific to that property\nThis tab defines the task schema used by creation flows, NLP parsing, views, and API payloads.
  • \n
\n

Property keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example note["TN-status"], rather than dot syntax such as note.TN-status.

\n

Core Properties#

\n

Title#

\n

The task title property. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: title)
  • \n
  • Store title in filename: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes.
  • \n
  • Filename format: When "Store title in filename" is disabled, choose how filenames are generated:
      \n
    • Title-based
    • \n
    • Zettelkasten-style
    • \n
    • Timestamp-based
    • \n
    • UUID v4
    • \n
    • Custom template
    • \n
    \n
  • \n
  • Custom template: Define a custom filename pattern using variables (shown when "custom" format is selected)
  • \n
\n

Status#

\n

Task completion state. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: status)
  • \n
  • Default: Default status for new tasks
  • \n
  • NLP trigger: Character that triggers status parsing (default: *)
  • \n
  • Status Values: Expandable section containing individual status cards
  • \n
\n

Each status value has:

\n
    \n
  • Value: Internal identifier stored in frontmatter (e.g., "in-progress")
  • \n
  • Label: Display name shown in the interface (e.g., "In Progress")
  • \n
  • Color: Visual indicator color
  • \n
  • Icon: Optional icon identifier
  • \n
  • Completed: Whether this status represents a finished task
  • \n
  • Skip when cycling: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits
  • \n
  • Next status: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence
  • \n
  • Auto-archive: Automatically archive tasks after a delay (1-1440 minutes)
  • \n
\n

Status cards support drag-and-drop reordering.

\n

Use the Value field as the stable stored identifier and the Label field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored Value, so use prefixes such as 1-open, 2-doing, 3-done if you need predictable native Bases order.

\n

Boolean Status Values#

\n

TaskNotes supports using boolean values (true and false) as status values, which integrates with Obsidian's native checkbox property format:

\n
    \n
  • When you set a task's status to "true" or "false" (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter
  • \n
  • When reading tasks with boolean status values from frontmatter, they are converted back to the strings "true" or "false"
  • \n
  • This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes
  • \n
\n

Example:

\n
---\nstatus: true    # Boolean checkbox in Obsidian\n---\n

Priority#

\n

Task priority level. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: priority)
  • \n
  • Default: Default priority for new tasks (can be set to "No default")
  • \n
  • NLP trigger: Character that triggers priority parsing (default: !, disabled by default)
  • \n
  • Priority Values: Expandable section containing individual priority cards
  • \n
\n

Each priority value has:

\n
    \n
  • Value: Internal identifier stored in frontmatter (e.g., "high")
  • \n
  • Label: Display name shown in the interface (e.g., "High Priority")
  • \n
  • Color: Visual indicator color
  • \n
\n

Priority cards support drag-and-drop reordering.\nStatus and priority values are stored in frontmatter; renaming them later may require migration of existing task files.

\n
\n

Note for Bases plugin users: Obsidian's Bases plugin sorts priorities alphabetically by their Value. To control sort order, name values to sort alphabetically in the desired order:

\n
    \n
  • Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low
  • \n
  • Or: a-urgent, b-high, c-medium, d-normal, e-low
  • \n
\n
\n

Date Properties#

\n

Due Date#

\n

When the task must be completed. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: due)
  • \n
  • Default: Default due date for new tasks (None, Today, Tomorrow, Next Week)
  • \n
\n

Scheduled Date#

\n

When to work on the task. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: scheduled)
  • \n
  • Default: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week)
  • \n
\n

When you use Convert current note to task, this default is also applied if the source note does not already have scheduled frontmatter. Choose None to keep converted notes unscheduled by default.

\n

due tracks commitment deadlines, while scheduled tracks intended execution time.

\n

Organization Properties#

\n

Contexts#

\n

Where or how the task can be done. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: contexts)
  • \n
  • Default: Comma-separated list of default contexts (e.g., @home, @work)
  • \n
  • NLP trigger: Character that triggers context parsing (default: @)
  • \n
\n

Projects#

\n

Projects the task belongs to. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: projects)
  • \n
  • Default projects: Select project notes to automatically link to new tasks
  • \n
  • Use active note for new tasks: Automatically link the active note as a project when opening task creation from the command palette or ribbon
  • \n
  • Use parent note for inline/instant conversion: Automatically link the source note as a project when using inline task creation or instant task conversion
  • \n
  • NLP trigger: Character that triggers project parsing (default: +)
  • \n
  • Autosuggest Filters: Expandable section to filter which notes appear in project suggestions
  • \n
  • Customize Display: Expandable section to configure how project suggestions appear
  • \n
\n

Autosuggest Filters#

\n

Control which notes appear when selecting projects:

\n
    \n
  • Required tags: Comma-separated list of tags (shows notes with ANY of these tags)
  • \n
  • Include folders: Comma-separated list of folder paths (shows notes in ANY of these folders)
  • \n
  • Required property key: Frontmatter property that must exist
  • \n
  • Required property value: Expected value for the property (optional)\nThese filters reduce suggestion noise in large vaults.
  • \n
\n

A "Filters On" badge appears when any filters are configured.

\n

Customize Display#

\n

Configure project suggestion appearance:

\n
    \n
  • Enable fuzzy matching: Allow typos and partial matches in project search
  • \n
  • Row 1, 2, 3: Configure up to 3 lines of information for each project suggestion
  • \n
\n

Tags#

\n

Obsidian tags for categorization. Configuration options:

\n
    \n
  • Default: Comma-separated list of default tags (without #)
  • \n
  • NLP trigger: Character that triggers tag parsing (default: #)
  • \n
\n

Note: Tags use native Obsidian tags and do not have a separate property key setting.

\n

Task Details#

\n

Time Estimate#

\n

Estimated time to complete the task. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: timeEstimate)
  • \n
  • Default: Default time estimate in minutes (0 = no default)
  • \n
\n

Recurrence#

\n

Pattern for repeating tasks. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: recurrence)
  • \n
  • Default: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly)
  • \n
\n

Recurring tasks also use the Recurrence anchor metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under Recurrence → Occurrence notes rather than as a global default.

\n

Reminders#

\n

Notifications before task deadlines. Configuration options:

\n
    \n
  • Property key: Frontmatter field name (default: reminders)
  • \n
  • Default Reminders: Expandable section containing default reminder cards
  • \n
\n

Each default reminder can be:

\n

Relative reminders (triggered relative to due or scheduled date):

\n
    \n
  • Anchor date (due date or scheduled date)
  • \n
  • Offset amount and unit (minutes, hours, days)
  • \n
  • Direction (before or after)
  • \n
  • Description
  • \n
\n

Absolute reminders (triggered at specific times):

\n
    \n
  • Date
  • \n
  • Time
  • \n
  • Description
  • \n
\n

Metadata Properties#

\n

These properties are system-managed and typically only require property key configuration:

\n
    \n
  • Date Created: When the task was created
  • \n
  • Date Modified: When the task was last modified
  • \n
  • Completed Date: When the task was completed
  • \n
  • Archive Tag: Tag used to mark archived tasks
  • \n
  • Time Entries: Time tracking entries for the task
  • \n
  • Complete Instances: Completion history for recurring tasks
  • \n
  • Skipped Instances: Skip history for recurring tasks
  • \n
  • Recurrence Anchor: Whether recurring progression is based on scheduled date or completion date
  • \n
  • Blocked By: Tasks that must be completed first
  • \n
\n

Materialized occurrence notes also use system-managed frontmatter fields such as recurrence_parent, occurrence_date, occurrence_materialization, occurrence_next_trigger, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the Property Types Reference and are normally changed through recurrence and occurrence-note controls instead of by hand.

\n

Feature Properties#

\n

These properties are used by specific TaskNotes features and are not stored in task frontmatter:

\n
    \n
  • Pomodoros: Property key for Pomodoro session counts. When Pomodoro data storage is set to "Daily notes", this property is written to daily notes rather than task files.
  • \n
  • ICS Event ID: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event.
  • \n
  • ICS Event Tag: Property key for calendar event tags. Added to notes created from ICS calendar events for identification.
  • \n
\n

Custom User Fields#

\n

Define custom frontmatter properties to appear as filter options across views. Configuration options for each field:

\n
    \n
  • Display Name: How the field appears in the UI
  • \n
  • Property Key: The frontmatter property name
  • \n
  • Type: Data type (text, number, boolean, date, or list)
  • \n
  • Default Value: Pre-fill value for new tasks (format varies by type)
  • \n
  • NLP trigger: Toggle and character for natural language parsing
  • \n
  • Autosuggest Filters: Filter which files appear when using [[ wikilink autocomplete\nCustom fields are most maintainable when they map to repeated workflow decisions (for example effort, owner, or client).
  • \n
\n\n

Use a Text custom field for a single link and a List custom field for multiple links. Task cards render [[wikilinks]], [label](https://example.com), <https://example.com>, and bare https://example.com values as clickable links.

\n

Autosuggest filters work with text and list fields when entering [[ wikilinks, so a field such as Related Note can suggest only files from a chosen folder or tag.

\n

Default Values#

\n

Each field type has a different input format for default values:

\n
    \n
  • Text: Enter the default text value
  • \n
  • Number: Enter the default number
  • \n
  • Boolean: Toggle switch to set default checked/unchecked state
  • \n
  • Date: Select from presets (None, Today, Tomorrow, Next Week)
  • \n
  • List: Enter comma-separated default values
  • \n
\n

Default values are applied when creating tasks via:

\n
    \n
  • Task creation modal
  • \n
  • Instant task conversion
  • \n
  • "Create or open task" command
  • \n
  • HTTP API (when using task creation defaults)
  • \n
\n

Autosuggestion Filters#

\n

Each custom field can configure filters to control which files appear in wikilink suggestions:

\n
    \n
  • Required tags: Comma-separated list of tags (shows files with ANY of these tags)
  • \n
  • Include folders: Comma-separated list of folder paths (shows files in ANY of these folders)
  • \n
  • Required property key: Frontmatter property that must exist
  • \n
  • Required property value: Expected value for the property (optional)
  • \n
\n

A "Filters On" badge appears when filters are configured.

\n

See User Fields Feature Documentation for detailed examples.

\n","text":"This tab configures all task properties. Each property is displayed as a card containing its configuration options. Looking for property type documentation?See the Property Types Reference for detailed documentation on the expected data types (text, list, date, etc.) for each frontmatter property. Property Card Structure# Each property card contains: Property key: The frontmatter field name used to store this property Default: The default value applied to new tasks (where applicable) NLP trigger: Toggle and character configuration for natural language parsing (where applicable) Property-specific settings: Additional configuration options specific to that property This tab defines the task schema used by creation flows, NLP parsing, views, and API payloads. Property keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example note[\"TN-status\"], rather than dot syntax such as note.TN-status. Core Properties# Title# The task title property. Configuration options: Property key: Frontmatter field name (default: title) Store title in filename: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes. Filename format: When \"Store title in filename\" is disabled, choose how filenames are generated: Title-based Zettelkasten-style Timestamp-based UUID v4 Custom template Custom template: Define a custom filename pattern using variables (shown when \"custom\" format is selected) Status# Task completion state. Configuration options: Property key: Frontmatter field name (default: status) Default: Default status for new tasks NLP trigger: Character that triggers status parsing (default: *) Status Values: Expandable section containing individual status cards Each status value has: Value: Internal identifier stored in frontmatter (e.g., \"in-progress\") Label: Display name shown in the interface (e.g., \"In Progress\") Color: Visual indicator color Icon: Optional icon identifier Completed: Whether this status represents a finished task Skip when cycling: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits Next status: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence Auto-archive: Automatically archive tasks after a delay (1-1440 minutes) Status cards support drag-and-drop reordering. Use the Value field as the stable stored identifier and the Label field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored Value, so use prefixes such as 1-open, 2-doing, 3-done if you need predictable native Bases order. Boolean Status Values# TaskNotes supports using boolean values (true and false) as status values, which integrates with Obsidian's native checkbox property format: When you set a task's status to \"true\" or \"false\" (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter When reading tasks with boolean status values from frontmatter, they are converted back to the strings \"true\" or \"false\" This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes Example: --- status: true # Boolean checkbox in Obsidian --- Priority# Task priority level. Configuration options: Property key: Frontmatter field name (default: priority) Default: Default priority for new tasks (can be set to \"No default\") NLP trigger: Character that triggers priority parsing (default: !, disabled by default) Priority Values: Expandable section containing individual priority cards Each priority value has: Value: Internal identifier stored in frontmatter (e.g., \"high\") Label: Display name shown in the interface (e.g., \"High Priority\") Color: Visual indicator color Priority cards support drag-and-drop reordering. Status and priority values are stored in frontmatter; renaming them later may require migration of existing task files. Note for Bases plugin users: Obsidian's Bases plugin sorts priorities alphabetically by their Value. To control sort order, name values to sort alphabetically in the desired order: Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Date Properties# Due Date# When the task must be completed. Configuration options: Property key: Frontmatter field name (default: due) Default: Default due date for new tasks (None, Today, Tomorrow, Next Week) Scheduled Date# When to work on the task. Configuration options: Property key: Frontmatter field name (default: scheduled) Default: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week) When you use Convert current note to task, this default is also applied if the source note does not already have scheduled frontmatter. Choose None to keep converted notes unscheduled by default. due tracks commitment deadlines, while scheduled tracks intended execution time. Organization Properties# Contexts# Where or how the task can be done. Configuration options: Property key: Frontmatter field name (default: contexts) Default: Comma-separated list of default contexts (e.g., @home, @work) NLP trigger: Character that triggers context parsing (default: @) Projects# Projects the task belongs to. Configuration options: Property key: Frontmatter field name (default: projects) Default projects: Select project notes to automatically link to new tasks Use active note for new tasks: Automatically link the active note as a project when opening task creation from the command palette or ribbon Use parent note for inline/instant conversion: Automatically link the source note as a project when using inline task creation or instant task conversion NLP trigger: Character that triggers project parsing (default: +) Autosuggest Filters: Expandable section to filter which notes appear in project suggestions Customize Display: Expandable section to configure how project suggestions appear Autosuggest Filters# Control which notes appear when selecting projects: Required tags: Comma-separated list of tags (shows notes with ANY of these tags) Include folders: Comma-separated list of folder paths (shows notes in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) These filters reduce suggestion noise in large vaults. A \"Filters On\" badge appears when any filters are configured. Customize Display# Configure project suggestion appearance: Enable fuzzy matching: Allow typos and partial matches in project search Row 1, 2, 3: Configure up to 3 lines of information for each project suggestion Tags# Obsidian tags for categorization. Configuration options: Default: Comma-separated list of default tags (without #) NLP trigger: Character that triggers tag parsing (default: #) Note: Tags use native Obsidian tags and do not have a separate property key setting. Task Details# Time Estimate# Estimated time to complete the task. Configuration options: Property key: Frontmatter field name (default: timeEstimate) Default: Default time estimate in minutes (0 = no default) Recurrence# Pattern for repeating tasks. Configuration options: Property key: Frontmatter field name (default: recurrence) Default: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly) Recurring tasks also use the Recurrence anchor metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under Recurrence → Occurrence notes rather than as a global default. Reminders# Notifications before task deadlines. Configuration options: Property key: Frontmatter field name (default: reminders) Default Reminders: Expandable section containing default reminder cards Each default reminder can be: Relative reminders (triggered relative to due or scheduled date): Anchor date (due date or scheduled date) Offset amount and unit (minutes, hours, days) Direction (before or after) Description Absolute reminders (triggered at specific times): Date Time Description Metadata Properties# These properties are system-managed and typically only require property key configuration: Date Created: When the task was created Date Modified: When the task was last modified Completed Date: When the task was completed Archive Tag: Tag used to mark archived tasks Time Entries: Time tracking entries for the task Complete Instances: Completion history for recurring tasks Skipped Instances: Skip history for recurring tasks Recurrence Anchor: Whether recurring progression is based on scheduled date or completion date Blocked By: Tasks that must be completed first Materialized occurrence notes also use system-managed frontmatter fields such as recurrence_parent, occurrence_date, occurrence_materialization, occurrence_next_trigger, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the Property Types Reference and are normally changed through recurrence and occurrence-note controls instead of by hand. Feature Properties# These properties are used by specific TaskNotes features and are not stored in task frontmatter: Pomodoros: Property key for Pomodoro session counts. When Pomodoro data storage is set to \"Daily notes\", this property is written to daily notes rather than task files. ICS Event ID: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event. ICS Event Tag: Property key for calendar event tags. Added to notes created from ICS calendar events for identification. Custom User Fields# Define custom frontmatter properties to appear as filter options across views. Configuration options for each field: Display Name: How the field appears in the UI Property Key: The frontmatter property name Type: Data type (text, number, boolean, date, or list) Default Value: Pre-fill value for new tasks (format varies by type) NLP trigger: Toggle and character for natural language parsing Autosuggest Filters: Filter which files appear when using [[ wikilink autocomplete Custom fields are most maintainable when they map to repeated workflow decisions (for example effort, owner, or client). Link Values# Use a Text custom field for a single link and a List custom field for multiple links. Task cards render [[wikilinks]], [label](https://example.com), , and bare https://example.com values as clickable links. Autosuggest filters work with text and list fields when entering [[ wikilinks, so a field such as Related Note can suggest only files from a chosen folder or tag. Default Values# Each field type has a different input format for default values: Text: Enter the default text value Number: Enter the default number Boolean: Toggle switch to set default checked/unchecked state Date: Select from presets (None, Today, Tomorrow, Next Week) List: Enter comma-separated default values Default values are applied when creating tasks via: Task creation modal Instant task conversion \"Create or open task\" command HTTP API (when using task creation defaults) Autosuggestion Filters# Each custom field can configure filters to control which files appear in wikilink suggestions: Required tags: Comma-separated list of tags (shows files with ANY of these tags) Include folders: Comma-separated list of folder paths (shows files in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) A \"Filters On\" badge appears when filters are configured. See User Fields Feature Documentation for detailed examples."},{"route":"/obsidian/troubleshooting/","title":"Troubleshooting","description":"Common issues and solutions for TaskNotes.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/troubleshooting.md","namespace":"obsidian","relativePath":"troubleshooting.md","raw":"# Troubleshooting\n\nCommon issues and solutions for TaskNotes.\n\nWhen debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from **About**, the operating system, and whether the problem also occurs in a fresh default Base.\n\n## First checks\n\n1. Confirm Obsidian meets the current [version requirement](reference/compatibility.md) and **Bases** is enabled.\n2. Open the affected task as Markdown and validate the `---` frontmatter delimiters and indentation.\n3. Confirm the task matches **Settings → TaskNotes → General → Task identification** and is not in an excluded folder.\n4. Run **TaskNotes: Refresh cache** from the command palette.\n5. Close and reopen the affected `.base` file.\n6. Restart Obsidian only after the targeted checks above.\n\nIf the issue remains, enable **Settings → TaskNotes → Features → Debug logging**, reproduce it once, and inspect the developer console with `Ctrl/Cmd + Shift + I`. Disable debug logging after collecting the relevant entries.\n\n## Bases and Views (v4)\n\n### Views Not Loading\n\n**Symptoms**: TaskNotes views show errors or don't display tasks\n\nFirst confirm Bases is enabled (`Settings -> Core Plugins -> Bases`), then restart Obsidian once. If views are still missing, verify `.base` files exist in `TaskNotes/Views/`. If needed, regenerate defaults from `Settings -> TaskNotes -> General -> Views & base files` (`Create files`).\n\n### Commands Open Wrong Files\n\n**Symptoms**: Ribbon icons or commands open unexpected files\n\nCheck command mappings in `Settings -> TaskNotes -> General` (`View Commands`). Reset mappings that were changed unintentionally, then verify each referenced `.base` file exists at the configured path.\n\n## Common Issues\n\n### Tasks Not Appearing in Views\n\n**Symptoms**: Tasks you've created don't show up in TaskNotes views\n\nFollow this decision tree:\n\n1. **Does Quick actions for current task work on the note?**\n - **No:** compare its tag or identification property with **General → Task identification**.\n - **Yes:** task recognition works; continue to the Base filter.\n2. **Is the note inside an excluded folder?**\n - **Yes:** move it or update **Excluded folders**.\n - **No:** continue.\n3. **Does a newly generated default task Base show it?**\n - **Yes:** the custom Base has a stale property name or filter.\n - **No:** run **TaskNotes: Refresh cache** and validate the frontmatter.\n4. **Did identification or field mapping change recently?**\n - **Yes:** update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change.\n\n### Task Link Widgets Not Working\n\n**Symptoms**: Links to task files appear as normal wikilinks instead of interactive widgets\n\nCheck that **Task link overlay** is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design.\n\n### Instant Conversion Buttons Missing\n\n**Symptoms**: Convert buttons don't appear next to checkbox tasks\n\nInstant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox.\n\n### Calendar View Performance Issues\n\n**Symptoms**: Calendar views are slow or unresponsive\n\nReduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below.\n\n### Natural Language Parsing Not Working\n\n**Symptoms**: Natural language input doesn't extract expected task properties\n\nEnable NLP in `Settings -> TaskNotes -> Features`, then verify your trigger characters (`@`, `#`, `!` by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in [NLP API](nlp-api.md).\n\n### Time Tracking Issues\n\n**Symptoms**: Time tracking doesn't start/stop properly or data is lost\n\nMost tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter.\n\n## Data Issues\n\n### Corrupted Task Files\n\n**Symptoms**: Tasks appear broken or cause errors in views\n\nOpen the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption.\n\n### Missing Task Properties\n\n**Symptoms**: Tasks missing expected properties or using default values unexpectedly\n\nCheck field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied.\n\n### Date Format Issues\n\n**Symptoms**: Dates not displaying correctly or causing parse errors\n\nUse supported formats (`YYYY-MM-DD` or `YYYY-MM-DDTHH:MM:SS`), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling.\n\n## Performance Troubleshooting\n\n### Slow View Loading\n\nTo improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use.\n\n## External Calendar Issues\n\n### OAuth Calendar Not Connecting\n\n**Symptoms**: Google Calendar or Microsoft Outlook won't connect\n\nVerify credentials and loopback redirect configuration (`127.0.0.1` with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use [Calendar Setup](calendar-setup.md).\n\n### OAuth Calendar Not Syncing\n\n**Symptoms**: Connected calendar shows old events or doesn't update\n\nRun manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior.\n\n### ICS Subscriptions Not Loading\n\n**Symptoms**: ICS calendar events don't appear in calendar views\n\nConfirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures.\n\n### Calendar Sync Problems\n\n**Symptoms**: External calendar changes not reflected in TaskNotes\n\nCheck refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state.\n\n## Getting Help\n\n### Reporting Issues\n\nReport bugs on [GitHub Issues](https://github.com/callumalpass/tasknotes/issues). Include:\n\n- Exact TaskNotes and Obsidian versions\n- Operating system\n- The smallest affected task frontmatter with private values removed\n- The `.base` path and whether a regenerated default has the same problem\n- Steps to reproduce from a fresh Obsidian start\n- Relevant console errors and TaskNotes debug entries\n- Screenshots if relevant\n\n### Configuration Reset\n\nUse a reversible reset only after the checks above:\n\n1. Close Obsidian\n2. Navigate to `.obsidian/plugins/tasknotes/`\n3. Copy `data.json` to a backup outside the plugin directory\n4. Rename the original to `data.json.backup-YYYY-MM-DD`\n5. Restart Obsidian\n\n!!! warning\n A reset affects settings, status and priority configurations, integration state, saved views, and plugin-stored Pomodoro history. Keep the backup until the problem is resolved. Restore it only while Obsidian is closed.\n\nFor full restore and uninstall guidance, see [Backup, restore, and removal](guides/backup-recovery.md).\n","aliases":["/troubleshooting/"],"toc":[{"level":2,"id":"first-checks","text":"First checks"},{"level":2,"id":"bases-and-views-v4","text":"Bases and Views (v4)"},{"level":3,"id":"views-not-loading","text":"Views Not Loading"},{"level":3,"id":"commands-open-wrong-files","text":"Commands Open Wrong Files"},{"level":2,"id":"common-issues","text":"Common Issues"},{"level":3,"id":"tasks-not-appearing-in-views","text":"Tasks Not Appearing in Views"},{"level":3,"id":"task-link-widgets-not-working","text":"Task Link Widgets Not Working"},{"level":3,"id":"instant-conversion-buttons-missing","text":"Instant Conversion Buttons Missing"},{"level":3,"id":"calendar-view-performance-issues","text":"Calendar View Performance Issues"},{"level":3,"id":"natural-language-parsing-not-working","text":"Natural Language Parsing Not Working"},{"level":3,"id":"time-tracking-issues","text":"Time Tracking Issues"},{"level":2,"id":"data-issues","text":"Data Issues"},{"level":3,"id":"corrupted-task-files","text":"Corrupted Task Files"},{"level":3,"id":"missing-task-properties","text":"Missing Task Properties"},{"level":3,"id":"date-format-issues","text":"Date Format Issues"},{"level":2,"id":"performance-troubleshooting","text":"Performance Troubleshooting"},{"level":3,"id":"slow-view-loading","text":"Slow View Loading"},{"level":2,"id":"external-calendar-issues","text":"External Calendar Issues"},{"level":3,"id":"oauth-calendar-not-connecting","text":"OAuth Calendar Not Connecting"},{"level":3,"id":"oauth-calendar-not-syncing","text":"OAuth Calendar Not Syncing"},{"level":3,"id":"ics-subscriptions-not-loading","text":"ICS Subscriptions Not Loading"},{"level":3,"id":"calendar-sync-problems","text":"Calendar Sync Problems"},{"level":2,"id":"getting-help","text":"Getting Help"},{"level":3,"id":"reporting-issues","text":"Reporting Issues"},{"level":3,"id":"configuration-reset","text":"Configuration Reset"}],"html":"

Common issues and solutions for TaskNotes.

\n

When debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from About, the operating system, and whether the problem also occurs in a fresh default Base.

\n

First checks#

\n
    \n
  1. Confirm Obsidian meets the current version requirement and Bases is enabled.
  2. \n
  3. Open the affected task as Markdown and validate the --- frontmatter delimiters and indentation.
  4. \n
  5. Confirm the task matches Settings → TaskNotes → General → Task identification and is not in an excluded folder.
  6. \n
  7. Run TaskNotes: Refresh cache from the command palette.
  8. \n
  9. Close and reopen the affected .base file.
  10. \n
  11. Restart Obsidian only after the targeted checks above.
  12. \n
\n

If the issue remains, enable Settings → TaskNotes → Features → Debug logging, reproduce it once, and inspect the developer console with Ctrl/Cmd + Shift + I. Disable debug logging after collecting the relevant entries.

\n

Bases and Views (v4)#

\n

Views Not Loading#

\n

Symptoms: TaskNotes views show errors or don't display tasks

\n

First confirm Bases is enabled (Settings -> Core Plugins -> Bases), then restart Obsidian once. If views are still missing, verify .base files exist in TaskNotes/Views/. If needed, regenerate defaults from Settings -> TaskNotes -> General -> Views & base files (Create files).

\n

Commands Open Wrong Files#

\n

Symptoms: Ribbon icons or commands open unexpected files

\n

Check command mappings in Settings -> TaskNotes -> General (View Commands). Reset mappings that were changed unintentionally, then verify each referenced .base file exists at the configured path.

\n

Common Issues#

\n

Tasks Not Appearing in Views#

\n

Symptoms: Tasks you've created don't show up in TaskNotes views

\n

Follow this decision tree:

\n
    \n
  1. Does Quick actions for current task work on the note?
      \n
    • No: compare its tag or identification property with General → Task identification.
    • \n
    • Yes: task recognition works; continue to the Base filter.
    • \n
    \n
  2. \n
  3. Is the note inside an excluded folder?
      \n
    • Yes: move it or update Excluded folders.
    • \n
    • No: continue.
    • \n
    \n
  4. \n
  5. Does a newly generated default task Base show it?
      \n
    • Yes: the custom Base has a stale property name or filter.
    • \n
    • No: run TaskNotes: Refresh cache and validate the frontmatter.
    • \n
    \n
  6. \n
  7. Did identification or field mapping change recently?
      \n
    • Yes: update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change.
    • \n
    \n
  8. \n
\n\n

Symptoms: Links to task files appear as normal wikilinks instead of interactive widgets

\n

Check that Task link overlay is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design.

\n

Instant Conversion Buttons Missing#

\n

Symptoms: Convert buttons don't appear next to checkbox tasks

\n

Instant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox.

\n

Calendar View Performance Issues#

\n

Symptoms: Calendar views are slow or unresponsive

\n

Reduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below.

\n

Natural Language Parsing Not Working#

\n

Symptoms: Natural language input doesn't extract expected task properties

\n

Enable NLP in Settings -> TaskNotes -> Features, then verify your trigger characters (@, #, ! by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in NLP API.

\n

Time Tracking Issues#

\n

Symptoms: Time tracking doesn't start/stop properly or data is lost

\n

Most tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter.

\n

Data Issues#

\n

Corrupted Task Files#

\n

Symptoms: Tasks appear broken or cause errors in views

\n

Open the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption.

\n

Missing Task Properties#

\n

Symptoms: Tasks missing expected properties or using default values unexpectedly

\n

Check field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied.

\n

Date Format Issues#

\n

Symptoms: Dates not displaying correctly or causing parse errors

\n

Use supported formats (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling.

\n

Performance Troubleshooting#

\n

Slow View Loading#

\n

To improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use.

\n

External Calendar Issues#

\n

OAuth Calendar Not Connecting#

\n

Symptoms: Google Calendar or Microsoft Outlook won't connect

\n

Verify credentials and loopback redirect configuration (127.0.0.1 with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use Calendar Setup.

\n

OAuth Calendar Not Syncing#

\n

Symptoms: Connected calendar shows old events or doesn't update

\n

Run manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior.

\n

ICS Subscriptions Not Loading#

\n

Symptoms: ICS calendar events don't appear in calendar views

\n

Confirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures.

\n

Calendar Sync Problems#

\n

Symptoms: External calendar changes not reflected in TaskNotes

\n

Check refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state.

\n

Getting Help#

\n

Reporting Issues#

\n

Report bugs on GitHub Issues. Include:

\n
    \n
  • Exact TaskNotes and Obsidian versions
  • \n
  • Operating system
  • \n
  • The smallest affected task frontmatter with private values removed
  • \n
  • The .base path and whether a regenerated default has the same problem
  • \n
  • Steps to reproduce from a fresh Obsidian start
  • \n
  • Relevant console errors and TaskNotes debug entries
  • \n
  • Screenshots if relevant
  • \n
\n

Configuration Reset#

\n

Use a reversible reset only after the checks above:

\n
    \n
  1. Close Obsidian
  2. \n
  3. Navigate to .obsidian/plugins/tasknotes/
  4. \n
  5. Copy data.json to a backup outside the plugin directory
  6. \n
  7. Rename the original to data.json.backup-YYYY-MM-DD
  8. \n
  9. Restart Obsidian
  10. \n
\n\n

For full restore and uninstall guidance, see Backup, restore, and removal.

\n","text":"Common issues and solutions for TaskNotes. When debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from About, the operating system, and whether the problem also occurs in a fresh default Base. First checks# Confirm Obsidian meets the current version requirement and Bases is enabled. Open the affected task as Markdown and validate the --- frontmatter delimiters and indentation. Confirm the task matches Settings → TaskNotes → General → Task identification and is not in an excluded folder. Run TaskNotes: Refresh cache from the command palette. Close and reopen the affected .base file. Restart Obsidian only after the targeted checks above. If the issue remains, enable Settings → TaskNotes → Features → Debug logging, reproduce it once, and inspect the developer console with Ctrl/Cmd + Shift + I. Disable debug logging after collecting the relevant entries. Bases and Views (v4)# Views Not Loading# Symptoms: TaskNotes views show errors or don't display tasks First confirm Bases is enabled (Settings -> Core Plugins -> Bases), then restart Obsidian once. If views are still missing, verify .base files exist in TaskNotes/Views/. If needed, regenerate defaults from Settings -> TaskNotes -> General -> Views & base files (Create files). Commands Open Wrong Files# Symptoms: Ribbon icons or commands open unexpected files Check command mappings in Settings -> TaskNotes -> General (View Commands). Reset mappings that were changed unintentionally, then verify each referenced .base file exists at the configured path. Common Issues# Tasks Not Appearing in Views# Symptoms: Tasks you've created don't show up in TaskNotes views Follow this decision tree: Does Quick actions for current task work on the note? No: compare its tag or identification property with General → Task identification. Yes: task recognition works; continue to the Base filter. Is the note inside an excluded folder? Yes: move it or update Excluded folders. No: continue. Does a newly generated default task Base show it? Yes: the custom Base has a stale property name or filter. No: run TaskNotes: Refresh cache and validate the frontmatter. Did identification or field mapping change recently? Yes: update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change. Task Link Widgets Not Working# Symptoms: Links to task files appear as normal wikilinks instead of interactive widgets Check that Task link overlay is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design. Instant Conversion Buttons Missing# Symptoms: Convert buttons don't appear next to checkbox tasks Instant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox. Calendar View Performance Issues# Symptoms: Calendar views are slow or unresponsive Reduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below. Natural Language Parsing Not Working# Symptoms: Natural language input doesn't extract expected task properties Enable NLP in Settings -> TaskNotes -> Features, then verify your trigger characters (@, #, ! by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in NLP API. Time Tracking Issues# Symptoms: Time tracking doesn't start/stop properly or data is lost Most tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter. Data Issues# Corrupted Task Files# Symptoms: Tasks appear broken or cause errors in views Open the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption. Missing Task Properties# Symptoms: Tasks missing expected properties or using default values unexpectedly Check field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied. Date Format Issues# Symptoms: Dates not displaying correctly or causing parse errors Use supported formats (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling. Performance Troubleshooting# Slow View Loading# To improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use. External Calendar Issues# OAuth Calendar Not Connecting# Symptoms: Google Calendar or Microsoft Outlook won't connect Verify credentials and loopback redirect configuration (127.0.0.1 with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use Calendar Setup. OAuth Calendar Not Syncing# Symptoms: Connected calendar shows old events or doesn't update Run manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior. ICS Subscriptions Not Loading# Symptoms: ICS calendar events don't appear in calendar views Confirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures. Calendar Sync Problems# Symptoms: External calendar changes not reflected in TaskNotes Check refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state. Getting Help# Reporting Issues# Report bugs on GitHub Issues. Include: Exact TaskNotes and Obsidian versions Operating system The smallest affected task frontmatter with private values removed The .base path and whether a regenerated default has the same problem Steps to reproduce from a fresh Obsidian start Relevant console errors and TaskNotes debug entries Screenshots if relevant Configuration Reset# Use a reversible reset only after the checks above: Close Obsidian Navigate to .obsidian/plugins/tasknotes/ Copy data.json to a backup outside the plugin directory Rename the original to data.json.backup-YYYY-MM-DD Restart Obsidian WarningA reset affects settings, status and priority configurations, integration state, saved views, and plugin-stored Pomodoro history. Keep the backup until the problem is resolved. Restore it only while Obsidian is closed. For full restore and uninstall guidance, see Backup, restore, and removal."},{"route":"/obsidian/views/","title":"Views","description":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and requi...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views.md","namespace":"obsidian","relativePath":"views.md","raw":"# Views\n\nTaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as `.base` files located in the `TaskNotes/Views/` directory and require Obsidian's Bases core plugin to be enabled.\n\n\nFor details on Bases integration and how to enable it, see [Core Concepts](core-concepts.md#bases-integration). For view templates and configuration examples, see [Default Base Templates](views/default-base-templates.md).\n\n## Task-Focused Views\n\nTask-focused views are different entry points into the same underlying task notes. The [Task List View](views/task-list.md) is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format.\n\nWhen you want workflow by status, [Kanban View](views/kanban-view.md) organizes cards into columns and can optionally add swimlanes for an extra organizational layer. [Calendar Views](views/calendar-views.md) are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support.\n\n[Agenda View](views/agenda-view.md) is a preconfigured list-oriented calendar layout designed for short-horizon planning, while [MiniCalendar View](views/calendar-views.md#mini-calendar-view) gives a compact month heatmap and fast keyboard navigation.\n\n![Task List view](assets/views-tasks-list.png)\n\n![Calendar week view](assets/views-calendar-week.png)\n\n## Productivity-Focused Views\n\nThese views support time management and work tracking.\n\n[Pomodoro View](views/pomodoro-view.md) supports focused intervals directly inside Obsidian, and [Pomodoro Stats View](views/pomodoro-view.md#pomodoro-stats-view) summarizes completed sessions so you can see pace and consistency over time.\n\n![Pomodoro view](assets/feature-pomodoro-timer.png)\n\nScreenshots in this section are captured via the Playwright docs suite (`npm run e2e:docs`).\n","aliases":["/views/"],"toc":[{"level":2,"id":"task-focused-views","text":"Task-Focused Views"},{"level":2,"id":"productivity-focused-views","text":"Productivity-Focused Views"}],"html":"

TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and require Obsidian's Bases core plugin to be enabled.

\n

For details on Bases integration and how to enable it, see Core Concepts. For view templates and configuration examples, see Default Base Templates.

\n

Task-Focused Views#

\n

Task-focused views are different entry points into the same underlying task notes. The Task List View is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format.

\n

When you want workflow by status, Kanban View organizes cards into columns and can optionally add swimlanes for an extra organizational layer. Calendar Views are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support.

\n

Agenda View is a preconfigured list-oriented calendar layout designed for short-horizon planning, while MiniCalendar View gives a compact month heatmap and fast keyboard navigation.

\n

\"Task

\n

\"Calendar

\n

Productivity-Focused Views#

\n

These views support time management and work tracking.

\n

Pomodoro View supports focused intervals directly inside Obsidian, and Pomodoro Stats View summarizes completed sessions so you can see pace and consistency over time.

\n

\"Pomodoro

\n

Screenshots in this section are captured via the Playwright docs suite (npm run e2e:docs).

\n","text":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and require Obsidian's Bases core plugin to be enabled. For details on Bases integration and how to enable it, see Core Concepts. For view templates and configuration examples, see Default Base Templates. Task-Focused Views# Task-focused views are different entry points into the same underlying task notes. The Task List View is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format. When you want workflow by status, Kanban View organizes cards into columns and can optionally add swimlanes for an extra organizational layer. Calendar Views are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support. Agenda View is a preconfigured list-oriented calendar layout designed for short-horizon planning, while MiniCalendar View gives a compact month heatmap and fast keyboard navigation. Productivity-Focused Views# These views support time management and work tracking. Pomodoro View supports focused intervals directly inside Obsidian, and Pomodoro Stats View summarizes completed sessions so you can see pace and consistency over time. Screenshots in this section are captured via the Playwright docs suite (npm run e2e:docs)."},{"route":"/obsidian/views/agenda-view/","title":"Agenda View","description":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without ne...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/agenda-view.md","namespace":"obsidian","relativePath":"views/agenda-view.md","raw":"# Agenda View\n\n\nThe Agenda view is a dedicated `.base` file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually.\n\n![Agenda View](../assets/views-agenda.png)\n\n## File Location\n\n- Default file: `TaskNotes/Views/agenda-default.base`\n- Command: **Open Agenda View** (ribbon icon and command palette)\n- Configure the file path in **Settings → TaskNotes → General → View Commands**\n\nTaskNotes creates missing default `.base` files automatically on startup when **Auto-create default files** is enabled. You can replace the command path with your own `.base` file if you maintain multiple agendas.\n\n## Default Configuration\n\nThe stock agenda file renders the calendar in `listWeek` mode:\n\n```yaml\nviews:\n - type: tasknotesCalendar\n name: \"Agenda\"\n calendarView: \"listWeek\"\n listDayCount: 7\n startDateProperty: file.ctime\n titleProperty: file.basename\n order:\n - note.status\n - note.priority\n - note.due\n - formula.dueIn\n - note.scheduled\n```\n\nThis configuration displays seven days at a time, derives entries from `file.ctime`/`file.basename`, shows the generated `Due in` countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view.\n\n## Customization\n\nEdit the `.base` file to tailor the agenda:\n\n- Change `calendarView` to `listDay` or `listMonth` for different spans\n- Adjust `listDayCount` for shorter or longer agendas; the Bases option supports up to 365 days\n- Add `filters` to focus on specific projects, tags, or statuses\n- Modify `order` to control which task properties appear in the row layout\n\nBecause the view runs inside Bases, any YAML changes are applied immediately after saving the file.\n\n## Usage Tips\n\n- Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries\n- Saved views within Bases let you maintain multiple agenda variants (e.g., \"Work Week\" vs. \"Personal\")\n- Calendar display options (show due, show scheduled, etc.) persist when you save the `.base` file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks\n","aliases":["/views/agenda-view/"],"toc":[{"level":2,"id":"file-location","text":"File Location"},{"level":2,"id":"default-configuration","text":"Default Configuration"},{"level":2,"id":"customization","text":"Customization"},{"level":2,"id":"usage-tips","text":"Usage Tips"}],"html":"

The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually.

\n

\"Agenda

\n

File Location#

\n
    \n
  • Default file: TaskNotes/Views/agenda-default.base
  • \n
  • Command: Open Agenda View (ribbon icon and command palette)
  • \n
  • Configure the file path in Settings → TaskNotes → General → View Commands
  • \n
\n

TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled. You can replace the command path with your own .base file if you maintain multiple agendas.

\n

Default Configuration#

\n

The stock agenda file renders the calendar in listWeek mode:

\n
views:\n  - type: tasknotesCalendar\n    name: "Agenda"\n    calendarView: "listWeek"\n    listDayCount: 7\n    startDateProperty: file.ctime\n    titleProperty: file.basename\n    order:\n      - note.status\n      - note.priority\n      - note.due\n      - formula.dueIn\n      - note.scheduled\n

This configuration displays seven days at a time, derives entries from file.ctime/file.basename, shows the generated Due in countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view.

\n

Customization#

\n

Edit the .base file to tailor the agenda:

\n
    \n
  • Change calendarView to listDay or listMonth for different spans
  • \n
  • Adjust listDayCount for shorter or longer agendas; the Bases option supports up to 365 days
  • \n
  • Add filters to focus on specific projects, tags, or statuses
  • \n
  • Modify order to control which task properties appear in the row layout
  • \n
\n

Because the view runs inside Bases, any YAML changes are applied immediately after saving the file.

\n

Usage Tips#

\n
    \n
  • Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries
  • \n
  • Saved views within Bases let you maintain multiple agenda variants (e.g., "Work Week" vs. "Personal")
  • \n
  • Calendar display options (show due, show scheduled, etc.) persist when you save the .base file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks
  • \n
\n","text":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually. File Location# Default file: TaskNotes/Views/agenda-default.base Command: Open Agenda View (ribbon icon and command palette) Configure the file path in Settings → TaskNotes → General → View Commands TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled. You can replace the command path with your own .base file if you maintain multiple agendas. Default Configuration# The stock agenda file renders the calendar in listWeek mode: views: - type: tasknotesCalendar name: \"Agenda\" calendarView: \"listWeek\" listDayCount: 7 startDateProperty: file.ctime titleProperty: file.basename order: - note.status - note.priority - note.due - formula.dueIn - note.scheduled This configuration displays seven days at a time, derives entries from file.ctime/file.basename, shows the generated Due in countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view. Customization# Edit the .base file to tailor the agenda: Change calendarView to listDay or listMonth for different spans Adjust listDayCount for shorter or longer agendas; the Bases option supports up to 365 days Add filters to focus on specific projects, tags, or statuses Modify order to control which task properties appear in the row layout Because the view runs inside Bases, any YAML changes are applied immediately after saving the file. Usage Tips# Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries Saved views within Bases let you maintain multiple agenda variants (e.g., \"Work Week\" vs. \"Personal\") Calendar display options (show due, show scheduled, etc.) persist when you save the .base file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks"},{"route":"/obsidian/views/calendar-views/","title":"Calendar Views","description":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled i...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/calendar-views.md","namespace":"obsidian","relativePath":"views/calendar-views.md","raw":"# Calendar Views\n\n\nTaskNotes provides two calendar-based views: the **Mini Calendar** and the **Calendar View**. Both operate as Bases views (`.base` files) and require the Bases core plugin to be enabled in Obsidian.\nMini Calendar is date-density and navigation focused, while Calendar View is scheduling focused.\n\n![Calendar Month View](../assets/views-calendar-month.png)\n\n## Bases View Architecture\n\nCalendar views in TaskNotes v4 are implemented as Bases views, which means:\n\n- Calendar views are created as `.base` files in your vault\n- Configuration is controlled through YAML frontmatter in the base file\n- The Bases plugin is an official Obsidian core plugin and must be enabled\n- Views can be opened in tabs, pinned, and managed like other Obsidian views\nThis architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups.\n\n## Mini Calendar View\n\nThe Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time.\n\n![Mini Calendar View](../assets/views-mini-calendar.png)\n\n### Features\n\n- **Date Navigation**: Click any date to open a fuzzy selector modal showing all notes associated with that date\n- **Keyboard Navigation**: Navigate the calendar using arrow keys and select dates with Enter\n- **Heatmap Styling**: Visual indicators show the density of tasks or notes on each day\n- **Configurable Date Property**: Set which date property to track (not limited to tasks - can display any dated notes based on configured property)\n- **Month Navigation**: Browse forward and backward through months to view historical and future task distribution\nMini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution.\n\n## Calendar View\n\nThe Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times.\n\n### View Modes\n\nThe Calendar View supports the following view modes:\n\n- **Month**: Month grid showing all-day and timed events\n- **Week**: Week view with hourly time slots for detailed scheduling\n- **Day**: Single day view with hourly breakdown\n- **Year**: Annual overview showing event distribution across months\n- **List**: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own `.base` file for quick reviews.\n- **Custom Days**: Configurable multi-day view (2-10 days)\nView modes can be switched within a single `.base` file based on planning horizon (day, week, month, year, or custom range).\n\n| Week View | Day View | Year View |\n|-----------|----------|-----------|\n| ![Week View](../assets/views-calendar-week.png) | ![Day View](../assets/views-calendar-day.png) | ![Year View](../assets/views-calendar-year.png) |\n\n### Performance Improvements\n\nThe Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness.\n\n### Custom Days View\n\nThe Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view.\n\n#### Key Features\n\n- **Configurable Duration**: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count\n- **TimeGrid Format**: Uses the same hourly time slots and time-based event layout as Week and Day views\n- **Real-time Updates**: The view updates immediately when the day count setting is changed\n- **Default Configuration**: Ships with 3 days displayed by default for optimal space utilization\n\n#### Use Cases\n\nThe Custom Days view is particularly useful for:\n- Users who find the single-day view too wide and wasteful of screen space\n- Planning workflows that require seeing a few days at a glance without the full week\n- Detailed scheduling tasks that benefit from the time-grid format\n- Customizing the viewing window to match personal preference and screen size\n\n#### Configuration\n\n1. **Select the View**: Choose \"Custom Days\" from the calendar toolbar alongside Month, Week, Day, and Year views\n2. **Adjust Day Count**: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days\n3. **Set as Default**: Optionally set \"Custom Days\" as your default view in Settings > Calendar > Default view\n\n### Recurring Task Support\n\nThe Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior.\n\n#### Visual Hierarchy\n\nRecurring tasks are displayed with distinct visual styling:\n\n- **Next Scheduled Occurrence**: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance\n- **Pattern Instances**: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule\n\n#### Drag and Drop Behavior\n\nThe calendar provides different behaviors depending on which type of recurring event you drag:\n\n**Dragging Next Scheduled Occurrence (Solid Border)**:\n\n- Updates only the `scheduled` field in the task\n- Reschedules just that specific occurrence to the new date/time\n- Leaves the recurrence pattern unchanged\n- Notice: \"Rescheduled next occurrence. This does not change the recurrence pattern.\"\n\n**Dragging Pattern Instances (Dashed Border)**:\n\n- Updates the DTSTART time in the recurrence rule\n- Changes when all future pattern instances appear\n- Does not affect the independently scheduled next occurrence\n- Notice: \"Updated recurring pattern time. All future instances now appear at this time.\"\n\n#### Flexible Scheduling\n\nThe next scheduled occurrence can appear on any date, even:\n\n- Before the DTSTART date\n- On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern)\n- At different times than the pattern instances\n\nThis flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling.\n\n### View Options\n\nThe Calendar View provides several display options that control what types of events appear on the calendar:\n\n- **Show scheduled**: Display tasks with scheduled dates\n- **Show due**: Display tasks with due dates\n- **Show timeblocks**: Display time-blocking entries\n- **Show recurring**: Display recurring task events\n- **Show ICS events**: Display events from imported ICS calendars\n- **Show time entries**: Display time tracking entries\n- **All-day slot**: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views)\n- **Create daily notes from date links**: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes.\n- **Drag/drop resolution**: Set `snapDuration` when you want events to drag or resize in smaller increments than the visible `slotDuration`, such as 5-minute dragging on a 30-minute grid.\n- **Span tasks between scheduled and due dates**: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below)\nMultiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles.\n\nThe **All-day slot** option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view.\n\n#### Multi-Day Task Spans\n\nThe **Span tasks between scheduled and due dates** option provides a visual representation of task duration on the calendar. When enabled:\n\n- Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date\n- This replaces the separate scheduled and due markers for qualifying tasks\n- Tasks with only a scheduled date or only a due date continue to display as single-day events\n- Span events are shown as all-day bars with the task's priority color\n- Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify)\n\nThis option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views.\n\nThese display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions.\n\n### OAuth Calendar Integration\n\nThe Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication:\n\n- **Google Calendar**: Connect to Google Calendar accounts to display and sync events\n- **Microsoft Outlook**: Connect to Microsoft Outlook accounts for calendar integration\n\n#### Synchronization Behavior\n\n- External calendar events appear alongside TaskNotes tasks in all calendar views\n- Drag and drop events to reschedule them - changes sync back to the external calendar service\n- Events from external calendars respect the same view options and display settings as native TaskNotes tasks\n\n#### Configuration\n\nOAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services.\n\n### Time Entry Editor Modal\n\nThe Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface.\n\n#### Creating Time Entries\n\n- Drag on the calendar to select a time range\n- When the selection menu appears, choose **Create time entry**\n- The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone\n\n#### Editing Time Entries\n\nTime entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata.\n\n### Filtering and View Configuration\n\nCalendar filtering is configured through the Bases YAML frontmatter in the `.base` file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin.\n\nSaved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes.\n","aliases":["/views/calendar-views/"],"toc":[{"level":2,"id":"bases-view-architecture","text":"Bases View Architecture"},{"level":2,"id":"mini-calendar-view","text":"Mini Calendar View"},{"level":3,"id":"features","text":"Features"},{"level":2,"id":"calendar-view","text":"Calendar View"},{"level":3,"id":"view-modes","text":"View Modes"},{"level":3,"id":"performance-improvements","text":"Performance Improvements"},{"level":3,"id":"custom-days-view","text":"Custom Days View"},{"level":3,"id":"recurring-task-support","text":"Recurring Task Support"},{"level":3,"id":"view-options","text":"View Options"},{"level":3,"id":"oauth-calendar-integration","text":"OAuth Calendar Integration"},{"level":3,"id":"time-entry-editor-modal","text":"Time Entry Editor Modal"},{"level":3,"id":"filtering-and-view-configuration","text":"Filtering and View Configuration"}],"html":"

TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled in Obsidian.\nMini Calendar is date-density and navigation focused, while Calendar View is scheduling focused.

\n

\"Calendar

\n

Bases View Architecture#

\n

Calendar views in TaskNotes v4 are implemented as Bases views, which means:

\n
    \n
  • Calendar views are created as .base files in your vault
  • \n
  • Configuration is controlled through YAML frontmatter in the base file
  • \n
  • The Bases plugin is an official Obsidian core plugin and must be enabled
  • \n
  • Views can be opened in tabs, pinned, and managed like other Obsidian views\nThis architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups.
  • \n
\n

Mini Calendar View#

\n

The Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time.

\n

\"Mini

\n

Features#

\n
    \n
  • Date Navigation: Click any date to open a fuzzy selector modal showing all notes associated with that date
  • \n
  • Keyboard Navigation: Navigate the calendar using arrow keys and select dates with Enter
  • \n
  • Heatmap Styling: Visual indicators show the density of tasks or notes on each day
  • \n
  • Configurable Date Property: Set which date property to track (not limited to tasks - can display any dated notes based on configured property)
  • \n
  • Month Navigation: Browse forward and backward through months to view historical and future task distribution\nMini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution.
  • \n
\n

Calendar View#

\n

The Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times.

\n

View Modes#

\n

The Calendar View supports the following view modes:

\n
    \n
  • Month: Month grid showing all-day and timed events
  • \n
  • Week: Week view with hourly time slots for detailed scheduling
  • \n
  • Day: Single day view with hourly breakdown
  • \n
  • Year: Annual overview showing event distribution across months
  • \n
  • List: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own .base file for quick reviews.
  • \n
  • Custom Days: Configurable multi-day view (2-10 days)\nView modes can be switched within a single .base file based on planning horizon (day, week, month, year, or custom range).
  • \n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n
Week ViewDay ViewYear View
\"Week\"Day\"Year
\n

Performance Improvements#

\n

The Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness.

\n

Custom Days View#

\n

The Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view.

\n

Key Features#

\n
    \n
  • Configurable Duration: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count
  • \n
  • TimeGrid Format: Uses the same hourly time slots and time-based event layout as Week and Day views
  • \n
  • Real-time Updates: The view updates immediately when the day count setting is changed
  • \n
  • Default Configuration: Ships with 3 days displayed by default for optimal space utilization
  • \n
\n

Use Cases#

\n

The Custom Days view is particularly useful for:

\n
    \n
  • Users who find the single-day view too wide and wasteful of screen space
  • \n
  • Planning workflows that require seeing a few days at a glance without the full week
  • \n
  • Detailed scheduling tasks that benefit from the time-grid format
  • \n
  • Customizing the viewing window to match personal preference and screen size
  • \n
\n

Configuration#

\n
    \n
  1. Select the View: Choose "Custom Days" from the calendar toolbar alongside Month, Week, Day, and Year views
  2. \n
  3. Adjust Day Count: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days
  4. \n
  5. Set as Default: Optionally set "Custom Days" as your default view in Settings > Calendar > Default view
  6. \n
\n

Recurring Task Support#

\n

The Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior.

\n

Visual Hierarchy#

\n

Recurring tasks are displayed with distinct visual styling:

\n
    \n
  • Next Scheduled Occurrence: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance
  • \n
  • Pattern Instances: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule
  • \n
\n

Drag and Drop Behavior#

\n

The calendar provides different behaviors depending on which type of recurring event you drag:

\n

Dragging Next Scheduled Occurrence (Solid Border):

\n
    \n
  • Updates only the scheduled field in the task
  • \n
  • Reschedules just that specific occurrence to the new date/time
  • \n
  • Leaves the recurrence pattern unchanged
  • \n
  • Notice: "Rescheduled next occurrence. This does not change the recurrence pattern."
  • \n
\n

Dragging Pattern Instances (Dashed Border):

\n
    \n
  • Updates the DTSTART time in the recurrence rule
  • \n
  • Changes when all future pattern instances appear
  • \n
  • Does not affect the independently scheduled next occurrence
  • \n
  • Notice: "Updated recurring pattern time. All future instances now appear at this time."
  • \n
\n

Flexible Scheduling#

\n

The next scheduled occurrence can appear on any date, even:

\n
    \n
  • Before the DTSTART date
  • \n
  • On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern)
  • \n
  • At different times than the pattern instances
  • \n
\n

This flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling.

\n

View Options#

\n

The Calendar View provides several display options that control what types of events appear on the calendar:

\n
    \n
  • Show scheduled: Display tasks with scheduled dates
  • \n
  • Show due: Display tasks with due dates
  • \n
  • Show timeblocks: Display time-blocking entries
  • \n
  • Show recurring: Display recurring task events
  • \n
  • Show ICS events: Display events from imported ICS calendars
  • \n
  • Show time entries: Display time tracking entries
  • \n
  • All-day slot: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views)
  • \n
  • Create daily notes from date links: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes.
  • \n
  • Drag/drop resolution: Set snapDuration when you want events to drag or resize in smaller increments than the visible slotDuration, such as 5-minute dragging on a 30-minute grid.
  • \n
  • Span tasks between scheduled and due dates: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below)\nMultiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles.
  • \n
\n

The All-day slot option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view.

\n

Multi-Day Task Spans#

\n

The Span tasks between scheduled and due dates option provides a visual representation of task duration on the calendar. When enabled:

\n
    \n
  • Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date
  • \n
  • This replaces the separate scheduled and due markers for qualifying tasks
  • \n
  • Tasks with only a scheduled date or only a due date continue to display as single-day events
  • \n
  • Span events are shown as all-day bars with the task's priority color
  • \n
  • Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify)
  • \n
\n

This option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views.

\n

These display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions.

\n

OAuth Calendar Integration#

\n

The Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication:

\n
    \n
  • Google Calendar: Connect to Google Calendar accounts to display and sync events
  • \n
  • Microsoft Outlook: Connect to Microsoft Outlook accounts for calendar integration
  • \n
\n

Synchronization Behavior#

\n
    \n
  • External calendar events appear alongside TaskNotes tasks in all calendar views
  • \n
  • Drag and drop events to reschedule them - changes sync back to the external calendar service
  • \n
  • Events from external calendars respect the same view options and display settings as native TaskNotes tasks
  • \n
\n

Configuration#

\n

OAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services.

\n

Time Entry Editor Modal#

\n

The Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface.

\n

Creating Time Entries#

\n
    \n
  • Drag on the calendar to select a time range
  • \n
  • When the selection menu appears, choose Create time entry
  • \n
  • The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone
  • \n
\n

Editing Time Entries#

\n

Time entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata.

\n

Filtering and View Configuration#

\n

Calendar filtering is configured through the Bases YAML frontmatter in the .base file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin.

\n

Saved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes.

\n","text":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled in Obsidian. Mini Calendar is date-density and navigation focused, while Calendar View is scheduling focused. Bases View Architecture# Calendar views in TaskNotes v4 are implemented as Bases views, which means: Calendar views are created as .base files in your vault Configuration is controlled through YAML frontmatter in the base file The Bases plugin is an official Obsidian core plugin and must be enabled Views can be opened in tabs, pinned, and managed like other Obsidian views This architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups. Mini Calendar View# The Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time. Features# Date Navigation: Click any date to open a fuzzy selector modal showing all notes associated with that date Keyboard Navigation: Navigate the calendar using arrow keys and select dates with Enter Heatmap Styling: Visual indicators show the density of tasks or notes on each day Configurable Date Property: Set which date property to track (not limited to tasks - can display any dated notes based on configured property) Month Navigation: Browse forward and backward through months to view historical and future task distribution Mini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution. Calendar View# The Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times. View Modes# The Calendar View supports the following view modes: Month: Month grid showing all-day and timed events Week: Week view with hourly time slots for detailed scheduling Day: Single day view with hourly breakdown Year: Annual overview showing event distribution across months List: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own .base file for quick reviews. Custom Days: Configurable multi-day view (2-10 days) View modes can be switched within a single .base file based on planning horizon (day, week, month, year, or custom range). Week View Day View Year View Performance Improvements# The Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness. Custom Days View# The Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view. Key Features# Configurable Duration: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count TimeGrid Format: Uses the same hourly time slots and time-based event layout as Week and Day views Real-time Updates: The view updates immediately when the day count setting is changed Default Configuration: Ships with 3 days displayed by default for optimal space utilization Use Cases# The Custom Days view is particularly useful for: Users who find the single-day view too wide and wasteful of screen space Planning workflows that require seeing a few days at a glance without the full week Detailed scheduling tasks that benefit from the time-grid format Customizing the viewing window to match personal preference and screen size Configuration# Select the View: Choose \"Custom Days\" from the calendar toolbar alongside Month, Week, Day, and Year views Adjust Day Count: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days Set as Default: Optionally set \"Custom Days\" as your default view in Settings > Calendar > Default view Recurring Task Support# The Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior. Visual Hierarchy# Recurring tasks are displayed with distinct visual styling: Next Scheduled Occurrence: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance Pattern Instances: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule Drag and Drop Behavior# The calendar provides different behaviors depending on which type of recurring event you drag: Dragging Next Scheduled Occurrence (Solid Border): Updates only the scheduled field in the task Reschedules just that specific occurrence to the new date/time Leaves the recurrence pattern unchanged Notice: \"Rescheduled next occurrence. This does not change the recurrence pattern.\" Dragging Pattern Instances (Dashed Border): Updates the DTSTART time in the recurrence rule Changes when all future pattern instances appear Does not affect the independently scheduled next occurrence Notice: \"Updated recurring pattern time. All future instances now appear at this time.\" Flexible Scheduling# The next scheduled occurrence can appear on any date, even: Before the DTSTART date On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern) At different times than the pattern instances This flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling. View Options# The Calendar View provides several display options that control what types of events appear on the calendar: Show scheduled: Display tasks with scheduled dates Show due: Display tasks with due dates Show timeblocks: Display time-blocking entries Show recurring: Display recurring task events Show ICS events: Display events from imported ICS calendars Show time entries: Display time tracking entries All-day slot: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views) Create daily notes from date links: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes. Drag/drop resolution: Set snapDuration when you want events to drag or resize in smaller increments than the visible slotDuration, such as 5-minute dragging on a 30-minute grid. Span tasks between scheduled and due dates: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below) Multiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles. The All-day slot option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view. Multi-Day Task Spans# The Span tasks between scheduled and due dates option provides a visual representation of task duration on the calendar. When enabled: Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date This replaces the separate scheduled and due markers for qualifying tasks Tasks with only a scheduled date or only a due date continue to display as single-day events Span events are shown as all-day bars with the task's priority color Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify) This option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views. These display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions. OAuth Calendar Integration# The Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication: Google Calendar: Connect to Google Calendar accounts to display and sync events Microsoft Outlook: Connect to Microsoft Outlook accounts for calendar integration Synchronization Behavior# External calendar events appear alongside TaskNotes tasks in all calendar views Drag and drop events to reschedule them - changes sync back to the external calendar service Events from external calendars respect the same view options and display settings as native TaskNotes tasks Configuration# OAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services. Time Entry Editor Modal# The Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface. Creating Time Entries# Drag on the calendar to select a time range When the selection menu appears, choose Create time entry The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone Editing Time Entries# Time entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata. Filtering and View Configuration# Calendar filtering is configured through the Bases YAML frontmatter in the .base file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin. Saved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes."},{"route":"/obsidian/views/kanban-view/","title":"Kanban View","description":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag o...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/kanban-view.md","namespace":"obsidian","relativePath":"views/kanban-view.md","raw":"# Kanban View\n\n\nThe Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property.\nKanban emphasizes state transitions and drag operations over dense list scanning.\n\n![Kanban View](../assets/views-kanban.png)\n\n## Configuration\n\nKanban views are stored as `.base` files in `TaskNotes/Views/`. The `groupBy` property determines the column structure—each unique value becomes a column in the board. Open a `.base` file and access the view settings panel to configure options.\n\n### Core Settings (Bases)\n\n- **Data source**: Select which files or folders to include in the view\n- **Filter**: Define criteria to include or exclude specific tasks\n- **Sort**: Specify the order of tasks within each column\n- **Group by**: Required. Defines the property that creates columns (e.g., status, priority)\nChoosing a stable `groupBy` field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder.\n\n### Kanban-Specific Options\n\nAccess these options through the Bases view settings panel:\n\n- **Swim Lane**: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane)\n- **Column Width**: Controls the width of columns in pixels. Range: 200-500px. Default: 280px\n- **Max Swimlane Height**: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px\n- **Hide Empty Columns**: When enabled, columns containing no tasks are hidden from the view\n- **Pinned Columns**: Optional comma-separated list of column values that should stay visible even when empty. This is useful with **Hide Empty Columns** when each board needs a small stable subset of shared statuses or categories\n- **WIP Limits**: Advanced JSON configuration for showing per-column work-in-progress limits in column headers\n- **Hide Empty Swimlanes**: When enabled, ordered swimlanes with no tasks are hidden from the view\n- **Card Layout**: Chooses the task card density for this board. **Default** uses the standard TaskNotes card layout. **Compact** uses a tighter card layout for denser boards\n- **Show items in multiple columns**: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with `contexts: [work, call]` appears in both the \"work\" and \"call\" columns. When disabled, tasks appear in a single combined column (e.g., \"work, call\")\n- **Hide top-level subtasks**: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks\n- **Column Order**: Managed automatically when dragging column headers. Stores custom column ordering\n- **Swim Lane Order**: Advanced JSON configuration for pinning swimlane rows in a stable order\nA common setup is to keep one board grouped by status and another grouped by project or context, each in a separate `.base` file.\n\n## Interface Layout\n\n### Standard Layout\n\nIn standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the `groupBy` property.\n\nEach column includes:\n- A header showing the property value and task count\n- A scrollable area containing task cards\n- An add button that opens the TaskNotes creation modal with the column value filled in\n- Drag-and-drop functionality for reordering columns or moving tasks between columns\n\n### Swimlane Layout\n\nWhen a `swimLane` property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes.\n\nEach swimlane row includes:\n- A label cell showing the swimlane property value and total task count\n- Multiple cells, each representing a column within that swimlane\n- Scrollable cells containing task cards\n- Add buttons inside cells that fill in both the column value and swimlane value\n\nTo pin swimlanes in a stable order, set the advanced `swimLaneOrder` option to a JSON object keyed by the swimlane property:\n\n```yaml\nconfig:\n swimLane: note.contexts\n swimLaneOrder: '{\"note.contexts\":[\"transitcal\",\"bill\",\"cycles-research\",\"astrolabe\"]}'\n```\n\nListed swimlane values render first in the configured order. Values not listed in `swimLaneOrder` render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If `hideEmptySwimLanes` is disabled, listed values can remain visible even when no matching tasks are currently present.\n\nTo show WIP limits in column headers, set the advanced `wipLimits` option to a JSON object keyed by column value:\n\n```yaml\nconfig:\n wipLimits: '{\"in-progress\":5,\"review\":2}'\n```\n\nColumns with limits display counts as `(current/limit)`. When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes.\n\n## Task Cards\n\nEach task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date.\n\nUse the **Card Layout** setting when a board needs a different density from other task views. Existing boards use **Default** unless `cardLayout: compact` is set in the view options.\n\nTo show checklist progress on cards, include `file.tasks` in the view `order` array.\nFor existing `.base` files, add this in YAML manually first; after it is in `order`, it appears in the Bases picker as `tasks`.\n\nClick a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties.\n\n## Column Operations\n\n### Reordering Columns\n\nDrag column headers to reorder columns. The new order persists across sessions and is stored in the `columnOrder` configuration.\n\n### Drag-and-Drop Tasks\n\nDrag task cards between columns to update the `groupBy` property value. In swimlane mode, dragging a task to a different cell updates both the `groupBy` and `swimLane` properties.\n\nWhen grouping by a list property (contexts, tags, projects) with \"Show items in multiple columns\" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the \"work\" column to the \"home\" column changes `contexts: [work, call]` to `contexts: [call, home]`.\nDrag operations write directly to task metadata, so consistent grouping values reduce ambiguity.\n\nThe add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location.\n\n### Manual Reordering Within Columns\n\nKanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is `tasknotes_manual_order`.\n\nTo enable persistent manual ordering within Kanban columns:\n\n```yaml\nsort:\n - column: tasknotes_manual_order\n direction: DESC\n```\n\nOnce the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions.\n\nIn swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the \"In Progress\" column for the \"High\" swimlane only adjusts the tasks in that cell.\n\nImportant constraints:\n\n- Manual drag-to-reorder only works when the view sort includes the manual-order property.\n- Moving a card to a different column or swimlane still updates the grouped property values as usual.\n- In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.\n- Large reorder operations may show a confirmation dialog before writing changes.\n\nThe default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists.\n\n## Performance Optimization\n\nThe Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks.\n\nVirtual scrolling activates automatically based on task count. No configuration is required.\n\n## Example Configuration\n\nA typical Kanban view `.base` file includes:\n\n```yaml\n---\ntype: query\nsource: TaskNotes\nview: TaskNotes Kanban\nviews:\n - name: TaskNotes Kanban\n type: tasknotesKanban\n groupBy:\n property: task.status\n config:\n swimLane: task.priority\n swimLaneOrder: '{\"task.priority\":[\"high\",\"normal\",\"low\"]}'\n columnWidth: 300\n hideEmptyColumns: true\n pinnedColumns: to-do, in-progress, done\n wipLimits: '{\"in-progress\":5}'\n---\n```\n\nThis configuration creates a Kanban board with:\n- Columns based on task status\n- Swimlanes based on task priority\n- Priority swimlanes pinned in high, normal, low order\n- 300px column width\n- Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets\n- A WIP limit of 5 tasks on the in-progress column\n\n## Filtering and Sorting\n\nFiltering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column.\n","aliases":["/views/kanban-view/"],"toc":[{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"core-settings-bases","text":"Core Settings (Bases)"},{"level":3,"id":"kanban-specific-options","text":"Kanban-Specific Options"},{"level":2,"id":"interface-layout","text":"Interface Layout"},{"level":3,"id":"standard-layout","text":"Standard Layout"},{"level":3,"id":"swimlane-layout","text":"Swimlane Layout"},{"level":2,"id":"task-cards","text":"Task Cards"},{"level":2,"id":"column-operations","text":"Column Operations"},{"level":3,"id":"reordering-columns","text":"Reordering Columns"},{"level":3,"id":"drag-and-drop-tasks","text":"Drag-and-Drop Tasks"},{"level":3,"id":"manual-reordering-within-columns","text":"Manual Reordering Within Columns"},{"level":2,"id":"performance-optimization","text":"Performance Optimization"},{"level":2,"id":"example-configuration","text":"Example Configuration"},{"level":2,"id":"filtering-and-sorting","text":"Filtering and Sorting"}],"html":"

The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property.\nKanban emphasizes state transitions and drag operations over dense list scanning.

\n

\"Kanban

\n

Configuration#

\n

Kanban views are stored as .base files in TaskNotes/Views/. The groupBy property determines the column structure—each unique value becomes a column in the board. Open a .base file and access the view settings panel to configure options.

\n

Core Settings (Bases)#

\n
    \n
  • Data source: Select which files or folders to include in the view
  • \n
  • Filter: Define criteria to include or exclude specific tasks
  • \n
  • Sort: Specify the order of tasks within each column
  • \n
  • Group by: Required. Defines the property that creates columns (e.g., status, priority)\nChoosing a stable groupBy field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder.
  • \n
\n

Kanban-Specific Options#

\n

Access these options through the Bases view settings panel:

\n
    \n
  • Swim Lane: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane)
  • \n
  • Column Width: Controls the width of columns in pixels. Range: 200-500px. Default: 280px
  • \n
  • Max Swimlane Height: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px
  • \n
  • Hide Empty Columns: When enabled, columns containing no tasks are hidden from the view
  • \n
  • Pinned Columns: Optional comma-separated list of column values that should stay visible even when empty. This is useful with Hide Empty Columns when each board needs a small stable subset of shared statuses or categories
  • \n
  • WIP Limits: Advanced JSON configuration for showing per-column work-in-progress limits in column headers
  • \n
  • Hide Empty Swimlanes: When enabled, ordered swimlanes with no tasks are hidden from the view
  • \n
  • Card Layout: Chooses the task card density for this board. Default uses the standard TaskNotes card layout. Compact uses a tighter card layout for denser boards
  • \n
  • Show items in multiple columns: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with contexts: [work, call] appears in both the "work" and "call" columns. When disabled, tasks appear in a single combined column (e.g., "work, call")
  • \n
  • Hide top-level subtasks: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks
  • \n
  • Column Order: Managed automatically when dragging column headers. Stores custom column ordering
  • \n
  • Swim Lane Order: Advanced JSON configuration for pinning swimlane rows in a stable order\nA common setup is to keep one board grouped by status and another grouped by project or context, each in a separate .base file.
  • \n
\n

Interface Layout#

\n

Standard Layout#

\n

In standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the groupBy property.

\n

Each column includes:

\n
    \n
  • A header showing the property value and task count
  • \n
  • A scrollable area containing task cards
  • \n
  • An add button that opens the TaskNotes creation modal with the column value filled in
  • \n
  • Drag-and-drop functionality for reordering columns or moving tasks between columns
  • \n
\n

Swimlane Layout#

\n

When a swimLane property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes.

\n

Each swimlane row includes:

\n
    \n
  • A label cell showing the swimlane property value and total task count
  • \n
  • Multiple cells, each representing a column within that swimlane
  • \n
  • Scrollable cells containing task cards
  • \n
  • Add buttons inside cells that fill in both the column value and swimlane value
  • \n
\n

To pin swimlanes in a stable order, set the advanced swimLaneOrder option to a JSON object keyed by the swimlane property:

\n
config:\n  swimLane: note.contexts\n  swimLaneOrder: '{"note.contexts":["transitcal","bill","cycles-research","astrolabe"]}'\n

Listed swimlane values render first in the configured order. Values not listed in swimLaneOrder render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If hideEmptySwimLanes is disabled, listed values can remain visible even when no matching tasks are currently present.

\n

To show WIP limits in column headers, set the advanced wipLimits option to a JSON object keyed by column value:

\n
config:\n  wipLimits: '{"in-progress":5,"review":2}'\n

Columns with limits display counts as (current/limit). When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes.

\n

Task Cards#

\n

Each task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date.

\n

Use the Card Layout setting when a board needs a different density from other task views. Existing boards use Default unless cardLayout: compact is set in the view options.

\n

To show checklist progress on cards, include file.tasks in the view order array.\nFor existing .base files, add this in YAML manually first; after it is in order, it appears in the Bases picker as tasks.

\n

Click a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties.

\n

Column Operations#

\n

Reordering Columns#

\n

Drag column headers to reorder columns. The new order persists across sessions and is stored in the columnOrder configuration.

\n

Drag-and-Drop Tasks#

\n

Drag task cards between columns to update the groupBy property value. In swimlane mode, dragging a task to a different cell updates both the groupBy and swimLane properties.

\n

When grouping by a list property (contexts, tags, projects) with "Show items in multiple columns" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the "work" column to the "home" column changes contexts: [work, call] to contexts: [call, home].\nDrag operations write directly to task metadata, so consistent grouping values reduce ambiguity.

\n

The add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location.

\n

Manual Reordering Within Columns#

\n

Kanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order.

\n

To enable persistent manual ordering within Kanban columns:

\n
sort:\n  - column: tasknotes_manual_order\n    direction: DESC\n

Once the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions.

\n

In swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the "In Progress" column for the "High" swimlane only adjusts the tasks in that cell.

\n

Important constraints:

\n
    \n
  • Manual drag-to-reorder only works when the view sort includes the manual-order property.
  • \n
  • Moving a card to a different column or swimlane still updates the grouped property values as usual.
  • \n
  • In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.
  • \n
  • Large reorder operations may show a confirmation dialog before writing changes.
  • \n
\n

The default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists.

\n

Performance Optimization#

\n

The Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks.

\n

Virtual scrolling activates automatically based on task count. No configuration is required.

\n

Example Configuration#

\n

A typical Kanban view .base file includes:

\n
---\ntype: query\nsource: TaskNotes\nview: TaskNotes Kanban\nviews:\n  - name: TaskNotes Kanban\n    type: tasknotesKanban\n    groupBy:\n      property: task.status\n    config:\n      swimLane: task.priority\n      swimLaneOrder: '{"task.priority":["high","normal","low"]}'\n      columnWidth: 300\n      hideEmptyColumns: true\n      pinnedColumns: to-do, in-progress, done\n      wipLimits: '{"in-progress":5}'\n---\n

This configuration creates a Kanban board with:

\n
    \n
  • Columns based on task status
  • \n
  • Swimlanes based on task priority
  • \n
  • Priority swimlanes pinned in high, normal, low order
  • \n
  • 300px column width
  • \n
  • Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets
  • \n
  • A WIP limit of 5 tasks on the in-progress column
  • \n
\n

Filtering and Sorting#

\n

Filtering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column.

\n","text":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag operations over dense list scanning. Configuration# Kanban views are stored as .base files in TaskNotes/Views/. The groupBy property determines the column structure—each unique value becomes a column in the board. Open a .base file and access the view settings panel to configure options. Core Settings (Bases)# Data source: Select which files or folders to include in the view Filter: Define criteria to include or exclude specific tasks Sort: Specify the order of tasks within each column Group by: Required. Defines the property that creates columns (e.g., status, priority) Choosing a stable groupBy field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder. Kanban-Specific Options# Access these options through the Bases view settings panel: Swim Lane: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane) Column Width: Controls the width of columns in pixels. Range: 200-500px. Default: 280px Max Swimlane Height: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px Hide Empty Columns: When enabled, columns containing no tasks are hidden from the view Pinned Columns: Optional comma-separated list of column values that should stay visible even when empty. This is useful with Hide Empty Columns when each board needs a small stable subset of shared statuses or categories WIP Limits: Advanced JSON configuration for showing per-column work-in-progress limits in column headers Hide Empty Swimlanes: When enabled, ordered swimlanes with no tasks are hidden from the view Card Layout: Chooses the task card density for this board. Default uses the standard TaskNotes card layout. Compact uses a tighter card layout for denser boards Show items in multiple columns: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with contexts: [work, call] appears in both the \"work\" and \"call\" columns. When disabled, tasks appear in a single combined column (e.g., \"work, call\") Hide top-level subtasks: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks Column Order: Managed automatically when dragging column headers. Stores custom column ordering Swim Lane Order: Advanced JSON configuration for pinning swimlane rows in a stable order A common setup is to keep one board grouped by status and another grouped by project or context, each in a separate .base file. Interface Layout# Standard Layout# In standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the groupBy property. Each column includes: A header showing the property value and task count A scrollable area containing task cards An add button that opens the TaskNotes creation modal with the column value filled in Drag-and-drop functionality for reordering columns or moving tasks between columns Swimlane Layout# When a swimLane property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes. Each swimlane row includes: A label cell showing the swimlane property value and total task count Multiple cells, each representing a column within that swimlane Scrollable cells containing task cards Add buttons inside cells that fill in both the column value and swimlane value To pin swimlanes in a stable order, set the advanced swimLaneOrder option to a JSON object keyed by the swimlane property: config: swimLane: note.contexts swimLaneOrder: '{\"note.contexts\":[\"transitcal\",\"bill\",\"cycles-research\",\"astrolabe\"]}' Listed swimlane values render first in the configured order. Values not listed in swimLaneOrder render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If hideEmptySwimLanes is disabled, listed values can remain visible even when no matching tasks are currently present. To show WIP limits in column headers, set the advanced wipLimits option to a JSON object keyed by column value: config: wipLimits: '{\"in-progress\":5,\"review\":2}' Columns with limits display counts as (current/limit). When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes. Task Cards# Each task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date. Use the Card Layout setting when a board needs a different density from other task views. Existing boards use Default unless cardLayout: compact is set in the view options. To show checklist progress on cards, include file.tasks in the view order array. For existing .base files, add this in YAML manually first; after it is in order, it appears in the Bases picker as tasks. Click a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties. Column Operations# Reordering Columns# Drag column headers to reorder columns. The new order persists across sessions and is stored in the columnOrder configuration. Drag-and-Drop Tasks# Drag task cards between columns to update the groupBy property value. In swimlane mode, dragging a task to a different cell updates both the groupBy and swimLane properties. When grouping by a list property (contexts, tags, projects) with \"Show items in multiple columns\" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the \"work\" column to the \"home\" column changes contexts: [work, call] to contexts: [call, home]. Drag operations write directly to task metadata, so consistent grouping values reduce ambiguity. The add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location. Manual Reordering Within Columns# Kanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering within Kanban columns: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions. In swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the \"In Progress\" column for the \"High\" swimlane only adjusts the tasks in that cell. Important constraints: Manual drag-to-reorder only works when the view sort includes the manual-order property. Moving a card to a different column or swimlane still updates the grouped property values as usual. In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists. Performance Optimization# The Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks. Virtual scrolling activates automatically based on task count. No configuration is required. Example Configuration# A typical Kanban view .base file includes: --- type: query source: TaskNotes view: TaskNotes Kanban views: - name: TaskNotes Kanban type: tasknotesKanban groupBy: property: task.status config: swimLane: task.priority swimLaneOrder: '{\"task.priority\":[\"high\",\"normal\",\"low\"]}' columnWidth: 300 hideEmptyColumns: true pinnedColumns: to-do, in-progress, done wipLimits: '{\"in-progress\":5}' --- This configuration creates a Kanban board with: Columns based on task status Swimlanes based on task priority Priority swimlanes pinned in high, normal, low order 300px column width Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets A WIP limit of 5 tasks on the in-progress column Filtering and Sorting# Filtering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column."},{"route":"/obsidian/views/pomodoro-view/","title":"Pomodoro View","description":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/pomodoro-view.md","namespace":"obsidian","relativePath":"views/pomodoro-view.md","raw":"# Pomodoro View\n\n\nThe Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.\n\n## Timer Interface\n\nThe Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete.\n\n![Pomodoro Timer](../assets/feature-pomodoro-timer.png)\n\n## Pomodoro Stats View\n\nThe Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks.\n\n![Pomodoro Statistics](../assets/feature-pomodoro-stats.png)\n","aliases":["/views/pomodoro-view/"],"toc":[{"level":2,"id":"timer-interface","text":"Timer Interface"},{"level":2,"id":"pomodoro-stats-view","text":"Pomodoro Stats View"}],"html":"

The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.

\n

Timer Interface#

\n

The Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete.

\n

\"Pomodoro

\n

Pomodoro Stats View#

\n

The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks.

\n

\"Pomodoro

\n","text":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique. Timer Interface# The Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete. Pomodoro Stats View# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks."},{"route":"/obsidian/views/task-list/","title":"Task List View","description":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/views/task-list.md","namespace":"obsidian","relativePath":"views/task-list.md","raw":"# Task List View\n\n\nThe Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML.\nThis view is optimized for high task volume and explicit filter definitions.\n\n![Task List View](../assets/views-tasks-list.png)\n\n## Bases Architecture\n\nTask List is implemented as a `.base` file located in `TaskNotes/Views/tasks-default.base` by default. It requires the Bases core plugin to be enabled.\n\n### What is Bases?\n\nBases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks.\n\nTo enable Bases:\n1. Open `Settings -> Core Plugins`\n2. Enable \"Bases\"\n3. TaskNotes view commands will now open `.base` files from `TaskNotes/Views/`\nIf commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended `.base` file.\n\n### View File Location\n\nWhen you use the \"Open Tasks View\" command or ribbon icon, TaskNotes opens the `.base` file configured under `Settings -> TaskNotes -> General -> Views & base files` (initially `TaskNotes/Views/tasks-default.base`). TaskNotes creates missing default `.base` files automatically on startup when **Auto-create default files** is enabled, and you can point the command to any other `.base` file if you maintain multiple task-list layouts.\n\n## Configuration\n\nTask List views are configured through YAML frontmatter in the `.base` file. The YAML defines which tasks to show, how to sort them, and how to group them.\n\n### Basic Structure\n\n```yaml\n# All Tasks\n\nviews:\n - type: tasknotesTaskList\n name: \"All Tasks\"\n order:\n - note.status\n - note.priority\n - note.due\n - note.scheduled\n - note.projects\n - note.contexts\n - file.tags\n sort:\n - column: due\n direction: ASC\n```\n\n### Configuration Options\n\n**`type`**: Must be `tasknotesTaskList` for Task List views\n\n**`name`**: Display name shown in the view header\n\n**`order`**: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., `note.status`, `note.priority`, `note.due`, `file.tasks`).\nFor existing `.base` files, add `file.tasks` in YAML manually; once present in `order`, it appears in the Bases picker as `tasks`.\n\n**`sort`**: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria.\n- `column`: Property to sort by (e.g., `due`, `scheduled`, `priority`, `title`)\n- `direction`: `ASC` (ascending) or `DESC` (descending)\n\n**`groupBy`**: Optional grouping configuration\n- `property`: Property to group by (e.g., `note.status`, `note.priority`)\n- `direction`: Sort direction for group headers\n\n**`hideTopLevelSubtasks`**: Optional boolean. When `true`, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks.\n\n**`filters`**: Optional filter conditions using Bases query syntax\n```yaml\nfilters:\n and:\n - note.status == \"Open\"\n - note.priority == \"High\"\n```\nStart with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites.\n\n### Property Mapping\n\nTaskNotes properties are accessed in Bases YAML using these paths:\n\n| TaskNotes Property | Bases Property Path | Description |\n|-------------------|-------------------|-------------|\n| Status | `note.status` | Task status value |\n| Priority | `note.priority` | Priority level |\n| Due date | `note.due` | Due date/time |\n| Scheduled date | `note.scheduled` | Scheduled date/time |\n| Projects | `note.projects` | Associated projects |\n| Contexts | `note.contexts` | Task contexts |\n| Tags | `file.tags` | File tags |\n| Checklist progress | `file.tasks` | First-level markdown checkbox progress shown as the TaskNotes checklist progress bar |\n| Time estimate | `note.timeEstimate` | Estimated duration |\n| Recurrence | `note.recurrence` | Recurrence pattern |\n| Blocked by | `note.blockedBy` | Blocking dependencies |\n| Title | `file.name` | Task title (file name) |\n| Created | `file.ctime` | File creation date |\n| Modified | `file.mtime` | File modification date |\n\nThe exact property names depend on your TaskNotes field mapping settings (`Settings -> TaskNotes -> Task Properties`). The table above shows default mappings.\n\n## Filtering and Sorting\n\n### Adding Filters\n\nEdit the `.base` file to add filter conditions using Bases query syntax:\n\n```yaml\nviews:\n - type: tasknotesTaskList\n name: \"High Priority Tasks\"\n filters:\n and:\n - note.priority == \"High\"\n - note.status != \"Completed\"\n order:\n - note.status\n - note.priority\n - note.due\n```\n\n### Filter Operators\n\nBases supports standard comparison operators:\n- `==` (equals), `!=` (not equals)\n- `>`, `<`, `>=`, `<=` (comparison)\n- `contains()` (substring/array membership)\n- Boolean logic: `and`, `or`\n\nFor detailed filter syntax, see the [Bases documentation](https://help.obsidian.md/Plugins/Bases).\n\n### Sorting Examples\n\nSingle sort criterion:\n```yaml\nsort:\n - column: due\n direction: ASC\n```\n\nMultiple sort criteria:\n```yaml\nsort:\n - column: priority\n direction: DESC\n - column: due\n direction: ASC\n - column: title\n direction: ASC\n```\n\n### Drag-to-Reorder\n\nTask List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is `tasknotes_manual_order`.\n\nTo enable persistent manual ordering in a Task List view:\n\n```yaml\nsort:\n - column: tasknotes_manual_order\n direction: DESC\n```\n\nOnce the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions.\n\nIf your field mapping changes the sort-order property name, use that mapped property name instead of `tasknotes_manual_order`.\n\n### Drag-to-Reorder with Grouping\n\nGrouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the \"In Progress\" group updates the manual order for tasks in that group.\n\nImportant constraints:\n\n- Drag-to-reorder only works when the view sort includes the manual-order property.\n- Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly.\n- In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.\n- Large reorder operations may show a confirmation dialog before writing changes.\n\nThe default generated TaskNotes task-list templates include a **Manual Order** view that is already configured for this behavior.\n\n## Grouping\n\nGroups organize tasks under collapsible headers based on a property value.\n\n### Enable Grouping\n\nAdd `groupBy` configuration to your view:\n\n```yaml\nviews:\n - type: tasknotesTaskList\n name: \"Tasks by Status\"\n groupBy:\n property: note.status\n direction: ASC\n order:\n - note.status\n - note.priority\n - note.due\n```\n\n### Available Grouping Properties\n\nCommon grouping properties:\n- `note.status` - Group by task status\n- `note.priority` - Group by priority level\n- `note.contexts` - Group by first context\n- `note.projects` - Group by project (tasks can appear in multiple groups)\n\n### Interactive Group Headers\n\nGroup headers support interaction:\n- Click to expand/collapse the group\n- Click on project links in headers to navigate to project notes\n- Hover over project links with Ctrl to preview project notes\n\n### Collapsed State Persistence\n\nCollapsed/expanded state for each group is preserved across sessions.\n\n## Creating Multiple Views\n\nYou can create multiple `.base` files for different task perspectives:\n\n1. Duplicate an existing `.base` file in `TaskNotes/Views/`\n2. Rename it (e.g., `High Priority.base`)\n3. Edit the YAML configuration for that view\n4. Open the file to see the customized view\n\n### Example: Context-Specific View\n\n```yaml\n# Work Tasks\n\nviews:\n - type: tasknotesTaskList\n name: \"Work Context\"\n filters:\n and:\n - note.contexts.contains(\"work\")\n groupBy:\n property: note.priority\n direction: DESC\n order:\n - note.status\n - note.priority\n - note.due\n```\n\n## Migrating from v3 Saved Views\n\nTaskNotes v3 stored filter configurations in plugin settings. These saved views are **not automatically migrated** to v4.\n\nTo recreate a v3 saved view:\n1. Create a new `.base` file in `TaskNotes/Views/`\n2. Translate your v3 filter conditions to Bases YAML syntax\n3. Configure sorting and grouping through YAML\n4. Save the file\n\nThe v3 FilterBar UI component no longer exists - all configuration is done through YAML editing.\n\n## Task Actions\n\nThe Task List View provides interaction with tasks through clicking and context menus:\n\n- **Click on a task**: Opens the task for editing or navigates to the task note (behavior configured in `Settings -> TaskNotes -> General` in click-action controls)\n- **Right-click on a task**: Opens a context menu with actions:\n - Mark as complete\n - Change priority\n - Change status\n - Edit dates\n - Delete task\n - And more\n\nContext menu availability depends on your TaskNotes settings and task properties.\n\n## Virtual Scrolling\n\nThe Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides:\n\n- Approximately 90% memory reduction for large lists\n- Elimination of UI lag when scrolling through hundreds of tasks\n- Smooth performance with unlimited task counts\n\nVirtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll.\n\n## Further Reading\n\n- [Default Base Templates](default-base-templates.md) - Complete templates for all TaskNotes views\n- [Bases Plugin Documentation](https://help.obsidian.md/Plugins/Bases) - Official Obsidian documentation for Bases syntax and features\n- [Kanban View](kanban-view.md) - Alternative board-based task visualization\n- [Calendar Views](calendar-views.md) - Time-based task visualization\n- [Views Overview](../views.md) - All available TaskNotes views\n","aliases":["/views/task-list/"],"toc":[{"level":2,"id":"bases-architecture","text":"Bases Architecture"},{"level":3,"id":"what-is-bases","text":"What is Bases?"},{"level":3,"id":"view-file-location","text":"View File Location"},{"level":2,"id":"configuration","text":"Configuration"},{"level":3,"id":"basic-structure","text":"Basic Structure"},{"level":3,"id":"configuration-options","text":"Configuration Options"},{"level":3,"id":"property-mapping","text":"Property Mapping"},{"level":2,"id":"filtering-and-sorting","text":"Filtering and Sorting"},{"level":3,"id":"adding-filters","text":"Adding Filters"},{"level":3,"id":"filter-operators","text":"Filter Operators"},{"level":3,"id":"sorting-examples","text":"Sorting Examples"},{"level":3,"id":"drag-to-reorder","text":"Drag-to-Reorder"},{"level":3,"id":"drag-to-reorder-with-grouping","text":"Drag-to-Reorder with Grouping"},{"level":2,"id":"grouping","text":"Grouping"},{"level":3,"id":"enable-grouping","text":"Enable Grouping"},{"level":3,"id":"available-grouping-properties","text":"Available Grouping Properties"},{"level":3,"id":"interactive-group-headers","text":"Interactive Group Headers"},{"level":3,"id":"collapsed-state-persistence","text":"Collapsed State Persistence"},{"level":2,"id":"creating-multiple-views","text":"Creating Multiple Views"},{"level":3,"id":"example-context-specific-view","text":"Example: Context-Specific View"},{"level":2,"id":"migrating-from-v3-saved-views","text":"Migrating from v3 Saved Views"},{"level":2,"id":"task-actions","text":"Task Actions"},{"level":2,"id":"virtual-scrolling","text":"Virtual Scrolling"},{"level":2,"id":"further-reading","text":"Further Reading"}],"html":"

The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML.\nThis view is optimized for high task volume and explicit filter definitions.

\n

\"Task

\n

Bases Architecture#

\n

Task List is implemented as a .base file located in TaskNotes/Views/tasks-default.base by default. It requires the Bases core plugin to be enabled.

\n

What is Bases?#

\n

Bases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks.

\n

To enable Bases:

\n
    \n
  1. Open Settings -> Core Plugins
  2. \n
  3. Enable "Bases"
  4. \n
  5. TaskNotes view commands will now open .base files from TaskNotes/Views/\nIf commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended .base file.
  6. \n
\n

View File Location#

\n

When you use the "Open Tasks View" command or ribbon icon, TaskNotes opens the .base file configured under Settings -> TaskNotes -> General -> Views & base files (initially TaskNotes/Views/tasks-default.base). TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled, and you can point the command to any other .base file if you maintain multiple task-list layouts.

\n

Configuration#

\n

Task List views are configured through YAML frontmatter in the .base file. The YAML defines which tasks to show, how to sort them, and how to group them.

\n

Basic Structure#

\n
# All Tasks\n\nviews:\n  - type: tasknotesTaskList\n    name: "All Tasks"\n    order:\n      - note.status\n      - note.priority\n      - note.due\n      - note.scheduled\n      - note.projects\n      - note.contexts\n      - file.tags\n    sort:\n      - column: due\n        direction: ASC\n

Configuration Options#

\n

type: Must be tasknotesTaskList for Task List views

\n

name: Display name shown in the view header

\n

order: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., note.status, note.priority, note.due, file.tasks).\nFor existing .base files, add file.tasks in YAML manually; once present in order, it appears in the Bases picker as tasks.

\n

sort: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria.

\n
    \n
  • column: Property to sort by (e.g., due, scheduled, priority, title)
  • \n
  • direction: ASC (ascending) or DESC (descending)
  • \n
\n

groupBy: Optional grouping configuration

\n
    \n
  • property: Property to group by (e.g., note.status, note.priority)
  • \n
  • direction: Sort direction for group headers
  • \n
\n

hideTopLevelSubtasks: Optional boolean. When true, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks.

\n

filters: Optional filter conditions using Bases query syntax

\n
filters:\n  and:\n    - note.status == "Open"\n    - note.priority == "High"\n

Start with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites.

\n

Property Mapping#

\n

TaskNotes properties are accessed in Bases YAML using these paths:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TaskNotes PropertyBases Property PathDescription
Statusnote.statusTask status value
Prioritynote.priorityPriority level
Due datenote.dueDue date/time
Scheduled datenote.scheduledScheduled date/time
Projectsnote.projectsAssociated projects
Contextsnote.contextsTask contexts
Tagsfile.tagsFile tags
Checklist progressfile.tasksFirst-level markdown checkbox progress shown as the TaskNotes checklist progress bar
Time estimatenote.timeEstimateEstimated duration
Recurrencenote.recurrenceRecurrence pattern
Blocked bynote.blockedByBlocking dependencies
Titlefile.nameTask title (file name)
Createdfile.ctimeFile creation date
Modifiedfile.mtimeFile modification date
\n

The exact property names depend on your TaskNotes field mapping settings (Settings -> TaskNotes -> Task Properties). The table above shows default mappings.

\n

Filtering and Sorting#

\n

Adding Filters#

\n

Edit the .base file to add filter conditions using Bases query syntax:

\n
views:\n  - type: tasknotesTaskList\n    name: "High Priority Tasks"\n    filters:\n      and:\n        - note.priority == "High"\n        - note.status != "Completed"\n    order:\n      - note.status\n      - note.priority\n      - note.due\n

Filter Operators#

\n

Bases supports standard comparison operators:

\n
    \n
  • == (equals), != (not equals)
  • \n
  • >, <, >=, <= (comparison)
  • \n
  • contains() (substring/array membership)
  • \n
  • Boolean logic: and, or
  • \n
\n

For detailed filter syntax, see the Bases documentation.

\n

Sorting Examples#

\n

Single sort criterion:

\n
sort:\n  - column: due\n    direction: ASC\n

Multiple sort criteria:

\n
sort:\n  - column: priority\n    direction: DESC\n  - column: due\n    direction: ASC\n  - column: title\n    direction: ASC\n

Drag-to-Reorder#

\n

Task List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order.

\n

To enable persistent manual ordering in a Task List view:

\n
sort:\n  - column: tasknotes_manual_order\n    direction: DESC\n

Once the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions.

\n

If your field mapping changes the sort-order property name, use that mapped property name instead of tasknotes_manual_order.

\n

Drag-to-Reorder with Grouping#

\n

Grouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the "In Progress" group updates the manual order for tasks in that group.

\n

Important constraints:

\n
    \n
  • Drag-to-reorder only works when the view sort includes the manual-order property.
  • \n
  • Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly.
  • \n
  • In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order.
  • \n
  • Large reorder operations may show a confirmation dialog before writing changes.
  • \n
\n

The default generated TaskNotes task-list templates include a Manual Order view that is already configured for this behavior.

\n

Grouping#

\n

Groups organize tasks under collapsible headers based on a property value.

\n

Enable Grouping#

\n

Add groupBy configuration to your view:

\n
views:\n  - type: tasknotesTaskList\n    name: "Tasks by Status"\n    groupBy:\n      property: note.status\n      direction: ASC\n    order:\n      - note.status\n      - note.priority\n      - note.due\n

Available Grouping Properties#

\n

Common grouping properties:

\n
    \n
  • note.status - Group by task status
  • \n
  • note.priority - Group by priority level
  • \n
  • note.contexts - Group by first context
  • \n
  • note.projects - Group by project (tasks can appear in multiple groups)
  • \n
\n

Interactive Group Headers#

\n

Group headers support interaction:

\n
    \n
  • Click to expand/collapse the group
  • \n
  • Click on project links in headers to navigate to project notes
  • \n
  • Hover over project links with Ctrl to preview project notes
  • \n
\n

Collapsed State Persistence#

\n

Collapsed/expanded state for each group is preserved across sessions.

\n

Creating Multiple Views#

\n

You can create multiple .base files for different task perspectives:

\n
    \n
  1. Duplicate an existing .base file in TaskNotes/Views/
  2. \n
  3. Rename it (e.g., High Priority.base)
  4. \n
  5. Edit the YAML configuration for that view
  6. \n
  7. Open the file to see the customized view
  8. \n
\n

Example: Context-Specific View#

\n
# Work Tasks\n\nviews:\n  - type: tasknotesTaskList\n    name: "Work Context"\n    filters:\n      and:\n        - note.contexts.contains("work")\n    groupBy:\n      property: note.priority\n      direction: DESC\n    order:\n      - note.status\n      - note.priority\n      - note.due\n

Migrating from v3 Saved Views#

\n

TaskNotes v3 stored filter configurations in plugin settings. These saved views are not automatically migrated to v4.

\n

To recreate a v3 saved view:

\n
    \n
  1. Create a new .base file in TaskNotes/Views/
  2. \n
  3. Translate your v3 filter conditions to Bases YAML syntax
  4. \n
  5. Configure sorting and grouping through YAML
  6. \n
  7. Save the file
  8. \n
\n

The v3 FilterBar UI component no longer exists - all configuration is done through YAML editing.

\n

Task Actions#

\n

The Task List View provides interaction with tasks through clicking and context menus:

\n
    \n
  • Click on a task: Opens the task for editing or navigates to the task note (behavior configured in Settings -> TaskNotes -> General in click-action controls)
  • \n
  • Right-click on a task: Opens a context menu with actions:
      \n
    • Mark as complete
    • \n
    • Change priority
    • \n
    • Change status
    • \n
    • Edit dates
    • \n
    • Delete task
    • \n
    • And more
    • \n
    \n
  • \n
\n

Context menu availability depends on your TaskNotes settings and task properties.

\n

Virtual Scrolling#

\n

The Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides:

\n
    \n
  • Approximately 90% memory reduction for large lists
  • \n
  • Elimination of UI lag when scrolling through hundreds of tasks
  • \n
  • Smooth performance with unlimited task counts
  • \n
\n

Virtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll.

\n

Further Reading#

\n\n","text":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML. This view is optimized for high task volume and explicit filter definitions. Bases Architecture# Task List is implemented as a .base file located in TaskNotes/Views/tasks-default.base by default. It requires the Bases core plugin to be enabled. What is Bases?# Bases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks. To enable Bases: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes view commands will now open .base files from TaskNotes/Views/ If commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended .base file. View File Location# When you use the \"Open Tasks View\" command or ribbon icon, TaskNotes opens the .base file configured under Settings -> TaskNotes -> General -> Views & base files (initially TaskNotes/Views/tasks-default.base). TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled, and you can point the command to any other .base file if you maintain multiple task-list layouts. Configuration# Task List views are configured through YAML frontmatter in the .base file. The YAML defines which tasks to show, how to sort them, and how to group them. Basic Structure# # All Tasks views: - type: tasknotesTaskList name: \"All Tasks\" order: - note.status - note.priority - note.due - note.scheduled - note.projects - note.contexts - file.tags sort: - column: due direction: ASC Configuration Options# type: Must be tasknotesTaskList for Task List views name: Display name shown in the view header order: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., note.status, note.priority, note.due, file.tasks). For existing .base files, add file.tasks in YAML manually; once present in order, it appears in the Bases picker as tasks. sort: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria. column: Property to sort by (e.g., due, scheduled, priority, title) direction: ASC (ascending) or DESC (descending) groupBy: Optional grouping configuration property: Property to group by (e.g., note.status, note.priority) direction: Sort direction for group headers hideTopLevelSubtasks: Optional boolean. When true, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks. filters: Optional filter conditions using Bases query syntax filters: and: - note.status == \"Open\" - note.priority == \"High\" Start with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites. Property Mapping# TaskNotes properties are accessed in Bases YAML using these paths: TaskNotes Property Bases Property Path Description Status note.status Task status value Priority note.priority Priority level Due date note.due Due date/time Scheduled date note.scheduled Scheduled date/time Projects note.projects Associated projects Contexts note.contexts Task contexts Tags file.tags File tags Checklist progress file.tasks First-level markdown checkbox progress shown as the TaskNotes checklist progress bar Time estimate note.timeEstimate Estimated duration Recurrence note.recurrence Recurrence pattern Blocked by note.blockedBy Blocking dependencies Title file.name Task title (file name) Created file.ctime File creation date Modified file.mtime File modification date The exact property names depend on your TaskNotes field mapping settings (Settings -> TaskNotes -> Task Properties). The table above shows default mappings. Filtering and Sorting# Adding Filters# Edit the .base file to add filter conditions using Bases query syntax: views: - type: tasknotesTaskList name: \"High Priority Tasks\" filters: and: - note.priority == \"High\" - note.status != \"Completed\" order: - note.status - note.priority - note.due Filter Operators# Bases supports standard comparison operators: == (equals), != (not equals) >, <, >=, <= (comparison) contains() (substring/array membership) Boolean logic: and, or For detailed filter syntax, see the Bases documentation. Sorting Examples# Single sort criterion: sort: - column: due direction: ASC Multiple sort criteria: sort: - column: priority direction: DESC - column: due direction: ASC - column: title direction: ASC Drag-to-Reorder# Task List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering in a Task List view: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions. If your field mapping changes the sort-order property name, use that mapped property name instead of tasknotes_manual_order. Drag-to-Reorder with Grouping# Grouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the \"In Progress\" group updates the manual order for tasks in that group. Important constraints: Drag-to-reorder only works when the view sort includes the manual-order property. Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly. In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes task-list templates include a Manual Order view that is already configured for this behavior. Grouping# Groups organize tasks under collapsible headers based on a property value. Enable Grouping# Add groupBy configuration to your view: views: - type: tasknotesTaskList name: \"Tasks by Status\" groupBy: property: note.status direction: ASC order: - note.status - note.priority - note.due Available Grouping Properties# Common grouping properties: note.status - Group by task status note.priority - Group by priority level note.contexts - Group by first context note.projects - Group by project (tasks can appear in multiple groups) Interactive Group Headers# Group headers support interaction: Click to expand/collapse the group Click on project links in headers to navigate to project notes Hover over project links with Ctrl to preview project notes Collapsed State Persistence# Collapsed/expanded state for each group is preserved across sessions. Creating Multiple Views# You can create multiple .base files for different task perspectives: Duplicate an existing .base file in TaskNotes/Views/ Rename it (e.g., High Priority.base) Edit the YAML configuration for that view Open the file to see the customized view Example: Context-Specific View# # Work Tasks views: - type: tasknotesTaskList name: \"Work Context\" filters: and: - note.contexts.contains(\"work\") groupBy: property: note.priority direction: DESC order: - note.status - note.priority - note.due Migrating from v3 Saved Views# TaskNotes v3 stored filter configurations in plugin settings. These saved views are not automatically migrated to v4. To recreate a v3 saved view: Create a new .base file in TaskNotes/Views/ Translate your v3 filter conditions to Bases YAML syntax Configure sorting and grouping through YAML Save the file The v3 FilterBar UI component no longer exists - all configuration is done through YAML editing. Task Actions# The Task List View provides interaction with tasks through clicking and context menus: Click on a task: Opens the task for editing or navigates to the task note (behavior configured in Settings -> TaskNotes -> General in click-action controls) Right-click on a task: Opens a context menu with actions: Mark as complete Change priority Change status Edit dates Delete task And more Context menu availability depends on your TaskNotes settings and task properties. Virtual Scrolling# The Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides: Approximately 90% memory reduction for large lists Elimination of UI lag when scrolling through hundreds of tasks Smooth performance with unlimited task counts Virtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll. Further Reading# Default Base Templates - Complete templates for all TaskNotes views Bases Plugin Documentation - Official Obsidian documentation for Bases syntax and features Kanban View - Alternative board-based task visualization Calendar Views - Time-based task visualization Views Overview - All available TaskNotes views"},{"route":"/obsidian/webhooks/","title":"TaskNotes Webhooks","description":"TaskNotes webhooks send HTTP POST requests when selected events occur.","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/webhooks.md","namespace":"obsidian","relativePath":"webhooks.md","raw":"# TaskNotes Webhooks\n\nTaskNotes webhooks send HTTP POST requests when selected events occur.\n\n## Prerequisites\n\n1. Enable HTTP API in `Settings -> TaskNotes -> Integrations -> HTTP API`.\n2. Create at least one webhook (settings UI or API).\n3. Subscribe it to one or more events.\n\n## Event Types\n\nTask events:\n\n- `task.created`\n- `task.updated`\n- `task.deleted`\n- `task.completed`\n- `task.archived`\n- `task.unarchived`\n\nTime events:\n\n- `time.started`\n- `time.stopped`\n\nPomodoro events:\n\n- `pomodoro.started`\n- `pomodoro.completed`\n- `pomodoro.interrupted`\n\nRecurring events:\n\n- `recurring.instance.completed`\n- `recurring.instance.skipped`\n\nCompleting a materialized occurrence note emits `recurring.instance.completed` with the reconciled parent task plus the completed `occurrence` and `date` in the event data. Skipping virtual recurring instances emits `recurring.instance.skipped`; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook.\n\nReminder events:\n\n- `reminder.triggered`\n\n## Payload Shape\n\nAll webhook payloads use the same top-level envelope:\n\n```json\n{\n \"event\": \"task.created\",\n \"timestamp\": \"2026-02-21T10:30:00.000Z\",\n \"vault\": {\n \"name\": \"My Vault\",\n \"path\": \"/path/to/vault\"\n },\n \"data\": {}\n}\n```\n\n`data` is event-specific.\n\n## Register and Manage Webhooks via API\n\n### Create\n\n`POST /api/webhooks`\n\nRequired fields:\n\n- `url` (string)\n- `events` (non-empty array)\n\nOptional fields:\n\n- `id`\n- `secret` (auto-generated if omitted)\n- `active` (default `true`)\n- `transformFile`\n- `corsHeaders` (default `true`)\n\nExample:\n\n```bash\ncurl -X POST http://localhost:8080/api/webhooks \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"url\": \"https://example.com/tasknotes\",\n \"events\": [\"task.completed\", \"task.created\"],\n \"transformFile\": \"TaskNotes/webhooks/slack.json\"\n }'\n```\n\n### List\n\n`GET /api/webhooks`\n\nReturns registered hooks. Secrets are not returned.\n\n### Delete\n\n`DELETE /api/webhooks/:id`\n\n### Delivery History\n\n`GET /api/webhooks/deliveries`\n\nReturns last 100 in-memory deliveries.\n\n## Delivery Behavior\n\nCurrent implementation behavior:\n\n- Webhook processing is asynchronous (fire-and-forget from task operation).\n- Each delivery starts with one attempt.\n- Failed deliveries retry with exponential backoff: `1s`, `2s`, `4s`.\n- Maximum retries: `3` retries after initial attempt (up to 4 attempts total).\n- If cumulative `failureCount` for a webhook exceeds `10`, webhook is auto-disabled.\n- No explicit request timeout is set in delivery fetch.\n\nBecause retries and duplicates are possible, handlers should be idempotent.\n\n## Signature Verification\n\nWhen `corsHeaders` is enabled (default), delivery includes:\n\n- `X-TaskNotes-Event`\n- `X-TaskNotes-Signature`\n- `X-TaskNotes-Delivery-ID`\n\nSignature is HMAC-SHA256 over `JSON.stringify(payload)` using webhook `secret`.\n\nNode.js example:\n\n```javascript\nconst crypto = require(\"crypto\");\n\nfunction verifyWebhook(payload, signature, secret) {\n const expected = crypto\n .createHmac(\"sha256\", secret)\n .update(JSON.stringify(payload))\n .digest(\"hex\");\n return signature === expected;\n}\n```\n\n## Payload Transformations\n\nA webhook can specify `transformFile` pointing to a file in your vault.\n\nSupported file types:\n\n- `.json`: event template map with variable interpolation\n\nIf transform execution fails, TaskNotes falls back to original payload.\n\nJavaScript transform files are no longer supported.\n\n### JSON Transform Files\n\nStructure:\n\n```json\n{\n \"task.completed\": {\n \"text\": \"Task completed: ${data.task.title}\",\n \"vault\": \"${vault.name}\"\n },\n \"default\": {\n \"text\": \"TaskNotes event: ${event}\"\n }\n}\n```\n\nRules:\n\n- Matching order: exact event key, then `default`.\n- Variables use `${path.to.value}`.\n- Missing variables are left unchanged.\n\n## CORS and Headers\n\nWebhook delivery requests are outbound server-side requests from TaskNotes.\n\n`corsHeaders` behavior:\n\n- `true` (default): sends TaskNotes custom headers including signature.\n- `false`: only sends `Content-Type: application/json`.\n\nDisable custom headers for endpoints that reject non-standard headers.\n\n## Testing\n\n### Local Test Server\n\nUse repository script:\n\n```bash\nnode test-webhook.js\n```\n\nOptional custom port:\n\n```bash\nnode test-webhook.js 8080\n```\n\nDefault server values:\n\n- URL: `http://localhost:3000/webhook`\n- Test secret: `test-secret-key-for-tasknotes-webhooks`\n\n### External Inspection\n\nFor quick inspection, use a request-bin tool such as `webhook.site`.\n\n## Troubleshooting\n\n### No deliveries\n\n1. Confirm HTTP API is enabled.\n2. Confirm webhook is active.\n3. Confirm event is subscribed.\n\n### Signature mismatch\n\n1. Confirm secret matches webhook config.\n2. Verify your verifier hashes the exact JSON body.\n3. Verify hex digest comparison.\n\n### Webhook disabled automatically\n\nIf failures continue and `failureCount` exceeds 10, webhook is disabled.\n\n1. Fix endpoint availability or response handling.\n2. Re-enable webhook in TaskNotes settings, or recreate it via `POST /api/webhooks`.\n\n### Transform errors\n\n1. Confirm `transformFile` exists in vault.\n2. Confirm the file is a `.json` transform template.\n3. Check Obsidian console logs for transform exceptions.\n","aliases":["/webhooks/"],"toc":[{"level":2,"id":"prerequisites","text":"Prerequisites"},{"level":2,"id":"event-types","text":"Event Types"},{"level":2,"id":"payload-shape","text":"Payload Shape"},{"level":2,"id":"register-and-manage-webhooks-via-api","text":"Register and Manage Webhooks via API"},{"level":3,"id":"create","text":"Create"},{"level":3,"id":"list","text":"List"},{"level":3,"id":"delete","text":"Delete"},{"level":3,"id":"delivery-history","text":"Delivery History"},{"level":2,"id":"delivery-behavior","text":"Delivery Behavior"},{"level":2,"id":"signature-verification","text":"Signature Verification"},{"level":2,"id":"payload-transformations","text":"Payload Transformations"},{"level":3,"id":"json-transform-files","text":"JSON Transform Files"},{"level":2,"id":"cors-and-headers","text":"CORS and Headers"},{"level":2,"id":"testing","text":"Testing"},{"level":3,"id":"local-test-server","text":"Local Test Server"},{"level":3,"id":"external-inspection","text":"External Inspection"},{"level":2,"id":"troubleshooting","text":"Troubleshooting"},{"level":3,"id":"no-deliveries","text":"No deliveries"},{"level":3,"id":"signature-mismatch","text":"Signature mismatch"},{"level":3,"id":"webhook-disabled-automatically","text":"Webhook disabled automatically"},{"level":3,"id":"transform-errors","text":"Transform errors"}],"html":"

TaskNotes webhooks send HTTP POST requests when selected events occur.

\n

Prerequisites#

\n
    \n
  1. Enable HTTP API in Settings -> TaskNotes -> Integrations -> HTTP API.
  2. \n
  3. Create at least one webhook (settings UI or API).
  4. \n
  5. Subscribe it to one or more events.
  6. \n
\n

Event Types#

\n

Task events:

\n
    \n
  • task.created
  • \n
  • task.updated
  • \n
  • task.deleted
  • \n
  • task.completed
  • \n
  • task.archived
  • \n
  • task.unarchived
  • \n
\n

Time events:

\n
    \n
  • time.started
  • \n
  • time.stopped
  • \n
\n

Pomodoro events:

\n
    \n
  • pomodoro.started
  • \n
  • pomodoro.completed
  • \n
  • pomodoro.interrupted
  • \n
\n

Recurring events:

\n
    \n
  • recurring.instance.completed
  • \n
  • recurring.instance.skipped
  • \n
\n

Completing a materialized occurrence note emits recurring.instance.completed with the reconciled parent task plus the completed occurrence and date in the event data. Skipping virtual recurring instances emits recurring.instance.skipped; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook.

\n

Reminder events:

\n
    \n
  • reminder.triggered
  • \n
\n

Payload Shape#

\n

All webhook payloads use the same top-level envelope:

\n
{\n  "event": "task.created",\n  "timestamp": "2026-02-21T10:30:00.000Z",\n  "vault": {\n    "name": "My Vault",\n    "path": "/path/to/vault"\n  },\n  "data": {}\n}\n

data is event-specific.

\n

Register and Manage Webhooks via API#

\n

Create#

\n

POST /api/webhooks

\n

Required fields:

\n
    \n
  • url (string)
  • \n
  • events (non-empty array)
  • \n
\n

Optional fields:

\n
    \n
  • id
  • \n
  • secret (auto-generated if omitted)
  • \n
  • active (default true)
  • \n
  • transformFile
  • \n
  • corsHeaders (default true)
  • \n
\n

Example:

\n
curl -X POST http://localhost:8080/api/webhooks \\\n  -H "Content-Type: application/json" \\\n  -d '{\n    "url": "https://example.com/tasknotes",\n    "events": ["task.completed", "task.created"],\n    "transformFile": "TaskNotes/webhooks/slack.json"\n  }'\n

List#

\n

GET /api/webhooks

\n

Returns registered hooks. Secrets are not returned.

\n

Delete#

\n

DELETE /api/webhooks/:id

\n

Delivery History#

\n

GET /api/webhooks/deliveries

\n

Returns last 100 in-memory deliveries.

\n

Delivery Behavior#

\n

Current implementation behavior:

\n
    \n
  • Webhook processing is asynchronous (fire-and-forget from task operation).
  • \n
  • Each delivery starts with one attempt.
  • \n
  • Failed deliveries retry with exponential backoff: 1s, 2s, 4s.
  • \n
  • Maximum retries: 3 retries after initial attempt (up to 4 attempts total).
  • \n
  • If cumulative failureCount for a webhook exceeds 10, webhook is auto-disabled.
  • \n
  • No explicit request timeout is set in delivery fetch.
  • \n
\n

Because retries and duplicates are possible, handlers should be idempotent.

\n

Signature Verification#

\n

When corsHeaders is enabled (default), delivery includes:

\n
    \n
  • X-TaskNotes-Event
  • \n
  • X-TaskNotes-Signature
  • \n
  • X-TaskNotes-Delivery-ID
  • \n
\n

Signature is HMAC-SHA256 over JSON.stringify(payload) using webhook secret.

\n

Node.js example:

\n
const crypto = require("crypto");\n\nfunction verifyWebhook(payload, signature, secret) {\n  const expected = crypto\n    .createHmac("sha256", secret)\n    .update(JSON.stringify(payload))\n    .digest("hex");\n  return signature === expected;\n}\n

Payload Transformations#

\n

A webhook can specify transformFile pointing to a file in your vault.

\n

Supported file types:

\n
    \n
  • .json: event template map with variable interpolation
  • \n
\n

If transform execution fails, TaskNotes falls back to original payload.

\n

JavaScript transform files are no longer supported.

\n

JSON Transform Files#

\n

Structure:

\n
{\n  "task.completed": {\n    "text": "Task completed: ${data.task.title}",\n    "vault": "${vault.name}"\n  },\n  "default": {\n    "text": "TaskNotes event: ${event}"\n  }\n}\n

Rules:

\n
    \n
  • Matching order: exact event key, then default.
  • \n
  • Variables use ${path.to.value}.
  • \n
  • Missing variables are left unchanged.
  • \n
\n

CORS and Headers#

\n

Webhook delivery requests are outbound server-side requests from TaskNotes.

\n

corsHeaders behavior:

\n
    \n
  • true (default): sends TaskNotes custom headers including signature.
  • \n
  • false: only sends Content-Type: application/json.
  • \n
\n

Disable custom headers for endpoints that reject non-standard headers.

\n

Testing#

\n

Local Test Server#

\n

Use repository script:

\n
node test-webhook.js\n

Optional custom port:

\n
node test-webhook.js 8080\n

Default server values:

\n
    \n
  • URL: http://localhost:3000/webhook
  • \n
  • Test secret: test-secret-key-for-tasknotes-webhooks
  • \n
\n

External Inspection#

\n

For quick inspection, use a request-bin tool such as webhook.site.

\n

Troubleshooting#

\n

No deliveries#

\n
    \n
  1. Confirm HTTP API is enabled.
  2. \n
  3. Confirm webhook is active.
  4. \n
  5. Confirm event is subscribed.
  6. \n
\n

Signature mismatch#

\n
    \n
  1. Confirm secret matches webhook config.
  2. \n
  3. Verify your verifier hashes the exact JSON body.
  4. \n
  5. Verify hex digest comparison.
  6. \n
\n

Webhook disabled automatically#

\n

If failures continue and failureCount exceeds 10, webhook is disabled.

\n
    \n
  1. Fix endpoint availability or response handling.
  2. \n
  3. Re-enable webhook in TaskNotes settings, or recreate it via POST /api/webhooks.
  4. \n
\n

Transform errors#

\n
    \n
  1. Confirm transformFile exists in vault.
  2. \n
  3. Confirm the file is a .json transform template.
  4. \n
  5. Check Obsidian console logs for transform exceptions.
  6. \n
\n","text":"TaskNotes webhooks send HTTP POST requests when selected events occur. Prerequisites# Enable HTTP API in Settings -> TaskNotes -> Integrations -> HTTP API. Create at least one webhook (settings UI or API). Subscribe it to one or more events. Event Types# Task events: task.created task.updated task.deleted task.completed task.archived task.unarchived Time events: time.started time.stopped Pomodoro events: pomodoro.started pomodoro.completed pomodoro.interrupted Recurring events: recurring.instance.completed recurring.instance.skipped Completing a materialized occurrence note emits recurring.instance.completed with the reconciled parent task plus the completed occurrence and date in the event data. Skipping virtual recurring instances emits recurring.instance.skipped; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook. Reminder events: reminder.triggered Payload Shape# All webhook payloads use the same top-level envelope: { \"event\": \"task.created\", \"timestamp\": \"2026-02-21T10:30:00.000Z\", \"vault\": { \"name\": \"My Vault\", \"path\": \"/path/to/vault\" }, \"data\": {} } data is event-specific. Register and Manage Webhooks via API# Create# POST /api/webhooks Required fields: url (string) events (non-empty array) Optional fields: id secret (auto-generated if omitted) active (default true) transformFile corsHeaders (default true) Example: curl -X POST http://localhost:8080/api/webhooks \\ -H \"Content-Type: application/json\" \\ -d '{ \"url\": \"https://example.com/tasknotes\", \"events\": [\"task.completed\", \"task.created\"], \"transformFile\": \"TaskNotes/webhooks/slack.json\" }' List# GET /api/webhooks Returns registered hooks. Secrets are not returned. Delete# DELETE /api/webhooks/:id Delivery History# GET /api/webhooks/deliveries Returns last 100 in-memory deliveries. Delivery Behavior# Current implementation behavior: Webhook processing is asynchronous (fire-and-forget from task operation). Each delivery starts with one attempt. Failed deliveries retry with exponential backoff: 1s, 2s, 4s. Maximum retries: 3 retries after initial attempt (up to 4 attempts total). If cumulative failureCount for a webhook exceeds 10, webhook is auto-disabled. No explicit request timeout is set in delivery fetch. Because retries and duplicates are possible, handlers should be idempotent. Signature Verification# When corsHeaders is enabled (default), delivery includes: X-TaskNotes-Event X-TaskNotes-Signature X-TaskNotes-Delivery-ID Signature is HMAC-SHA256 over JSON.stringify(payload) using webhook secret. Node.js example: const crypto = require(\"crypto\"); function verifyWebhook(payload, signature, secret) { const expected = crypto .createHmac(\"sha256\", secret) .update(JSON.stringify(payload)) .digest(\"hex\"); return signature === expected; } Payload Transformations# A webhook can specify transformFile pointing to a file in your vault. Supported file types: .json: event template map with variable interpolation If transform execution fails, TaskNotes falls back to original payload. JavaScript transform files are no longer supported. JSON Transform Files# Structure: { \"task.completed\": { \"text\": \"Task completed: ${data.task.title}\", \"vault\": \"${vault.name}\" }, \"default\": { \"text\": \"TaskNotes event: ${event}\" } } Rules: Matching order: exact event key, then default. Variables use ${path.to.value}. Missing variables are left unchanged. CORS and Headers# Webhook delivery requests are outbound server-side requests from TaskNotes. corsHeaders behavior: true (default): sends TaskNotes custom headers including signature. false: only sends Content-Type: application/json. Disable custom headers for endpoints that reject non-standard headers. Testing# Local Test Server# Use repository script: node test-webhook.js Optional custom port: node test-webhook.js 8080 Default server values: URL: http://localhost:3000/webhook Test secret: test-secret-key-for-tasknotes-webhooks External Inspection# For quick inspection, use a request-bin tool such as webhook.site. Troubleshooting# No deliveries# Confirm HTTP API is enabled. Confirm webhook is active. Confirm event is subscribed. Signature mismatch# Confirm secret matches webhook config. Verify your verifier hashes the exact JSON body. Verify hex digest comparison. Webhook disabled automatically# If failures continue and failureCount exceeds 10, webhook is disabled. Fix endpoint availability or response handling. Re-enable webhook in TaskNotes settings, or recreate it via POST /api/webhooks. Transform errors# Confirm transformFile exists in vault. Confirm the file is a .json transform template. Check Obsidian console logs for transform exceptions."},{"route":"/obsidian/workflows/","title":"Workflows","description":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit toge...","product":"obsidian","platforms":[],"version":"4.12.3","generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/obsidian/workflows.md","namespace":"obsidian","relativePath":"workflows.md","raw":"# Workflows\n\nThis page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use.\n\n## Habit Tracking with Recurring Tasks\n\nHabit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, \"Exercise daily\" or \"Gym every Monday and Wednesday\") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions.\n\nOnce a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in `complete_instances`, so a recurring task can remain open while still recording daily/weekly completion behavior.\n\n![Recurring task calendar](assets/views-calendar-month.png)\n\n```yaml\ntitle: Morning Exercise\nrecurrence: \"FREQ=DAILY\"\nscheduled: \"07:00\"\ncomplete_instances:\n - \"2025-01-01\"\n - \"2025-01-02\"\n - \"2025-01-04\"\n```\n\nUse Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view.\n\nFor richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose **Open or create occurrence note**. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern.\n\n## Project-Centered Planning\n\nProjects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation.\n\n```yaml\ntitle: \"Research competitors\"\nprojects: [\"[[Market Research]]\", \"[[Q1 Strategy]]\"]\n```\n\nDuring task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on `note.projects contains [[Project Name]]` to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly.\n\n![Task list view](assets/views-tasks-list.png)\n\nWhen work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization.\n\n```yaml\ntitle: \"Prepare presentation slides\"\nprojects: [\"[[Q4 Planning]]\"]\ncontexts: [\"computer\", \"office\"]\ntags: [\"review\"]\n```\n\n## Execution Workflow (Daily)\n\nA typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system.\n\nIf you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes.\n\n![Calendar quick add workflow](assets/workflow-quick-add-calendar.png)\n\n## Maintenance Workflow (Weekly)\n\nA weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health.\n\nFor teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes.\n","aliases":["/workflows/"],"toc":[{"level":2,"id":"habit-tracking-with-recurring-tasks","text":"Habit Tracking with Recurring Tasks"},{"level":2,"id":"project-centered-planning","text":"Project-Centered Planning"},{"level":2,"id":"execution-workflow-daily","text":"Execution Workflow (Daily)"},{"level":2,"id":"maintenance-workflow-weekly","text":"Maintenance Workflow (Weekly)"}],"html":"

This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use.

\n

Habit Tracking with Recurring Tasks#

\n

Habit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, "Exercise daily" or "Gym every Monday and Wednesday") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions.

\n

Once a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in complete_instances, so a recurring task can remain open while still recording daily/weekly completion behavior.

\n

\"Recurring

\n
title: Morning Exercise\nrecurrence: "FREQ=DAILY"\nscheduled: "07:00"\ncomplete_instances:\n  - "2025-01-01"\n  - "2025-01-02"\n  - "2025-01-04"\n

Use Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view.

\n

For richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose Open or create occurrence note. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern.

\n

Project-Centered Planning#

\n

Projects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation.

\n
title: "Research competitors"\nprojects: ["[[Market Research]]", "[[Q1 Strategy]]"]\n

During task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on note.projects contains [[Project Name]] to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly.

\n

\"Task

\n

When work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization.

\n
title: "Prepare presentation slides"\nprojects: ["[[Q4 Planning]]"]\ncontexts: ["computer", "office"]\ntags: ["review"]\n

Execution Workflow (Daily)#

\n

A typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system.

\n

If you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes.

\n

\"Calendar

\n

Maintenance Workflow (Weekly)#

\n

A weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health.

\n

For teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes.

\n","text":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use. Habit Tracking with Recurring Tasks# Habit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, \"Exercise daily\" or \"Gym every Monday and Wednesday\") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions. Once a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in complete_instances, so a recurring task can remain open while still recording daily/weekly completion behavior. title: Morning Exercise recurrence: \"FREQ=DAILY\" scheduled: \"07:00\" complete_instances: - \"2025-01-01\" - \"2025-01-02\" - \"2025-01-04\" Use Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view. For richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose Open or create occurrence note. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern. Project-Centered Planning# Projects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation. title: \"Research competitors\" projects: [\"[[Market Research]]\", \"[[Q1 Strategy]]\"] During task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on note.projects contains [[Project Name]] to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly. When work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization. title: \"Prepare presentation slides\" projects: [\"[[Q4 Planning]]\"] contexts: [\"computer\", \"office\"] tags: [\"review\"] Execution Workflow (Daily)# A typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system. If you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes. Maintenance Workflow (Weekly)# A weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health. For teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes."},{"route":"/privacy/","title":"TaskNotes privacy overview","description":"How the TaskNotes app and Obsidian plugin store data and when optional services are involved.","product":"shared","platforms":[],"version":null,"generated":false,"noIndex":false,"hideToc":false,"source":"tasknotes.dev:content/policies/privacy.md","namespace":"policies","relativePath":"privacy.md","raw":"---\ntitle: TaskNotes privacy overview\ndescription: How the TaskNotes app and Obsidian plugin store data and when optional services are involved.\nroute: /privacy/\nproduct: shared\nlast_updated: 2026-08-06\n---\n\n# TaskNotes privacy overview\n\nLast updated: August 6, 2026\n\nTaskNotes products are built around portable Markdown records. The storage and\nnetwork boundaries depend on the client and collection you choose.\n\n## TaskNotes app\n\n- The TaskNotes app opens every collection through mdbase and requires a\n connection to read or change it.\n- A hosted collection stores the authoritative Markdown with the hosted\n provider.\n- A computer collection keeps the authoritative Markdown on that computer.\n TaskNotes reaches it through an end-to-end encrypted relay that cannot read\n record contents; the computer must remain reachable and run mdbase Connect.\n- TaskNotes keeps only a temporary in-memory session cache. It does not retain\n a separate offline collection after the app or page closes.\n- Reminder notifications for mdbase collections require explicit permission\n and use content-free event payloads. Task content is refreshed through the\n authorized collection connection.\n\n## Obsidian plugin\n\nThe plugin keeps task and note content in the local Obsidian vault. Plugin\nsettings live in Obsidian's plugin configuration. Network access occurs only\nfor enabled features that require it, including release checks, calendar\nproviders, ICS subscriptions, webhooks, and remotely loaded API documentation\nassets.\n\n## Analytics\n\nTaskNotes does not include a product telemetry or analytics pipeline. Services\nyou choose to connect may keep their own operational, account, security, or\nbilling records under their respective policies.\n\n## Removal\n\nRemoving a client does not necessarily remove its authoritative collection.\nUse the hosted provider's controls for a hosted collection, or manage the\nMarkdown folder on the computer that owns a computer collection. Back up\nrecords before removing an authoritative copy.\n\n## Questions and source code\n\nUse the relevant TaskNotes GitHub repository to report a privacy problem or\ninspect the implementation:\n\n- [TaskNotes app](https://github.com/callumalpass/tasknotes-app)\n- [TaskNotes Obsidian plugin](https://github.com/callumalpass/tasknotes)\n","aliases":[],"toc":[{"level":2,"id":"tasknotes-app","text":"TaskNotes app"},{"level":2,"id":"obsidian-plugin","text":"Obsidian plugin"},{"level":2,"id":"analytics","text":"Analytics"},{"level":2,"id":"removal","text":"Removal"},{"level":2,"id":"questions-and-source-code","text":"Questions and source code"}],"html":"

Last updated: August 6, 2026

\n

TaskNotes products are built around portable Markdown records. The storage and\nnetwork boundaries depend on the client and collection you choose.

\n

TaskNotes app#

\n
    \n
  • The TaskNotes app opens every collection through mdbase and requires a\nconnection to read or change it.
  • \n
  • A hosted collection stores the authoritative Markdown with the hosted\nprovider.
  • \n
  • A computer collection keeps the authoritative Markdown on that computer.\nTaskNotes reaches it through an end-to-end encrypted relay that cannot read\nrecord contents; the computer must remain reachable and run mdbase Connect.
  • \n
  • TaskNotes keeps only a temporary in-memory session cache. It does not retain\na separate offline collection after the app or page closes.
  • \n
  • Reminder notifications for mdbase collections require explicit permission\nand use content-free event payloads. Task content is refreshed through the\nauthorized collection connection.
  • \n
\n

Obsidian plugin#

\n

The plugin keeps task and note content in the local Obsidian vault. Plugin\nsettings live in Obsidian's plugin configuration. Network access occurs only\nfor enabled features that require it, including release checks, calendar\nproviders, ICS subscriptions, webhooks, and remotely loaded API documentation\nassets.

\n

Analytics#

\n

TaskNotes does not include a product telemetry or analytics pipeline. Services\nyou choose to connect may keep their own operational, account, security, or\nbilling records under their respective policies.

\n

Removal#

\n

Removing a client does not necessarily remove its authoritative collection.\nUse the hosted provider's controls for a hosted collection, or manage the\nMarkdown folder on the computer that owns a computer collection. Back up\nrecords before removing an authoritative copy.

\n

Questions and source code#

\n

Use the relevant TaskNotes GitHub repository to report a privacy problem or\ninspect the implementation:

\n\n","text":"Last updated: August 6, 2026 TaskNotes products are built around portable Markdown records. The storage and network boundaries depend on the client and collection you choose. TaskNotes app# The TaskNotes app opens every collection through mdbase and requires a connection to read or change it. A hosted collection stores the authoritative Markdown with the hosted provider. A computer collection keeps the authoritative Markdown on that computer. TaskNotes reaches it through an end-to-end encrypted relay that cannot read record contents; the computer must remain reachable and run mdbase Connect. TaskNotes keeps only a temporary in-memory session cache. It does not retain a separate offline collection after the app or page closes. Reminder notifications for mdbase collections require explicit permission and use content-free event payloads. Task content is refreshed through the authorized collection connection. Obsidian plugin# The plugin keeps task and note content in the local Obsidian vault. Plugin settings live in Obsidian's plugin configuration. Network access occurs only for enabled features that require it, including release checks, calendar providers, ICS subscriptions, webhooks, and remotely loaded API documentation assets. Analytics# TaskNotes does not include a product telemetry or analytics pipeline. Services you choose to connect may keep their own operational, account, security, or billing records under their respective policies. Removal# Removing a client does not necessarily remove its authoritative collection. Use the hosted provider's controls for a hosted collection, or manage the Markdown folder on the computer that owns a computer collection. Back up records before removing an authoritative copy. Questions and source code# Use the relevant TaskNotes GitHub repository to report a privacy problem or inspect the implementation: TaskNotes app TaskNotes Obsidian plugin"}]} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 24e7490..b14fbc6 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -4,6 +4,8 @@ on: push: branches: [main] workflow_dispatch: + schedule: + - cron: "17 3 * * *" permissions: contents: read @@ -21,6 +23,24 @@ jobs: - name: Check out documentation uses: actions/checkout@v4 + - name: Check out TaskNotes plugin + uses: actions/checkout@v4 + with: + repository: callumalpass/tasknotes + path: .sources/tasknotes + + - name: Check out TaskNotes app + uses: actions/checkout@v4 + with: + repository: callumalpass/tasknotes-app + path: .sources/tasknotes-app + + - name: Check out TaskNotes specification + uses: actions/checkout@v4 + with: + repository: callumalpass/tasknotes-spec + path: .sources/tasknotes-spec + - name: Set up Node.js uses: actions/setup-node@v4 with: @@ -30,6 +50,10 @@ jobs: - name: Install documentation dependencies run: npm ci + - name: Install plugin reference dependencies + run: npm ci --ignore-scripts + working-directory: .sources/tasknotes + - name: Build and test static documentation run: npm test diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 3c12307..b7254ed 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -15,6 +15,24 @@ jobs: - name: Check out documentation uses: actions/checkout@v4 + - name: Check out TaskNotes plugin + uses: actions/checkout@v4 + with: + repository: callumalpass/tasknotes + path: .sources/tasknotes + + - name: Check out TaskNotes app + uses: actions/checkout@v4 + with: + repository: callumalpass/tasknotes-app + path: .sources/tasknotes-app + + - name: Check out TaskNotes specification + uses: actions/checkout@v4 + with: + repository: callumalpass/tasknotes-spec + path: .sources/tasknotes-spec + - name: Set up Node.js uses: actions/setup-node@v4 with: @@ -24,5 +42,9 @@ jobs: - name: Install documentation dependencies run: npm ci + - name: Install plugin reference dependencies + run: npm ci --ignore-scripts + working-directory: .sources/tasknotes + - name: Build and test run: npm test diff --git a/public/llms-full.txt b/public/llms-full.txt index d132952..a3dfbc6 100644 --- a/public/llms-full.txt +++ b/public/llms-full.txt @@ -629,7 +629,7 @@ The tasknotes plugin is the primary reference for how this spec was derived, but ## 0.1 Status and authority -This document is part of `tasknotes-spec` version `0.3.0-rc.1`. +This document is part of `tasknotes-spec` version `0.3.0-rc.3`. This specification is normative for implementations that claim conformance. No single implementation is normative; implementations are expected to conform to the specification. @@ -781,7 +781,7 @@ This guide covers the TaskNotes plugin for Obsidian. It follows the "one note pe ## Requirements -TaskNotes 4.11.1 requires **Obsidian 1.12.2** or later and depends on the **Bases** core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins. +TaskNotes 4.12.3 requires **Obsidian 1.12.2** or later and depends on the **Bases** core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins. ## Getting Started @@ -2532,6 +2532,7 @@ The following JSON is generated from `DEFAULT_SETTINGS`. Empty strings and disab "scheduled": "scheduled", "contexts": "contexts", "projects": "projects", + "attachments": "attachments", "timeEstimate": "timeEstimate", "completedDate": "completedDate", "dateCreated": "dateCreated", @@ -2752,6 +2753,10 @@ Welcome to the TaskNotes release notes. Here you can find detailed information a ### Version 4.x (Current) +- [4.12.3](releases/4.12.3.md) +- [4.12.2](releases/4.12.2.md) +- [4.12.1](releases/4.12.1.md) +- [4.12.0](releases/4.12.0.md) - [4.11.1](releases/4.11.1.md) - [4.11.0](releases/4.11.0.md) - [4.10.2](releases/4.10.2.md) diff --git a/public/search-index.json b/public/search-index.json index 2ada890..530ad4b 100644 --- a/public/search-index.json +++ b/public/search-index.json @@ -1 +1 @@ -[{"title":"TaskNotes documentation","url":"/","description":"Guides and reference material for the TaskNotes app, the Obsidian plugin, and the portable task format they share.","product":"shared","text":"TaskNotes keeps structured task information in portable Markdown records. Use the dedicated app on the web, Android, or iOS, or work inside Obsidian with the TaskNotes plugin. Beta · Web · Android · iOS TaskNotes app Manage portable TaskNotes v5 collections on the web, Android, and iOS through mdbase. Open the app guide → Obsidian TaskNotes plugin Task and note management inside an Obsidian vault using Bases and Markdown. Open the plugin guide → One portable task model# Both clients understand the same TaskNotes concepts: status, priority, dates, projects, contexts, recurrence, reminders, relationships, and custom fields. The interface and available integrations differ, but your task records are not locked to one screen or application. Start with portable task records if you want to understand what the products share. Read the formal specification when implementing or integrating with TaskNotes. Review the privacy overview before choosing a hosted or computer-connected collection."},{"title":"TaskNotes app","url":"/app/","description":"Use TaskNotes on the web, Android, and iOS with portable Markdown through mdbase.","product":"app","text":"The TaskNotes app is currently in beta. It is a web-first client packaged for Android and iOS, designed for quick capture, daily review, editing, and completion while keeping task records portable. The app is compatible with TaskNotes v5 collections, which use the mdbase 0.3.0 specification. The same collection can be used by other compatible TaskNotes and mdbase tools. Every TaskNotes session opens an mdbase collection. You can use a collection hosted online or connect to a Markdown collection on your computer through the encrypted mdbase relay. TaskNotes reads and writes that collection directly, so changes require a connection. The Today workspace in the desktop layout. Disposable sample collection Try TaskNotes before connecting your own collection. Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets. Open the interactive demo → Begin here# Try TaskNotes with sample tasks or open or install TaskNotes. Learn how mdbase supports TaskNotes. Choose where your collection lives. Create a task and open Today. Turn on reminders only if the collection and platform support delivery. What the app includes# Today, Upcoming, Projects, lists, boards, and calendars Capture, editing, completion, archive, and search Projects, contexts, tags, priorities, relationships, and custom fields Recurrence, materialized occurrence notes, reminders, and time tracking Hosted mdbase and end-to-end encrypted relay connections Browser, Android, and iOS packaging from the same application Plugin-only functionality such as inline Obsidian widgets, the command palette, external calendar integrations, HTTP APIs, and companion plugins is documented under the Obsidian plugin."},{"title":"Choose a collection","url":"/app/collections/","description":"Compare hosted mdbase with a collection connected from your own computer.","product":"app","text":"TaskNotes opens every collection through mdbase. The choice is where the main copy of your Markdown lives: hosted online or on your own computer. If mdbase is new to you, start with mdbase and TaskNotes for a plain-language explanation of the format, Connect desktop app, and hosting choices. Hosted mdbase# Hosted mdbase is the recommended choice for convenient access across the web, Android, and iOS. The provider keeps the main collection online, so it is available from any TaskNotes device with a network connection and can deliver reminders while TaskNotes is closed. TaskNotes reads and writes the hosted collection directly. It does not keep a separate offline copy, so you need a network connection to open the collection or make changes. Connect to a computer# mdbase Connect can make a Markdown collection on your computer available to TaskNotes. Requests and responses travel through an end-to-end encrypted relay; the relay cannot read your task contents and you do not need to open a port on your router. The computer holds the main copy, so it must be awake, online, and running the mdbase Connect background service whenever you use TaskNotes. See how to install mdbase Connect and use a computer collection. Change collections later# Open More and choose Change collection. Opening another collection does not copy or move records from the collection you were using."},{"title":"Connection and availability","url":"/app/connection/","description":"Understand when TaskNotes can reach hosted and computer-connected mdbase collections.","product":"app","text":"TaskNotes reads and writes the selected mdbase collection directly. It does not keep a separate offline collection or a queue of changes waiting to sync. What each status means# Status Meaning Connected TaskNotes can read and change the selected collection Connecting TaskNotes is checking the collection connection Collection unavailable The hosted service or connected computer cannot be reached Open More to see the current status and use Refresh now to read the latest collection state. Hosted collections# A hosted collection needs a network connection and an available hosted mdbase service. If either is unavailable, TaskNotes cannot open the collection or save changes. Reconnect the collection if its authorization has expired. Collections on your computer# A computer collection also needs the computer holding the Markdown to be awake, online, and running the mdbase Connect background service. TaskNotes reaches it through the end-to-end encrypted relay. If the computer becomes unavailable, access returns when the computer and connector return. During a connection problem# Tasks already visible in the current session may remain on screen during a short interruption, but TaskNotes cannot safely save new changes until mdbase is reachable. A failed action is not silently queued for later. If the problem continues, open More and choose Change collection to use another mdbase collection."},{"title":"Interactive demo","url":"/app/demo/","description":"Explore the TaskNotes app with disposable sample tasks before connecting a collection.","product":"app","text":"Explore the TaskNotes app using a disposable collection of sample tasks. You can complete and edit tasks, use Scratchpad, search, and move between views without signing in or connecting a collection. The demo keeps changes only for the current session. Reloading or resetting it starts again with the original sample data."},{"title":"Get started with the TaskNotes app","url":"/app/getting-started/","description":"Open TaskNotes, connect an mdbase collection, create a task, and find your way around the app.","product":"app","text":"TaskNotes app is currently in beta. Features, availability, and setup steps may change before the stable release. The app supports TaskNotes v5 collections based on the mdbase 0.3.0 specification. 1. Open TaskNotes# Use app.tasknotes.dev in a supported browser or install the Android or iOS application when it is available through its store. The web and native applications use the same task interface. 2. Choose a collection# TaskNotes opens every collection through mdbase. Choose Hosted mdbase for a collection available anywhere with a network connection, or Connect to a computer to use a Markdown collection kept on your own computer through the encrypted relay. Read What is mdbase? if this is new to you, then Choose a collection to compare the two options. 3. Create a task# Use Add task, enter a title, and save. Capture understands the collection's configured status, priority, project, context, and tag values. 4. Review the starter views# Open Today for current work, Upcoming for scheduled tasks, and Views for the complete collection of lists, boards, calendars, and project views. Navigation belongs to the current collection and can be reordered from Views. 5. Check collection status# Open More to see the collection location, connection state, last refresh, notification access, task model settings, and appearance preference."},{"title":"mdbase and TaskNotes","url":"/app/mdbase/","description":"Understand how TaskNotes uses hosted mdbase or the encrypted relay to reach a collection on your computer.","product":"app","text":"mdbase lets TaskNotes work with a portable Markdown collection instead of hiding your tasks in a TaskNotes-only database. Every TaskNotes session opens one mdbase collection: either a collection hosted online or one kept on your computer and reached through the encrypted relay. What is mdbase?# Two related names appear in TaskNotes: mdbase is the open collection format and specification. A collection is a folder of Markdown files plus a small description of what those files mean. mdbase Connect is the access service TaskNotes uses to ask for permission and connect to a hosted collection or a collection on your computer. Read the mdbase introduction for a visual explanation of the wider ecosystem. What it gives TaskNotes# TaskNotes understands what a task looks like inside an mdbase collection. That compatibility is defined by the TaskNotes v5 collection format and its mdbase 0.3.0 binding. That means TaskNotes can: use the same task fields, projects, tags, saved views, and settings on the web, Android, and iOS; ask for access to one collection without seeing your other folders; and keep reminders running while TaskNotes is closed when your collection supports them. Behind the scenes, mdbase checks that each change is valid and writes it to the main collection. You still own readable Markdown files rather than a database that only TaskNotes can open. How the connection works# The mdbase collection is the source of truth. TaskNotes reads and writes it directly and does not keep a separate offline collection, so opening tasks and saving changes require a connection. Choice Where the Markdown lives What must be available Hosted mdbase With the hosted provider Your device must have a network connection Connect to your computer In a folder on your computer Both devices must be online, and your computer must be running mdbase Connect Choose a collection compares the TaskNotes behavior of these options in more detail. Use a collection on your computer# Install the Electron-based mdbase Connect desktop app to make a folder on your computer available to TaskNotes. It runs a small background service that keeps TaskNotes connected to the Markdown folder. The download also includes command line tools. The mdbase editor is online and is not part of the desktop app. Open the mdbase Connect download page and choose the package for macOS, Windows, or Linux. Install and open mdbase Connect. Follow any platform-specific beta installation notes shown on the download page. Add an existing mdbase folder on the computer, or create a collection. In TaskNotes, choose Connect to a computer and select that collection. Review the requested actions and approve the connection. TaskNotes requests and responses travel through an end-to-end encrypted relay. The relay passes the encrypted data along but cannot read your task contents. You do not need to open an inbound port on your router. The background service on your computer checks that TaskNotes has permission, then reads or changes the Markdown files. It does not create another hosted or offline copy of the collection. Do I need to leave my computer on?# Yes. Your computer holds the main copy, so it is part of the connection: It must be awake, connected to the internet, and running the mdbase Connect background service whenever TaskNotes needs remote access. Sleep, shutdown, a network outage, or a stopped connector makes the collection unavailable until the computer returns. Reminder delivery also depends on the computer remaining available. You are responsible for the computer's security, disk health, and backups. This works well for an always-on desktop or home server. It is less convenient for a laptop that sleeps or travels regularly. Hosted mdbase removes the always-on-computer requirement, but it moves the main copy to a provider you must trust. Both choices require a network connection while you use TaskNotes. For more detail about how Connect protects and routes your data, read How mdbase Connect works. A practical recommendation# Choose Hosted mdbase if dependable access across several devices and reminder delivery matter most. Choose Connect to a computer if keeping the main Markdown folder on your own machine matters more and that machine can remain available."},{"title":"App integration manifest","url":"/app/reference/manifest/","description":"Generated reference for the TaskNotes app's mdbase integration requirements and capabilities.","product":"app","text":"This page is generated from the integration manifest shipped by TaskNotes app 0.1.0. Field Value Application ID dev.tasknotes.app Manifest version 1 Homepage https://app.tasknotes.dev/ Collection access full_collection Required contracts# tasknotes.task version 0.3.0-rc.3 File capabilities# list read add replace move delete Notification criteria# task.reminder listens for mdbase.runtime.timer.fired version 1.0.0."},{"title":"Reminders in the TaskNotes app","url":"/app/reminders/","description":"Understand reminder data, notification delivery, permissions, and collection requirements.","product":"app","text":"Task records can contain relative reminders anchored to scheduled or due dates, or absolute reminders fixed to a particular time. Saving reminder data does not by itself guarantee notification delivery. Delivery by collection# Collection Reminder data Notification delivery Hosted mdbase Saved in the collection Available after opt-in Computer through the relay Saved in the collection Available while the computer and connector remain available For mdbase collections, the authority schedules reminder events so delivery does not depend on one TaskNotes screen remaining open. Notification payloads are content-free; selecting one refreshes authorized collection state in the app. Turn on reminders# Open More, select Turn on reminders, and approve the browser or operating system permission. Some existing mdbase grants require Review notification access before the channel can be enabled. An unsupported or insecure browser reports that notification delivery is not available. The reminder definitions remain in the task record."},{"title":"Work with tasks","url":"/app/tasks/","description":"Capture, edit, organize, complete, archive, and search tasks in the TaskNotes app.","product":"app","text":"A task opens beside its source view on wider screens. Capture# Use Add task from navigation or from a saved view. When a view has safe creation defaults, TaskNotes applies them automatically so the new task remains in that view. Edit# A task can contain: Status and priority Scheduled and due dates Markdown notes Projects, contexts, and tags Dependencies and subtasks Collection-defined custom properties Time estimates and tracked sessions Recurrence and occurrence-note policies Relative and absolute reminder definitions Background saves remain ordered if you navigate away while a write is still in progress. Complete, archive, and delete# Complete a task from its row or detail screen. Archive retains the record and may move its Markdown file according to collection settings. Delete offers a short undo period before committing the removal. Search# Search runs across the current collection and matches titles, notes, projects, contexts, and tags. Use Refresh now under More if a change made by another tool does not appear yet."},{"title":"Troubleshoot the TaskNotes app","url":"/app/troubleshooting/","description":"Diagnose mdbase connection, authorization, refresh, and notification problems in the app.","product":"app","text":"Start by recording the app version, platform, collection type, collection status shown under More, and the smallest sequence that reproduces the problem. The collection is unavailable# For a hosted collection, confirm that the device is online and try Reconnect this collection. For a computer collection, also confirm that the computer holding the Markdown is awake, online, and running mdbase Connect. An authorization error appears# Use the reconnect action for the current collection and review the access that mdbase requests. If you no longer want to use that collection, open More and choose Change collection. A change did not save# TaskNotes writes directly to mdbase and does not queue failed changes for later. Restore the connection, then retry the action. Capture and editing screens keep recoverable input visible when they can do so safely. A change from another tool is missing# Open More and choose Refresh now. If the record still does not appear, confirm that the other tool wrote to the same mdbase collection and that the record uses a compatible TaskNotes task definition. Notifications do not arrive# Confirm that the current collection is an mdbase collection, reminders are enabled in More, the browser or operating system permission is granted, and the task contains a valid future reminder. For a computer collection, the computer and mdbase Connect must remain available."},{"title":"Views and navigation","url":"/app/views/","description":"Use and arrange lists, boards, calendars, projects, and saved views in the TaskNotes app.","product":"app","text":"Views are saved ways of selecting, sorting, grouping, and presenting records in a collection. They travel with the collection; the set pinned to navigation is a preference on each device. The Views manager controls navigation order and saved view definitions. Starter views# TaskNotes creates managed starter views such as Today, Upcoming, Calendar, and Projects. They use the same saved-view catalog as user-created views while providing focused presentations for common work. Presentations# Task list supports grouping, visible properties, section moves, and manual ordering. Kanban groups tasks into columns and can update the grouped property when a task moves. Calendar shows task dates in month, week, day, and list layouts. Mini calendar combines a month picker with tasks for the selected day. Projects finds project records referenced by active tasks. Navigation# Open Views to add or remove a view from navigation and to change its order. The first navigation item is the collection's home. Mobile displays the first three views directly and keeps the rest in the Views destination. Create and edit views# The view editor controls the name, presentation, query, grouping, sort order, visible properties, and safe defaults for tasks created from the view. View documents remain ordinary collection resources rather than being stored only inside the TaskNotes app."},{"title":"Portable task records","url":"/concepts/task-records/","description":"The Markdown records, collection configuration, and task concepts shared by TaskNotes clients.","product":"shared","text":"A TaskNotes task is an ordinary Markdown record with structured properties. Those properties describe the task; the Markdown body remains available for notes, checklists, links, and supporting detail. Collections# A collection is a group of records plus the configuration that explains how to interpret them. The configuration defines field names, statuses, priorities, custom properties, record locations, and saved views. The TaskNotes app uses collection throughout. The Obsidian plugin usually describes the containing folder as a vault and presents saved views through Obsidian Bases. Source of truth# Where the authoritative copy lives depends on the client and connection: Client and collection Source of truth Availability TaskNotes app · hosted mdbase Hosted collection Requires a network connection TaskNotes app · computer through relay Collection on that computer Requires the network, computer, and connector Obsidian vault Markdown files in the vault Controlled by Obsidian and your sync choice Portability and compatibility# Portable does not mean every client exposes every feature. Inline task widgets, Obsidian commands, external calendar integrations, and companion plugins belong to the Obsidian client. mdbase collection access and background reminder delivery belong to the TaskNotes app. Use the client-specific guide for interface instructions and the specification for normative data semantics."},{"title":"0. Overview","url":"/developers/specification/","description":"TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editabl...","product":"specification","text":"0.0 About tasknotes# TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling. A minimal task file looks like this: --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. Tasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. #task in body or frontmatter). The plugin stores its configuration in .obsidian/plugins/tasknotes/data.json within the vault root. This specification was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for: CLI tools and scripts that process task files outside Obsidian, any application that wants to interoperate with a tasknotes vault. The spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in conformance/) can be driven by an adapter written in any language. The tasknotes plugin is the primary reference for how this spec was derived, but the specification is normative — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5). 0.1 Status and authority# This document is part of tasknotes-spec version 0.3.0-rc.1. This specification is normative for implementations that claim conformance. No single implementation is normative; implementations are expected to conform to the specification. 0.2 Motivation# TaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages: Task records are plain files that can be inspected and edited without proprietary tooling. Data remains portable across environments. Files are suitable for version control and collaboration workflows. As soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas: Field semantics and naming drift. Date and timezone interpretation differences. Recurring-task state transitions that are handled differently by different clients. When these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned. 0.3 Objectives# This specification defines a stable contract for: Representing task records in markdown frontmatter. Mapping storage keys to canonical semantic roles. Defining effective collection configuration via provider model (for example tasknotes.yaml and/or TaskNotes data.json). Interpreting date and datetime values consistently. Applying recurrence, per-instance completion/skip behavior, and optional materialized occurrence notes. Managing time tracking sessions and time_entries lifecycle behavior. Parsing and resolving links consistently across task fields. Defining dependency and reminder behavior. Optionally applying deterministic create-time templating behavior. Executing write operations with predictable side-effects. Validating task records and reporting issues. 0.4 Non-objectives# This specification does not standardize: UI layout, styling, command palettes, or interaction design. Internal caching architecture or rendering pipelines. Transport protocols (HTTP, IPC, etc.) except where they affect persisted task semantics. Rich template-language features beyond the portable create-time templating contract in §5/§7/§9. 0.5 Scope# This specification is standalone. It does not require conformance to any other specification. Implementations MAY internally reuse other libraries or specifications, but conformance claims under tasknotes-spec are evaluated only against this document. Templating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support. References to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative. 0.6 Design principles# 0.6.1 File-first persistence# Task state is represented in user-visible files. Derived indexes and caches are non-canonical. 0.6.2 Deterministic semantics# Equivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone. 0.6.3 Explicit mapping# Semantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly. 0.6.4 Backward evolution# The specification supports migration from legacy keys and historical behaviors through explicit compatibility rules. 0.7 Conformance# Conformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations. 0.8 Normative language# The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are to be interpreted as described in RFC 2119. 0.9 Example collection# A default tasknotes vault looks like this: MyVault/ ├── TaskNotes/ │ ├── Tasks/ │ │ ├── buy-groceries.md ← task file (title-derived filename by default) │ │ └── weekly-review.md │ └── Archive/ ← archive folder (if moveArchivedTasks=true) ├── .obsidian/ │ └── plugins/ │ └── tasknotes/ │ └── data.json ← plugin settings (primary config provider) └── tasknotes.yaml ← optional spec-level config (secondary provider) Task files are identified by the #task tag by default (configurable). The full default collection state is described in §9.21. Configuration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy. A task file example (using default field mapping): --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task, errands] contexts: [\"town\"] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. 0.10 Versioning policy# This specification uses semantic versioning. A major version introduces breaking semantic changes. A minor version introduces additive behavior or optional features. A patch version clarifies wording or fixes non-breaking defects. Implementations MUST reject unsupported major versions when strict mode is enabled. 0.11 Change governance# Specification changes SHOULD be accompanied by: a motivation statement, precise normative edits, migration notes when behavior changes, updated examples."},{"title":"1. Terminology","url":"/developers/specification/01-terminology/","description":"This section defines terms used normatively in this specification.","product":"specification","text":"This section defines terms used normatively in this specification. 1.1 Collection# A collection is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration. 1.2 Task file# A task file is a markdown file identified as a task record by collection rules. 1.3 Frontmatter# Frontmatter is the YAML block at the start of a markdown file delimited by --- markers. 1.4 Task record# A task record is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata). 1.5 Semantic role# A semantic role is a canonical meaning defined by this specification, independent of storage key names. Examples: title, status, date_created, complete_instances. 1.6 Storage key# A storage key is the YAML property name used in frontmatter. Examples: dateCreated, date_created, completedDate. 1.7 Field mapping# Field mapping is the configuration that maps semantic roles to storage keys for reads and writes. 1.8 Alias# An alias is a non-canonical storage key accepted for compatibility during reads. 1.9 Canonical write key# The canonical write key is the configured storage key that conforming writers use for persisted output. 1.10 Date value# A date value represents a calendar day with no time-of-day and no timezone. Canonical form: YYYY-MM-DD. 1.11 Datetime value# A datetime value represents an instant in time. Canonical form: ISO 8601 UTC with trailing Z. 1.12 Target date# A target date is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20). 1.13 Recurrence rule# A recurrence rule is a tasknotes recurrence string stored in the recurrence semantic role. It uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline DTSTART prefix segment as defined in §4.3. 1.14 Recurrence anchor# Recurrence anchor defines how next-instance progression is computed. Allowed values: scheduled completion 1.15 Complete instances# Complete instances is the set/list of target dates marked completed for a recurring task. 1.16 Skipped instances# Skipped instances is the set/list of target dates marked skipped for a recurring task. 1.17 Materialized occurrence note# A materialized occurrence note is a task file created for one target date of a recurring parent task. It stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date. 1.18 Recurrence parent# A recurrence parent is the recurring task record referenced by a materialized occurrence note. The reference is stored in semantic role recurrence_parent and resolved as a link according to §11. 1.19 Occurrence materialization# Occurrence materialization is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20. 1.20 Effective status# Effective status is the status presented for a given date context after applying recurrence instance state. 1.21 Completed-status list# The completed-status list is the configured ordered list of status values treated as completed for non-recurring completion semantics. When a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it. 1.22 Idempotent operation# An operation is idempotent if applying it multiple times with the same input produces the same persisted state as applying it once. 1.23 Unknown field# An unknown field is a frontmatter property not mapped to a semantic role in current configuration. 1.24 Validation issue# A validation issue is a structured report containing at least: machine-readable code, severity, optional path/field context, human-readable message. 1.25 Strict validation mode# Strict validation mode is a mode where invalid required semantics are treated as hard errors and write operations fail. 1.26 Legacy compatibility mode# Legacy compatibility mode is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes. 1.27 Configuration provider# A configuration provider is an adapter that loads configuration from a source (for example tasknotes.yaml or .obsidian/plugins/tasknotes/data.json) and normalizes it to the schema in §9. 1.28 Effective configuration# The effective configuration is the final resolved configuration after applying provider precedence and fallback rules. 1.29 Template file# A template file is a markdown document used at create time to generate frontmatter and/or body content through variable expansion. When templating is enabled, template behavior is defined by §5.3.5 and §9.14. 1.30 Template expansion# Template expansion is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules. 1.31 Time entry# A time entry is a structured record in time_entries containing startTime, optional endTime, and optional description. 1.32 Active time entry# An active time entry is a time entry with startTime present and endTime absent. 1.33 Time tracking management# Time tracking management is the set of operations that start, stop, edit, and remove time_entries, including completion-triggered auto-stop behavior when configured."},{"title":"2. Model and Field Mapping","url":"/developers/specification/02-model-and-mapping/","description":"A task record consists of:","product":"specification","text":"2.1 Task record model# A task record consists of: frontmatter object (structured fields), markdown body (freeform text), file metadata (path, created/modified time) where available. Frontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features. 2.2 Required semantic roles# Conforming implementations MUST support these semantic roles: Semantic role Type Required title string support required (value required via configured title source, see §2.2.2) status string/enum yes completed_date date support required (conditionally required, see §2.2.1) date_created datetime yes date_modified datetime yes If storage omits a role marked yes, validation MUST report an error (see §6). For operation-required roles, validation and operation rules in §5 and §6 apply. 2.2.1 Conditional requiredness (completed_date)# completed_date support is mandatory, but presence is conditional: For non-recurring tasks with status in configured status.completed_values, completed_date MUST be present. For non-recurring tasks with non-completed status, completed_date MAY be absent. For recurring tasks, completed_date is not required by recurrence completion semantics and MAY be absent. Validators MUST apply this conditional rule and MUST NOT treat completed_date as unconditionally required. 2.2.2 Conditional requiredness (title)# Semantic title is always required, with deterministic read resolution and storage-mode-dependent read/write behavior: Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13): when title.storage=frontmatter: mapped title key when present and non-empty, then file basename fallback; when title.storage=filename: file basename first, then mapped title fallback when basename is unavailable. If mapped title and filename-derived title both exist and differ, the source authoritative for active title.storage MUST win and implementations SHOULD emit title_source_conflict. When title.storage=filename, implementations MAY keep mapped title as a synchronized compatibility mirror, but filename-derived title remains authoritative. Title storage mode controls canonical writes (§9.13): frontmatter favors mapped-key writes; filename favors filename-derived title with rename-on-title-change behavior. Validators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone. 2.3 Common semantic roles# Implementations conforming beyond minimal scope SHOULD support: Semantic role Type Notes id string stable task identity token; see §2.6.5 priority string/enum configurable values due date or datetime see §3 scheduled date or datetime see §3 tags list free tags contexts list commonly prefixed with @ projects list project references, see §11 time_estimate integer >= 0 minutes time_entries list see §2.6 recurrence string tasknotes recurrence string; see §4 recurrence_anchor enum scheduled or completion complete_instances list recurring completion state skipped_instances list recurring skip state recurrence_parent link-or-string parent recurring task reference for materialized occurrence notes; see §4.18 occurrence_date date target date represented by a materialized occurrence note occurrence_materialization enum parent task materialization mode: manual, on_completion, or rolling occurrence_next_trigger enum parent task next-note trigger: completion or completion_or_skip occurrence_template link-or-string optional template used when creating materialized occurrence notes occurrence_past_horizon duration optional rolling materialization lookbehind bound occurrence_future_horizon duration optional rolling materialization lookahead bound blocked_by list dependency records, see §10 and §11 reminders list reminder records, see §10 Optional extended roles are defined in §7 profiles. 2.4 Field mapping requirements# 2.4.1 Mapping presence# An implementation MUST have an effective mapping from each supported semantic role to a canonical write key. Mapping configuration is defined in §9. If semantic role id is supported, it MUST also have a canonical write key. 2.4.2 Read behavior# Readers MUST: Read the canonical mapped key if present. Support configured aliases where enabled. Resolve conflicts deterministically when canonical and alias keys coexist. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win. When canonical key wins over alias, validator/loader SHOULD emit warning alias_conflict_ignored. 2.4.3 Write behavior# Writers MUST: write only canonical keys, avoid introducing alias keys in new writes, preserve unknown fields unless the operation explicitly opts into normalization. 2.5 Legacy alias compatibility# Implementations SHOULD accept these aliases on read for interoperability: Semantic role Canonical example Alias examples recurrence_anchor recurrence_anchor recurrenceAnchor complete_instances complete_instances completeInstances skipped_instances skipped_instances skippedInstances recurrence_parent recurrence_parent recurrenceParent occurrence_date occurrence_date occurrenceDate occurrence_materialization occurrence_materialization occurrenceMaterialization occurrence_next_trigger occurrence_next_trigger occurrenceNextTrigger occurrence_template occurrence_template occurrenceTemplate occurrence_past_horizon occurrence_past_horizon occurrencePastHorizon occurrence_future_horizon occurrence_future_horizon occurrenceFutureHorizon date_created dateCreated date_created date_modified dateModified date_modified completed_date completedDate completed_date time_entries timeEntries time_entries time_estimate timeEstimate time_estimate blocked_by blockedBy blocked_by This table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical. 2.6 Structured role schemas# 2.6.1 time_entries# time_entries items MUST be objects with: startTime datetime (required) endTime datetime (optional) description string (optional) Additional constraints: a task MUST NOT contain more than one active time entry (entry with startTime and no endTime) at commit time. an entry with missing endTime is interpreted as an active/running session. an implementation MAY accept duration on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes. Nested key names in time_entries are fixed by this specification and are not independently configurable in mapping. 2.6.2 projects# projects SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted. When interpreted as links, parsing and resolution MUST follow §11. 2.6.3 blocked_by# blocked_by items MUST be objects with: uid link-or-string task reference (required) reltype enum (required; default allowed by §10 when omitted) gap ISO 8601 duration string (optional) Detailed semantics are defined in §10. uid parsing and resolution MUST follow §11. 2.6.4 reminders# reminders items MUST be objects with: id string (required) type enum absolute|relative (required) relative-only fields: relatedTo, offset absolute-only fields: absoluteTime description string (optional) Detailed semantics are defined in §10. 2.6.5 id (stable task identity)# When semantic role id is present: value MUST be a non-empty string. value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations. readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3). implementations SHOULD keep id unique within a collection; duplicate IDs SHOULD produce a validation issue. 2.6.6 Materialized occurrence roles# The roles in this subsection are required only for implementations claiming profile materialized-occurrences (§7.3.4). Parent recurring task roles: occurrence_materialization: enum manual|on_completion|rolling; controls when occurrence notes are created (§4.18.5). occurrence_next_trigger: enum completion|completion_or_skip; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6). occurrence_template: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported. occurrence_past_horizon and occurrence_future_horizon: ISO 8601 durations used by rolling materialization (§4.18.7). Materialized occurrence note roles: recurrence_parent: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections. occurrence_date: date value identifying the target date this occurrence note represents. Implementations claiming materialized-occurrences MUST treat recurrence_parent and occurrence_date together as the occurrence identity key. Within a resolved parent task, at most one materialized occurrence note SHOULD exist for each occurrence_date; duplicate notes MUST be reported when detected (§6.4). Materialized occurrence notes MAY also use normal task roles such as status, completed_date, scheduled, due, time_entries, reminders, contexts, projects, and body content. For dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3. 2.7 Unknown fields# Unknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations. Unknown fields MAY be removed only when: explicit normalization/migration is requested, or strict schema replacement is explicitly requested. 2.8 Example mapping# Example effective mapping: mapping: id: id title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrence_anchor complete_instances: complete_instances skipped_instances: skipped_instances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_estimate: timeEstimate time_entries: timeEntries blocked_by: blockedBy reminders: reminders 2.9 Example task record# --- id: task-2026-01-10-weekly-review title: Weekly review status: open priority: high scheduled: 2026-02-20 recurrence: FREQ=WEEKLY;BYDAY=FR recurrence_anchor: scheduled complete_instances: [2026-02-13] skipped_instances: [] blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: P1D reminders: - id: rem_day_before type: relative relatedTo: due offset: -P1D - id: rem_start type: absolute absoluteTime: 2026-02-20T09:00:00Z dateCreated: 2026-01-10T09:30:00Z dateModified: 2026-02-20T08:02:11Z --- Review completed work and plan next week. 2.10 Deterministic load example# Given frontmatter: recurrence_anchor: scheduled recurrenceAnchor: completion If canonical key is recurrence_anchor, a conforming loader using canonical-precedence policy MUST resolve semantic recurrence_anchor as scheduled and SHOULD emit a compatibility warning."},{"title":"3. Temporal Semantics","url":"/developers/specification/03-temporal-semantics/","description":"This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.","product":"specification","text":"3.1 Purpose# This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values. 3.2 Supported temporal value classes# Implementations MUST support: Date values: calendar day without time or timezone. Datetime values: instant in time. 3.3 Canonical serialization# 3.3.1 Date# Canonical date serialization is: YYYY-MM-DD 3.3.2 Datetime# Canonical datetime serialization is UTC ISO 8601 with Z, for example: 2026-02-20T13:45:00Z Canonical datetime writes MUST use second precision (YYYY-MM-DDTHH:MM:SSZ) and MUST NOT include fractional seconds. Implementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes. If an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds. 3.4 Parsing requirements# 3.4.1 Date parsing# Date parsing MUST reject invalid calendar dates. valid: 2026-02-28 invalid: 2026-02-30 3.4.2 Datetime parsing# Datetime parsing MUST reject malformed values. In strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example 2026-02-20T09:00:00 with no timezone offset). In permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning. 3.4.3 Mixed input tolerance# Implementations MAY accept both date and datetime values for roles like due and scheduled if configured to do so. The accepted form MUST be documented. 3.4.4 Inbound acceptance matrix# To avoid ambiguity, conforming parsers MUST follow this matrix. Date forms: Form Example Strict Permissive Canonical date 2026-02-20 accept accept Basic date (no separators) 20260220 reject (invalid_date_value) MAY accept only under documented compatibility policy; SHOULD emit warning Datetime forms: Form Example Strict Permissive Canonical UTC 2026-02-20T09:00:00Z accept accept ISO with explicit offset 2026-02-20T09:00:00+10:00 accept accept ISO with fractional seconds 2026-02-20T09:00:00.250Z accept (normalize to second precision on write) accept (normalize to second precision on write) Offset-less local datetime 2026-02-20T09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Space-separated datetime 2026-02-20 09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Basic datetime (no separators) 20260220T090000Z reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning When permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3. 3.5 Day semantics vs instant semantics# 3.5.1 Date roles# Date roles represent days, not instants, and MUST NOT be timezone-shifted. 3.5.2 Datetime roles# Datetime roles represent instants and MUST preserve instant equality through normalization. Example: input 2026-02-20T08:00:00-05:00 canonical write 2026-02-20T13:00:00Z 3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)# Because date-only fields are human-readable (YYYY-MM-DD) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals. Recommended approach: Parse date-only values to a UTC-midnight anchor instant for internal computations. Format date-only values from UTC calendar components when writing YYYY-MM-DD. Keep date-only roles as date-only on write unless an explicit conversion operation is requested. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6. Implementations MAY use different internal representations as long as all normative requirements in this section are preserved. 3.6 Local calendar-day evaluation# 3.6.1 Active runtime timezone# For day-level semantics, the active runtime timezone is: configured collection runtime_timezone if provided, otherwise the process/system local timezone. Implementations MUST make the effective timezone discoverable. 3.6.2 Local calendar-day rules# When calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone. This requirement prevents off-by-one day drift in positive and negative UTC offsets. 3.7 Comparison rules# 3.7.1 Date-to-date# Compare by calendar day ordering. 3.7.2 Datetime-to-datetime# Compare by instant ordering. 3.7.3 Date-to-datetime# If compared, implementations MUST document coercion policy. Recommended policy: convert date to local start-of-day for day-level comparisons, avoid implicit coercion for instant-level comparisons. 3.8 due and scheduled semantics# due and scheduled MAY be either date or datetime by configuration. Implementations MUST: preserve stored granularity unless explicit conversion is requested, avoid silently converting date to datetime during unrelated writes, require documented explicit policy for date-to-datetime conversion operations, apply consistent coercion policy in filters and status calculations. 3.9 Completion date semantics# completed_date is a date role. For non-recurring completion, writers MUST set completed_date using §5 semantics: explicit completion-day input when provided, otherwise current local day in active runtime timezone. 3.10 Created/modified timestamps# date_created and date_modified are datetime roles. Writers MUST: set both on create, update date_modified on successful mutating operations that change persisted state, preserve date_created unless explicit migration/edit operation changes it. 3.11 time_entries semantics# 3.11.1 Timestamp format# time_entries.startTime and time_entries.endTime MUST be datetime instants in canonical form on write. 3.11.2 Range validity# If both times exist, endTime MUST be greater than or equal to startTime. 3.11.3 Duration handling# If duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization. 3.11.4 Active session semantics# An entry with startTime and no endTime represents an active/running session. Implementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time. 3.11.5 Derived time calculations# For interoperability, implementations SHOULD expose both derived views when reporting tracked time: closed_minutes: sum of entries where both startTime and endTime exist. live_minutes: closed_minutes plus elapsed minutes of active entries (if any). Implementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs). 3.12 reminder temporal semantics# Reminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section. Rules: reminders[].absoluteTime MUST be a canonical datetime on write. reminders[].offset MUST be a valid ISO 8601 duration string. relative reminder base conversion for date-only values MUST use reminders.date_only_anchor_time from §9, or 00:00 local time if unset. 3.13 Example: local-day overdue evaluation# Assume local timezone America/Los_Angeles and local date 2026-02-20. Task A: due: 2026-02-19 status: open Task A is overdue. Task B: due: 2026-02-20 status: open Task B is not overdue at start of day; it becomes overdue on 2026-02-21 local day. 3.14 Example: preserving granularity# Before update: due: 2026-02-20 priority: normal Operation: update priority only. After update (conforming): due: 2026-02-20 priority: high Non-conforming behavior would silently rewrite due to a datetime. 3.15 Example: canonical datetime write# Input: timeEntries: - startTime: 2026-02-20T09:30:00+01:00 endTime: 2026-02-20T10:00:00+01:00 Canonical write: timeEntries: - startTime: 2026-02-20T08:30:00Z endTime: 2026-02-20T09:00:00Z 3.16 Example: UTC-anchor roundtrip for date-only field# Input: due: 2026-02-20 Internal computation anchor: 2026-02-20T00:00:00Z After unrelated update, conforming write: due: 2026-02-20 Non-conforming behavior would rewrite due as a datetime or shift it to another day based on local offset."},{"title":"4. Recurrence","url":"/developers/specification/04-recurrence/","description":"This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.","product":"specification","text":"4.1 Purpose# This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state. 4.2 Recurrence applicability# A task is recurring when semantic role recurrence contains a valid tasknotes recurrence string. If recurrence is absent or empty, the task is non-recurring. 4.3 Rule format# 4.3.1 Required format# recurrence MUST be a tasknotes recurrence string. This syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment. The RRULE parameter portion MUST use RFC 5545 RRULE property syntax. It MAY include a leading inline DTSTART segment. If DTSTART is present, it MUST use one of: DTSTART:YYYYMMDD (date-only) DTSTART:YYYYMMDDTHHMMSSZ (UTC datetime) Canonical combined form is: DTSTART:...;FREQ=... Implementations MAY accept inbound RRULE: prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above. Examples: FREQ=DAILY FREQ=WEEKLY;BYDAY=MO,WE,FR FREQ=MONTHLY;BYMONTHDAY=1 DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR 4.3.2 Invalid rule handling# Invalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode. 4.4 Recurrence anchor# recurrence_anchor controls progression semantics and MUST be one of: scheduled completion If missing, implementations SHOULD default to scheduled unless collection configuration defines another default. 4.4.1 Recurrence seed precedence# When recurrence generation requires a seed/start date, implementations MUST resolve it in this order: DTSTART embedded in recurrence, semantic scheduled, semantic date_created. If no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error. 4.4.2 Anchor progression behavior# For recurrence_anchor=scheduled, progression is based on the scheduled chain and DTSTART MUST remain fixed after it is set. For recurrence_anchor=completion, complete-instance operations MUST advance progression by updating DTSTART to the completion target (date or datetime per §4.4.3). 4.4.3 DTSTART update semantics# When recurrence_anchor=completion and instance completion succeeds for resolved target day D: Instance-list state (complete_instances, skipped_instances) MUST always use day D. If the caller provided an explicit datetime target, DTSTART MUST be rewritten as DTSTART:YYYYMMDDTHHMMSSZ using that target instant normalized to UTC. Otherwise, DTSTART MUST be rewritten as DTSTART:YYYYMMDD for day D. RRULE components other than DTSTART MUST be preserved unless an explicit recurrence-edit operation changes them. If DTSTART is absent, completion-anchor progression MUST insert it before RRULE parameters. 4.4.4 Recalculation semantics for recurrence_anchor=completion# When calculating the next candidate occurrence for recurrence_anchor=completion: Implementations MUST treat DTSTART progression as the consumed-history mechanism. complete_instances MUST NOT be used as an exclusion set for future occurrence selection in this mode. skipped_instances MUST still exclude matching candidate dates. Candidate selection MUST choose the first RRULE occurrence strictly after the current DTSTART anchor (or resolved seed if DTSTART is absent). This matches the completion-anchor progression model where each completion advances the chain by rewriting DTSTART. This model is intentionally not fully reversible via ordinary uncomplete instance; progression history lives in DTSTART, not only in complete_instances. 4.4.5 DTSTART canonicalization on recurring writes# To ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure DTSTART is present after create or successful recurring-instance completion. Rules: If persisted recurrence already contains DTSTART, keep it unless an explicit operation updates it per §4.4.3. If persisted recurrence omits DTSTART, writers MUST resolve a seed using §4.4.1 and insert DTSTART before RRULE parameters. For recurrence_anchor=scheduled, inserted DTSTART becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions. If seed resolution fails, operation MUST fail deterministically and emit missing_recurrence_seed. 4.5 Instance state fields# Per-instance state is represented by: complete_instances: list of date values skipped_instances: list of date values These lists represent day-level instance outcomes. 4.6 Invariants# Implementations MUST enforce: Items in instance lists are valid date values. No date appears in both lists simultaneously. Duplicate dates are normalized (set semantics) or rejected deterministically. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence. 4.7 Instance completion semantics# Operation: complete instance for target date D. Conforming behavior: Add D to complete_instances. Remove D from skipped_instances if present. Leave base task status unchanged unless explicit policy states otherwise. Update date_modified when state changes. Operation MUST be idempotent. 4.8 Instance uncompletion semantics# Operation: uncomplete instance for target date D. Conforming behavior: Remove D from complete_instances if present. Do not add D to skipped_instances implicitly. For recurrence_anchor=completion, uncomplete MUST NOT rewrite or roll back DTSTART; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation. Update date_modified when state changes. Operation MUST be idempotent. 4.9 Instance skip semantics# Operation: skip instance for target date D. Conforming behavior: Add D to skipped_instances. Remove D from complete_instances if present. Update date_modified when state changes. Operation MUST be idempotent. 4.10 Instance unskip semantics# Operation: unskip instance for target date D. Conforming behavior: Remove D from skipped_instances if present. Do not add to complete_instances implicitly. Update date_modified when state changes. Operation MUST be idempotent. 4.11 Effective instance state# For target date D, effective state MUST be resolved in this order: If D in complete_instances: state is completed. Else if D in skipped_instances: state is skipped. Else: state is unresolved/default for that instance. Because overlap is invalid, this ordering is deterministic. 4.12 Interaction with base status# For recurring tasks: Base status is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured. Instance state determines completion for recurrence-aware views and operations. Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy. For non-recurring tasks, completion uses base status semantics (§5). 4.13 Completed-status configuration# Implementations MUST define which status values are treated as complete for non-recurring tasks. The completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal. 4.14 Example: complete then skip same day# Initial: recurrence: FREQ=DAILY completeInstances: [2026-02-20] skippedInstances: [] Skip target date 2026-02-20: recurrence: FREQ=DAILY completeInstances: [] skippedInstances: [2026-02-20] 4.15 Example: idempotent complete# Initial: completeInstances: [2026-02-20] skippedInstances: [] Complete 2026-02-20 again: persisted instance lists remain unchanged, operation succeeds without duplicate entries. 4.16 Example: anchor semantics# Task: recurrence: FREQ=WEEKLY;BYDAY=FR recurrenceAnchor: completion If implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is completion, not solely by scheduled chain. Implementations using DTSTART progression MUST update DTSTART to the completion date for this mode. Worked example (recurrence_anchor=completion): recurrence: DTSTART:20260220;FREQ=DAILY recurrence_anchor: completion complete_instances: [2026-02-20, 2026-02-21] skipped_instances: [2026-02-23] Conforming recalculation: does not exclude 2026-02-22 because it is absent from skipped_instances, does exclude 2026-02-23 because it is skipped, ignores complete_instances for future exclusion in this mode (§4.4.4). 4.17 Validation examples# Invalid overlap: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Result: validation error instance_state_overlap. Invalid date in list: completeInstances: [2026-02-30] Result: validation error invalid_date_value. 4.18 Recurrence materialization# This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4). Recurrence materialization creates ordinary task files for specific target dates of a recurring parent task. It is additive behavior: implementations that do not claim materialized-occurrences continue to use the instance-list model in §4.5-§4.12. Materialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7). 4.18.1 Parent and occurrence ownership# The parent recurring task owns series-level semantics: recurrence recurrence_anchor recurrence generation and DTSTART progression parent instance-list compatibility state (complete_instances, skipped_instances) materialization policy fields (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon) A materialized occurrence note owns per-date task semantics for its occurrence_date, including: status completed_date body content and checklists time_entries per-occurrence due, scheduled, reminders, contexts, projects, and unknown fields 4.18.2 Occurrence identity and parent reference# A materialized occurrence note MUST store: recurrence_parent: a link-or-string reference to the parent recurring task occurrence_date: the target date represented by the occurrence note The preferred Obsidian-compatible representation for recurrence_parent is a wikilink, for example: recurrence_parent: \"[[Weekly Review]]\" occurrence_date: 2026-02-27 Implementations claiming materialized-occurrences MUST resolve recurrence_parent using §11 link semantics for this role, even if they do not claim full extended. If the parent cannot be resolved, validation SHOULD report invalid_recurrence_parent. For one resolved parent, there SHOULD be at most one materialized occurrence note per occurrence_date. Duplicate detected occurrence notes SHOULD report duplicate_occurrence_note and MUST NOT be chosen nondeterministically for writes. 4.18.3 Effective state precedence# For target date D, recurrence-aware effective state MUST be resolved in this order: If a materialized occurrence note exists for (parent, D), derive state from that note's own task state: completed when its status is in status.completed_values; skipped when its status is in status.skipped_values; otherwise unresolved/default for that instance. Else if D is in parent complete_instances: state is completed. Else if D is in parent skipped_instances: state is skipped. Else: state is unresolved/default for that instance. If a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for D. Validators SHOULD report occurrence_state_conflict, and repair/normalization operations MAY update parent lists to match occurrence notes. 4.18.4 Parent instance lists as compatibility state# When materialized occurrence notes are supported, parent complete_instances and skipped_instances remain part of canonical persisted state. They serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes. Conforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip: completed child state: add D to complete_instances, remove D from skipped_instances; skipped child state: add D to skipped_instances, remove D from complete_instances; active/unresolved child state after uncompletion/unskip: remove D from the relevant parent list. Reconciliation failure MUST NOT silently change the occurrence note state. Implementations SHOULD surface a recoverable error or warning. 4.18.5 Materialization modes# occurrence_materialization controls when materialized occurrence notes are created. Allowed values: manual: occurrence notes are created only by explicit user or API action. on_completion: completing a materialized occurrence note creates the next occurrence note. rolling: the implementation maintains a bounded materialized window, such as today through the next 14 days. If absent, occurrence_materialization MUST default to manual. on_completion does not by itself create the first occurrence note in a series. The first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option. Conforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing. 4.18.6 Next-occurrence trigger# occurrence_next_trigger controls whether skip/cancel transitions also create the next occurrence note when occurrence_materialization=on_completion. Allowed values: completion: only completion creates the next occurrence note. completion_or_skip: completion and skip/cancel create the next occurrence note. If absent, occurrence_next_trigger MUST default to completion. The next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics. Materializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate. 4.18.7 Rolling materialization bounds# For occurrence_materialization=rolling, implementations MUST enforce finite bounds. Unbounded future materialization is non-conformant. Bounds SHOULD be expressed with ISO 8601 durations such as: occurrence_past_horizon: P0D occurrence_future_horizon: P14D If bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults. 4.18.8 Recurrence edits and historical notes# Materialized occurrence notes are durable task files. Editing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes. If an existing occurrence note's occurrence_date is no longer generated by the current parent recurrence rule, validators MAY report materialization_target_not_generated as a warning. This condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated."},{"title":"5. Operations","url":"/developers/specification/05-operations/","description":"This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.","product":"specification","text":"5.1 Purpose# This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state. 5.2 General operation rules# For all mutating operations: Validation MUST run before commit in strict mode. Writes MUST be atomic at file level (all-or-nothing per file). date_modified MUST be updated on successful state change. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations. Operations identified as idempotent MUST remain safe under repetition. 5.2.1 Target day/date resolution# Recurring instance operations act on a target day/date (complete instance, uncomplete instance, skip, unskip). Non-recurring complete uses completion-day semantics for completed_date. Resolution MUST be deterministic: If caller provides an explicit target date/datetime, that value is authoritative. If caller omits target for recurring instance operations, implementations MUST resolve in this order: task scheduled, if present and target-day-resolvable, else task due, if present and target-day-resolvable, else current local day in active runtime timezone (§3.6). Target-day resolution for fallback task fields (scheduled / due) MUST use this extraction policy: if stored value is canonical date (YYYY-MM-DD), use it as-is; if stored value is datetime, use the literal date token before T (YYYY-MM-DD) without timezone shifting; if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning; if a candidate value is unusable, continue to the next fallback source. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone. When an explicit target is datetime: operations that require day semantics MUST use its calendar date part in active runtime timezone, for recurring complete instance with recurrence_anchor=completion, the same explicit datetime target MUST also drive DTSTART rewrite semantics in §4.4.3. This explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above. 5.2.2 Idempotency and date_modified# For operations marked idempotent: first application MAY change state and date_modified, repeated application with semantically equivalent input MUST leave persisted state unchanged. When a repeated idempotent operation is a no-op, date_modified MUST remain unchanged. 5.3 Create# 5.3.1 Input requirements# Create MUST provide at minimum semantic roles required by §2, directly or via defaults. 5.3.2 Required behavior# Create MUST: apply default values, generate date_created and date_modified when absent, resolve semantic title and filename/path behavior according to §9.13, apply create-time templating when enabled and supported (§5.3.5, §9.14, §7), serialize canonical keys and canonical temporal formats, when recurrence is present, canonicalize DTSTART per §4.4.5, preserve caller-provided semantic id when present, fail with validation errors if required constraints are unmet, apply default reminders according to §10.3.9 when configured. 5.3.3 Title and filename resolution on create# Create MUST produce a deterministic initial filename/path. Rules: Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames. If title.storage=filename: basename MUST derive from semantic title, title changes after create are handled by update semantics (§5.4.4), implementations MAY also persist mapped title as a synchronized compatibility mirror, title.filename_format and title.custom_filename_template MUST be ignored. If title.storage=frontmatter, create-time basename MUST follow title.filename_format: title: sanitized semantic title, zettel: implementation-defined zettel pattern (MUST be documented), timestamp: implementation-defined timestamp pattern (MUST be documented), custom: title.custom_filename_template expansion. If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing). 5.3.4 Example# Input intent: title: \"Pay electricity bill\" Assume defaults: status default open priority default normal Persisted frontmatter (example): title: Pay electricity bill status: open priority: normal dateCreated: 2026-02-20T14:00:00Z dateModified: 2026-02-20T14:00:00Z 5.3.5 Optional create-time templating# This subsection is required only for implementations claiming profile templating (§7.3.3). Create-time templating pipeline MUST be deterministic: Compute base create payload from explicit input, defaults (§9.8), and generated/system values (date_created, date_modified, resolved title policy). Expand template variables using that base payload and active runtime date/time context. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict). Resolve body output: if expanded template body is non-empty, use it; otherwise use caller-provided body/details (if any). Template parse rules: If template content begins with ---, implementations MUST treat the first --- ... --- block as template frontmatter and the remainder as template body. Frontmatter variable expansion MUST run before YAML parsing of template frontmatter. Portable variable support: Implementations claiming templating MUST support all variables in the Required column of the table below. Implementations MAY support any variable in the Extended column. Required task-data variables: Variable Value Format / separator {{title}} Semantic title string; YAML-quoted if needed {{status}} Task status value string {{priority}} Task priority value string {{dueDate}} Due date if set YYYY-MM-DD or empty {{scheduledDate}} Scheduled date if set YYYY-MM-DD or empty {{details}} Caller-provided body/description string {{contexts}} Contexts list comma-separated, e.g. \"work, home\" {{tags}} Tags list comma-separated, e.g. \"task, errands\" {{hashtags}} Tags list as hashtags space-separated, e.g. \"#task #errands\" {{timeEstimate}} Time estimate in minutes integer string or empty {{parentNote}} Parent note name/path string; YAML-quoted if needed Required date/time variables (expansion time): Variable Value Format {{date}} Current date yyyy-MM-dd {{time}} Current time (24h) HH:mm {{year}} Full year yyyy {{month}} Month number MM {{day}} Day of month dd Extended variables (optional): Variable Value Format {{dateTime}} Date + time yyyy-MM-dd-HHmm {{timestamp}} Full timestamp yyyy-MM-dd-HHmmss {{shortDate}} Short date yyMMdd {{shortYear}} Two-digit year yy {{monthName}} Month full name e.g. February {{monthNameShort}} Month short name e.g. Feb {{dayName}} Weekday full name e.g. Monday {{dayNameShort}} Weekday short name e.g. Mon {{week}} ISO week number ww {{quarter}} Quarter number 1–4 {{hour}} Hour (24h) HH {{minute}} Minute mm {{second}} Second ss {{time12}} Time with AM/PM hh:mm a {{time24}} Time (24h) HH:mm {{timezone}} UTC offset long e.g. +05:30 {{utcOffset}} UTC offset long e.g. +05:30 {{unix}} Unix timestamp (seconds) integer string {{unixMs}} Unix timestamp (ms) integer string {{zettel}} Zettelkasten ID date + seconds-since-midnight base-36 {{titleLower}} Title lowercase string {{titleUpper}} Title uppercase string {{titleSnake}} Title snake_case string {{titleKebab}} Title kebab-case string {{titleCamel}} Title camelCase string {{titlePascal}} Title PascalCase string {{priorityShort}} First letter of priority uppercase char {{statusShort}} First letter of status uppercase char Unknown variables (not in the above lists) MUST be handled per templating.unknown_variable_policy (§9.14): preserve: leave the {{...}} placeholder as-is. empty: replace with an empty string. Deterministic expansion context: date/time variable expansion MUST use the active runtime timezone from §3.6. locale-sensitive variables (monthName, monthNameShort, dayName, dayNameShort, time12) MUST use English locale outputs for portability (January, Jan, Monday, Mon, AM/PM). template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2). Failure behavior: templating.failure_mode=error: template read/parse failures MUST abort create. templating.failure_mode=warning_fallback: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (template_missing or template_parse_failed). 5.3.6 Identity handling on create# If semantic id is provided on create, writers MUST preserve it. If implementation supports auto-generation of semantic id, generation policy MUST be documented and resulting id MUST remain stable after create. 5.4 Update# 5.4.1 Patch semantics# Update MUST be patch-by-default: only targeted semantic roles are changed. 5.4.2 Preservation rules# Update MUST preserve: unrelated known roles, unknown fields, original date/datetime granularity for untouched fields. 5.4.3 Example# Before: title: Weekly review scheduled: 2026-02-20 priority: normal customClient: ACME Operation: set priority to high. After: title: Weekly review scheduled: 2026-02-20 priority: high customClient: ACME 5.4.4 Title updates and filename updates# If an update changes semantic title, behavior MUST follow title.storage: title.storage=filename: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move. title.storage=frontmatter: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested. If implementation keeps frontmatter title for compatibility while title.storage=filename, it MUST keep stored title synchronized with effective filename-derived title. 5.5 Complete (non-recurring)# For non-recurring tasks, complete MUST: Set status to a configured completed value, unless already completed. If multiple completed values are configured, implementation MUST choose deterministically (default: first entry in status.completed_values). Set completed_date to completion day: explicit completion-day input when provided, otherwise current local day in active runtime timezone (§5.2.1). Apply overwrite policy deterministically (overwrite or preserve_if_present). Update date_modified on state change. Implementations MUST document completion-day input handling and completed_date overwrite policy. Operation MUST be idempotent. 5.6 Uncomplete (non-recurring)# For non-recurring tasks, uncomplete MUST: Set status to configured active/default status according to policy (default: status.default). Clear or retain completed_date according to policy. Update date_modified on state change. Policy MUST be documented and deterministic. Operation MUST be idempotent. 5.7 Complete instance (recurring)# For recurring tasks, complete with resolved target date D (§5.2.1) MUST follow §4.7. Writers MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it. When recurrence_anchor=completion and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime DTSTART rewrite behavior. When recurrence_anchor=scheduled and DTSTART is absent, implementations MUST insert DTSTART deterministically per §4.4.5. Next-occurrence recalculation in this mode MUST follow §4.4.4. 5.8 Uncomplete instance (recurring)# For recurring tasks, uncomplete with resolved target date D (§5.2.1) MUST follow §4.8. For recurrence_anchor=completion, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back DTSTART. 5.9 Skip and unskip instance# Skip/unskip for recurring tasks with resolved target date D (§5.2.1) MUST follow §4.9 and §4.10. 5.10 Dependency operations# Dependency operations MUST follow §10.2. 5.10.1 Add dependency# Add dependency MUST: validate dependency entry schema, parse and resolve uid per §11, enforce duplicate and self-reference rules, preserve existing non-target dependency entries, update date_modified on change. 5.10.2 Remove dependency# Remove dependency by uid MUST be idempotent. 5.10.3 Replace dependency list# Replace dependency list MUST be explicit (not default patch behavior). 5.11 Reminder operations# Reminder operations MUST follow §10.3. 5.11.1 Add reminder# Add reminder MUST: validate reminder schema, enforce unique id within task, update date_modified on change. 5.11.2 Update reminder# Update reminder MUST target a reminder by id and be patch-by-default. 5.11.3 Remove reminder# Remove reminder by id MUST be idempotent. 5.12 Archive# Implementations MAY support archive semantics through: archive tag, archive status, dedicated boolean/archive field. Archive behavior MUST be documented. Archive MUST NOT implicitly delete the task. 5.13 Delete# Delete MUST remove the task file. Optional safety behavior: Implementations MAY perform backlink/dependency checks. If checks are enabled, implementation MUST provide a bypass option for explicit force delete. 5.14 Rename# Rename operation changes file path/filename while preserving semantic record identity. 5.14.1 Rename interaction with title storage mode# If title.storage=filename, basename changes from rename MUST update effective semantic title. If title.storage=frontmatter, rename MUST NOT implicitly rewrite mapped title unless explicitly requested. Implementations that persist frontmatter title in title.storage=filename mode MUST either update that field on rename or remove it to prevent divergence. If semantic id is present, rename/move MUST preserve its value unchanged. If implementation supports link/reference updating, it MUST: update resolvable references deterministically, report unresolved or ambiguous updates, update dependency uid and projects references consistently with normal links. If implementation does not support reference updates, this limitation MUST be disclosed in conformance claim. 5.15 Batch operations# Batch operations MAY be supported. If supported, implementation MUST report per-item outcomes and summary counts: total succeeded failed Partial success behavior MUST be documented. 5.16 Concurrency# Implementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash). When conflict is detected, operation MUST fail safely unless explicit overwrite is requested. 5.17 Dry run# If dry run mode is supported, operation MUST: execute validation and transformation logic, report intended changes, perform no file write. 5.18 Error model# Implementation-native operation failures MUST provide structured error information with: operation name, error code, message, optional field/path context. For conformance adapter envelopes (§5.22), failures MAY be represented as a compact error string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via error_details). 5.19 Time tracking management# This subsection applies to implementations that support time_entries. 5.19.1 Start time tracking# Start on task T MUST: fail when T already has an active time entry, append a new entry with canonical startTime and no endTime, MAY set a default description, update date_modified, persist canonical time_entries shape (including removal of legacy/stale duration fields when normalizing). Recommended error code when already active: time_tracking_already_active. 5.19.2 Stop time tracking# Stop on task T MUST: fail when T has no active time entry, set endTime on the active entry to canonical current datetime, update date_modified, preserve non-target entries and unknown frontmatter fields. Recommended error code when no active session exists: no_active_time_entry. 5.19.3 Edit or replace time entries# When replacing/editing time_entries explicitly, implementations MUST: valid"},{"title":"6. Validation","url":"/developers/specification/06-validation/","description":"Validation ensures persisted task records conform to this specification and collection configuration.","product":"specification","text":"6.1 Purpose# Validation ensures persisted task records conform to this specification and collection configuration. 6.2 Validation phases# Implementations SHOULD validate in these phases: Parse validation (YAML/frontmatter structure) Schema validation (types and role constraints) Semantic validation (cross-field invariants) 6.3 Validation modes# Conforming implementations MUST support: strict: errors block writes. Implementations MAY additionally support: permissive: writes may continue with warnings. Current mode MUST be discoverable. 6.4 Required checks# A conforming validator MUST implement checks required by the claimed profile(s): Check ID Requirement Required for 1 Unconditionally required semantic roles are present (status, date_created, date_modified). core-lite and above 1a completed_date conditional requiredness is enforced per §2.2.1. core-lite and above 1b title resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback. core-lite and above 2 Field values match role type requirements. core-lite and above 3 Temporal values conform to §3. core-lite and above 4 Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules). recurrence and above 5 Per-instance lists contain valid dates with no overlap. recurrence and above 6 date_modified is not earlier than date_created when both exist. core-lite and above 7 time_estimate is non-negative when present. any profile that supports time_estimate 8 time_entries entries include required startTime, ranges are valid when endTime exists, and at most one active entry exists per task. any profile that supports time_entries 9 blocked_by entries conform to §10.2 (shape, enum, duplicates, self-reference). extended 10 reminders entries conform to §10.3 (shape, type-specific fields, unique ids). extended 11 relative reminders have resolvable base fields or produce configured error/warning behavior. extended 12 link-bearing fields (projects, blocked_by.uid) conform to §11 parsing/resolution and traversal safety. extended 13 templating configuration is valid when provided (templating schema and enums). templating 14 create-time template failures obey configured failure mode (error vs fallback). templating 15 semantic id (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable. any profile that supports semantic id 16 materialized occurrence notes contain valid recurrence_parent and occurrence_date roles. materialized-occurrences 17 no duplicate materialized occurrence notes exist for the same resolved (recurrence_parent, occurrence_date) pair. materialized-occurrences 18 materialization policy values and rolling horizons conform to §4.18 and §9.17. materialized-occurrences 6.5 Unknown field policy# Unknown fields: MUST NOT fail validation by default unless collection is configured for strict schema closure. SHOULD generate informational warnings when strict schema closure is desired but not enabled. 6.6 Issue structure# Validation issues MUST include: code (machine-readable) severity (error, warning, or info) message (human-readable) Issues SHOULD include: field or path expected and actual details where useful 6.7 Recommended issue codes# Code Severity (default) Meaning missing_required error required role missing invalid_type error value type mismatch invalid_enum_value error value not in configured set invalid_date_value error malformed or impossible date invalid_datetime_value error malformed datetime invalid_recurrence_rule error recurrence not valid tasknotes recurrence syntax missing_recurrence_seed error recurrence has no resolvable seed/start date invalid_recurrence_anchor error anchor not allowed instance_state_overlap error same date in complete and skipped lists invalid_time_range error end before start in time entry missing_time_entry_start error time entry is missing required startTime multiple_active_time_entries error more than one active time entry exists in one task invalid_dependency_entry error dependency object missing required fields invalid_dependency_reltype error dependency reltype not allowed invalid_dependency_gap error dependency gap not valid ISO 8601 duration duplicate_dependency_uid error in strict mode when dependencies.enforce_unique_uid=true; warning otherwise by policy repeated dependency uid in task self_dependency error task depends on itself unresolved_dependency_target warning dependency target not resolvable invalid_reminder_entry error reminder object missing required fields duplicate_reminder_id error repeated reminder id in task invalid_reminder_type error reminder type not allowed invalid_reminder_offset error relative reminder offset not valid duration invalid_reminder_related_to error relatedTo must be due or scheduled invalid_reminder_absolute_time error absoluteTime invalid datetime unresolvable_reminder_base error relative reminder base field missing/unusable invalid_link_format error link value cannot be parsed as supported format ambiguous_link warning link resolves to multiple candidates path_traversal error resolved path escapes collection root unresolved_link_target warning link target cannot be resolved invalid_task_id error semantic id is empty or invalid type duplicate_task_id warning duplicate semantic id detected in collection scope alias_conflict_ignored warning alias key ignored due to canonical conflict unresolvable_title error title cannot be resolved from title resolution policy title_source_conflict warning mapped title and filename title differ; active title-storage policy selected authoritative source template_missing warning configured template file cannot be read/found template_parse_failed warning template frontmatter/body parsing or expansion failed missing_recurrence_parent error materialized occurrence note omits recurrence_parent invalid_recurrence_parent warning occurrence note parent reference cannot be resolved or does not reference a recurring task missing_occurrence_date error materialized occurrence note omits occurrence_date duplicate_occurrence_note warning more than one materialized occurrence note exists for the same parent/date occurrence_state_conflict warning materialized occurrence state disagrees with parent instance lists materialization_target_not_generated warning occurrence date is not generated by current parent recurrence rule missing_skipped_status error skip of materialized occurrence requires configured skipped status next_occurrence_materialization_failed warning triggering operation succeeded but next occurrence note could not be created orphan_occurrence_note warning materialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note unknown_field info unmapped field encountered Implementations MAY extend this code set but SHOULD preserve existing meanings. 6.8 Write-time validation behavior# In strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes. Warnings SHOULD NOT block writes unless explicitly configured. Datetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4. 6.9 Validation examples# 6.9.1 Missing required role# Input: title: Plan workshop status: open dateCreated: 2026-02-20T09:00:00Z Issue: code: missing_required severity: error field: dateModified message: Required field 'dateModified' is missing. 6.9.2 Invalid recurrence anchor# Input: recurrence: FREQ=DAILY recurrenceAnchor: due Issue: code: invalid_recurrence_anchor severity: error field: recurrenceAnchor message: recurrence anchor must be 'scheduled' or 'completion'. 6.9.3 Overlap in instance state# Input: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Issue: code: instance_state_overlap severity: error message: same date exists in complete and skipped instance lists. 6.9.4 Invalid dependency reltype# Input: blockedBy: - uid: \"[[task-a]]\" reltype: BLOCKS Issue: code: invalid_dependency_reltype severity: error field: blockedBy[0].reltype message: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH. 6.9.5 Unresolvable reminder base# Input: reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D Issue when due missing: code: unresolvable_reminder_base severity: error field: reminders[0] message: relative reminder references due but no due value exists. 6.9.6 Unknown field in permissive mode# Input: title: Plan workshop status: open vendorPriority: p1 Issue example: code: unknown_field severity: info field: vendorPriority message: field is not mapped to a known semantic role. 6.9.7 Multiple active time entries# Input: timeEntries: - startTime: 2026-02-20T10:00:00Z - startTime: 2026-02-20T11:00:00Z Issue: code: multiple_active_time_entries severity: error field: timeEntries message: task contains more than one active time entry."},{"title":"7. Conformance","url":"/developers/specification/07-conformance/","description":"This section defines conformance profiles and claim requirements for implementations.","product":"specification","text":"7.1 Purpose# This section defines conformance profiles and claim requirements for implementations. 7.2 Conformance principles# An implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented. Implementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements. 7.3 Profile model# Profiles are cumulative unless explicitly marked otherwise. 7.3.1 Profile: core-lite# Required capabilities: task identification and loading semantic-role mapping and canonical writes (§2) required role support (title, status, completed_date, date_created, date_modified) create, update, delete operations (§5) non-recurring complete/uncomplete (§5) temporal parsing/canonical serialization basics (§3) strict validation mode support (§6.3) validation core checks (§6.4 items 1,1a,1b,2,3,6) 7.3.2 Profile: recurrence# Additional required capabilities: tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline DTSTART handling recurrence anchor semantics, including seed precedence and completion-anchor progression complete/uncomplete instance skip/unskip instance instance-list invariants and effective state resolution validation checks for recurrence and instance overlap 7.3.3 Profile: templating (non-cumulative extension)# This profile is not cumulative; it MAY be claimed alongside core-lite, recurrence, materialized-occurrences, and/or extended. templating MUST NOT be claimed alone. Required capabilities: create-time template processing semantics per §5.3.5 templating configuration support per §9.14 deterministic template/frontmatter/body merge behavior deterministic failure-mode behavior for template read/parse failures support for portable double-brace template variables defined in §5.3.5 7.3.4 Profile: materialized-occurrences (non-cumulative extension)# This profile is not cumulative; it MUST be claimed alongside recurrence. It MAY be claimed alongside extended and/or templating, but it does not require either. Required capabilities: materialized occurrence roles and identity semantics (§2.6.6) recurrence materialization semantics (§4.18) materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20) occurrences configuration defaults (§9.17) parent-reference link parsing/resolution for recurrence_parent (§11), without requiring full extended validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18) Claiming materialized-occurrences also has required capability-token implications: meta.claim.capabilities MUST include materialized-occurrences. meta.claim.profiles MUST also include recurrence. Omitting either token while claiming materialized-occurrences is a non-conformant claim. 7.3.5 Profile: extended# Additional required capabilities: dependency schema support (blocked_by) reminder schema support (reminders) link parsing/resolution semantics for link-bearing fields (§11) time-tracking management semantics for time_entries (§5.19), including per-task active-session constraints dependency operations and validation per §10.2 reminder operations and validation per §10.3 If extended is claimed, all of the above baseline capabilities MUST conform to documented semantics. Claiming extended also has required capability-token implications: meta.claim.capabilities MUST include dependencies, reminders, links, and time-tracking. Omitting any of these tokens while claiming extended is a non-conformant claim (even if capability-gated fixtures are skipped by a runner). Optional capability extensions within extended: rename capability: reference-aware rename behavior (including dependency UID references) archive capability: archive semantics (§5.12) batch capability: batch operations with per-item outcomes (§5.15) concurrency capability: write-conflict detection semantics (§5.16) dry-run capability: dry-run semantics (§5.17) When an optional capability token is claimed, corresponding behavior MUST conform to documented semantics. 7.4 Conformance claim format# A conformance claim MUST include: implementation name and version, tasknotes-spec version, claimed profile list, validation mode support (strict required; permissive optional), known deviations, compatibility mode status (if any), configuration provider status (active provider chain, precedence policy, and fallback state). Example: Implementation: example-task-cli v1.4.0 Spec: tasknotes-spec 0.3.0-rc.1 Profiles: core-lite, recurrence, templating Validation modes: strict, permissive Known deviations: none Compatibility mode: disabled Configuration providers: tasknotes_plugin_data_json > built_in_defaults Configuration fallback: none 7.5 Deviation disclosure# Any known deviation from normative text MUST be explicitly disclosed in conformance output/documentation. A deviation entry SHOULD include: affected section, deviation summary, impact, planned resolution version. 7.6 Feature detection# Implementations SHOULD expose machine-readable capability metadata, including: profiles effective runtime timezone active configuration providers and precedence chain enabled compatibility modes configurable status sets supported mapping aliases templating support flags and effective templating failure mode dependency and reminder support flags time-tracking support flags, including active-session policy and auto-stop-on-complete behavior materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds configured natural-language capture triggers when the optional nlp block is present 7.7 Strictness disclosure# Conformance requires strict validation mode support (§6.3). Conformance claims MUST indicate whether permissive mode is also supported. 7.8 Example profile matrix# Capability core-lite recurrence templating materialized-occurrences extended create/update/delete required required companion-profile required companion-profile required required non-recurring complete required required companion-profile required companion-profile required required recurring instance complete/skip - required optional required via companion recurrence claim required materialize occurrence notes (§4.18, §5.20) - - optional required optional recurrence parent link resolution - - optional required for recurrence_parent only required template expansion/merge (§5.3.5) - - required optional optional double-brace portable variable support - - required optional optional recurrence-string validation - required optional required via companion recurrence claim required link parsing/resolution (§11) - - optional required for recurrence_parent only required dependency schema and ops - - optional optional required reminder schema and ops - - optional optional required time tracking start/stop/edit semantics (§5.19) - - optional optional required rename updates dependency/project links - - optional optional optional via rename capability archive semantics (§5.12) - - optional optional optional via archive capability batch per-item outcomes (§5.15) - - optional optional optional via batch capability write-conflict detection (§5.16) - - optional optional optional via concurrency capability dry-run reporting (§5.17) - - optional optional optional via dry-run capability 7.9 Executable fixture suite# This specification includes an executable fixture suite in conformance/. language-neutral fixtures are stored in conformance/fixtures/*.json section/profile/operation coverage is tracked in conformance/manifest.json coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations. adapters execute fixture operations per conformance/docs/ADAPTER_CONTRACT.md runners MUST execute fixtures only when both conditions hold: fixture profile is satisfied by claimed adapter profiles under cumulative profile rules (§7.3), all fixture requires capability tokens are present. Fixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own profile/requires gating guarantees. Fixtures for optional extension capabilities (rename, archive, batch, concurrency, dry-run) MUST be capability-gated via requires and MUST NOT rely on extended profile membership alone. Conformance claims SHOULD report fixture pass/fail results against the claimed profiles. 7.10 Meta operations# The following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token. meta.claim# Returns the adapter's self-reported metadata. Input: {} (empty object) Output: { \"ok\": true, \"result\": { \"implementation\": \"my-tool\", \"version\": \"1.0.0\", \"spec_version\": \"0.3.0-rc.1\", \"validation_modes\": [\"strict\"], \"profiles\": [\"core-lite\", \"recurrence\"], \"capabilities\": [\"dependencies\", \"links\"] } } Fields: Field Type Required Description implementation string yes Human-readable implementation name version string yes Implementation version string spec_version string yes tasknotes-spec version targeted by this adapter validation_modes string[] yes Supported validation modes; MUST include strict profiles string[] yes Claimed conformance profiles; valid values: core-lite, recurrence, extended, templating, materialized-occurrences capabilities string[] yes Optional capability tokens; known tokens listed in §7.11 profiles lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of meta.has_profile. Profile-token consistency rules: If profiles contains extended, capabilities MUST include dependencies, reminders, links, and time-tracking. If profiles contains templating, capabilities MUST include templating. If profiles contains materialized-occurrences, profiles MUST also contain recurrence and capabilities MUST include materialized-occurrences. Runners and fixture suites SHOULD validate these claim-consistency rules directly from meta.claim, not only by capability-gating feature fixtures. meta.has_capability# Tests whether the adapter claims a specific capability. Input: { \"capability\": \"dependencies\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the capability is in the capabilities array returned by meta.claim, and false otherwise. meta.has_profile# Tests whether the adapter claims a specific conformance profile. Input: { \"profile\": \"recurrence\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the profile is in the profiles array returned by meta.claim, and false otherwise. 7.11 Known capability tokens# The following capability tokens are defined by this specification. Implementations MAY define additional tokens. Token Required by profile Meaning dependencies extended Supports blocked_by, dependency operations, and dependency validation reminders extended Supports reminders, reminder operations, and reminder validation links extended Supports link parsing and resolution (§11) time-tracking extended Supports time-tracking management operations (§5.19) materialized-occurrences materialized-occurrences Supports recurrence materialization and materialized occurrence operations (§4.18, §5.20) rename optional extension under extended Supports file rename with reference updates archive optional extension under extended Supports archive semantics (§5.12) batch optional extension under extended Supports batch operations with per-item outcomes (§5.15) concurrency optional extension under extended Supports write-conflict detection (§5.16) dry-run optional extension under extended Supports dry-run mode (§5.17) migration — Supports migration operations (§8) templating templating Supports create-time templating (§5.3.5)"},{"title":"8. Compatibility and Migrations","url":"/developers/specification/08-compatibility-and-migrations/","description":"This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.","product":"specification","text":"8.1 Purpose# This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage. 8.2 Compatibility modes# Implementations MAY support compatibility modes for legacy behavior. If supported, compatibility modes MUST: be explicitly enabled or disabled, be discoverable through configuration or capability metadata, not be silently enabled by default in new collections. 8.3 Migration expectations# When canonical behavior differs from historical behavior, implementations SHOULD provide: deterministic migration rules, dry-run preview support, rollback-safe workflow guidance. 8.4 Alias normalization migration# For legacy key aliases, a migration SHOULD: read both canonical and alias keys, choose canonical value deterministically (recommended: canonical key precedence), rewrite persisted file using canonical keys, preserve unrelated unknown fields. 8.4.1 Example# Before: recurrenceAnchor: scheduled recurrence_anchor: completion After normalization: recurrenceAnchor: scheduled With warning: alias_conflict_ignored: alias value ignored because canonical key present. 8.5 Temporal normalization migration# If historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO Z for datetime roles while preserving date-only roles as dates. Example: Before: dateCreated: 2026-02-20 10:00:00+00:00 After: dateCreated: 2026-02-20T10:00:00Z 8.6 Recurrence state migration# If historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically. Recommended resolution policy: if overlap exists, prefer most recent user action where recoverable, otherwise prefer complete_instances and remove overlapping skip entries, emit migration report for affected dates. Policy choice MUST be documented. 8.7 Materialized occurrence migration# When introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation. Recommended migration behavior: do not materialize historical or future occurrence notes unless explicitly requested; preserve existing parent complete_instances and skipped_instances; when importing existing per-occurrence task files, require deterministic parent/date matching before adding recurrence_parent and occurrence_date; when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report occurrence_state_conflict; provide a dry-run report before converting existing task files into materialized occurrence notes. Migration tooling MUST NOT silently delete occurrence notes or parent recurring tasks. 8.8 Dependency migration# When migrating legacy dependency data, implementations SHOULD: normalize dependency key names to mapped canonical key, ensure each entry has uid and canonical reltype, normalize legacy string/path references into configured canonical reference style, remove duplicate dependency entries by policy. If historical data omits reltype, migration MAY apply dependencies.default_reltype and SHOULD report count of inferred values. 8.9 Reminder migration# When migrating legacy reminder data, implementations SHOULD: normalize reminder key names, normalize type values to canonical enum (absolute or relative), normalize relatedTo values to canonical enum (due or scheduled), normalize absoluteTime to canonical UTC ISO Z, validate and normalize offsets to ISO 8601 duration syntax. If reminder id values are missing, migration MAY generate IDs and MUST report generated count. 8.10 Link migration# When migrating legacy link values, implementations SHOULD: normalize supported link syntaxes according to §11 parsing rules, preserve alias and anchor components where possible, normalize resolved targets into canonical write format by policy, detect and report ambiguous links instead of silently choosing non-deterministically. 8.11 Divergence register# Implementations SHOULD maintain a divergence register with columns: section current behavior target canonical behavior migration strategy deprecation timeline 8.12 Deprecation policy# For any behavior deprecated by the specification: announce deprecation in release notes, provide warning period, provide migration tooling where feasible, remove deprecated behavior only in a version aligned with compatibility commitments. 8.13 Data safety requirements# Migrations MUST NOT: silently drop unknown fields, silently convert valid date-only fields to datetime, silently rewrite recurrence semantics without explicit policy, silently materialize occurrence notes outside explicit user/configured materialization policy, silently delete materialized occurrence notes during recurrence edits, silently drop unresolved dependency entries, silently rewrite link targets to different destinations without explicit policy, silently delete reminders unless explicitly requested. 8.14 Suggested migration report format# spec_version_from: 0.1.0-draft spec_version_to: 0.3.0-rc.1 files_scanned: 214 files_changed: 67 warnings: alias_conflict_ignored: 3 instance_state_overlap_resolved: 2 occurrence_state_conflict: 1 unresolved_dependency_target: 4 changes: normalized_datetime_fields: 41 alias_keys_removed: 29 instance_overlaps_fixed: 2 occurrence_state_conflicts: 1 inferred_dependency_reltype: 5 generated_reminder_ids: 8 normalized_link_targets: 14 8.15 Compatibility statement example# Compatibility mode: legacy-aliases=true, legacy-timeentry-duration=true Planned removal: v2.0.0 Migration command: tasknotes migrate --normalize-frontmatter"},{"title":"9. Configuration","url":"/developers/specification/09-configuration/","description":"This section defines the normative configuration model for collections using tasknotes-spec.","product":"specification","text":"9.1 Purpose# This section defines the normative configuration model for collections using tasknotes-spec. 9.2 Configuration provider model# Implementations MUST derive an effective configuration from one or more configuration providers. A provider is a source adapter that returns a partial configuration normalized to this section's schema. Implementations MUST: support at least one provider, document supported providers, document provider precedence order, disclose active providers and fallback behavior in conformance output (§7). 9.2.1 Common provider types# Common providers include: yaml_file: a tasknotes.yaml document at collection root, tasknotes_plugin_data_json: .obsidian/plugins/tasknotes/data.json, built_in_defaults: implementation defaults, optional runtime/CLI/env overrides. This list is not exhaustive. 9.2.2 Deterministic precedence and merge# Provider precedence MUST be deterministic. Unless explicitly documented otherwise, implementations MUST resolve configuration per top-level key: for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins, winning object values replace lower-precedence object values as whole objects (no implicit deep merge), after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration. If an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic. 9.2.3 Strict vs permissive provider behavior# In strict mode: failure to resolve required effective keys (spec_version, mapping) MUST be a configuration error. If permissive mode is implemented, then in permissive mode: implementations MAY continue with defaults when providers are missing/unreadable, implementations MUST emit configuration warnings, implementations MUST disclose that effective configuration is partial/default-derived. 9.2.4 TaskNotes plugin provider (data.json)# The TaskNotes plugin stores settings in .obsidian/plugins/tasknotes/data.json within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below. Key mapping table (data.json key → spec effective config): data.json key Spec key Notes fieldMapping mapping Normalize role names: dateCreated→date_created, completedDate→completed_date, recurrenceAnchor→recurrence_anchor, completeInstances→complete_instances, skippedInstances→skipped_instances, recurrenceParent→recurrence_parent, occurrenceDate→occurrence_date, occurrenceMaterialization→occurrence_materialization, occurrenceNextTrigger→occurrence_next_trigger, occurrenceTemplate→occurrence_template, occurrencePastHorizon→occurrence_past_horizon, occurrenceFutureHorizon→occurrence_future_horizon, blockedBy→blocked_by, timeEntries→time_entries, timeEstimate→time_estimate storeTitleInFilename title.storage true → \"filename\", false → \"frontmatter\" taskFilenameFormat title.filename_format Values: \"title\", \"zettel\", \"timestamp\", \"custom\"; used only when title.storage=frontmatter for canonical writes, but preserved as compatibility input when present customFilenameTemplate title.custom_filename_template Template string, e.g. \"{title}\"; used only when title.storage=frontmatter and filename_format=custom taskCreationDefaults.useBodyTemplate templating.enabled boolean taskCreationDefaults.bodyTemplate templating.template_path Path to template file customStatuses[*].value status.values Ordered array of status value strings defaultTaskStatus status.default Default status string customStatuses[isCompleted=true][*].value status.completed_values Statuses where isCompleted: true defaultTaskPriority defaults.priority Default priority string autoStopTimeTrackingOnComplete time_tracking.auto_stop_on_complete boolean autoStopTimeTrackingNotification time_tracking.auto_stop_notification boolean taskIdentificationMethod task_detection.method \"tag\" or \"property\" taskTag task_detection.tag Tag string used when method=\"tag\" taskPropertyName task_detection.property_name Frontmatter key used when method=\"property\" taskPropertyValue task_detection.property_value Expected value; empty means key must exist tasksFolder task_detection.default_folder Default folder for new tasks excludedFolders task_detection.excluded_folders Comma-separated folder paths to exclude moveArchivedTasks archive.move_on_archive boolean archiveFolder archive.folder Archive destination folder useFrontmatterMarkdownLinks links.use_markdown_format boolean; see §11 Key data.json fields with defaults (for cold-start reading of a vault with no tasknotes.yaml): Field Type Default Meaning tasksFolder string \"TaskNotes/Tasks\" Default folder for new task files taskIdentificationMethod \"tag\" | \"property\" \"tag\" How task files are identified taskTag string \"task\" Tag that identifies task files (when method=\"tag\") taskPropertyName string \"\" Frontmatter key for property-based identification taskPropertyValue string \"\" Expected value for property-based identification (empty = key presence) storeTitleInFilename boolean true Title storage mode taskFilenameFormat \"title\" | \"zettel\" | \"timestamp\" | \"custom\" \"title\" Filename generation format customFilenameTemplate string \"{title}\" Template for \"custom\" filename format defaultTaskStatus string \"open\" Default status on create defaultTaskPriority string \"normal\" Default priority on create customStatuses StatusConfig[] see object shape below Ordered status definitions autoStopTimeTrackingOnComplete boolean true Auto-stop active session on completion autoStopTimeTrackingNotification boolean false Show notification when auto-stopping useFrontmatterMarkdownLinks boolean false Use markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin) moveArchivedTasks boolean false Move task file to archive folder on archive archiveFolder string \"TaskNotes/Archive\" Archive destination folder excludedFolders string \"\" Comma-separated folders to exclude from task indexing StatusConfig object shape: { \"id\": \"done\", \"value\": \"done\", \"label\": \"Done\", \"color\": \"#00aa00\", \"isCompleted\": true, \"order\": 3, \"autoArchive\": false, \"autoArchiveDelay\": 5 } spec_version is not present in data.json. Implementations MUST synthesize an effective spec_version as described in §9.5. Provider keys not listed above MAY be ignored by tasknotes-spec consumers. 9.3 Required top-level keys# Required keys apply to the effective configuration after provider resolution. Key Type Required Description spec_version string yes target spec version (provider-supplied or synthesized per §9.5) mapping object yes semantic role to storage key mapping 9.4 Recommended top-level keys# Key Type Description runtime_timezone string IANA timezone for day-level semantics task_detection object task file identification rules defaults object role defaults used during create status object status set and completed-value semantics validation object validation behavior (strict required, permissive optional) links object link parsing/resolution behavior title object title source and filename behavior policy templating object optional create-time templating behavior policy dependencies object dependency behavior policy reminders object reminder behavior policy time_tracking object time-tracking management behavior policy occurrences object recurrence materialization defaults and bounds compatibility object legacy alias/behavior switches 9.5 spec_version behavior# spec_version MUST be a semantic version string. Pre-release identifiers are valid (for example 0.3.0-rc.1). Implementations in strict mode MUST reject unsupported major versions. If permissive mode is implemented, permissive mode MAY proceed with warning when major version differs. If a provider does not supply spec_version (for example TaskNotes data.json), implementations MUST synthesize an effective spec_version matching their target tasknotes-spec version and SHOULD disclose that it was synthesized. 9.5.1 runtime_timezone behavior# If runtime_timezone is configured, it MUST be a valid IANA timezone identifier and MUST be used for day-level semantics. If runtime_timezone is absent, implementations MUST use system local timezone. The effective timezone MUST be discoverable. 9.6 mapping schema# mapping MUST map semantic roles (from §2) to string storage keys. Minimum required roles in mapping: title status completed_date date_created date_modified If semantic role id is supported (§2.6.5), mapping SHOULD include id. If profile materialized-occurrences is claimed, mapping MUST include recurrence_parent and occurrence_date, and SHOULD include parent policy roles (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon). Example: mapping: title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrenceAnchor complete_instances: completeInstances skipped_instances: skippedInstances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_entries: timeEntries blocked_by: blockedBy reminders: reminders 9.7 task_detection schema# task_detection controls how task files are identified within the vault. Detection methods# The tasknotes plugin natively supports two identification methods, controlled by taskIdentificationMethod in data.json (mapped to task_detection.method): tag (default) — A markdown file is a task if it contains the configured tag (default #task) in its frontmatter tags array or inline in the body. Configured by task_detection.tag. property — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by task_detection.property_name and task_detection.property_value. Schema and selection rules: task_detection MAY specify either: method (single-method form), or methods (multi-method form; non-empty list). If both are present, methods MUST take precedence and implementations SHOULD emit a configuration warning. If neither is present, effective detection method MUST default to tag. method MUST be tag or property. methods entries MUST be unique and MUST be from: tag property field_presence field_match Method-specific required keys: when tag is enabled, effective task_detection.tag MUST be non-empty (default task when absent); when property is enabled, task_detection.property_name MUST be provided and non-empty; task_detection.property_value MAY be empty (empty means key-exists semantics). If methods has more than one entry, task_detection.combine controls combination semantics (§9.7.3). If omitted, it MUST default to or. 9.7.1 Tag matching semantics# When task_detection.method=tag, matching MUST follow these rules: Normalize configured task_detection.tag by stripping one leading # when present. Compare tag names case-insensitively after normalization. Frontmatter matching: tags MAY be a list of strings or a single string. each tag value is normalized by trimming surrounding whitespace and stripping one leading #. match requires exact normalized equality (for example task matches #task; task does not match tasking). Body matching: only markdown text outside fenced code blocks and inline code spans is considered, a match requires a hashtag token with exact normalized name (for example #task), partial-word matches MUST NOT count (for example #tasking does not match configured task). If either frontmatter or body matches, the file is identified as a task. 9.7.2 Property matching semantics# When property detection is enabled (method=property or methods includes property): task_detection.property_name MUST name the frontmatter key to inspect. If task_detection.property_value is non-empty, match requires semantic equality with the configured value. If task_detection.property_value is empty or absent, match requires key presence only. 9.7.3 Multi-method extension semantics# tasknotes.yaml-level providers MAY additionally support: field_presence (example: required key status) field_match (example: type == \"task\") Extension-key shape: field_presence: string or list of required frontmatter keys. field_match: object map of key -> expected scalar value for exact semantic equality checks. If multiple methods are configured in tasknotes.yaml, task_detection.combine MUST define combinator semantics: or (default): file is a task if any enabled method matches. and: file is a task only if all enabled methods match. If task_detection.combine is absent, implementations MUST default to or. Implementations MUST exclude folders listed in task_detection.excluded_folders from task indexing. Executable conformance: adapters participating in the fixture suite SHOULD expose config.detect_task_file to evaluate these detection semantics against fixture inputs. Example (tasknotes.yaml, equivalent to tag-based default): task_detection: method: tag tag: task default_folder: TaskNotes/Tasks Example (property-based): task_detection: method: property property_name: type property_value: task 9.8 defaults schema# defaults defines values used at create time when caller input omits a role. Defaults MUST NOT override explicit user input. Example: defaults: status: open priority: normal recurrence_anchor: scheduled reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D defaults.reminders behavior is defined in §10.3.9. 9.9 status schema# status defines known status values and completion semantics. Example: status: values: [open, in-progress, done, cancelled] default: open completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled Rules: default MUST be one of values. completed_values MUST be a non-empty list. Each completed_values entry MUST be in values. skipped_values, when present, MUST be a list whose entries are in values. default_skipped, when present, MUST be in skipped_values. For implementations claiming materialized-occurrences, skipped_values MUST NOT overlap completed_values. Implementations claiming materialized-occurrences MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3). Non-recurring completion MUST use this list, not hardcoded literals. When a complete operation does not provide an explicit target status, writers MUST use the first entry of completed_values. When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use default_skipped when present, otherwise the first entry of skipped_values. 9.10 validation schema# Example: validation: mode: strict reject_unknown_fields: false Rules: mode MUST be strict or permissive when present. If mode is absent, effective mode MUST default to strict. Conforming implementations MUST support strict. Implementations MAY support permissive. If mode=permissive is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode. reject_unknown_fields=true enforces closed-schema behavior for mapped roles. 9.11 dependencies schema# Example: dependencies: default_reltype: FINISHTOSTART treat_missing_target_as_blocked: true enforce_unique_uid: true unresolved_target_severity: warning require_resolved_uid_on_write: false Rules: default_reltype MUST be one of the allowed reltype values in §10.2. treat_missing_target_as_blocked controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5). If treat_missing_target_as_blocked is absent, effective value MUST default to true. enforce_unique_uid=true enforces uniqueness at validation/write time. If enforce_unique_uid is absent, effective value MUST default to true. unresolved_target_severity MUST be warning"},{"title":"10. Dependencies and Reminders","url":"/developers/specification/10-dependencies-and-reminders/","description":"This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders).","product":"specification","text":"10.1 Purpose# This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders). 10.2 Dependencies (blocked_by)# 10.2.1 Data shape# blocked_by MUST be a list of dependency entries. Each entry MUST be an object with: uid (required): reference to a blocking task (link or string) reltype (required): one of FINISHTOSTART STARTTOSTART FINISHTOFINISH STARTTOFINISH gap (optional): ISO 8601 duration string If reltype is omitted on read in compatibility mode, implementations MAY treat it as FINISHTOSTART and SHOULD emit a warning. 10.2.2 UID normalization# Implementations SHOULD normalize uid values to a canonical reference representation on write. If link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented. Link parsing and resolution MUST follow §11. 10.2.3 Dependency uniqueness# Within a task, dependency entries are keyed by normalized uid. Policy is configuration-driven and MUST be deterministic: when dependencies.enforce_unique_uid=true (default), duplicate normalized uid values MUST NOT be accepted as canonical persisted state: strict mode: duplicates MUST fail validation/write with duplicate_dependency_uid; permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit duplicate_dependency_uid. when dependencies.enforce_unique_uid=false, duplicates MAY be preserved as compatibility behavior. The active policy MUST be documented in conformance claims. 10.2.4 Self-dependency# A task MUST NOT depend on itself. Self-dependency is a validation error. 10.2.5 Blocking semantics (v0.1)# For v0.1, blocking evaluation MUST be status-presence based: A task is blocked if it has at least one unresolved dependency. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status. Completed status MUST be determined from configured status.completed_values. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base status only; complete_instances/skipped_instances are not consulted. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow dependencies.treat_missing_target_as_blocked (§9.11, default true). For v0.1, reltype and gap are preserved and validated but MUST NOT change the unresolved/resolved decision. 10.2.6 Missing referenced task# When uid cannot be resolved: implementations SHOULD emit unresolved_dependency_target. blocked-state contribution for this missing target MUST follow dependencies.treat_missing_target_as_blocked (§9.11). issue severity SHOULD follow dependencies.unresolved_target_severity (default: warning). for blocked_by.uid, this dependency-specific severity policy MUST take precedence over links.unresolved_default_severity. parse failures that produce invalid_link_format and containment violations that produce path_traversal remain error-severity conditions from §11. if dependencies.require_resolved_uid_on_write=true, add/update MUST fail with error. 10.2.7 Cycles# Implementations MUST reject direct self-cycles. Detection of multi-hop dependency cycles is RECOMMENDED but not required for core-lite or recurrence profiles. 10.2.8 Reverse relation field# Some implementations maintain reverse relationships (for example blocking). Such fields are derived and non-canonical in this spec unless explicitly mapped. If maintained, reverse updates SHOULD remain consistent with blocked_by edits. 10.2.9 Dependency operation semantics# Add dependency# Add dependency MUST: validate entry shape, handle duplicates by policy (preserve, normalize, or reject), preserve unrelated dependency entries, update date_modified on change. Remove dependency# Remove dependency MUST remove by normalized uid and be idempotent. Replace dependencies# Replace behavior MUST be explicit operation mode (not default for patch update). 10.2.10 Dependency examples# Example entry: blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: PT4H Example unresolved dependency (target missing): blockedBy: - uid: \"[[non-existent-task]]\" reltype: FINISHTOSTART 10.3 Reminders (reminders)# 10.3.1 Data shape# reminders MUST be a list of reminder entries. Each reminder MUST include: id (required): unique string within the task type (required): absolute or relative Optional field: description string Type-specific fields: absolute: requires absoluteTime datetime relative: requires relatedTo (due or scheduled) and offset (ISO 8601 duration) 10.3.2 Reminder uniqueness# Reminder id values MUST be unique within the task. If duplicates occur: strict mode: MUST raise duplicate_reminder_id. permissive mode: MAY normalize deterministically and emit warning. 10.3.3 Relative reminder base# relatedTo MUST reference semantic role due or scheduled. If the referenced role is absent, the reminder is unresolved. 10.3.4 Trigger instant computation# Trigger instant MUST be computed as follows: If type=absolute, trigger = absoluteTime instant. If type=relative, resolve base field from relatedTo, if base is datetime: use that instant, if base is date: convert to local datetime at configured reminders.date_only_anchor_time, trigger = base + offset. If reminders.date_only_anchor_time is not configured, implementations MUST use 00:00 local time. 10.3.5 Offset semantics# offset MUST be a valid ISO 8601 duration with optional sign. negative offset = before base positive offset = after base zero offset = at base instant 10.3.6 Invalid mixed fields# Entries with incompatible field combinations MUST fail validation in strict mode. Examples: type=absolute with relatedTo and no absoluteTime type=relative with absoluteTime and missing offset 10.3.7 Reminder ordering# When computing reminder schedules, implementations MUST sort by trigger instant ascending. For identical trigger instants, implementations MUST use stable tie-break ordering by id ascending. 10.3.8 Reminder operation semantics# Add reminder# Add reminder MUST validate shape and unique id, then update date_modified. If id is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task. Update reminder# Update reminder MUST address reminders by id and be patch-by-default. Remove reminder# Remove reminder by id MUST be idempotent. 10.3.9 Default reminders# If defaults.reminders is configured (see §9): create without explicit reminders MUST apply defaults. create with explicit reminders MUST follow reminders.apply_defaults_when_explicit (§9.15): false (default): explicit reminders replace defaults. true: explicit reminders are merged with defaults. Deterministic merge rules when apply_defaults_when_explicit=true: Start with explicit reminders in caller order. Append each default reminder whose id is not already present. If explicit and default reminders share an id, explicit reminder MUST win. 10.3.10 Reminder examples# Relative reminder: reminders: - id: due_minus_15m type: relative relatedTo: due offset: -PT15M Absolute reminder: reminders: - id: call_now type: absolute absoluteTime: 2026-02-20T09:00:00Z 10.3.11 Reminder resolution error handling# If relative reminder base is unavailable (relatedTo=due but no due field): strict mode: validation error unresolvable_reminder_base. permissive mode: warning and reminder excluded from trigger computation. 10.4 Interactions# 10.4.1 Rename interaction# If implementation supports rename/reference updates, dependency uid references SHOULD be updated consistently with other link references. 10.4.2 Completion interaction# Changing task completion state does not automatically remove dependencies or reminders unless explicitly configured. 10.4.3 Archive interaction# Archive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested."},{"title":"11. Links","url":"/developers/specification/11-links/","description":"This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects and blocked_by.uid. Alignment with Obsidian a...","product":"specification","text":"11.1 Purpose# This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects and blocked_by.uid. Alignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section. Applicability: Implementations claiming profile extended (§7.3.5) MUST conform to this section for supported link-bearing roles. Implementations claiming profile materialized-occurrences (§7.3.4) MUST conform to this section for recurrence_parent links, but are not required to support unrelated extended link-bearing roles solely because of that profile. Implementations that claim neither extended nor materialized-occurrences MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior. 11.2 Link formats# Implementations that conform to §11 (see §11.1 applicability) MUST support three link formats. 11.2.1 Wikilinks# [[target]] [[target|alias]] [[target#anchor]] [[target#anchor|alias]] [[folder/target]] [[./relative]] [[../parent/target]] Components: target: The file being linked to (without extension by default) alias: Display text; does not affect resolution anchor: A heading or block reference within the target path: May be absolute (from collection root) or relative (from current file) Examples in frontmatter: projects: - \"[[home-project]]\" - \"[[projects/alpha|Alpha Project]]\" blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART 11.2.2 Markdown links# [text](path.md) [text](./relative.md) [text](../other/file.md) [text](path.md#anchor) The text portion is treated as an alias and does not affect resolution. Markdown links in frontmatter require the obsidian-frontmatter-markdown-links Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless links.use_markdown_format=true is configured (§11.7). 11.2.3 Bare paths# ./sibling.md ../other/file.md folder/file.md Bare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with /). 11.3 Link parsing# When a link value is read, implementations MUST parse it into a structured representation: Component Type Description raw string Original string value exactly as written target string File path or identifier (without anchor or alias) alias string? Display text if provided, otherwise null anchor string? Heading or block reference if provided, otherwise null format enum One of: wikilink, markdown, path is_relative boolean Whether target begins with ./ or ../ Parsing examples: Input target alias anchor format is_relative [[task-001]] task-001 null null wikilink false [[task-001|My Task]] task-001 My Task null wikilink false [[docs/api#auth]] docs/api null auth wikilink false [[./sibling]] ./sibling null null wikilink true [Link](file.md) file.md Link null markdown false ./other.md ./other.md null null path true 11.4 Resolution algorithm# Resolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file. Given a parsed link and the path of the source file containing it: Step 1: Parse the link into components (target, format, is_relative)# Step 2: Route by format# If format is markdown or path: If target starts with /, resolve from collection root (strip the leading /) Otherwise, resolve relative to the source file's directory (standard markdown behavior) Example: link [Docs](docs/api.md) in notes/meeting.md resolves to notes/docs/api.md If format is wikilink: If target starts with ./ or ../, resolve relative to the source file's directory If target starts with /, resolve from collection root (strip the leading /) If target contains / (and is not relative), resolve from collection root Example: [[docs/api]] resolves to docs/api If simple name (no /, no ./ or ../): proceed to Step 3 Step 3: Simple-name resolution (wikilinks only)# For simple wikilink names (no path separator): Define the search scope: For blocked_by.uid: scope to files matching task_detection (task files only) For projects: scope to all markdown files in the collection unless narrowed by explicit configuration ID match pass: search scoped files for semantic role id (§2.6.5) equal to the name. Implementations MAY treat literal frontmatter key id as compatibility input when semantic mapping for id is unavailable. Equality MUST be exact string equality. If exactly one match: resolve to that file If multiple matches: fail with ambiguous_link Filename match pass: if no ID match, search scoped markdown files by filename (without extension). Implementations MUST deduplicate normalized candidate paths before final selection. If exactly one filename candidate remains after normalization and extension handling, resolve to that file. If multiple filename candidates remain, resolve to null and emit ambiguous_link. Callers SHOULD use a path-qualified or relative target to disambiguate. Step 4: Extension handling# If the target has no extension, implementations SHOULD try configured extensions in order. Default extension order: [\".md\"]. Example: [[readme]] tries readme.md, readme.mdx, etc. Step 5: Path traversal check# After resolution and normalization, if the resolved path would escape the collection root, abort with path_traversal. See §11.5. Step 6: Return result# The normalized collection-relative path if found null if no matching file exists Resolution examples# Given collection structure: / ├── TaskNotes/ │ ├── Tasks/ │ │ ├── task-001.md │ │ └── subtasks/ │ │ └── task-002.md ├── notes/ │ └── meeting.md └── projects/ └── alpha.md Resolution from TaskNotes/Tasks/subtasks/task-002.md: Link value Resolved path Notes [[task-001]] TaskNotes/Tasks/task-001.md Simple-name search [[../task-001]] TaskNotes/Tasks/task-001.md Relative wikilink [[./task-003]] TaskNotes/Tasks/subtasks/task-003.md Relative (may not exist) [[notes/meeting]] notes/meeting.md Absolute from root [[alpha]] projects/alpha.md Simple-name search (projects scope) [link](../task-001.md) TaskNotes/Tasks/task-001.md Markdown, relative ../task-001.md TaskNotes/Tasks/task-001.md Bare path, relative 11.5 Path sandboxing# Link resolution MUST NOT produce paths outside the collection root. Rules: After resolving relative paths (applying ../ segments), the resulting path MUST be within the collection root directory If resolution would escape the collection root, the link MUST resolve to null and implementations MUST emit a path_traversal error This applies to all link formats: wikilinks, markdown links, and bare paths Implementations MUST normalize paths (resolve . and .. segments) before checking containment Examples (collection rooted at /home/user/MyVault/): Link From file Result [[../../../etc/passwd]] TaskNotes/Tasks/task.md null + path_traversal [[../../secrets/key]] deep/nested/file.md null + path_traversal [[../task-001]] TaskNotes/Tasks/subtasks/t.md Resolves normally 11.6 Canonical write format# When creating new link values or changing a link target, implementations MUST use a deterministic canonical form. Default (wikilink format)# By default (links.use_markdown_format=false), the canonical write format is a simple wikilink: blockedBy: - uid: \"[[task-001]]\" reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" Rules: Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope. Use a path-qualified target (folder/name) when the simple name would be ambiguous. Do NOT include the alias component in dependency uid writes. Do NOT include the anchor component in dependency uid writes. Preserve the alias component in projects entries when the alias was provided by the user. Markdown link format (links.use_markdown_format=true)# When links.use_markdown_format=true is configured (requires the obsidian-frontmatter-markdown-links Obsidian plugin), the canonical write format for link-bearing fields is a markdown link using the collection-relative path: blockedBy: - uid: \"[task-001](TaskNotes/Tasks/task-001.md)\" reltype: FINISHTOSTART Round-trip preservation# When writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible: If the user wrote [[task-001|My Task]], preserve alias for projects entries. If the user wrote a relative path, preserve relativity when possible. For blocked_by.uid, alias and anchor components MUST still be removed on canonical writes. If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section. 11.7 Configuration# links configuration keys (see §9.12): links: extensions: [\".md\"] # Extension trial order for extensionless targets use_markdown_format: false # Write markdown links instead of wikilinks unresolved_default_severity: warning # \"warning\" or \"error\" update_references_on_rename: true # Update link targets when files are renamed Rules: extensions MUST be a non-empty list when present unresolved_default_severity MUST be \"warning\" or \"error\" update_references_on_rename=true enables rename-time link rewrite behavior (§11.9) use_markdown_format=true requires the obsidian-frontmatter-markdown-links plugin in Obsidian deployments 11.8 Role-specific rules# 11.8.1 projects# projects entries SHOULD be interpreted with this section's parsing/resolution rules. If a projects entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution. If unresolved: links.unresolved_default_severity=error: validation error otherwise: SHOULD emit unresolved_link_target warning 11.8.2 blocked_by.uid# blocked_by.uid values MUST use this section's parsing/resolution rules. For dependency semantics, unresolved uid handling follows §10.2.6. For unresolved-target severity, dependencies.unresolved_target_severity controls and takes precedence over links.unresolved_default_severity. The canonical write form for uid values is specified in §11.6. 11.9 Rename and reference updates# If an implementation supports reference updates on rename (i.e. claims the rename capability): It MUST update resolvable references in blocked_by.uid and projects link fields. It SHOULD update links in body content. It SHOULD preserve the original link format when possible. It MUST preserve alias and anchor components where valid for the target field. For blocked_by.uid, alias and anchor are non-canonical and MUST be removed on write (§11.6). It MUST report unresolved or ambiguous rewrite cases. If reference updates are not supported, this limitation MUST be disclosed in conformance claims. 11.10 Validation# Link validation issues: Code Severity Trigger invalid_link_format error Link value cannot be parsed as any supported format ambiguous_link warning Simple-name resolution found multiple candidates after normalization unresolved_link_target warning Link target cannot be resolved to an existing file path_traversal error Resolved path escapes collection root unresolved_link_target severity may be promoted to error via links.unresolved_default_severity=error. For blocked_by.uid, use unresolved_dependency_target severity policy from §10.2.6 instead of unresolved_link_target. 11.11 Examples# Dependency with wikilink (default)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[[design-api]]\" reltype: FINISHTOSTART - uid: \"[[projects/infra/setup-server]]\" reltype: FINISHTOSTART gap: P1D projects: - \"[[projects/alpha]]\" dateCreated: 2026-02-20T10:00:00Z dateModified: 2026-02-20T10:00:00Z --- Dependency with markdown links (links.use_markdown_format=true)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[design-api](TaskNotes/Tasks/design-api.md)\" reltype: FINISHTOSTART --- Relative links from nested task# # TaskNotes/Tasks/subtasks/task-002.md --- title: Sub-task status: open tags: [task] blockedBy: - uid: \"[[../task-001]]\" # resolves to TaskNotes/Tasks/task-001.md reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" # resolves from collection root ---"},{"title":"12. mdbase v0.3 Data-Contract Binding","url":"/developers/specification/12-mdbase-v0.3-binding/","description":"Status: Draft","product":"specification","text":"Status: Draft Record contract: tasknotes.task 0.3.0-rc.1 Event contract: tasknotes.task.completed 1.0.0 Target: mdbase 0.3.x 12.1 Purpose# This chapter defines how a TaskNotes task model is exposed through mdbase without coupling TaskNotes to one record type or one application's private extension. The binding has three deliberately separate parts: the tasknotes.task data contract defines the portable task view; an mdbase type's implements entry maps that view to its own frontmatter fields and supplies TaskNotes behavior; and the rest of the type file continues to define that type's storage, matching, defaults, lifecycle, links, and paths. The normative artifacts are: mdbase/tasknotes.task.md, the record contract; schemas/tasknotes-task.schema.json, the projected task-view schema; and schemas/tasknotes-task-binding.schema.json, the implementation binding schema. The optional event-interoperability artifacts are: mdbase/tasknotes.task.completed.md, the event contract; and schemas/tasknotes-task-completed.schema.json, its event-data schema. 12.2 The mental model# A contract is not another record type. It is a view that several record types can implement and several applications can consume. personal_task ─┐ work_task ─────┼─ implements tasknotes.task 0.3.0-rc.1 ── TaskNotes issue_task ────┘ ├─ automation └─ another task app Reading or listing through the contract uses the union of all implementing types. Creating a task is different: the caller MUST choose one exact target type because the contract does not choose storage, paths, or lifecycle policy. The contract version is an exact semantic version. For this draft it is also the tasknotes-spec version whose task semantics the contract exposes. There is no independent x-tasknotes.version or spec_version mirror. Record types use implements because they adapt persisted fields and semantic bindings to the tasknotes.task record contract. Event sources do not use a type file. A TaskNotes application instead registers an event-source declaration for tasknotes.task.completed with an active mdbase interoperability bridge. 12.3 Layering# An implementing type MUST keep these responsibilities in their canonical locations: Information mdbase v0.3 location Persisted frontmatter shape, required fields, enum values, formats schema Type identification match Display field, defaults, links, uniqueness, and path generation collection Managed create/update values lifecycle Contract identity and custom field names implements[].contract, version, and fields TaskNotes semantic behavior implements[].binding TaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords. x-tasknotes MUST NOT be used for contract discovery, field mapping, conformance, or authorization. 12.4 Declaring an implementation# An mdbase TaskNotes type declares one implementation: implements: - contract: tasknotes.task version: 0.3.0-rc.1 fields: title: summary status: state priority: importance dateCreated: created_at binding: # TaskNotes behavior; abbreviated here profiles: [core-lite] capabilities: [] title: storage: frontmatter filename_format: title status: values: [todo, doing, done] default: todo completed_values: [done] definitions: [] priority: values: [normal] default: normal definitions: [] The contract file identified by the exact contract and version MUST exist in the collection contract registry. The binding MUST validate against that contract's binding_schema. Each type MUST declare at most one implementation of one exact contract identity. A type may implement several different contracts. 12.5 Portable fields# fields maps contract field paths to record field paths. Consumers access contract fields and MUST NOT assume that their names are also frontmatter property names. fields: title: summary status: state blockedBy: dependencies Every unconditionally required contract field MUST be mapped. Every mapped contract field and record field MUST exist in its respective JSON Schema. The contract view contains only mapped fields. It does not expose unmapped frontmatter or the Markdown body. A consumer that requires either needs separate, explicit whole-record access. title is optional in the portable schema because TaskNotes permits filename title storage. When binding.title.storage is filename, consumers derive the effective title from the record identity/path rules in §9.13 instead of expecting a projected frontmatter value. The camel-case contract field names are stable portable identifiers. Their snake-case tasknotes-spec counterparts include: Contract field tasknotes-spec role timeEstimate time_estimate completedDate completed_date dateCreated date_created dateModified date_modified recurrenceAnchor recurrence_anchor completeInstances complete_instances skippedInstances skipped_instances recurrenceParent recurrence_parent occurrenceDate occurrence_date occurrenceMaterialization occurrence_materialization occurrenceNextTrigger occurrence_next_trigger occurrenceTemplate occurrence_template occurrencePastHorizon occurrence_past_horizon occurrenceFutureHorizon occurrence_future_horizon timeEntries time_entries blockedBy blocked_by 12.6 Semantic profiles and capabilities# binding.profiles and binding.capabilities describe semantics that records of this implementation may use: binding: profiles: [core-lite, recurrence, materialized-occurrences] capabilities: - dependencies - reminders - links - time-tracking - materialized-occurrences - archive These are properties of the implementation, not claims that every consuming application supports them. Before mutating a governed field, a consumer SHOULD verify its own corresponding capability. It may still perform unrelated operations when it preserves unsupported fields and invariants. 12.7 Status and priority semantics# The implementing type schema defines the legal persisted values of the mapped fields. The binding gives those values TaskNotes meaning: binding: status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] The following consistency rules apply: binding values MUST equal the mapped type-schema enum values; defaults MUST equal mapped collection.read_defaults values when present; completed and skipped values MUST be members of status.values; default_skipped MUST be a skipped value; completed and skipped values MUST NOT overlap for materialized occurrences; and definition semantics MUST agree with completed/skipped membership. Status and priority labels, colors, and icons are presentation hints. Status cycle, completion, skipping, auto-archive, and priority weight are semantic. 12.8 Title, recurrence, links, and operations# The remaining binding sections project the effective TaskNotes behavior defined elsewhere in this specification: title follows §9.13 and MUST agree with collection.display and collection.path; recurrence follows §4; occurrences follows §2.6.6, §4.18, §5.20, and §9.17; links follows §11; archive follows §5.12; time_tracking follows §5.19 and §9.16; templating follows §5.3.5 and §9.14; and optional nlp triggers follow §9.18. Archive always operates on the portable tags contract field, so the binding does not repeat a record-specific tags_field. The implementation's fields map determines the actual frontmatter property. Application-local notification preferences and generator bookkeeping MUST NOT be placed in the binding. 12.9 Multiple implementations# A collection may contain any number of types implementing tasknotes.task 0.3.0-rc.1. TaskNotes-aware readers MUST: resolve the exact local contract; enumerate every implementation in canonical type-name order; read each matching record through that implementation's projected view; validate the projected view; and retain the concrete type identity for updates. Implementations MUST NOT merge type schemas into one synthetic schema. A record is validated by its concrete type and then by its projected contract view. When an approval, cache, or external protocol pins an implementation set, it MUST pin the exact contract digest and sorted implementation descriptors, including each implementation digest. A newly installed type is therefore not silently added to an existing approval. Creation MUST name one concrete implementing type. If no type is selected, creation fails as ambiguous. 12.10 Task-completed event# An event source that claims tasknotes.task.completed 1.0.0 MUST emit one CloudEvents structured event for each observed transition from a non-completed status to a completed status. Its data contains only: task_id, using the stable TaskNotes ID when present and otherwise the normalized path; task_path; the current title and completed status; and completed_at, the instant when TaskNotes observed the transition. The event source MUST use the mdbase event/action interoperability profile 0.1, pin the exact event-contract digest, and preserve any correlation and causation identifiers supplied by the mutation context. It MUST NOT include a complete task record merely because one is locally available. An authorized consumer can retrieve current state separately, avoiding stale snapshots and unnecessary disclosure. Contract compatibility and bridge authorization are independent. Installing TaskNotes or resolving this contract does not grant permission to publish or consume the event. 12.11 Precedence and consistency# The complete implementation is self-describing: the contract schema is authoritative for the portable projected view; the type schema is authoritative for persisted value shapes; collection is authoritative for generic mdbase behavior; lifecycle is authoritative for generic managed writes; and implements[].binding is authoritative for TaskNotes semantics. Where values intentionally mirror each other, producers MUST keep them equal. A TaskNotes-aware consumer MUST report a configuration error instead of silently choosing between contradictory values. 12.12 Safe writes# TaskNotes-aware consumers MUST preserve: unknown frontmatter properties unless explicit replacement or migration was requested; Markdown body content unless an operation explicitly replaces it; fields governed by unsupported capabilities; and unrelated type metadata and implementations. Generic mdbase operations are safe only when they preserve the same data. Completion, recurrence mutation, occurrence materialization, dependency updates, time tracking, archive, and other domain operations MUST follow the TaskNotes semantics referenced by the binding. 12.13 Complete custom-field example# --- kind: mdbase.type name: work_task version: 1 schema: dialect: json-schema-2020-12 value: type: object additionalProperties: true required: [summary, state, created_at] properties: summary: { type: string, minLength: 1 } state: { enum: [todo, doing, done, cancelled] } importance: { enum: [low, normal, high] } created_at: { type: string, format: date-time } tags: type: array items: { type: string } collection: display: name_field: summary read_defaults: state: todo importance: normal lifecycle: on_create: set: created_at: { now: true } implements: - contract: tasknotes.task version: 0.3.0-rc.1 fields: title: summary status: state priority: importance dateCreated: created_at tags: tags binding: profiles: [core-lite] capabilities: [archive] title: storage: frontmatter filename_format: title status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] recurrence: syntax: tasknotes maintain_due_date_offset: false reset_body_checkboxes: false occurrences: identity_roles: [recurrenceParent, occurrenceDate] default_materialization: manual default_next_trigger: completion links: accepted_formats: [wikilink, markdown] write_format: wikilink archive: archived_tag: archived move_on_archive: false time_tracking: auto_stop_on_complete: true templating: enabled: false occurrence_enabled: false ---"},{"title":"Changelog","url":"/developers/specification/CHANGELOG/","description":"Initial standalone draft of tasknotes-spec including:","product":"specification","text":"0.3.0-rc.1 - 2026-07-28# adopt the discriminated first-class mdbase contract shape for tasknotes.task, including explicit contract_type: record add the tasknotes.task.completed 1.0.0 event contract and minimal privacy-preserving event-data schema for the mdbase interoperability profile separate type-file record implementation bindings from application-level event-source declarations 0.2.0-draft - 2026-05-31# add optional materialized-occurrences profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation add optional NLP trigger configuration so TaskNotes clients can share capture suggestion vocabulary replace the private x-tasknotes discovery envelope with the first-class tasknotes.task 0.2.0 mdbase data contract, portable task-view schema, and implementation binding schema document the precedence and consistency rules between JSON Schema, collection, lifecycle, contract field mappings, and TaskNotes behavior 0.1.0-draft - 2026-02-20# Initial standalone draft of tasknotes-spec including: motivation, scope, and normative conventions terminology task model and field mapping temporal semantics recurrence semantics operation semantics validation model conformance profiles compatibility and migration policy collection configuration schema and provider model (tasknotes.yaml, TaskNotes data.json) full dependency (blocked_by) semantics full reminder (reminders) semantics explicit time-tracking management semantics (time_entries lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration) explicit links chapter and link-resolution rules for projects/dependencies optional templating conformance profile with create-time template expansion/merge semantics"},{"title":"TaskNotes for Obsidian","url":"/obsidian/","description":"Install TaskNotes, create a first task, and open the default Obsidian Base views.","product":"obsidian","text":"This guide covers the TaskNotes plugin for Obsidian. It follows the \"one note per task\" principle: each task is a Markdown file with structured metadata in YAML frontmatter. Requirements# TaskNotes 4.11.1 requires Obsidian 1.12.2 or later and depends on the Bases core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins. Getting Started# 1. Install and Enable# Install TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly. 2. Create Your First Task# Press Ctrl+P (or Cmd+P on macOS), run TaskNotes: Create new task, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like - [ ] Buy groceries and convert it using the inline task command. 3. Open the Task List# Open your first view from the TaskNotes ribbon icon or by running TaskNotes: Open tasks view from the command palette. This opens the default Task List .base file inside TaskNotes/Views. 4. Explore# Use Core Concepts to understand the data model, Features for workflow capabilities, Views for interface behaviour, and Settings to tune TaskNotes for your vault. If you already have task-like notes, start with Adopt TaskNotes in an existing vault. Quick Links# GitHub Repository Source code, issues, releases, and contribution discussions Task Management Status, priority, dates, reminders, and recurring tasks Inline Tasks Widgets, natural language parsing, and checkbox conversion Calendar Integration Google Calendar, Outlook, and ICS subscriptions HTTP API REST API for automation and external integrations JavaScript API In-process API for companion plugins and in-vault scripts Companion Plugins Optional plugins such as Canvas Bases and TaskNotes Workflows that build on TaskNotes Migration Guide Upgrading from TaskNotes v3 to v4 Troubleshooting Common issues and how to resolve them Command Reference Every registered command, generated from the plugin source Backup & Recovery Protect task notes, Base files, settings, and integration data Specification The formal spec behind TaskNotes: data model, operations, recurrence, and conformance"},{"title":"Calendar Integration Setup","url":"/obsidian/calendar-setup/","description":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.","product":"obsidian","text":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0. Setup (Your Own OAuth Credentials)# To connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider. Google Calendar# Video by @antoneheyward In Google Cloud Console, create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (Settings -> TaskNotes -> Integrations) and click Connect Google Calendar. If your Google OAuth app is still in testing mode, add the Google account you will connect with under Google Auth Platform -> Audience -> Test users. Otherwise Google may block sign-in with a 403 access_denied error saying the app has not completed verification. Microsoft Calendar# In Azure Portal, create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's common OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet. Under Authentication, add the Mobile and desktop applications platform and add this redirect URI: http://localhost Also turn on Allow public client flows. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI. If Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding: { \"url\": \"http://127.0.0.1\", \"type\": \"Web\" } Next, add delegated Microsoft Graph API permissions (Calendars.Read, Calendars.ReadWrite, and offline_access) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click Connect Microsoft Calendar. The client secret field can be left blank for public-client desktop setup. Security Notes# OAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' data.json. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access. Secret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use Forget saved credentials if you also want to remove the client ID and client secret. Troubleshooting# \"Failed to connect\" Verify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on 127.0.0.1 with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted. For Google 403 access_denied errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode. \"Failed to fetch events\" Disconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions. Connection lost after Obsidian restart Tokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault."},{"title":"Companion Plugins","url":"/obsidian/companion-plugins/","description":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes...","product":"obsidian","text":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files. Use companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior. Available Companion Plugins# Plugin Purpose Documentation Canvas Bases TaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges. Canvas Bases TaskNotes Workflows Markdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows. TaskNotes Workflows More companion plugins may be documented here over time. How Companion Plugins Relate to TaskNotes# TaskNotes remains the source of truth for task behavior. Companion plugins should use the TaskNotes JavaScript Runtime API for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes. Companion plugins can also publish their own runtime surface through api.extensions. Other plugins and scripts can discover those extension APIs from TaskNotes: const tasknotes = app.plugins.getPlugin(\"tasknotes\"); const workflows = tasknotes?.api?.extensions.get(\"tasknotes-workflows\"); The extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools. Choosing an Integration Surface# Use case Prefer A user-facing Obsidian UI that works with TaskNotes tasks Companion plugin In-vault scripting with Templater, QuickAdd, MetaBind, or another plugin JavaScript Runtime API Local tools outside Obsidian HTTP API or TaskNotes Obsidian CLI Notifications to external services when tasks change Webhooks Direct file analysis without Obsidian running mdbase-tasknotes CLI Compatibility Expectations# Companion plugins should: Check api.apiVersion and api.hasCapability(...) before using runtime features. Use api.catalog and canonical runtime query DTOs from api.query instead of reaching into TaskNotes filter/view internals. Include a source value when mutating tasks so TaskNotes events are debuggable. Avoid reacting to their own mutations unless the behavior is explicit. Keep user data in the vault where possible, using readable Markdown or JSON files. Treat TaskNotes task notes and Bases files as user-owned documents. TaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work."},{"title":"Canvas Bases","url":"/obsidian/companion-plugins/canvas-bases/","description":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layo...","product":"obsidian","text":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named Canvas Bases or as a generated JSON Canvas snapshot. Canvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the .base file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates. Requirements# Obsidian 1.10.1 or newer. The Obsidian Bases core plugin. The Obsidian Canvas core plugin when opening or editing generated .canvas files. TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions. If TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability. When to Use Canvas Bases# Use Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set. Common uses include: Planning project tasks on a visual board. Seeing dependencies or related notes as edges between cards. Embedding a board in a daily note, project note, or meeting note. Turning a filtered Base view into a reusable .canvas snapshot. Grouping notes with Bases, then manually arranging the result. Dropping cards into assignment zones to update a note property or run a supported TaskNotes action. If the question is only \"which tasks should appear?\", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set. Canvas Bases Layout# After Canvas Bases is installed, open or create a .base file and add a view using the Canvas Bases layout. In the live layout: Each Base result row becomes a file card. Displayed Base properties appear on each card in the same order as the Base properties menu. Base groups become group frames. Cards and group frames can be dragged and resized. Ungrouped views place cards directly on the board. The initial card order follows the Base sort order. Inline note-body editing is available when Show body editor is enabled. Board controls support panning, zooming, fit view, reset view, and opening cards. Manual notes, manual groups, and text cards can be added without changing the Base query. Canvas Bases stores layout and board state in Canvas Bases-owned keys in the .base view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path. Materialize a Canvas# Canvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts. Run these commands from the command palette: Canvas Bases: Create canvas from current bases view Canvas Bases: Update linked canvas Canvas Bases: Open linked canvas The create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges. The generated .canvas file is a snapshot, not a live query. Re-run Canvas Bases: Update linked canvas after changing the Base result set or board layout. TaskNotes Integration# Canvas Bases reads TaskNotes through the TaskNotes JavaScript Runtime API. It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing. When TaskNotes integration is enabled, Canvas Bases can: Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards. Add TaskNotes task actions to card context menus through the TaskNotes task menu API. Draw dependency edges between visible tasks. Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to all. Add or remove dependency and subtask relationships by dragging from one card's link handle to another. Update mapped TaskNotes task properties when a card is dropped into a property zone. Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence. TaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly. Edges and Relationships# Canvas Bases can draw edges when both endpoint notes are present on the board. Supported edge sources include: Source What it uses wikilinks Links found in the note body. properties Links stored in configured note properties. all Wikilinks and configured property links. TaskNotes dependencies Blocking relationships from TaskNotes. TaskNotes subtasks Parent-child task relationships from TaskNotes when enabled. For property edges, configure a comma-separated list of property names, such as: depends_on, related Edges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu. Assignment Zones# Assignment zones are board regions that do something when a card is dropped into them. The default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note. Custom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones. Files and Data# Canvas Bases keeps user data in normal vault files: Data Where it lives Task and note content Markdown files. Query, visible properties, sorting, and grouping .base files. Live board geometry and Canvas Bases options Canvas Bases-owned keys in the .base view config. Generated board snapshots .canvas files. Options for non-Canvas Bases active views Canvas Bases plugin data. Manual non-Canvas Bases nodes in a generated .canvas file are preserved when Canvas Bases updates that canvas. First Board# A practical first Canvas Bases setup is: Create or duplicate a TaskNotes .base view. Filter it to the tasks or notes you want on the board. Add a Canvas Bases layout view to that .base file. Choose which properties to show on cards. Enable TaskNotes badges, actions, or relationships if the board is task-focused. Arrange the cards and groups. Use the toolbar to create a linked .canvas snapshot when you want a Canvas file. Canvas Bases can also create starter files under Canvas Bases/ with a demo Base, sample notes, and a linked Canvas path. Run Canvas Bases: Create starter files from the command palette if you want a small example board to inspect before adapting your own TaskNotes views."},{"title":"TaskNotes Workflows","url":"/obsidian/companion-plugins/tasknotes-workflows/","description":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and se...","product":"obsidian","text":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks. Install TaskNotes Workflows# Install from Obsidian Community Plugins Open the TaskNotes Workflows listing in the Obsidian plugin directory You can also install it from Obsidian: open Settings > Community plugins > Browse, then search for TaskNotes Workflows. The plugin is designed for workflows users often ask TaskNotes core to handle, such as: Start time tracking when a task becomes active. Stop time tracking when a task is completed. Move completed tasks into a review folder. Copy parent task context, tags, priority, dates, or dependencies to subtasks. Warn when a blocked task is moved to active. Run a daily review query. TaskNotes Workflows keeps this behavior outside TaskNotes core while still using the TaskNotes JavaScript Runtime API for safe task reads, writes, canonical queries, events, and relationship resolution. Requirements# TaskNotes must be installed and enabled. TaskNotes must expose the JavaScript runtime API. Obsidian must be open for workflows to run. Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed. The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded. If TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run. Files Created by the Plugin# By default, TaskNotes Workflows uses: Path Purpose TaskNotes/Workflows/ Workflow Markdown files. TaskNotes/Views/workflows.base Generated Obsidian Base that renders workflow cards through the custom workflow view. Plugin config folder Run history and detail logs, unless a run-log folder is configured. Workflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance. First Run# On first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally. The generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note. Workflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly. Default Workflows# The plugin can write these starter workflows: Workflow What it demonstrates Auto-start time tracking Starts a timer when a task status changes to active. Stop time tracking on complete Stops the timer when a task is completed. Morning overdue review Runs a daily cron query and marks overdue open tasks high priority. Move completed tasks to review Moves completed task notes into a review folder. Inherit subtask contexts and tags Copies contexts and tags from the first parent task when a task becomes a subtask. Inherit subtask priority Copies priority from the first parent task when a task becomes a subtask. Inherit subtask planning dates Copies scheduled and due dates from the first parent task when a task becomes a subtask. Inherit subtask dependencies Adds the first parent task's blocking dependencies to new subtasks. Mirror parent priority to subtasks Updates existing subtasks when a parent task priority changes. Mirror parent planning dates to subtasks Updates existing subtasks when a parent scheduled or due date changes. Mirror parent dependencies to subtasks Replaces each subtask's dependencies with the parent task's current dependencies. Warn when starting a blocked task Shows a notice when a task becomes active while dependencies remain. Daily active task review Shows a daily count of tasks still marked active. Treat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows. Workflow Shape# A workflow file looks like this: --- type: tasknotes-workflow schemaVersion: 1 id: auto-start-time-tracking name: Auto-start time tracking enabled: false description: Start a timer when a task status changes to active. triggers: - id: status-active type: tasknotes.event event: task.status.changed to: active conditions: - field: trigger.after.path operator: exists steps: - id: start-time type: time.start input: task: \"{{trigger.after.path}}\" options: description: \"Started by {{workflow.name}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop --- # Auto-start time tracking Enable this workflow to start time tracking when a TaskNotes task moves to `active`. Required frontmatter fields: Field Type Notes type string Must be tasknotes-workflow. schemaVersion number Must be 1. id string Stable lowercase identifier. Use letters, numbers, dots, underscores, and dashes. name string Human-readable name shown in workflow cards and command-palette commands. enabled boolean Disabled workflows can be edited and dry-run but do not run automatically or from manual commands. triggers array One or more trigger definitions. conditions array Optional workflow-level guards. steps array Linear typed step pipeline. run object Run policy and safety limits. Triggers# Triggers decide when a workflow should run. TaskNotes Events# Use tasknotes.event to react to TaskNotes runtime events: triggers: - id: status-active type: tasknotes.event event: task.status.changed from: open to: active Common event names include: task.created task.updated task.deleted task.moved task.status.changed task.completed task.uncompleted task.archived task.unarchived task.scheduled.changed task.due.changed task.priority.changed task.tags.changed task.contexts.changed task.projects.changed task.reminders.changed task.dependencies.changed task.recurrence.changed time.started time.stopped pomodoro.started pomodoro.completed pomodoro.interrupted recurring.instance.completed recurring.instance.skipped The workflow editor loads available TaskNotes events dynamically from api.events.list(), so event pickers can follow the runtime API instead of relying on a hardcoded list. TaskNotes event triggers can use these filters: Field Purpose event Runtime event name. from Previous status or value for status-change workflows. to New status or value for status-change workflows. path.glob Optional path glob limiting which task files can trigger the workflow. allowSelfTrigger Allows this workflow to react to writes caused by tasknotes-workflows. Leave off unless you have a clear reason. TaskNotes event output fields include values such as trigger.after.path, trigger.after.status, trigger.before.status, trigger.changes, trigger.source, and trigger.correlationId. Cron# Cron triggers run on matching minutes while Obsidian is open: triggers: - id: weekday-review type: cron schedule: \"0 17 * * 1-5\" timezone: local The schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with run.maxTasks, especially if they query many tasks. Interval# Interval triggers run repeatedly while Obsidian is open: triggers: - id: half-hour-check type: interval every: 30m The plugin enforces a minimum interval to avoid excessive background work. Manual# Manual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette: triggers: - id: manual type: manual Enabled workflows with a manual trigger are registered as Obsidian commands named Run: . You can launch them from the command palette or assign hotkeys in Obsidian settings. The generated command id is based on the workflow id. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned. Obsidian Events# Advanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events: triggers: - id: project-note-opened type: obsidian.workspace event: file-open path: glob: \"Projects/**/*.md\" - id: task-note-modified type: obsidian.vault event: modify path: glob: \"Tasks/**/*.md\" - id: metadata-changed type: obsidian.metadata event: changed path: glob: \"Projects/**/*.md\" Keep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent. Conditions# Conditions can appear at workflow level or on individual steps. conditions: - field: trigger.after.path operator: exists - field: trigger.after.status operator: is value: active Supported operators: Operator Meaning is / isNot Exact comparison after scalar normalization. in / notIn Check a value against an array. exists / missing Check whether a field has a value. contains Check whether a string contains text or an array contains a value. startsWith String prefix check. before / after Date comparison. onOrBefore / onOrAfter Inclusive date comparison. Step-level conditions use the same shape: steps: - id: warn type: notice.show if: - field: steps.dependencies.tasks[0].path operator: exists input: message: \"This task still has dependencies.\" References# References use constrained template expressions. Arbitrary JavaScript is not evaluated. {{workflow.id}} {{workflow.name}} {{trigger.after.path}} {{trigger.changes.status.after}} {{steps.query.tasks}} {{steps.parents.tasks[0].path}} {{item.path}} {{today}} {{now}} If a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified. Use forEach when a step should run once per item: steps: - id: overdue type: task.query input: query: where: all: - field: task.due op: lt value: fn: today - field: task.status op: notIn value: - done - cancelled sort: - field: task.due direction: asc limit: 50 scope: includeArchived: false - id: mark-high type: task.patch forEach: \"{{steps.overdue.tasks}}\" input: task: \"{{item.path}}\" patch: priority: high When a step uses forEach, {{item}} refers to the current item and the step output becomes an array of per-item outputs. task.query uses the canonical TaskNotes runtime query DTO. Its output includes tasks, count, total, matched, returned, groups, groupPaths, query, and warnings. Runtime query conditions use canonical field IDs and operators: query: where: all: - field: task.status op: ne value: done - any: - field: task.due op: lte value: fn: today - field: task.priority op: eq value: high sort: - field: task.due direction: asc group: - field: task.status limit: 25 scope: includeArchived: false Common fields include task.status, task.priority, task.due, task.scheduled, task.projects, task.contexts, task.tags, task.isBlocked, and file.path. Operators include eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Use api.catalog.filterProperties() and api.catalog.filterOperators() for the complete runtime catalog. Steps# Steps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers. Task read steps: Step Output task.get One task. task.query Tasks matching a canonical TaskNotes runtime query. task.parents Parent tasks linked from the task's projects. task.subtasks Tasks that reference the current task as a project. task.dependencies Dependencies stored in blockedBy, with resolved task data when available. task.blocking Tasks blocked by the current task. task.relationships The task plus parents, subtasks, dependencies, and blocking tasks. Task write steps: Step Purpose task.create Create a new TaskNotes task. task.patch Update one or more fields. task.set Set one field. task.move Move the task note to a target folder. task.archive / task.unarchive Archive or unarchive a task. task.complete / task.uncomplete Complete or reopen a task. task.reschedule Update planning dates. task.setDue / task.clearDue Set or clear due date. task.setScheduled / task.clearScheduled Set or clear scheduled date. task.addTag / task.removeTag Mutate tags. task.addProject / task.removeProject Mutate project links. task.addContext / task.removeContext Mutate contexts. task.addDependency / task.removeDependency Mutate blocking dependencies. Time and utility steps: Step Purpose time.start Start time tracking for a task. time.stop Stop active time tracking for a task. time.appendEntry Append a time entry. notice.show Show an Obsidian notice. workflow.stop Stop a workflow early. Companion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension: const tasknotes = app.plugins.getPlugin(\"tasknotes\")?.api; const workflows = tasknotes?.extensions.get(\"tasknotes-workflows\"); const steps = workflows?.listStepDefinitions(); Run Policy# Every workflow has a run policy: run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop timeout: 30s Field Notes mode Currently sequential. Steps run in order. noOverlap Skips a new run if the same workflow is already running. source Mutation source passed to TaskNotes runtime API calls. maxTasks Safety limit for forEach batch steps. onError stop or continue. timeout Optional duration string. TaskNotes attaches source, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops. Run Logs and Debugging# Workflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings. Run records include: Workflow id, name, and source path. Trigger payload. Step statuses. Inputs and outputs, depending on the configured log level. Error text when a run fails. Use dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files. Example: Manual Command Workflow# This workflow can be run from the command palette after it is enabled: --- type: tasknotes-workflow schemaVersion: 1 id: show-active-count name: Show active task count enabled: true description: Show a notice with the number of active tasks. triggers: - id: manual type: manual steps: - id: active type: task.query input: query: where: field: task.status op: eq value: active limit: 25 scope: includeArchived: false - id: notice type: notice.show input: message: \"Active tasks: {{steps.active.count}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop --- # Show active task count Run this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`. Example: Inherit Parent Priority# This workflow copies priority from the first parent task when a task becomes a subtask: type: tasknotes-workflow schemaVersion: 1 id: inherit-subtask-priority name: Inherit subtask priority enabled: false triggers: - id: projects-changed type: tasknotes.event event: task.projects.changed - id: task-created type: tasknotes.event event: task.created conditions: - field: trigger.after.path operator: exists - field: trigger.after.projects operator: exists steps: - id: parents type: task.parents input: task: \"{{trigger.after.path}}\" - id: inherit-priority type: task.patch if: - field: steps.parents.tasks[0].priority operator: exists input: task: \"{{trigger.after.path}}\" patch: priority: \"{{steps.parents.tasks[0].priority}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop This pattern uses task.parents rather than trying to parse project links manually. Authoring Guidelines# When writing workflow notes: Start with enabled: false fo"},{"title":"Core Concepts","url":"/obsidian/core-concepts/","description":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.","product":"obsidian","text":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter. The Note-Per-Task Approach# Individual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool. Task Structure# A TaskNotes task is a standard Markdown file with YAML frontmatter: --- tags: - task title: Review quarterly report status: in-progress priority: high due: 2025-01-15 scheduled: 2025-01-14 contexts: - office projects: - \"[[Q1 Planning]]\" --- ## Notes Key points to review: - Revenue projections - Budget allocations ## Meeting Notes Discussion with finance team on 2025-01-10... The frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents. Obsidian Integration# Since tasks are proper notes, they work with Obsidian's core features: Backlinks: See which notes reference a task Graph View: Visualize task relationships and project connections Tags: Use Obsidian's tag system for additional categorization Search: Find tasks using Obsidian's search Links: Reference tasks from daily notes, meeting notes, or project documents This approach creates many small files. TaskNotes stores tasks in a configurable folder (default: TaskNotes/Tasks/) to keep them organized. In practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top. YAML Frontmatter# Task properties are stored in YAML frontmatter, a standard format with broad tool support. Treat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body. Property Types# TaskNotes uses several property types: Type Example Description Text title: Buy groceries Single text value List tags: [work, urgent] Multiple values Date due: 2025-01-15 ISO 8601 date format DateTime scheduled: 2025-01-15T09:00 Date with time Link projects: [\"[[Project A]]\"] Obsidian wikilinks Number timeEstimate: 60 Numeric values (minutes) Field Mapping# Property keys are configurable. If your vault uses deadline instead of due, you can map TaskNotes to use your existing field names without modifying your files. The exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the TaskNotes Specification. The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data. Custom Fields# Add any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in Settings -> TaskNotes -> Task Properties to include them in task modals and views. Bases Integration# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides: Filtering: Query tasks using AND/OR conditions Sorting: Order tasks by any property Grouping: Organize tasks by status, priority, project, or custom fields Views: Task List, Kanban, Calendar, and Agenda are all Bases views Views are stored as .base files in TaskNotes/Views/. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files. This makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the .base file and see exactly which filter or grouping rule produced that result. Enabling Bases# Bases is a core plugin included with Obsidian 1.10.1+: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes views will now function"},{"title":"Features","url":"/obsidian/features/","description":"TaskNotes includes task organization, time tracking, and calendar integration features.","product":"obsidian","text":"TaskNotes includes task organization, time tracking, and calendar integration features. Task Management# TaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases. Reminders can be relative (for example, \"3 days before due\") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance. See Task Management for details. For recurrence behavior, see Recurring Tasks. For reminder setup and data format, see Task Reminders. Filtering and Views# TaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a .base file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state. This design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault. For details on how Bases integration works, see Core Concepts. For Bases syntax documentation, see the official Obsidian Bases documentation. Inline Task Integration# Inline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place. Natural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data. See Inline Task Integration for details. Time Management# Time tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution. See Time Management for details. Calendar Integration# TaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly. For planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace. See Calendar Integration for details. User Fields# User fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas. See User Fields for details. Integrations# Beyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling. See Integrations for details. Companion Plugins# TaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. Canvas Bases is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. TaskNotes Workflows adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions. See Companion Plugins for details. REST API# External applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools. See HTTP API for details."},{"title":"Calendar Integration","url":"/obsidian/features/calendar-integration/","description":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.","product":"obsidian","text":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions. OAuth Calendar Integration# TaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider. Supported Providers# Google Calendar - OAuth 2.0 authentication with access to all calendars in your Google account Microsoft Outlook - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account Setup Requirements# OAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to: Create an OAuth application in Google Cloud Console or Microsoft Azure Portal Configure redirect URIs and scopes Obtain client ID and client secret Enter credentials in TaskNotes settings (Settings -> TaskNotes -> Integrations, OAuth calendar section) Synchronization Behavior# Events are fetched automatically every 15 minutes Events are also fetched when local changes occur (task creation, updates, rescheduling) Dragging calendar events to new dates/times updates the event in the calendar provider Per-calendar visibility toggles allow selective display of calendars Access tokens are automatically refreshed when expired Token Management# TaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' data.json. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings. Calendar Views# TaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling. For detailed view documentation, see Calendar Views. Notes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in Integrations settings. Time Entry Editor# TaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View. Creating Time Entries# To create a time entry on the Calendar View: Click and drag on a time slot in the calendar to select a time range When the selection menu appears, choose Create time entry (timeblock appears only if the feature is enabled) Choose a task in the task selector modal A time entry is created for that task with the selected start/end range Time entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task. Managing Time Entries# The time entry editor modal provides functions to: View all time entries for a task Edit the start time, end time, and duration of time entries Delete time entries See the total time tracked across all entries for a task Access the time entry editor by clicking an existing time entry in the calendar. ICS Calendar Subscriptions# TaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar. Add and manage ICS subscriptions from Settings -> TaskNotes -> Integrations (Calendar Subscriptions section). For details on creating notes and tasks from calendar events, see ICS Integration. Time Blocking# The Calendar View supports time blocking for scheduling dedicated work periods. To create a time block: Click and drag on a time slot in the calendar to select a time range A context menu will appear with available options Select \"Create timeblock\" from the menu (this option only appears if timeblocking is enabled in settings) Time blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes. Enable time blocking under Settings -> TaskNotes -> Features (Timeblocking section)."},{"title":"ICS Calendar Event Integration","url":"/obsidian/features/ics-integration/","description":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-...","product":"obsidian","text":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-entry. Overview# The ICS integration allows you to: View detailed information about calendar events Create notes from calendar events with customizable templates Generate tasks from events with proper scheduling and context Link existing vault content to calendar events Maintain relationships between events and created content Event context, notes, and follow-up tasks remain connected through frontmatter links. Event Information Modal# When you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides: Event Details# Event title and description Start and end times (formatted according to your locale) Location information Source calendar name Event URL (if available) Related Content# The modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as: Task - Files containing the configured task tag Note - Files without the task tag The relationship is maintained through the ICS Event ID field in the content's frontmatter. Available Actions# Create Note - Opens a creation dialog for generating a new note from the event data. Create Task - Creates a task immediately using the event information with default settings. Link Note - Opens a file selection dialog to link an existing note to the calendar event. Refresh - Reloads the list of related content to reflect recent changes. Note Creation from Events# The note creation process allows customization of the generated content: Basic Settings# Title - Default combines event title and date, but can be modified Folder - Destination for the new note (uses default ICS note folder if configured) Template - Optional template file to structure the note content Template Usage# When a template is specified: The template file is processed with ICS-specific variables Standard TaskNotes template variables are also available Template content replaces the default event description format Frontmatter from templates is merged with required ICS fields Templates apply a consistent note structure across imported events. Default Content# Without a template, notes include: Event title as the main heading Formatted start and end times Location information Source calendar name Event description (if provided) Event URL (if available) Task Creation from Events# Tasks created from calendar events include relevant event data: Scheduled Date and Time# Tasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing. Task Properties# Title - Uses the event title Status - Set to the default task status configured in settings Priority - Set to the default task priority Contexts - Event location is added as a context (if provided) Time Estimate - Calculated from event duration (if start and end times are available) Tags - Includes the ICS event tag and any default task tags After creation, priority, status, and schedule can be edited if event data does not match the final task plan. Content# Task content includes formatted event details similar to note creation, providing context about the original calendar event. Linking Existing Content# You can establish connections between existing vault content and calendar events: Link Process# Select an existing markdown file from your vault The file's frontmatter is updated to include the event ID The modification date is updated to reflect the change The connection appears in the related content list Bidirectional References# Calendar events can display all linked content Content files maintain references to their associated events Multiple pieces of content can be linked to a single event Content can be linked to multiple events (stored as an array) Field Mapping Integration# The ICS integration extends the field mapping system with two new fields: ICS Event ID Field# Stores the unique identifier connecting content to calendar events Default field name is icsEventId Values are stored as arrays to support multiple event associations Field name can be customized through field mapping settings ICS Event Tag Field# Tag automatically applied to content created from events Default tag is ics_event Used to identify ICS-related content throughout the system Can be customized through field mapping settings Template Variables# Templates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables: Event Information# {{icsEventTitle}} - Event title {{icsEventStart}} - Start date and time (ISO format) {{icsEventEnd}} - End date and time (ISO format) {{icsEventLocation}} - Event location {{icsEventDescription}} - Event description {{icsEventUrl}} - Event URL {{icsEventSubscription}} - Calendar subscription name {{icsEventId}} - Unique event identifier Standard Variables# All standard TaskNotes template variables remain available: {{title}}, {{date}}, {{time}} {{priority}}, {{status}}, {{contexts}} And others as documented in the template system Configuration# ICS integration settings are located under Settings -> TaskNotes -> Integrations: Default Templates# Configure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified. Default Folders# Set destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired. Folder paths support template variables for dynamic organization: Date variables: {{year}}, {{month}}, {{day}}, {{monthName}}, etc. ICS event variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Other variables: See template variables section below Example folder paths: Daily/{{year}}/{{month}}/{{day}} creates date-based hierarchy Events/{{year}}/{{icsEventTitle}} organizes by year and event title Meetings/{{monthName}} groups by month name Filename Formats# The system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content. Technical Implementation# Event Identification# Calendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change. Content Type Detection# The system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions. Error Handling# The integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow."},{"title":"Inline Task Integration","url":"/obsidian/features/inline-tasks/","description":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes,...","product":"obsidian","text":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing. Inline features support capture and task updates without leaving the current note. Task Link Overlays# When a wikilink to a task note is created, TaskNotes can replace it with an interactive Task Link Overlay. Enable or disable overlays from Settings -> TaskNotes -> Features (Task link overlay). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal. Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions In Source mode, task links appear as standard wikilinks until rendered Widget Features# The task link overlay displays: Status Dot: Clickable circular indicator showing current task status. Click to cycle through available statuses. Priority Dot: Color-coded indicator for task priority (only shown when assigned). Task Title: Displays the task name (truncated to 80 characters). Click to open the task edit modal. Date Information: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus. Recurrence Indicator: Rotating arrow icon for recurring tasks with modification options. Action Menu: Ellipsis icon (shown on hover) provides additional task actions. The widget exposes common task actions at the link location, so status and metadata can be updated in-place. Mode-Specific Behavior# Task link overlays work in both Live Preview and Reading modes: Live Preview Mode: Widgets hide when the cursor is within the wikilink range, allowing for easy editing. Reading Mode: Widgets display with full functionality and integrate with the reading mode typography. The overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file). Create New Inline Task Command# The Create new inline task command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette. When the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title. To turn the current line into a TaskNote, use Convert to TaskNote or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file. Instant Task Conversion# The Instant Task Conversion feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from Settings -> TaskNotes -> Features (Show convert button next to checkboxes). When enabled, a \"convert\" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file. This supports progressive conversion from draft notes to dedicated task files. Folder Configuration# By default, converted tasks are placed in the same folder as the current note ({{currentNotePath}}). You can change this behavior in Settings -> TaskNotes -> General (Folder for converted tasks): Leave empty: Uses your default tasks folder (configured in the same section) {{currentNotePath}}: Places tasks in the same folder as the note you're editing (default) {{currentNoteTitle}}: Creates a subfolder named after the current note Custom path: Specify any folder path (e.g., TaskNotes/Converted) Supported Line Types# The conversion feature works with: Checkbox tasks: - [ ] Task description becomes a TaskNote with task metadata Bullet points: - Some task idea becomes a TaskNote with the text as title Numbered lists: 1. Important item becomes a TaskNote Blockquoted content: > Task in callout becomes a TaskNote (preserves blockquote formatting) Plain text lines: Important thing to do becomes a TaskNote Mixed formats: > - [ ] Task in blockquote handles both blockquote and checkbox formatting Content Processing# When converting lines: Special characters like >, #, - are automatically removed from the task title Original formatting is preserved in the note (e.g., > [[Task Title]] for blockquoted content) Task metadata is extracted from checkbox tasks (due dates, priorities, etc.) Natural language processing can extract dates and metadata from plain text (if enabled) Conversion preserves surrounding formatting, including callouts, outlines, and nested lists. The feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement. Bulk Task Conversion# The Bulk Task Conversion command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as \"Convert all tasks in note to TaskNotes\". How It Works# The command: Scans the entire current note for checkbox tasks (- [ ], * [ ], 1. [ ], etc.) Includes tasks inside blockquotes (e.g., > - [ ] task in callout) Applies the same enhanced conversion logic as instant task conversion Creates individual TaskNote files for each task Replaces the original checkboxes with links to the new task files Preserves original indentation and formatting (including blockquote markers) The bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note. Usage# To use bulk conversion: Open a note containing checkbox tasks Access the command palette (Ctrl+P / Cmd+P) Search for \"Convert all tasks in note to TaskNotes\" Execute the command The command displays progress and shows a summary when complete (for example, \"Successfully converted 5 tasks to TaskNotes.\"). Important Considerations **This command modifies note content permanently.** Before using: - **Create a backup** of your note if it contains important data - **Review the tasks** to ensure they should become individual TaskNotes - **Expect processing time** - notes with many tasks may take several seconds to process - **Avoid interruption** - do not edit the note while conversion is running Performance Processing time depends on the number of tasks: - Small notes (1-10 tasks): Near-instant - Medium notes (10-50 tasks): 2-5 seconds - Large notes (50+ tasks): 10+ seconds The operation creates multiple files and updates the note content, which requires disk I/O and editor updates. Error Handling# If some tasks fail to convert, the command will: Complete successfully converted tasks Display a summary showing both successes and failures Log detailed error information to the console for troubleshooting Failed conversions typically occur due to: Tasks with titles containing invalid filename characters Insufficient disk permissions Very long task titles (over 200 characters) For large notes, converting a small section first helps validate folder and filename settings. Relationships Widget# New in v4: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface. The widget appears in task notes and automatically displays up to five tabs based on available relationship data: Subtasks Tab (Kanban): Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management. Occurrences Tab (List): Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date. Projects Tab (List): Shows projects that the current task belongs to. Uses list layout. Blocked By Tab (List): Shows tasks that are blocking the current task. Uses list layout. Blocking Tab (Kanban): Shows tasks that the current task is blocking. Uses Kanban layout. Automatic Tab Management# Tabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information. The widget layout changes with available data, so simple tasks show fewer sections. Features# The widget embeds the TaskNotes/Views/relationships.base view directly in the editor. Every filter, grouping rule, or property shown in that .base file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view. Additional behavior: Collapsible Interface: Click the widget title to expand or collapse. The state is remembered between sessions. Persistent Grouping: Any grouping defined in the .base file is honoured, and collapsed groups retain their state per note. Task Details: Each task shows its status, priority, due date, and other configured properties. Real-time Updates: The widget updates automatically when tasks are added, modified, or deleted via Bases views. Configuration# Enable or disable the widget in Settings -> TaskNotes -> Appearance (Show relationships widget). Position the widget at the top (after frontmatter) or bottom of the note using the Relationships Position setting. Expandable Subtasks Chevron# Tasks with subtasks can display an expand/collapse chevron that toggles subtask visibility. The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons). Configure this in Settings -> TaskNotes -> Appearance (Subtask chevron position). Migration from v3# In v3, TaskNotes provided three separate widgets controlled by individual settings: showProjectSubtasks and projectSubtasksPosition showTaskDependencies and taskDependenciesPosition showBlockingTasks and blockingTasksPosition These settings are replaced in v4 by: showRelationships and relationshipsPosition If you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from TaskNotes/Views/project-subtasks.base to TaskNotes/Views/relationships.base. Run the Create files action in Settings -> TaskNotes -> General -> Views & base files if relationships.base is missing. Natural Language Processing# TaskNotes includes a Natural Language Processor (NLP) that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as \"Prepare quarterly report due Friday #work high priority,\" which would automatically set the due date, tag, and priority. The NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian. Supported Syntax# The NLP engine recognizes: Tags and Contexts: #tag and @context syntax (triggers are customizable). Projects: +project for simple projects or +[[Project Name]] for projects with spaces. Priority Levels: Keywords like \"high,\" \"normal,\" and \"low\". Also supports a trigger character (default: !). Status Assignment: Keywords like \"open,\" \"in-progress,\" and \"done\". Also supports a trigger character (default: *). Dates and Times: Phrases like \"tomorrow,\" \"next Friday,\" and \"January 15th at 3pm\". Time Estimates: Formats like \"2h,\" \"30min,\" and \"1h30m\". Recurrence Patterns: Phrases like \"daily,\" \"weekly,\" and \"every Monday\". User-Defined Fields: Custom fields can be assigned using configured triggers (e.g., effort: high). Supports quoted values for multi-word entries. NLP parses common patterns during capture; fields can be refined in the modal afterward. Rich Markdown Editor# New in v4: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea. Features include: Live Preview: Rendered markdown preview as you type. Syntax Highlighting: Code blocks, links, and formatting are highlighted. Wikilink Support: Create links to other notes using [[Note Name]] syntax. Keyboard Shortcuts: Ctrl/Cmd+Enter saves the task Esc or Tab to navigate out of the editor Placeholder Text: Shows an example task (e.g., \"Buy groceries tomorrow at 3pm @home #errands\") when the editor is empty. Customizable Triggers# New in v4: Triggers for NLP properties can be customized in Settings -> TaskNotes -> Features (NLP Triggers). You can configure trigger characters or strings for: Tags (default: #) - When set to #, Obsidian's native tag suggester is used Contexts (default: @) Projects (default: +) Status (default: *) Priority (default: !, disabled by default) User-Defined Fields (default: fieldname:) - Each custom field can have its own trigger Triggers support up to 10 characters and can include trailing spaces (e.g., \"def: \" for a custom field). Autocomplete# New in v4: When typing a trigger in the NLP editor, an autocomplete menu appears with available values. Navigate suggestions with arrow keys Select with Enter or Tab Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields Tag autocomplete uses Obsidian's native tag suggester when using the # trigger For user fields with multi-word values, wrap the value in quotes (e.g., effort: \"very high\") The NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically."},{"title":"Integrations","url":"/obsidian/features/integrations/","description":"TaskNotes integrates with external services and Obsidian's core plugins.","product":"obsidian","text":"TaskNotes integrates with external services and Obsidian's core plugins. Bases Core Plugin# TaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in Settings -> Core Plugins. For details on Bases integration, see Core Concepts. External Calendars# TaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions. For setup instructions, see Calendar Integration. HTTP API# A REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations. For API documentation, see HTTP API. Webhooks# Webhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats. For configuration, see Webhooks. Companion Plugins# Companion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files. For the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see Companion Plugins."},{"title":"Recurring Tasks","url":"/obsidian/features/recurring-tasks/","description":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned i...","product":"obsidian","text":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content. If you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the scheduled field as the next concrete commitment. Most day-to-day editing affects scheduled, while recurrence editing changes the plan itself. Core Concepts# Recurring tasks operate on two independent levels: Recurring Pattern: Defines when pattern instances appear (controlled by DTSTART in the recurrence rule) Next Occurrence: The specific date/time when you plan to work on the next instance (controlled by the scheduled field) Materialized Occurrence Notes: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content This separation lets you reschedule the next occurrence without changing the pattern. Setting Up Recurring Tasks# In practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance. Creating Recurrence Patterns# You can create recurring tasks through: Recurrence Context Menu in task modals for presets or custom options Preset Options such as daily, weekly, or monthly Custom Recurrence Modal with date/time pickers and RRule configuration Required Components# Recurring tasks require: Recurrence Rule: RRule string with DTSTART Scheduled Date: Next occurrence date (independent from the pattern) Materialized occurrence notes add two system fields to the occurrence note: recurrence_parent: link/path back to the recurring parent task occurrence_date: the occurrence date represented by the note DTSTART Integration# DTSTART is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances. Date-only: DTSTART:20250804;FREQ=DAILY Date and time: DTSTART:20250804T090000Z;FREQ=DAILY Recurring Task Due Date# When a recurring task is completed, scheduled advances to the next occurrence. By default, due does not change. Enable Maintain due date offset in recurring tasks in Settings → TaskNotes → Features → Recurring Tasks to preserve due/scheduled spacing. Example: Scheduled: 2025-01-01 Due: 2025-01-03 Recurrence: weekly If the task advances to scheduled: 2025-01-08, the due date becomes 2025-01-10 when this setting is enabled. This setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, \"due two days after execution\"). If due dates are independent deadlines, leaving the setting off is usually clearer. Recurrence Pattern Examples# DTSTART:20250804T090000Z;FREQ=DAILY → Daily at 9:00 AM, starting August 4, 2025 DTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR → Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025 DTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15 → 15th of each month (all-day), starting August 15, 2025 DTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1 → Last day of each month (all-day), starting August 31, 2025 DTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR → Last Friday of each month at 10:00 AM, starting August 1, 2025 Dynamic Scheduled Dates# The scheduled field automatically tracks the next uncompleted occurrence: Initially set to the DTSTART date Advances when occurrences are completed Recalculates when the rule changes Can be manually rescheduled independently This behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities. Materialized Occurrence Notes# Most recurring tasks can remain virtual: the parent task stores complete_instances and skipped_instances, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note. Good uses include: A weekly review where each week needs a separate agenda and notes A maintenance task where each visit needs photos, links, or a checklist A recurring meeting where every occurrence should have its own time entries and completion state To create one manually, right-click a recurring task card or calendar occurrence and choose Open or create occurrence note. The Task Action Palette also exposes Open or create occurrence note for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate. An occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time. Its frontmatter includes: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date: \"2026-06-01\" scheduled: \"2026-06-01T09:30\" timeEstimate: 45 When TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at 09:30 creates an occurrence scheduled at 09:30 on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date. Occurrence notes can use a separate template from regular new tasks. Set occurrence_template on the recurring parent to point at a template note, or configure Settings → Features → Body template → Occurrence note template file as a global fallback. Parent-level occurrence_template wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior. The parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's recurrence, complete_instances, skipped_instances, completedDate, calendar provider IDs, or timeEntries. New time entries belong to the occurrence note once you track time there. Occurrence Filenames# By default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set Occurrence filename template under Settings → Task Properties → Title. For example, {{title}} — {{occurrenceDate}} produces Weekly review — 2026-08-01.md. Occurrence filename templates support all regular filename variables plus these occurrence-specific variables: {{occurrenceDate}} - occurrence date, such as 2026-08-01 {{occurrenceWeek}} - ISO week, such as 2026-W31 {{occurrenceMonth}} - month, such as 2026-08 {{occurrenceYear}} - year, such as 2026 {{occurrenceMonthName}} - full month name, such as August Choose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by Occurrence template override property (by default, occurrenceFilenameTemplate): occurrenceFilenameTemplate: \"{{title}} ({{occurrenceWeek}})\" Leaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix. Occurrence Note Policies# Each recurring parent has an Occurrence notes submenu under its recurrence menu: Create manually: occurrence notes are only created by explicit action. Create next after completion: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note. Rolling window: defined by the TaskNotes spec, but not automated in the plugin yet. When Create next after completion is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence. HTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use POST /api/tasks/:id/materialize-occurrence or the MCP tasknotes_materialize_occurrence tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the Create next after completion policy. The same submenu also controls the next-note trigger: Completion only: create the next occurrence note only when the current occurrence is completed. Completion or skip: create the next occurrence note when the current occurrence is completed or skipped. Skip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent skipped_instances list. Completion Reconciliation# When a materialized occurrence note is completed, TaskNotes updates both sides of the relationship: The occurrence note is completed like a normal task. The parent adds the occurrence date to complete_instances. The parent removes that date from skipped_instances if needed. The parent recalculates scheduled to the next uncompleted occurrence. If the parent policy is Create next after completion, TaskNotes creates the next occurrence note idempotently. Uncompleting an occurrence note removes the date from the parent's complete_instances list, but it does not delete later occurrence notes that were already created. Example Behavior# # Initial state recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-04T09:00\" complete_instances: [] # After completing Aug 4 recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T09:00\" complete_instances: [\"2025-08-04\"] # After manually rescheduling next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T14:30\" complete_instances: [\"2025-08-04\"] Calendar Drag and Drop# Calendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor. Recurring tasks can show: Next occurrence (solid border): dragging updates only scheduled Pattern instances (dashed border): dragging updates DTSTART and future pattern instances Materialized occurrence notes: dragging updates the occurrence note's own scheduled or due date like a normal task, without changing the parent's recurrence rule Materialized occurrence notes keep occurrence_date as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note. Completion Tracking# Each occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar). Completed instances are stored in: complete_instances: [\"2025-08-04\", \"2025-08-06\", \"2025-08-08\"] Skipped instances are stored in: skipped_instances: [\"2025-08-05\"] When completion changes, scheduled updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions. This means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks. Flexible Scheduling# TaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule. The next occurrence can be: Before DTSTART Outside the pattern day At a different time than pattern instances Far ahead while pattern continues unchanged Examples# # Early start before DTSTART recurrence: \"DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-07T14:00\" # Off-pattern next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-06T15:30\" Timezone Handling# Recurring task logic uses a UTC anchor approach: Pattern generation uses UTC dates DTSTART dates are interpreted as UTC anchors Display adapts to local timezone Prevents common off-by-one date issues In other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones. Backward Compatibility# Recurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites. Legacy RRule strings without DTSTART continue to work using scheduled as anchor Legacy recurrence objects are converted to RRule format Existing tasks continue to function without migration steps Mixed formats are handled transparently"},{"title":"Task Reminders","url":"/obsidian/features/reminders/","description":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types.","product":"obsidian","text":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types. The reminders system is designed to support both habit-like workflows (\"always remind me 15 minutes before\") and one-off commitments (\"alert me exactly at this date and time\"). Most users mix both styles depending on the task. Reminder Types# Relative Reminders# Relative reminders trigger from due or scheduled dates. Use relative reminders when you want reminder behavior to stay consistent even when task dates change. Examples: 15 minutes before due date 1 hour before scheduled date 2 days before due date 30 minutes after scheduled date Absolute Reminders# Absolute reminders trigger at a fixed date/time. Use absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling. Examples: October 26, 2025 at 9:00 AM Tomorrow at 2:30 PM Next Monday at 10:00 AM Adding Reminders# You can add reminders from: Task Creation Modal Task Edit Modal Task Cards (bell icon) Reminder field context menu From a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task. Quick Reminder Options# Common shortcuts are available for both due and scheduled anchors, such as: 5 minutes before 15 minutes before 1 hour before 1 day before Quick options appear only when the anchor date exists. This prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately. Reminder Data Format# Reminders are stored in YAML frontmatter arrays. Because reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML. Relative Structure# reminders: - id: \"rem_1678886400000_abc123xyz\" type: \"relative\" relatedTo: \"due\" offset: \"-PT15M\" description: \"Review task details\" Absolute Structure# reminders: - id: \"rem_1678886400001_def456uvw\" type: \"absolute\" absoluteTime: \"2025-10-26T09:00:00\" description: \"Follow up with client\" Field meanings: id: unique identifier type: relative or absolute relatedTo: due or scheduled (relative only) offset: ISO 8601 duration, negative before and positive after (relative only) absoluteTime: ISO 8601 timestamp (absolute only) description: optional message You typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data. Visual Indicators# Tasks with reminders show a bell icon on task cards. Solid bell indicates active reminders Clicking opens quick reminder actions Reminder UI shows task context (due/scheduled dates and reminder count) These indicators are intended to make reminders discoverable in list-heavy views without opening every task. Default Reminders# Default reminders can be configured in: Settings -> TaskNotes -> Task Properties -> Reminders Defaults are applied to: Manual task creation Instant conversion Natural language task creation Default reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts. Technical Notes# Reminders follow iCalendar VALARM concepts with ISO 8601 offsets The reminder property name can be customized through field mapping For settings-level behavior (notification channels, enable/disable state), see Features Settings."},{"title":"Task Management","url":"/obsidian/features/task-management/","description":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts.","product":"obsidian","text":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts. Use this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end. Creating and Editing Tasks# You can create and edit tasks in a variety of ways. The primary method is through the Task Creation Modal, which can be accessed via the \"Create new task\" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates. TaskNotes keeps a storage title and a filename-safe title separate. When Store title in filename is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter. For existing tasks, the Quick actions for current task command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month. TaskNotes also supports Natural Language Creation, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like \"Buy groceries tomorrow at 3pm @home #errands high priority.\" In most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed. Auto-Suggestions in Natural Language Input# The natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters: @ - Shows available contexts from existing tasks # - Shows available tags from existing tasks + - Shows files from your vault as project suggestions * - Shows available status options (configurable trigger in Settings → Features) In task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character. Project Suggestions# When typing + in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files: project-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha] meeting-notes [title: Weekly Team Meeting Notes] simple-project work-file [aliases: work, office-tasks] Project suggestions search across: File names (basename without extension) Frontmatter titles (using your configured field mapping) Frontmatter aliases Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest Selecting a project suggestion inserts it as +[[filename]], creating a wikilink to the file while maintaining the + project marker that the natural language parser recognizes. Enhanced Project Auto‑suggester (configurable cards)# Project suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest. Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key Flags: n or n(Label) → show the field name/label before the value s → include this field in + search (in addition to defaults) Literals: you can mix in fixed text or emojis between tokens Examples \"{title|n(Title)}\" → Title: Alpha Project \"🔖 {aliases|n(Aliases)}\" → 🔖 Aliases: alpha, proj-alpha \"{file.path|n(Path)|s}\" → include path in + search as well as display it Search behavior Defaults: + search always includes file basename, title (via your field mapping), and aliases |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer) Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches Performance tips Keep rows to three or fewer for clarity and performance (the UI supports up to 3) Prefer specific searchable fields with |s on large vaults Demo Status Suggestions# When typing the status trigger character (default *) in the natural language input, you'll see suggestions for all configured status options: Status suggestions allow quick selection of statuses when creating tasks. For example, typing *in shows \"In Progress\" as a suggestion if that's one of your configured statuses. Clicking a task card's status indicator cycles through statuses in the order configured under Settings → Task Properties → Status. A status can optionally define a specific Next status for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked Skip when cycling are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps. Additionally, you can convert any line type in your notes to TaskNotes using the Instant Conversion feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines. Task Properties# Tasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure. This frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets. For property types and examples, see Core Concepts. For configuration options, see Task Properties Settings. Projects# TaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management. This model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling. Project Assignment# Tasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the \"Add Project\" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault. Project Links# Projects are stored as wikilinks in the task's frontmatter (e.g., projects: [\"[[Project A]]\", \"[[Project B]]\"]). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field. Organization and Filtering# Tasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add note.projects conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization. Project Indicators# TaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance. Subtask Creation# Tasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select \"Create subtask\" to create a new task automatically linked to the current project. Dependencies# Task dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects: blockedBy: - uid: \"[[Operations/Order hardware]]\" reltype: FINISHTOSTART gap: P1D uid references the blocking task, typically through an Obsidian wikilink. reltype is stored with each dependency and defaults to FINISHTOSTART for dependencies created in the UI. gap is optional and uses ISO 8601 duration syntax (for example PT4H or P2D). Whenever a dependency is added, TaskNotes updates the upstream note’s blocking list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides. Selecting dependencies in the UI# The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries. The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views. Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place. These controls currently create and manage finish-to-start style blockers. Advanced reltype values and gap data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules. Automation# Auto-Archiving# TaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup. Configure auto-archiving per status from Settings → Task Properties → Task Statuses. Each status card includes an Auto-archive toggle and a Delay (minutes) input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically. The auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status. This automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault. File Management and Templates# TaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks. These settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds). For configuration details, see Task Defaults.For template variables, see Template Variables Reference. Recurring Tasks# TaskNotes recurring tasks use RFC 5545 RRule syntax with DTSTART, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu. For full behavior, examples, and edge cases, see Recurring Tasks. Task Reminders# Task reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus. For full setup, data format, defaults, and UI behavior, see Task Reminders."},{"title":"Template Variables Reference","url":"/obsidian/features/template-variables/","description":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced w...","product":"obsidian","text":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced with actual values when content is created. Overview# Template variables are available in three contexts: Body templates - Content templates for task and note files Folder templates - Dynamic folder paths for file organization Filename templates - Dynamic filename generation Not all variables are available in every context. The tables below indicate where each variable can be used. Task Properties# Variables for task-specific data. Variable Description Body Folder Example {{title}} Task title Yes Yes My Task {{titleLower}} Title in lowercase Yes Yes my task {{titleUpper}} Title in uppercase Yes Yes MY TASK {{titleSnake}} Title in snake_case Yes Yes my_task {{titleKebab}} Title in kebab-case Yes Yes my-task {{titleCamel}} Title in camelCase Yes Yes myTask {{titlePascal}} Title in PascalCase Yes Yes MyTask {{priority}} Task priority value Yes Yes high {{priorityShort}} First character of priority (uppercase) Yes Yes H {{status}} Task status value Yes Yes active {{statusShort}} First character of status (uppercase) Yes Yes A {{context}} First context from contexts array No Yes work {{contexts}} All contexts (comma-separated in body, / in folder) Yes Yes work, home or work/home {{project}} First project from projects array No Yes ProjectA {{projects}} All projects joined by / No Yes ProjectA/ProjectB {{projectFilePath}} Full path of the first project, without .md No Yes Work/Projects/ProjectA {{projectFilePaths}} Full paths of all projects, joined by / No Yes Work/Alpha/Personal/Beta {{projectFolder}} Folder containing the first project note (its file path without the note's own name) No Yes Work/Projects {{projectFolders}} Folders of all projects, joined by / No Yes Work/Personal {{dueDate}} Task due date Yes Yes 2025-01-15 {{scheduledDate}} Task scheduled date Yes Yes 2025-01-10 Body Template Only# Variables available only in body templates (not folder templates). Variable Description Example {{details}} User-provided details/description Task description text {{parentNote}} Parent note name/path where task was created Projects/MyNote {{tags}} Task tags (comma-separated) urgent, review {{hashtags}} Task tags as space-separated hashtags #urgent #review {{timeEstimate}} Time estimate in minutes 30 Date and Time# Variables for current date and time values. Variable Description Format Example {{date}} Full current date YYYY-MM-DD 2025-01-07 {{year}} Current year YYYY 2025 {{shortYear}} Short year YY 25 {{month}} Current month MM 01 {{day}} Current day DD 07 {{monthName}} Full month name - January {{monthNameShort}} Abbreviated month name - Jan {{dayName}} Full day name - Tuesday {{dayNameShort}} Abbreviated day name - Tue {{week}} Week number of year WW 02 {{quarter}} Quarter of year Q 1 {{shortDate}} Compact date YYMMDD 250107 Time Variables# Variable Description Format Example {{time}} Current time (compact) HHmmss 143052 {{time24}} 24-hour time HH:mm 14:30 {{time12}} 12-hour time with AM/PM hh:mm a 02:30 PM {{hour}} Current hour (24-hour) HH 14 {{hourPadded}} Hour with leading zero HH 14 {{hour12}} Hour in 12-hour format hh 02 {{minute}} Current minute mm 30 {{second}} Current second ss 52 {{ampm}} AM/PM indicator a PM Timestamps# Variable Description Format Example {{timestamp}} Date and time combined YYYY-MM-DD-HHmmss 2025-01-07-143052 {{dateTime}} Date and time (no seconds) YYYY-MM-DD-HHmm 2025-01-07-1430 {{unix}} Unix timestamp (seconds) - 1736264852 {{unixMs}} Unix timestamp (milliseconds) - 1736264852000 {{milliseconds}} Current milliseconds SSS 123 {{ms}} Milliseconds (alias) SSS 123 Timezone# Variable Description Example {{timezone}} Timezone offset +01:00 {{timezoneShort}} Short timezone offset +0100 {{utcOffset}} UTC offset +01:00 {{utcOffsetShort}} Short UTC offset +0100 {{utcZ}} UTC Z indicator Z Unique Identifiers# Variable Description Example {{zettel}} Zettelkasten-style ID (date + seconds since midnight in base36) 250107abc {{nano}} Unique nano ID (timestamp + random string) 1736264852000x7k2m ICS Calendar Event Variables# Variables for content created from ICS calendar events. Available when creating notes or tasks from calendar events. Event Information# Variable Description Body Folder {{icsEventTitle}} Event title Yes Yes {{icsEventTitleLower}} Event title lowercase No Yes {{icsEventTitleUpper}} Event title uppercase No Yes {{icsEventTitleSnake}} Event title in snake_case No Yes {{icsEventTitleKebab}} Event title in kebab-case No Yes {{icsEventTitleCamel}} Event title in camelCase No Yes {{icsEventTitlePascal}} Event title in PascalCase No Yes {{icsEventStart}} Event start time (ISO format) Yes No {{icsEventEnd}} Event end time (ISO format) Yes No {{icsEventLocation}} Event location Yes Yes {{icsEventDescription}} Event description Yes Yes {{icsEventUrl}} Event URL Yes No {{icsEventSubscription}} Calendar subscription name Yes No {{icsEventId}} Unique event identifier (UUID) Yes No Current Note Folder Variables# Variables available for inline-created tasks and the default tasks folder. Variable Description Example {{currentNotePath}} Path to the current note's folder Projects/Notes {{currentNoteTitle}} Title/name of the current note Meeting Notes Examples# Body Template# --- created: {{date}} priority: {{priority}} status: {{status}} --- # {{title}} {{details}} Created from: {{parentNote}} Tags: {{hashtags}} Folder Template# Organize tasks by project and status: Tasks/{{project}}/{{status}} Result: Tasks/MyProject/active Organize by date hierarchy: Daily/{{year}}/{{month}}/{{day}} Result: Daily/2025/01/07 Organize ICS events by year and title: Events/{{year}}/{{icsEventTitleKebab}} Result: Events/2025/team-meeting Filename Template# Using Zettelkasten ID: {{zettel}}-{{titleKebab}} Result: 250107abc-my-task.md Using timestamp: {{shortDate}}-{{title}} Result: 250107-My Task.md Notes# YAML Safety# When used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors. Folder Path Sanitization# In folder templates, title values have filesystem-unsafe characters (<>:\"/\\|?*) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment. Empty Values# If a variable references data that isn't available (e.g., {{project}} when no project is set), it resolves to an empty string. Case Transformations# The case transformation variables work as follows: Transform Input Output titleLower My Task Name my task name titleUpper My Task Name MY TASK NAME titleSnake My Task Name my_task_name titleKebab My Task Name my-task-name titleCamel My Task Name myTaskName titlePascal My Task Name MyTaskName"},{"title":"Time Management","url":"/obsidian/features/time-management/","description":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.","product":"obsidian","text":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer. Time Tracking# TaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the timeEntries array within each task's YAML frontmatter. Each time entry includes a start time and an end time. The time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions. Auto-Stop Time Tracking# TaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management. The auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated. Configuration Options: Configure these under Settings -> TaskNotes -> Features (Time Tracking section). Auto-stop tracking - Enable or disable the automatic stopping behavior (enabled by default) Completion notification - Show a notice when auto-stop occurs (disabled by default) Behavior: Monitors all task status changes in real-time Stops only the specific task that was completed (other active timers continue) Preserves the recorded time data in the task's time entries Works with both standard and recurring task completions Functions across all task views (list, kanban, calendar, etc.) The feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states. Pomodoro Timer# TaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer. When a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session. Productivity Analytics# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time."},{"title":"User Fields","url":"/obsidian/features/user-fields/","description":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User f...","product":"obsidian","text":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User fields can store workflow-specific metadata such as owner, effort class, client, or review stage. Creating User Fields# User fields are created in the TaskNotes settings, under the \"Task Properties\" tab. To create a new user field, click the \"Add new user field\" button. Fields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views. Each user field has the following properties: Display Name: The name of the field as it will be displayed in the UI. Property Name: The name of the field as it will be stored in the frontmatter of the task note. Type: The data type of the field. The following types are supported: Text: A single line of text. Number: A numeric value (supports ranges in filters and sorting). Boolean: A true/false value stored as a checkbox in the task modal. Date: A date. List: A list of values. Default Value (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type: Text: Enter the default text value. Number: Enter the default number. Boolean: Toggle to set the default state (checked/unchecked). Date: Select from presets: None, Today, Tomorrow, or Next Week. List: Enter comma-separated default values. Link Values# Use a Text field for one related link, such as a pull request or specification, and a List field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare https:// URLs as clickable links. For internal note links, type [[ in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped. File Suggestion Filtering (Advanced)# When using text or list type custom fields, you can configure autosuggestion filters to control which files appear in the autocomplete dropdown when you type [[ in the field. This is useful when you want to limit suggestions to specific types of notes. For example: An \"Assignee\" field that only suggests notes tagged with #person A \"Project\" field that only shows notes in the Projects/ folder A \"Related Document\" field filtered by a specific frontmatter property Filtering narrows wikilink suggestions in large vaults. Configuring Filters# To configure filters for a custom field: Go to Settings → Task Properties → Custom User Fields Expand the custom field card you want to configure Expand the \"Autosuggestion filters (Advanced)\" section Configure one or more of the following filters: Filter Options# Required tags: Only show files that have ANY of these tags (comma-separated) Example: person, team - shows files with either #person OR #team tag Supports hierarchical tags: project/active matches #project/active Include folders: Only show files in these folders (comma-separated) Example: People/, Teams/ - shows files in either folder Supports nested folders: Projects/Active/ matches files in that specific folder Required property key: Only show files that have this frontmatter property Example: role - shows files with a role: property in frontmatter Required property value: Expected value for the property (optional) Example: developer - when combined with property key role, shows files with role: developer Leave empty to match any value (just checks property exists) Filter Indicator# When filters are configured, a \"Filters On\" badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active. Filter Behavior# All filters are combined with AND logic: Files must match ALL configured filters to appear Empty filters are ignored: If you don't configure a filter, it won't restrict results No filters = all files: If no filters are configured, all markdown files in your vault will appear Filters only affect autocomplete: They don't affect the actual field value or validation Autocomplete filtering and stored field values are handled independently. Example Configurations# Assignee Field (People Only)# Display Name: Assignee Property Key: assignee Type: List Autosuggestion filters: Required tags: person Include folders: People/ Project Field (Active Projects)# Display Name: Project Property Key: project Type: Text Autosuggestion filters: Required tags: project Required property key: status Required property value: active Related Note (Specific Folder)# Display Name: Related Note Property Key: related-note Type: Text Autosuggestion filters: Include folders: Documentation/, Guides/ Using User Fields# Once you have created a user field, it will be available in the following places: Task Modals: The user field will be displayed in the task creation and edit modals. Bases Filters: Add the field to Bases filter expressions (for example note.effort == \"high\") to narrow task lists and Kanban boards. Sorting: Use the Bases sort menu to order tasks by the user field. Grouping: Use the Bases group menu to create swimlanes or list groupings based on the user field. To verify a new field is active in workflow, add it to at least one saved view. Frontmatter# User field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter. For example, if you create a user field with the property name \"my_field\", the data for that field will be stored in the frontmatter as follows: --- my_field: value ---"},{"title":"Adopt TaskNotes in an existing vault","url":"/obsidian/getting-started/existing-vault/","description":"Adopt TaskNotes in a vault that already contains tasks, tags, and custom frontmatter without rewriting everything first.","product":"obsidian","text":"TaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions. 1. Back up the vault# Make a complete vault backup, including the hidden .obsidian directory. The task notes themselves are Markdown, while TaskNotes settings live in .obsidian/plugins/tasknotes/data.json. 2. Inspect a representative note# Choose one existing task and record: The property or tag that distinguishes tasks from ordinary notes The property names used for title, status, priority, due date, and scheduled date Whether contexts and tags are stored with or without display prefixes The folder patterns that should be included or excluded Canonical frontmatter values do not include natural-language trigger characters. Store office, not @office, and review, not #review. --- type: task status: open contexts: - office tags: - review --- 3. Choose task identification# Open Settings → TaskNotes → General. Choose Tag if every task contains one identifying tag, such as task. Choose Property if a property/value pair identifies tasks, such as type: task. Add archive, template, attachment, or other non-task locations to Excluded folders. Task identification controls indexing and every generated Base filter. Confirm it before regenerating Base files. 4. Map properties# Open Settings → TaskNotes → Task properties and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both due and deadline. Start with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the property types reference to check value shapes. 5. Test one note# Open one existing note and confirm that TaskNotes recognizes it. Use TaskNotes: Quick actions for current task and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set. If the note is not recognized, use the troubleshooting decision tree. 6. Generate views from the final mapping# Open Settings → TaskNotes → General → Views & base files and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping. The update action replaces configured default Base files. Copy any customized Base to a new filename before updating it. 7. Convert incrementally# Convert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default TaskNotes/Tasks folder if your storage and exclusion settings already cover their location."},{"title":"Obsidian mobile guide","url":"/obsidian/getting-started/mobile/","description":"What is shared between TaskNotes desktop and mobile, and which integrations differ on mobile.","product":"obsidian","text":"TaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including .base files and .obsidian/plugins/tasknotes/data.json, when you want the same configuration on every device. Before opening TaskNotes# Install an Obsidian mobile version compatible with the current TaskNotes requirement. Enable the Bases core plugin. Confirm the TaskNotes plugin and its data.json have finished syncing before changing settings. Open a small default Base first and allow the initial index to finish. Mobile differences# Area Mobile behavior HTTP API and MCP server Desktop only. The HTTP API settings section is hidden on mobile. Calendar integrations Available, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem. Settings layout Uses the same six tabs. Desktop-only controls are omitted where they cannot run. Keyboard commands Commands remain available in the command palette; desktop key bindings may not have a mobile equivalent. Wide views Calendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration. A practical mobile setup# Keep task cards compact under Settings → Appearance and UI. Limit visible Base columns and calendar event layers. Increase remote calendar refresh intervals when mobile networking or battery use matters. Use the task creation modal or command palette for predictable capture. Keep HTTP automation on a desktop Obsidian instance. If mobile stops loading tasks# Wait for vault sync to finish, confirm Bases is enabled, and run TaskNotes: Refresh cache. Then reopen the affected Base. If the problem is isolated to calendar data, enable Disable calendar integration on mobile and restart Obsidian before investigating the provider connection on desktop."},{"title":"Backup, restore, and removal","url":"/obsidian/guides/backup-recovery/","description":"Back up, restore, reset, and uninstall TaskNotes while protecting task notes, views, settings, and integration data.","product":"obsidian","text":"TaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both. What to back up# Data Typical location Why it matters Task notes Your configured task folders Titles, properties, details, recurrence, and time entries Base views TaskNotes/Views/ or custom paths Filters, formulas, layout, and custom views Plugin settings .obsidian/plugins/tasknotes/data.json Field mapping, statuses, defaults, integrations, and view command paths Daily notes Your daily-note folder Pomodoro history when daily-note storage is enabled mdbase configuration tasknotes.yaml, mdbase.yaml, or .mdbase/ when configured Shared collection and schema configuration Treat data.json as sensitive because integration configuration can include credentials or tokens. Store backups accordingly. Create a restorable backup# Close Obsidian or disable TaskNotes so settings are not being written. Copy the entire vault, including hidden files. Verify the backup contains .obsidian/plugins/tasknotes/data.json. Keep at least one version from before a migration or bulk edit. File-history sync is useful, but it is not a substitute for a separate tested backup. Restore# Close Obsidian. Restore task notes and Base files first. Restore .obsidian/plugins/tasknotes/data.json if you also need the previous settings. Reopen Obsidian and confirm Bases is enabled. Run TaskNotes: Refresh cache and open one default Base. If provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens. Reset configuration safely# Do not delete data.json as a first troubleshooting step. Close Obsidian. Rename data.json to data.json.backup-YYYY-MM-DD. Reopen Obsidian and test with fresh defaults. Restore the backup while Obsidian is closed if the reset does not help. A reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files. Uninstall# Disabling or uninstalling TaskNotes leaves task notes and .base files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep. To remove plugin settings as well, close Obsidian and remove .obsidian/plugins/tasknotes/ after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render. Recovery checklist# Missing tasks: restore the note files, then verify task identification and excluded folders. Missing settings: restore data.json with Obsidian closed. Broken default views: regenerate them from General → Views & base files. Broken custom views: restore the individual .base files from history. Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter."},{"title":"Build a custom Base","url":"/obsidian/guides/custom-bases/","description":"Create a custom Obsidian Base for TaskNotes while keeping generated defaults safe and upgradeable.","product":"obsidian","text":"TaskNotes views are ordinary Obsidian .base files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy. Start from a copy# Open TaskNotes/Views/ in the file explorer. Duplicate the closest default, such as tasks-default.base. Rename the copy, for example work-tasks.base. Open the copy and make changes with the Bases interface or source editor. Avoid editing the only copy of a generated default. Update default base files replaces the files configured as defaults. Preserve task identification# Every task view needs a filter that matches the identification method in Settings → TaskNotes → General. For tag identification: filters: and: - file.hasTag(\"task\") For property identification: filters: and: - note[\"type\"] == \"task\" Also preserve any excluded-folder conditions generated from your settings. Add a focused view# This example starts with recognized tasks, then limits the view to the work context: filters: and: - file.hasTag(\"task\") - list(contexts).contains(\"work\") views: - type: tasknotesTaskList name: Work order: - status - priority - due - file.name sort: - column: due direction: ASC Use canonical stored values in filters. Natural-language prefixes such as @ and # are input syntax, not part of stored context and tag values. Point a command at the custom Base# Open Settings → TaskNotes → General → View commands and change the relevant command path. Resetting that mapping returns it to the generated default path. Upgrade safely# When TaskNotes ships improved templates: Keep your custom file at its own path. Run Update default base files. Compare the regenerated default with your copy. Bring across only the formulas, filters, or view options you want. The generated template reference always reflects the current source and default field mapping. Recovery# If a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time."},{"title":"TaskNotes HTTP API","url":"/obsidian/HTTP_API/","description":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.","product":"obsidian","text":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing. Availability# Desktop only Disabled by default Started when Obsidian starts and TaskNotes API is enabled Bound to loopback (127.0.0.1) only, not the local network Browser CORS requests are allowed only from loopback origins such as localhost, 127.0.0.1, and [::1] Not available on mobile Enable it in Settings -> TaskNotes -> Integrations -> HTTP API. Base URL# http://localhost:{PORT} Default port is 8080. Authentication# Authentication is optional. If apiAuthToken is empty, all API requests are accepted. If apiAuthToken is set, send Authorization: Bearer . Set a token for any workflow where local browser pages, scripts, or other desktop apps are not fully trusted. Example: curl -H \"Authorization: Bearer YOUR_TOKEN\" http://localhost:8080/api/health Response Format# Success: { \"success\": true, \"data\": {} } Error: { \"success\": false, \"error\": \"Error message\" } Endpoint Index# System# GET /api/health GET /api/docs GET /api/docs/ui POST /api/nlp/parse POST /api/nlp/create Tasks# GET /api/tasks POST /api/tasks GET /api/tasks/:id PUT /api/tasks/:id DELETE /api/tasks/:id POST /api/tasks/:id/toggle-status POST /api/tasks/:id/archive POST /api/tasks/:id/complete-instance POST /api/tasks/:id/materialize-occurrence POST /api/tasks/query GET /api/filter-options GET /api/stats Bases# POST /api/bases/default-files/update Time Tracking# POST /api/tasks/:id/time/start POST /api/tasks/:id/time/start-with-description POST /api/tasks/:id/time/stop GET /api/tasks/:id/time GET /api/time/active GET /api/time/summary Pomodoro# POST /api/pomodoro/start POST /api/pomodoro/stop POST /api/pomodoro/pause POST /api/pomodoro/resume GET /api/pomodoro/status GET /api/pomodoro/sessions GET /api/pomodoro/stats Calendars# GET /api/calendars GET /api/calendars/google GET /api/calendars/microsoft GET /api/calendars/subscriptions GET /api/calendars/events Webhooks# POST /api/webhooks GET /api/webhooks DELETE /api/webhooks/:id GET /api/webhooks/deliveries See docs/webhooks.md for event and transform details. Route Details# Health# GET /api/health# Returns service state plus vault metadata. curl http://localhost:8080/api/health Tasks# GET /api/tasks# Basic task listing with pagination only. Query params: limit (default 50, max 200) offset (default 0) Important: Filtering params such as status, priority, tag, project, context, due_before, due_after, overdue, completed, archived, and sort are rejected on this endpoint with HTTP 400. Use POST /api/tasks/query for filtering. Example: curl \"http://localhost:8080/api/tasks?limit=25&offset=0\" Response fields: data.tasks data.pagination with total, offset, limit, hasMore data.vault data.note Task objects include configured TaskNotes user fields in customProperties, keyed by their frontmatter property key. POST /api/tasks# Create one task. Required: title Common optional fields: details, status, priority, due, scheduled tags, contexts, projects recurrence, recurrence_anchor, timeEstimate, reminders blockedBy blockedBy accepts an array of dependency objects: uid: link or identifier for the blocking task, such as [[Project setup]] reltype: one of FINISHTOSTART, FINISHTOFINISH, STARTTOSTART, or STARTTOFINISH gap: optional ISO 8601 duration, such as P1D blocking is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' blockedBy fields. curl -X POST http://localhost:8080/api/tasks \\ -H \"Content-Type: application/json\" \\ -d '{\"title\":\"Review docs\",\"priority\":\"high\",\"blockedBy\":[{\"uid\":\"[[Draft docs]]\",\"reltype\":\"FINISHTOSTART\"}]}' Returns HTTP 201 with created task data. GET /api/tasks/:id# Get one task by path id. :id must be URL-encoded task path. Single-task reads include the task body in details. Configured TaskNotes user fields are returned in customProperties, keyed by their frontmatter property key. curl \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" PUT /api/tasks/:id# Update task with partial payload. Configured TaskNotes user fields can be updated either by their frontmatter property key or via customProperties. curl -X PUT \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" \\ -H \"Content-Type: application/json\" \\ -d '{\"status\":\"in-progress\"}' DELETE /api/tasks/:id# Delete task file. POST /api/tasks/:id/toggle-status# Toggle task status via configured workflow. POST /api/tasks/:id/archive# Toggle archive state. POST /api/tasks/:id/complete-instance# Complete recurring instance. Request body: Optional date (ISO string). If omitted, uses current date context. When the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to Create next after completion and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual complete_instances entry. POST /api/tasks/:id/materialize-occurrence# Create or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date. Request body: Required date (ISO date string, for example 2026-06-01) POST /api/tasks/query# Advanced filtering. Request body is a FilterQuery object. FilterQuery is still the supported advanced query shape for the HTTP API. The root object is a group with: type: \"group\" id conjunction: \"and\" | \"or\" children (conditions or groups) Optional top-level query options: sortKey, sortDirection groupKey, subgroupKey Example: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"c1\", \"property\": \"status\", \"operator\": \"is\", \"value\": \"open\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter tasks by context: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"context\", \"property\": \"contexts\", \"operator\": \"contains\", \"value\": \"@office\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter active, unarchived tasks, similar to the default available-task view: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"not-archived\", \"property\": \"archived\", \"operator\": \"is-not-checked\" }, { \"type\": \"condition\", \"id\": \"not-completed\", \"property\": \"status.isCompleted\", \"operator\": \"is-not-checked\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\", \"groupKey\": \"none\" } Condition fields: type: \"condition\" id: any stable string for your client property: a task property, such as title, status, priority, tags, contexts, projects, blockedBy, blocking, due, scheduled, completedDate, dateCreated, dateModified, archived, hasSubtasks, dependencies.isBlocked, dependencies.isBlocking, timeEstimate, recurrence, or status.isCompleted operator: one of is, is-not, contains, does-not-contain, is-before, is-after, is-on-or-before, is-on-or-after, is-empty, is-not-empty, is-checked, is-not-checked, is-greater-than, is-less-than, is-greater-than-or-equal, or is-less-than-or-equal value: required for comparison operators, omitted for empty/checked operators For user-defined fields, use property: \"user:\". Response: data.tasks data.total data.filtered data.vault GET /api/filter-options# Returns filter options for UI builders. GET /api/stats# Returns summary counts: total, completed, active, overdue, archived, withTimeTracking Bases# POST /api/bases/default-files/update# Overwrite the configured default TaskNotes .base files with templates generated from the current TaskNotes settings. This is the same write operation as Settings -> TaskNotes -> Views & base files -> Update files and replaces manual edits in those configured default files. curl -X POST http://localhost:8080/api/bases/default-files/update Response fields: data.created: default files created because they were missing data.updated: existing default files overwritten with current templates data.skipped: configured default files skipped Time Tracking# POST /api/tasks/:id/time/start# Starts a new active time entry for that task. POST /api/tasks/:id/time/start-with-description# Starts time tracking and writes description on the new active entry. Request body: { \"description\": \"Implementation\" } POST /api/tasks/:id/time/stop# Stops active time entry for that task. GET /api/tasks/:id/time# Returns per-task time summary and entries. GET /api/time/active# Returns currently active sessions across tasks. Important: Multiple active sessions can exist across different tasks. GET /api/time/summary# Returns aggregate time summary. Query params: period (for example today, week, month, all) from (ISO date) to (ISO date) Example: curl \"http://localhost:8080/api/time/summary?period=week\" Pomodoro# POST /api/pomodoro/start# Starts a session. Optional request fields: taskId (URL path of task) duration (number) POST /api/pomodoro/stop# Stops and resets current session. POST /api/pomodoro/pause# Pauses running session. POST /api/pomodoro/resume# Resumes paused session. GET /api/pomodoro/status# Returns current state plus computed totals (totalPomodoros, currentStreak, totalMinutesToday). GET /api/pomodoro/sessions# Returns history. Query params: limit date (YYYY-MM-DD) GET /api/pomodoro/stats# Returns stats for today or provided date. Query params: date (YYYY-MM-DD) Calendars# GET /api/calendars# Returns provider connectivity overview and subscription counts. GET /api/calendars/google# Returns Google provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/microsoft# Returns Microsoft provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/subscriptions# Returns ICS subscriptions with runtime fields such as lastFetched and lastError. GET /api/calendars/events# Returns merged event list from connected providers and ICS subscriptions. Query params: start (ISO date/datetime) end (ISO date/datetime) Response includes: events total sources (counts by provider) Webhooks# POST /api/webhooks# Registers webhook. Required fields: url events (non-empty array) Optional fields: id secret active transformFile corsHeaders GET /api/webhooks# Lists registered webhooks. Stored secrets are not returned. DELETE /api/webhooks/:id# Deletes webhook. GET /api/webhooks/deliveries# Returns last 100 delivery records. OpenAPI Docs# GET /api/docs# Returns OpenAPI JSON generated from registered controllers. GET /api/docs/ui# Returns Swagger UI. Errors# Common status codes: 400 invalid request or invalid state 401 missing/invalid bearer token (when auth token is configured) 404 missing task/webhook/resource 500 internal error Security Notes# Current behavior: CORS allows all origins (*). Transport is HTTP only (no TLS). Node server is started with server.listen(port) and does not explicitly bind to 127.0.0.1. Practical guidance: Set an auth token. Treat API port as sensitive and keep it firewalled. If you expose this port outside localhost, route through a trusted reverse proxy and TLS. Troubleshooting# API unavailable# Confirm API is enabled in settings. Confirm Obsidian is running. Confirm selected port is free. Reload plugin or restart Obsidian after changing API enable/port. 401 Authentication required# Check token value. Check Bearer prefix. Remove whitespace around token. Unexpected task list behavior# If you pass filters to GET /api/tasks, the endpoint returns 400 by design. Use POST /api/tasks/query."},{"title":"TaskNotes JavaScript Runtime API","url":"/obsidian/javascript-api/","description":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:","product":"obsidian","text":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; This API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI. This is separate from the HTTP API. The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app. For user-facing extensions built on this API, see Companion Plugins. For a concrete automation companion plugin, see TaskNotes Workflows. The TypeScript contract lives in src/api/runtime-api.ts. It is intentionally small and type-focused so it can later become a standalone @tasknotes/runtime-api package for companion plugins. Version and Capabilities# Check the API version and capabilities before using methods that may not exist in older TaskNotes versions: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; if (!api || api.apiVersion !== 1 || !api.hasCapability(\"tasks.write\")) { throw new Error(\"This workflow requires TaskNotes runtime API v1 task writes\"); } Current capabilities: model.read model.validate catalog.read extensions.read extensions.register tasks.read tasks.write tasks.delete tasks.move tasks.events relationships.read events.list time.read time.write time.summary pomodoro.read pomodoro.write pomodoro.events recurring.write recurring.materialize recurring.events settings.snapshot bases.write nlp.parse ui.task-menu query.tasks query.validate query.explain query.filter-options stats.tasks system.health lifecycle.events errors.typed Namespaces# Prefer the namespaced API for new code: await api.tasks.update(\"Tasks/example.md\", { status: \"active\" }); const subtasks = await api.relationships.subtasks(\"Tasks/example.md\"); await api.time.start(\"Tasks/example.md\", { description: \"Deep work\" }); await api.pomodoro.start({ taskPath: \"Tasks/example.md\", duration: 25 }); The older flat methods, such as api.getTask(path) and api.parseNaturalLanguage(text), remain available as compatibility aliases. Extension Registry# Companion plugins can publish their own runtime API namespace through api.extensions. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object. const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"extensions.register\")) { return; } const handle = api.extensions.register({ id: this.manifest.id, namespace: \"tasknotes-workflows\", displayName: \"TaskNotes Workflows\", version: this.manifest.version, capabilities: [\"tasknotes-workflows.run\", \"tasknotes-workflows.events\"], api: { runWorkflow: async (workflowId, input) => { // companion plugin implementation }, }, }); this.register(() => handle.unregister()); Other plugins can discover and consume extension namespaces: const workflows = api.extensions.get(\"tasknotes-workflows\"); if (api.hasCapability(\"tasknotes-workflows.run\")) { await workflows.runWorkflow(\"start-timer-on-active\", { taskPath: \"Tasks/example.md\" }); } Extension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions. Companion Plugin Access# Companion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry: const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"tasks.events\")) { return; } this.registerEvent( api.events.on(\"task.status.changed\", (event) => { console.log(event.taskPath, event.changes.status); }) ); If TaskNotes is disabled or has not loaded yet, api will be unavailable. Companion plugins should handle that case and retry after plugin load if needed. TypeScript# Use the exported runtime contract for type safety: import type { TaskNotesRuntimeApiV1 } from \"tasknotes/src/api/runtime-api\"; type TaskNotesPluginInstance = { api?: TaskNotesRuntimeApiV1; }; const tasknotes = app.plugins.getPlugin(\"tasknotes\") as TaskNotesPluginInstance | null; const api = tasknotes?.api; if (api?.apiVersion === 1 && api.hasCapability(\"tasks.write\")) { await api.tasks.setStatus(\"Tasks/example.md\", \"active\"); } TaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete. Model# The runtime API exposes a small model namespace backed by @tasknotes/model: const info = api.model.info(); const config = api.model.config(); const validation = api.model.validateTask(task); Method Description api.model.info() Returns the model package name, TaskNotes spec version, and runtime API version. api.model.config() Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings. api.model.validateTask(task) Validates a partial or complete task against the shared model schema and TaskNotes status rules. api.model.validatePatch(patch) Validates a task patch before passing it to a runtime task mutation. Catalog# Use api.catalog to build companion-plugin editors without hardcoding TaskNotes values: const statuses = api.catalog.statuses(); const writableFields = api.catalog.writableFields(); const operators = api.catalog.filterOperators(); Method Description api.catalog.statuses() Returns configured TaskNotes status definitions. api.catalog.priorities() Returns configured TaskNotes priority definitions. api.catalog.userFields() Returns configured user-defined field mappings. api.catalog.fields() Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available. api.catalog.writableFields() Returns only fields that runtime task mutations may write. api.catalog.filterProperties() Returns canonical query fields, aliases, value types, and supported operators. api.catalog.filterOperators() Returns canonical query operators, labels, value requirements, and accepted aliases. api.catalog.relationships() Returns relationship categories supported by api.relationships. api.catalog.dependencyRelTypes() Returns dependency relationship types accepted by api.tasks.addDependency. api.catalog.events() Returns the same runtime event catalogue as api.events.list(). Tasks# All paths are vault-relative Markdown file paths. Method Description api.tasks.get(path) Returns a task by path, or null when no task is cached at that path. api.tasks.list(query?) Returns all tasks, or tasks matching a runtime task query. Prefer api.query.tasks() when count and grouping metadata matters. api.tasks.create(taskData, context?) Creates a task using the normal TaskNotes creation service. api.tasks.update(path, patch, context?) Updates one or more task fields using the normal TaskNotes update service. api.tasks.delete(path, context?) Deletes the task file through TaskNotes' delete service. api.tasks.complete(path, options?, context?) Marks a task complete. api.tasks.uncomplete(path, options?, context?) Moves a completed task back to a non-completed status. api.tasks.setStatus(path, status, context?) Sets task status. api.tasks.setPriority(path, priority, context?) Sets task priority. api.tasks.setDue(path, date, context?) / clearDue(path, context?) Sets or clears due date. api.tasks.setScheduled(path, date, context?) / clearScheduled(path, context?) Sets or clears scheduled date. api.tasks.archive(path, archived, context?) Archives or unarchives a task, including archive-folder movement when configured. api.tasks.move(path, targetFolder, context?) Moves the task note and refuses to overwrite an existing file. api.tasks.addTag/removeTag Mutates task tags. api.tasks.addProject/removeProject Mutates project links. api.tasks.addContext/removeContext Mutates contexts. api.tasks.setReminders/addReminder/removeReminder Mutates reminders. api.tasks.addDependency/removeDependency Mutates blocking dependencies stored in blockedBy. Example: const task = await api.tasks.create( { title: \"Review automation design\", status: \"open\", priority: \"normal\", scheduled: \"2026-06-01\", tags: [\"tasknotes\"], }, { source: \"my-companion-plugin\", correlationId: crypto.randomUUID(), reason: \"manual workflow command\", } ); await api.tasks.complete(task.path); Relationships# Relationship methods resolve TaskNotes' project-as-parent links and blockedBy dependencies into task records where possible. Method Description api.relationships.parents(path) Returns parent tasks referenced from the task's projects. api.relationships.subtasks(path) Returns tasks that reference this task as a project. api.relationships.dependencies(path) Returns blockedBy dependencies with resolved task data when available. api.relationships.blocking(path) Returns tasks that are blocked by this task. api.relationships.all(path) Returns the task plus parents, subtasks, dependencies, and blocking tasks. Example: const relationships = await api.relationships.all(\"Tasks/example.md\"); for (const subtask of relationships.subtasks) { await api.tasks.setPriority(subtask.path, relationships.task.priority); } Time Tracking# Method Description api.time.start(path, options?, context?) Starts time tracking and returns the updated task. api.time.stop(path, context?) Stops the active time entry and returns the updated task. api.time.active() Returns active time entries with task, path, entry, and entry index. api.time.summary(options?) Returns aggregate time totals, top tasks, projects, and tags. api.time.task(path) Returns one task's time summary and normalized time entries. api.time.append(path, entry, context?) Appends a time entry. api.time.deleteEntry(path, entryIndex, context?) Deletes a time entry through TaskNotes' service. Query, Stats, And System# The query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state. const result = await api.query.tasks({ where: { all: [ { field: \"task.status\", op: \"eq\", value: \"active\" }, { field: \"task.due\", op: \"lte\", value: { fn: \"today\" } }, ], }, sort: [{ field: \"task.due\", direction: \"asc\" }], group: [{ field: \"task.status\" }], limit: 25, scope: { includeArchived: false, folders: [\"Tasks\"], }, }); Runtime query fields are canonical IDs such as task.status, task.priority, task.due, task.projects, task.isBlocked, file.path, and user.. api.catalog.filterProperties() returns the complete queryable field catalog, including aliases such as status and user:. Canonical operators are eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Legacy operator aliases such as is, is-not, is-on-or-before, and is-not-empty are accepted and normalized. api.query.tasks() returns explicit count semantics: total: tasks in scope before filtering matched: tasks matching where before offset and limit returned: tasks returned after offset and limit tasks: returned task records groups: optional group details with task paths query: the normalized canonical query warnings: non-fatal normalization notes Method Description api.query.tasks(query?) Validates, normalizes, and executes a runtime task query. api.query.validate(query) Validates a query without executing it. api.query.normalize(query) Returns the canonical normalized query, or throws a typed invalid_input API error. api.query.explain(query) Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run. api.query.filterOptions() Returns available statuses, priorities, contexts, projects, tags, folders, and user properties. api.stats.tasks(query?) Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals. api.system.health() Returns runtime status, API version, capabilities, vault identity, and task count. TaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract. Task Menu UI# Companion plugins can reuse the standard TaskNotes task context menu through api.ui.taskMenu. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals. This surface is only available inside Obsidian. It is not exposed through the HTTP API. Method Description api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? }) Shows the standard TaskNotes task context menu at a mouse event. api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... }) Shows the standard TaskNotes task context menu anchored to an element. api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... }) Adds the standard TaskNotes task context menu items to an existing Obsidian Menu so plugins can extend it. All methods resolve taskPath through the TaskNotes task cache and throw a typed task_not_found error when the path does not point to a cached task. targetDate defaults to today and is used by date-sensitive recurring-task menu items. onUpdate is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. promoteOccurrenceControls moves recurring-instance controls to the top of the menu. Example context menu: nodeEl.addEventListener(\"contextmenu\", async (event) => { event.preventDefault(); await api.ui.taskMenu.show({ taskPath: task.path, event, onUpdate: () => refreshGraph(), }); }); Example composed menu: const menu = new Menu(); await api.ui.taskMenu.populate(menu, { taskPath: task.path, onUpdate: () => refreshGraph(), }); menu.addSeparator(); menu.addItem((item) => item .setTitle(\"Focus in graph\") .setIcon(\"network\") .onClick(() => selectGraphNode(task.path)) ); menu.showAtMouseEvent(event); Pomodoro# Method Description api.pomodoro.status() Returns current Pomodoro state. api.pomodoro.start(options?, context?) Starts a Pomodoro session. api.pomodoro.stop(context?) Stops and resets the active Pomodoro session. api.pomodoro.pause(context?) Pauses the current session. api.pomodoro.resume(context?) Resumes a paused session. api.pomodoro.assignTask(pathOrNull, context?) Assigns or clears the current session task. api.pomodoro.sessions(options?) Returns Pomodoro session history. api.pomodoro.stats(date?) Returns Pomodoro stats for a date or today. Recurring Tasks# Method Description api.recurring.toggleCompleteInstance(path, date?, context?) Toggles completion for a recurring task instance. api.recurring.toggleSkippedInstance(path, date?, context?) Toggles skipped state for a recurring task instance. api.recurring.materializeOccurrence(path, date, context?) Creates or returns an occurrence note for a recurring task date. Natural Language Parser# const parsed = api.nlp.parse(\"Write draft friday 2pm #writing @desk\"); api.parseNaturalLanguage(text) remains as a compatibility alias. Parsing does not create or modify task files. See NLP API for HTTP endpoint details and parser behavior. Settings Snapshot# const settings = api.settings.snapshot(); console.log(settings.defaultTaskStatus); The returned object is a snapshot. Mutating it does not change TaskNotes settings. api.getSettingsSnapshot() remains available as a compatibility alias. Bases# api.bases.updateDefaultFiles() regenerates the configured default TaskNotes .base files from the current TaskNotes settings and returns the created, updated, and skipped file paths. const result = await api.bases.updateDefaultFiles(); console.log(result.updated); Mutation Context# Mutating methods accept an optional context object: { source: \"tasknotes-workflows\", correlationId: \"run-2026-06-01T09-00-00\", reason: \"status chang"},{"title":"mdbase-tasknotes CLI","url":"/obsidian/mdbase-tasknotes-cli/","description":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-c...","product":"obsidian","text":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-core for natural language parsing. When to use this vs TaskNotes Obsidian CLI# If you are looking for the built-in obsidian tasknotes:* commands exposed by the plugin itself, see TaskNotes Obsidian CLI. TaskNotes ships with tasknotes-cli (tn), which communicates with the Obsidian plugin over its HTTP API. mdbase-tasknotes operates directly on the markdown files instead. tn (tasknotes-cli) mtn (mdbase-tasknotes) Requires Obsidian Yes — plugin must be running with API enabled No Operates on HTTP API Markdown files directly via mdbase Use when Obsidian is open and you want live sync Obsidian is closed, on a server, or in scripts Time tracking Via plugin API Via frontmatter timeEntries Task creation NLP via API NLP via bundled tasknotes-nlp-core Install npm install -g tasknotes-cli npm install -g mdbase-tasknotes Use mtn when: Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines) You want to manage tasks from the terminal without any background process You're scripting task creation or querying in shell workflows You're on a machine where Obsidian isn't installed Both tools read and write the same task files, so they can be used interchangeably on the same vault. Install# npm install -g mdbase-tasknotes Setup# Using an existing TaskNotes vault# If you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point mtn at your vault root: mtn config --set collectionPath=/path/to/your/vault The plugin generates mdbase.yaml and _types/task.md automatically — mtn reads these to understand your task schema, including your custom statuses and priorities. Creating a standalone collection# To create a new collection without Obsidian: mtn init ~/tasks mtn config --set collectionPath=~/tasks This generates mdbase.yaml, _types/task.md, and a tasks/ folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent). Creating tasks# Create tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically: mtn create \"Buy groceries tomorrow #shopping @errands\" mtn create \"Write quarterly report due friday #work +quarterly-review\" mtn create \"Call dentist high priority @phone\" mtn create \"Water plants every monday #home\" Supported patterns# Pattern Example Extracted as #tag #shopping Tag @context @errands Context +project +quarterly-review Project (stored as wikilink) Date words tomorrow, friday, next week Due date Priority words high priority, urgent Priority Recurrence every day, weekly, every monday Recurrence rule Estimate ~30m, ~2h Time estimate The NLP parser reads your collection's status and priority enum values from _types/task.md, so any custom values you define there are automatically recognized. Querying tasks# List tasks# # Default: open tasks ordered by due date mtn list # Filter by status, priority, or tag mtn list --status in-progress mtn list --priority high mtn list --tag work # Show overdue tasks mtn list --overdue # Raw mdbase where expression mtn list --where 'due < \"2026-03-01\" && priority == \"urgent\"' # JSON output for scripting mtn list --json Show task detail# mtn show \"Buy groceries\" mtn show tasks/Buy\\ groceries.md Tasks can be referenced by title or file path. Title matching tries exact match first, then substring. Search# Full-text search across titles, body content, tags, contexts, and projects: mtn search quarterly Updating tasks# Complete a task# mtn complete \"Buy groceries\" Sets status to done and records the completion date. Update fields# mtn update \"Write report\" --status in-progress mtn update \"Write report\" --priority urgent --due 2026-03-01 mtn update \"Write report\" --add-tag important --remove-tag draft mtn update \"Write report\" --add-context office Archive and delete# mtn archive \"Write report\" # Adds \"archive\" tag mtn delete \"Old task\" # Checks for backlinks first mtn delete \"Old task\" --force # Skip backlink check Time tracking# Track time spent on tasks via the timeEntries frontmatter field — the same format TaskNotes uses. # Start a timer mtn timer start \"Write report\" mtn timer start \"Write report\" -d \"Drafting introduction\" # Check active timers mtn timer status # Stop the running timer mtn timer stop # View time log mtn timer log mtn timer log --period today mtn timer log --period week mtn timer log --from 2026-02-01 --to 2026-02-28 Projects and statistics# Projects# # List all projects mtn projects list mtn projects list --stats # With completion percentages # Show tasks for a project mtn projects show quarterly-review Statistics# mtn stats Shows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked. Interactive mode# Launch a REPL with live NLP preview that updates as you type: mtn interactive # or mtn i Type a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task. Configuration# Configuration is stored at ~/.config/mdbase-tasknotes/config.json. mtn config --list # Show all settings mtn config --set collectionPath=/path/to/vault # Set collection path mtn config --get collectionPath # Get a setting Collection path resolution# The collection path is resolved in order: --path / -p flag on any command MDBASE_TASKNOTES_PATH environment variable collectionPath in config file Current working directory Command reference# Command Alias Description mtn init [path] Initialize a new collection mtn create Create a task from natural language mtn list [options] ls List tasks with filters mtn show Show full task detail mtn complete done Mark task as completed mtn update [options] Update task fields mtn delete rm Delete a task mtn archive Add archive tag mtn search Full-text search mtn timer start Start time tracking mtn timer stop Stop running timer mtn timer status Show active timers mtn timer log Show time entry log mtn projects list List projects mtn projects show Show project tasks mtn stats Show task statistics mtn interactive i Interactive REPL mtn config [options] Manage configuration"},{"title":"Migrating from v3 to v4","url":"/obsidian/migration-v3-to-v4/","description":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.","product":"obsidian","text":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup. Back up before migratingBack up the complete vault, including the hidden .obsidian directory, before changing views or plugin data. Requirements# Obsidian 1.10.1 or later for early TaskNotes v4 releases Obsidian 1.12.2 or later for the current TaskNotes 4.11.1 release Bases core plugin enabled (Settings → Core Plugins → Bases) What Changed# Views are Now Bases Files# All task views (Task List, Kanban, Calendar, Agenda) are now .base files stored in TaskNotes/Views/. This replaces the custom view system in v3. v3 v4 Views stored in plugin settings Views stored as .base files Custom filter UI Bases filter syntax Saved views in settings Default views are separate files; exported v3 saved views share one multi-view file Automatic Migration on First Launch# When you first open TaskNotes v4: Default .base files are created in TaskNotes/Views/ Ribbon icons and commands now open these .base files Your existing task files are unchanged Converting Saved Filter Views# If you had saved filter views in v3, you can export them to one .base file: Go to Settings → TaskNotes → General → Views & base files. Find Export v3 saved views to Bases. Run the export. TaskNotes creates TaskNotes/Views/all-saved-views.base with one Base view for each saved v3 view. This is a one-way conversion. The original saved views remain in settings until you delete them. Breaking Changes# View Configuration# v3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment. v3 Filter Example: status: in-progress priority: high v4 Bases Syntax: filters: and: - status == \"in-progress\" - priority == \"high\" See the Obsidian Bases documentation for filter syntax details. Minimum Obsidian Version# Early v4 releases required Obsidian 1.10.1. The current release requirement is generated on the version compatibility page. Use the manifest requirement for the exact TaskNotes version you install. New Features in v4# OAuth Calendar Integration# v4 adds Google Calendar and Microsoft Outlook integration: View external calendar events alongside tasks Drag events to reschedule (syncs back to calendar provider) Events sync every 15 minutes See Calendar Setup for configuration. Kanban Swimlanes# The Kanban view now supports horizontal swimlane grouping: views: - type: tasknotesKanban groupBy: property: status config: swimLane: priority Time Entry Editor# A dedicated modal for managing time entries: Alt-drag on calendar to create time entries View total tracked time per task Edit and delete time entries Troubleshooting# Views Not Loading# Verify Bases core plugin is enabled (Settings → Core Plugins) Check that .base files exist in TaskNotes/Views/ Restart Obsidian Missing Saved Views After Upgrade# Saved views from v3 are preserved in settings. Use Export v3 saved views to Bases in Settings → TaskNotes → General → Views & base files to create the multi-view .base file. Filter Syntax Errors# Bases uses different filter syntax than v3. Common issues: Problem Solution status: done Use status == \"done\" Multiple conditions Wrap in and: or or: block Date comparisons Use date(due) < today() Downgrading to v3# Migration is one-way. If you need to downgrade: Uninstall TaskNotes v4 Install TaskNotes v3 from releases Reconfigure your saved views manually Your task files are unaffected—only view configurations change. View Templates# For complete .base file examples, see Default Base Templates."},{"title":"TaskNotes NLP API","url":"/obsidian/nlp-api/","description":"The NLP API parses natural-language task text and optionally creates a task.","product":"obsidian","text":"The NLP API parses natural-language task text and optionally creates a task. In-vault scripts can also call the parser directly from the loaded plugin: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Review PR tomorrow #code @work\"); For the full in-process API exposed at tasknotes.api, including task updates, time tracking, settings snapshots, and events, see TaskNotes JavaScript API. Endpoints# POST /api/nlp/parse POST /api/nlp/create Both endpoints require a JSON body with text. Request Format# { \"text\": \"Review PR #123 tomorrow high priority @work\" } Notes: text is required and must be a string. Per-request locale is not currently supported. Parser language comes from TaskNotes settings (nlpLanguage). POST /api/nlp/parse# Parses text and returns two objects: parsed: direct parser output taskData: normalized task payload that would be used for creation Example response (shape): { \"success\": true, \"data\": { \"parsed\": { \"title\": \"Review PR\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"projects\": [], \"priority\": \"high\", \"status\": null, \"dueDate\": \"2026-02-22\", \"scheduledDate\": null, \"dueTime\": null, \"scheduledTime\": null, \"recurrence\": null, \"estimate\": null, \"isCompleted\": false }, \"taskData\": { \"title\": \"Review PR\", \"priority\": \"high\", \"status\": \"open\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"due\": \"2026-02-22\", \"dateCreated\": \"2026-02-22T09:00:00.000Z\", \"dateModified\": \"2026-02-22T09:00:00.000Z\" } } } If parser does not detect status, taskData.status falls back to your configured default task status. Parsed due and scheduled date-times in taskData use the same YYYY-MM-DDTHH:mm format as created tasks, and NLP trigger values for user-defined fields are returned under customFrontmatter. POST /api/nlp/create# Parses text and creates a task in one call. Returns HTTP 201 on success. Example: curl -X POST http://localhost:8080/api/nlp/create \\ -H \"Content-Type: application/json\" \\ -d '{\"text\":\"Call mom due friday 2pm #personal\"}' Response fields: data.task (created task) data.parsed (parser output) What the Parser Extracts# The parser can extract: Dates and times (tomorrow, friday 2pm, ISO dates) Priority terms (high priority, urgent, symbol patterns) Status terms (mapped to your configured statuses) Tags (#tag) Contexts (@context) Projects (+project) Time estimates (2h, 30min, estimate 45m) Recurrence (daily, weekly, every monday) Exact parsing behavior depends on your TaskNotes NLP settings and trigger configuration. In-Vault Parser Method# Templater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Write draft friday 2pm #writing @desk\"); parseNaturalLanguage(text) returns the same parser output shape as data.parsed from POST /api/nlp/parse. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale. This method only parses text. It does not create or modify task files. For task creation and updates from in-vault scripts or companion plugins, use the broader TaskNotes JavaScript API. Example Templater use: <%* const tasknotes = app.plugins.plugins.tasknotes; const text = await tp.system.prompt(\"Task\"); const parsed = tasknotes.api.parseNaturalLanguage(text); tR += `title: ${parsed.title}`; %> Error Responses# Common errors: 400: missing/invalid text 401: auth required (if API token is enabled) 500: parse/processing error Error shape: { \"success\": false, \"error\": \"Text field is required and must be a string\" } Client Examples# JavaScript# async function parseTask(text) { const response = await fetch(\"http://localhost:8080/api/nlp/parse\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } async function createTaskFromText(text) { const response = await fetch(\"http://localhost:8080/api/nlp/create\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } Python# import requests def parse_task(text): response = requests.post( \"http://localhost:8080/api/nlp/parse\", json={\"text\": text}, ) return response.json() def create_task_from_text(text): response = requests.post( \"http://localhost:8080/api/nlp/create\", json={\"text\": text}, ) return response.json() Authentication# If API auth token is enabled, include bearer token: Authorization: Bearer YOUR_TOKEN"},{"title":"TaskNotes Obsidian CLI","url":"/obsidian/obsidian-cli/","description":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking...","product":"obsidian","text":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API. Use this page for the built-in obsidian ... commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see mdbase-tasknotes CLI. Requirements# Obsidian desktop 1.12.2 or newer TaskNotes installed and enabled in the target vault Obsidian running when you invoke the CLI The Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass vault= explicitly instead of relying on the default vault. Discovering commands# List available TaskNotes commands: obsidian help | rg 'tasknotes:' You should see: tasknotes:capture tasknotes:start-time tasknotes:stop-time tasknotes:time-status tasknotes:pomodoro tasknotes:capture# Create a task from free text, explicit flags, or both. obsidian tasknotes:capture vault=test text=\"Review PR tomorrow #work @desk\" By default, text= is parsed with TaskNotes NLP. Explicit flags override parsed values. Literal title mode# Use literal when you want the text treated as an exact title instead of being parsed. obsidian tasknotes:capture vault=test text=\"Fix parser edge case\" literal Explicit fields# Supported override flags: title details status priority due scheduled tags contexts projects recurrence recurrence-anchor reminders estimate Example: obsidian tasknotes:capture vault=test \\ text=\"Write release notes tomorrow #docs\" \\ priority=high \\ status=in-progress \\ reminders='due:-PT1H' Reminder format# reminders= accepts either: a semicolon-separated shorthand such as due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00 a JSON array in the same shape TaskNotes stores internally Recurrence anchor# Use recurrence-anchor=scheduled or recurrence-anchor=completion to control how recurring tasks advance. tasknotes:start-time# Start time tracking for a task. You can target a task by: path exact title fuzzy query Examples: obsidian tasknotes:start-time vault=test title=\"Write release notes\" obsidian tasknotes:start-time vault=test query=\"release notes\" description=\"Drafting first pass\" obsidian tasknotes:start-time vault=test path=\"TaskNotes/Write release notes.md\" tasknotes:stop-time# Stop time tracking for a task. Examples: obsidian tasknotes:stop-time vault=test title=\"Write release notes\" obsidian tasknotes:stop-time vault=test path=\"TaskNotes/Write release notes.md\" If you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous. tasknotes:time-status# Show time-tracking status for either: all active sessions one resolved task Examples: obsidian tasknotes:time-status vault=test obsidian tasknotes:time-status vault=test title=\"Write release notes\" obsidian tasknotes:time-status vault=test path=\"TaskNotes/Write release notes.md\" When a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault. tasknotes:pomodoro# Control Pomodoro state from the CLI. Supported actions: status start pause resume stop short-break long-break Inspect state# obsidian tasknotes:pomodoro vault=test action=status Start a work session# You can start a Pomodoro with or without a linked task. obsidian tasknotes:pomodoro vault=test action=start duration=25 obsidian tasknotes:pomodoro vault=test action=start title=\"Write release notes\" duration=25 Task lookup for action=start supports the same selectors as time tracking: path exact title fuzzy query Pause, resume, and stop# obsidian tasknotes:pomodoro vault=test action=pause obsidian tasknotes:pomodoro vault=test action=resume obsidian tasknotes:pomodoro vault=test action=stop Breaks# obsidian tasknotes:pomodoro vault=test action=short-break obsidian tasknotes:pomodoro vault=test action=long-break Choosing between CLI surfaces# Use the built-in Obsidian CLI when: Obsidian is already open you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state you are scripting on the same machine as the running vault Use mdbase-tasknotes CLI when: Obsidian is not running you need headless/server workflows you want direct file-level automation over a task collection Notes# path is the most reliable task selector for automation. Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up. These commands are desktop-only because they depend on the Obsidian desktop CLI."},{"title":"Command reference","url":"/obsidian/reference/commands/","description":"Every TaskNotes command registered with Obsidian, generated from the plugin command definitions.","product":"obsidian","text":"This page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian. Command ID Available in Open mini calendar view open-calendar-view Global Open calendar view open-advanced-calendar-view Global Open tasks view open-tasks-view Global Open agenda view open-agenda-view Global Open Pomodoro timer open-pomodoro-view Global Open Kanban board open-kanban-view Global Update default base files update-default-base-files Global Open Pomodoro statistics open-pomodoro-stats Global Open task & project statistics open-statistics Global Create new task create-new-task Global Convert current note to task convert-current-note-to-task Global Convert checkbox task to TaskNote convert-to-tasknote Editor Convert all tasks in note batch-convert-all-tasks Editor Insert tasknote link insert-tasknote-link Editor Create new inline task create-inline-task Editor Quick actions for current task quick-actions-current-task Global Quick actions for task under cursor quick-actions-task-under-cursor Editor Edit current task edit-current-task Global Cycle current task status cycle-current-task-status Global Cycle current task priority cycle-current-task-priority Global Add project to current task add-project-to-current-task Global Add subtask to current note add-subtask-to-current-note Global Go to today's note go-to-today Global Start Pomodoro timer start-pomodoro Global Stop Pomodoro timer stop-pomodoro Global Pause/resume Pomodoro timer pause-pomodoro Global Refresh cache refresh-cache Global Export all tasks as ICS file export-all-tasks-ics Global Sync all tasks to Google Calendar sync-all-tasks-google-calendar Global Sync current task to Google Calendar sync-current-task-google-calendar Global View release notes view-release-notes Global Start time tracking (select task) start-time-tracking-with-selector Global Edit time entries (select task) edit-time-entries Global Create or open task create-or-open-task Global Create or open task and start time tracking create-or-open-task-with-time-tracking Global Postpone overdue scheduled tasks to today rollover-overdue-scheduled-tasks Global Generated from 36 registered commands."},{"title":"Version compatibility","url":"/obsidian/reference/compatibility/","description":"Current TaskNotes and Obsidian compatibility requirements, generated from the plugin manifest.","product":"obsidian","text":"Current release# Item Value TaskNotes 4.11.1 Minimum Obsidian version 1.12.2 Desktop only No Bases core plugin Required The minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult versions.json or the relevant release note when maintaining an older installation."},{"title":"Generated default Base templates","url":"/obsidian/reference/default-base-templates/","description":"Exact default Obsidian Base files generated by the current TaskNotes source and default settings.","product":"obsidian","text":"These are the exact templates TaskNotes 4.11.1 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ. Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it. mini-calendar-default.base# Command/template ID: open-calendar-view # Mini Calendar # Generated with your TaskNotes settings filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))' nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))' nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))' urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))' timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")' dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))' views: - type: tasknotesMiniCalendar name: \"Due\" order: - status - priority - due - scheduled - projects - contexts - file.tags - blockedBy - file.name - recurrence - complete_instances - file.tasks sort: - property: due direction: ASC dateProperty: due - type: tasknotesMiniCalendar name: \"Scheduled\" order: [] dateProperty: scheduled - type: tasknotesMiniCalendar name: \"Created\" dateProperty: file.ctime - type: tasknotesMiniCalendar name: \"Modified\" dateProperty: file.mtime kanban-default.base# Command/template ID: open-kanban-view # Kanban Board filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).fo"},{"title":"HTTP route index","url":"/obsidian/reference/http-routes/","description":"Implemented TaskNotes HTTP API routes generated from controller decorators.","product":"obsidian","text":"This index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative HTTP API guide or NLP API guide. Method Path Controller POST /api/bases/default-files/update BasesController GET /api/calendars CalendarsController GET /api/calendars/events CalendarsController GET /api/calendars/google CalendarsController GET /api/calendars/microsoft CalendarsController GET /api/calendars/subscriptions CalendarsController GET /api/docs SystemController GET /api/docs/ui SystemController GET /api/filter-options TasksController GET /api/health SystemController POST /api/nlp/create SystemController POST /api/nlp/parse SystemController POST /api/pomodoro/pause PomodoroController POST /api/pomodoro/resume PomodoroController GET /api/pomodoro/sessions PomodoroController POST /api/pomodoro/start PomodoroController GET /api/pomodoro/stats PomodoroController GET /api/pomodoro/status PomodoroController POST /api/pomodoro/stop PomodoroController GET /api/stats TasksController GET /api/tasks TasksController POST /api/tasks TasksController DELETE /api/tasks/:id TasksController GET /api/tasks/:id TasksController PUT /api/tasks/:id TasksController POST /api/tasks/:id/archive TasksController POST /api/tasks/:id/complete-instance TasksController POST /api/tasks/:id/materialize-occurrence TasksController GET /api/tasks/:id/time TimeTrackingController POST /api/tasks/:id/time/start TimeTrackingController POST /api/tasks/:id/time/start-with-description TimeTrackingController POST /api/tasks/:id/time/stop TimeTrackingController POST /api/tasks/:id/toggle-status TasksController POST /api/tasks/query TasksController GET /api/time/active TimeTrackingController GET /api/time/summary TimeTrackingController GET /api/webhooks WebhookController POST /api/webhooks WebhookController DELETE /api/webhooks/:id WebhookController GET /api/webhooks/deliveries WebhookController Generated from 40 implemented routes."},{"title":"Settings source reference","url":"/obsidian/reference/settings-source/","description":"The six TaskNotes settings tabs, their controls, and the complete default settings snapshot generated from source.","product":"obsidian","text":"TaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation. General# Source: src/settings/tabs/generalTab.ts Setting Purpose Default tasks folder Default location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD. Folder for inline-created tasks Folder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note. Move archived tasks to folder Automatically move archived tasks to an archive folder Archive folder Folder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc. Identify tasks by Choose whether to identify tasks by tag or by a frontmatter property Task tag Tag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters. Hide identification tags in task cards When enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays Hidden tag scope Choose whether hiding identification tags also hides nested tags. Task property name The frontmatter property name (e.g., \"category\") Task property value The value that identifies a note as a task (e.g., \"task\") Auto-create default files Automatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated. Create default files Create the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten. Update default files Overwrite the configured default .base files with templates generated from your current TaskNotes settings. Export v3 saved views to Bases Convert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system. Excluded folders Comma-separated list of folders to exclude from task indexing and project suggestions UI language Select the language used for TaskNotes interface text Use Markdown links in frontmatter Generate markdown links ([text](path)) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly. Show release notes after update Automatically open release notes when TaskNotes is updated to a new version Check for new releases on startup Check GitHub once when TaskNotes starts and show a notice when a newer compatible release is available View release notes See what's new in the latest version of TaskNotes Task properties# Source: src/settings/tabs/taskPropertiesTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Modal fields# Source: src/settings/tabs/modalFieldsTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Appearance & UI# Source: src/settings/tabs/appearanceTab.ts Setting Purpose Default visible properties Choose which properties appear on task cards by default. Time format Display time in 12-hour or 24-hour format throughout the plugin Default view The calendar view shown when opening the calendar tab Custom view day count Number of days to show in custom multi-day view First day of week Which day should be the first column in week views Show weekends Display weekends in calendar views Show week numbers Display week numbers in calendar views Show today highlight Highlight the current day in calendar views Show current time indicator Display a line showing the current time in timeline views Selection mirror Show a visual preview while dragging to select time ranges Calendar locale Calendar locale for date formatting and calendar system (e.g., \"en\", \"fa\" for Farsi/Persian, \"de\" for German). Leave empty to auto-detect from browser. Show scheduled tasks Display tasks with scheduled dates by default Show due dates Display task due dates by default Show due dates when scheduled Display due dates even for tasks that already have scheduled dates Show time entries Display completed time tracking entries by default Show recurring tasks Display recurring task instances by default Show ICS events Display events from ICS subscriptions by default Time slot duration Duration of each time slot in timeline views Start time Earliest time shown in timeline views (HH:MM format) End time Latest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM. Initial scroll time Time to scroll to when opening timeline views (HH:MM format) Event minimum height Minimum height for events in timeline views (pixels) Show tracked tasks in status bar Display currently tracked tasks in Obsidian's status bar Show relationships widget Display a widget showing all relationships for the current note (subtasks, projects, dependencies) Relationships position Where to position the relationships widget Show task card in note Display a task card widget at the top of task notes showing the task details and actions Strike through completed task titles Draw a line through completed task card titles. Turn off to keep completed tasks easier to read Show expandable subtasks Allow expanding/collapsing subtask sections in task cards Expand subtasks by default Show project subtasks expanded when task cards are rendered Subtask chevron position Position of expand/collapse chevrons in task cards Views button alignment Alignment of the views/filters button in the task interface Single-click action Action performed when single-clicking a task card Double-click action Action performed when double-clicking a task card Features# Source: src/settings/tabs/featuresTab.ts Setting Purpose Task link overlay Show interactive overlays when hovering over task links Disable overlay for aliased links Do not show the task widget if the link contains an alias (e.g. [[Task|Alias]]). Show convert button next to checkboxes Display an inline button next to Markdown checkboxes that converts them to TaskNotes Keep checkbox when converting Leave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link Enable natural language task input Parse due dates, priorities, and contexts from natural language when creating tasks Default to scheduled When NLP detects a date without context, treat it as scheduled rather than due NLP language Language for natural language processing patterns and date parsing Open task after creation Choose whether the task creation modal opens the new task note after saving. Use body template Use a template file for task body content Body template file Path to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc. Use occurrence note template Use a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template Occurrence note template file Path to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback. Template variables: See the setting in Obsidian for contextual details. Use task defaults on instant convert Apply default task settings when converting text to tasks instantly Work duration Duration of work intervals in minutes Short break duration Duration of short breaks in minutes Long break duration Duration of long breaks in minutes Long break interval Number of work sessions before a long break Auto-start breaks Automatically start break timers after work sessions Auto-start work Automatically start work sessions after breaks Pomodoro notifications Show notifications when Pomodoro sessions end Show Pomodoro in status bar Display the active Pomodoro countdown in Obsidian's status bar Sound enabled Play sound when Pomodoro sessions end Sound volume Volume for Pomodoro sounds (0-100) Pomodoro data storage Configure where Pomodoro session data is stored and how it's managed. Mobile sidebar Where to open the Pomodoro timer on mobile devices Enable notifications Enable task reminder notifications Notification type Type of notifications to show Send test reminder Send a test reminder using the current notification type and sound settings. Notification sound Play a sound when task reminders trigger Sound volume Volume for task reminder sounds (0-100) Preview notification sound Play the configured task reminder sound Hide completed tasks from overdue Exclude completed tasks from overdue task calculations Disable note indexing Disable automatic indexing of note content for better performance Suggestion debounce Delay in milliseconds before showing suggestions Auto-stop time tracking Automatically stop time tracking when a task is marked complete Time tracking stop notification Show notification when time tracking is automatically stopped Maintain due date offset in recurring tasks Keep the offset between due date and scheduled date when recurring tasks are completed Reset checkboxes on recurrence Reset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled Enable timeblocking Enable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu. Show timeblocks Display timeblocks from daily notes by default Default timeblock color The default color used when creating new timeblocks Enable debug logging Log detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting. Integrations# Source: src/settings/tabs/integrationsTab.ts Setting Purpose Generate mdbase type definitions See the setting in Obsidian for contextual details. Disable calendar integrations on mobile Skip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged. Calendar integrations are disabled on this mobile device See the setting in Obsidian for contextual details. Enable task export When enabled, tasks with dates will be automatically synced to Google Calendar as events. Target calendar See the setting in Obsidian for contextual details. Sync trigger Which task date should trigger calendar event creation. Create as all-day events When enabled, tasks are created as all-day events. When disabled, uses time estimate for duration. Default event duration Duration in minutes for timed events (used when task has no time estimate). Event title template Template for event titles. Available variables: {{title}}, {{status}}, {{priority}} Include task details in description Add task metadata (priority, status, tags, etc.) to the event description. Include Obsidian link Add a link back to the task in Obsidian in the event description. Default reminder Add popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440. Automatic sync behavior See the setting in Obsidian for contextual details. Sync on task create Automatically create calendar event when a new task is created. Sync on task update Automatically update calendar event when a task is modified. Sync on task complete Update calendar event when a task is completed (adds checkmark to title). Delete event on task delete Remove calendar event when the corresponding task is deleted. Manual sync actions See the setting in Obsidian for contextual details. Sync all tasks Sync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet. Unlink all tasks Remove all task-event links without deleting calendar events. Default note template Path to template file for notes created from ICS events Default note folder Folder for notes created from ICS events ICS note filename format How filenames are generated for notes created from ICS events Custom ICS filename template Template for custom ICS event filenames Use ICS event end time as task due date When enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time. Recurring event related notes Choose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance. Add calendar subscription Add a new calendar subscription from ICS/iCal URL or local file New calendar See the setting in Obsidian for contextual details. Refresh all subscriptions Manually refresh all enabled calendar subscriptions Enable automatic export Automatically keep an ICS file updated with all your tasks Export file path Path where the ICS file will be saved (relative to vault root) Update interval (between 5 and 1440 minutes) How often to update the export file Use task duration for event length When enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines. Exclude completed tasks When enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings. Exclude archived tasks When enabled, archived tasks are omitted from ICS exports. Require due date When enabled, only tasks with a due date are included in ICS exports. Require scheduled date When enabled, only tasks with a scheduled date are included in ICS exports. Export now Manually trigger an immediate export Export status: See the setting in Obsidian for contextual details. Enable HTTP API Start local HTTP server for API access API port Port number for the HTTP API server API authentication token Token required for API authentication (leave empty for no auth) Enable MCP server Expose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled. Add webhook Register a new webhook endpoint Complete default settings snapshot# The following JSON is generated from DEFAULT_SETTINGS. Empty strings and disabled flags are intentional defaults. { \"tasksFolder\": \"TaskNotes/Tasks\", \"moveArchivedTasks\": false, \"archiveFolder\": \"TaskNotes/Archive\", \"taskTag\": \"task\", \"taskIdentificationMethod\": \"tag\", \"hideIdentifyingTagsInCards\": false, \"hideIdentifyingTagsMode\": \"all\", \"taskPropertyName\": \"\", \"taskPropertyValue\": \"\", \"excludedFolders\": \"\", \"defaultTaskPriority\": \"normal\", \"defaultTaskStatus\": \"open\", \"taskOrgFiltersCollapsed\": false, \"taskFilenameFormat\": \"zettel\", \"storeTitleInFilename\": true, \"customFilenameTemplate\": \"{{title}}\", \"occurrenceFilenameTemplate\": \"\", \"occurrenceFilenameTemplateProperty\": \"occurrenceFilenameTemplate\", \"taskCreationDefaults\": { \"defaultContexts\": \"\", \"defaultTags\": \"\", \"defaultProjects\": \"\", \"useParentNoteForTaskCreation\": false, \"useParentNoteAsProject\": false, \"useParentHeaderAsProject\": false, \"inheritParentTaskProperties\": false, \"defaultTimeEstimate\": 0, \"defaultRecurrence\": \"none\", \"defaultDueDate\": \"none\", \"defaultDueTime\": \"none\", \"defaultScheduledDate\": \"today\", \"defaultScheduledTime\": \"none\", \"bodyTemplate\": \"\", \"useBodyTemplate\": false, \"occurrenceBodyTemplate\": \"\", \"useOccurrenceBodyTemplate\": false, \"defaultReminders\": [] }, \"openTaskAfterCreation\": \"none\", \"calendarViewSettings\": { \"defaultView\": \"dayGridMonth\", \"customDayCount\": 3, \"slotDuration\": \"00:30:00\", \"slotMinTime\": \"00:00:00\", \"slotMaxTime\": \"24:00:00\", \"scrollTime\": \"08:00:00\", \"firstDay\": 1, \"timeFormat\": \"24\", \"showWeekends\": true, \"locale\": \"\", \"defaultShowSchedu"},{"title":"Release Notes","url":"/obsidian/releases/","description":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.","product":"obsidian","text":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements. Latest Releases# Version 4.x (Current)# 4.11.1 4.11.0 4.10.2 4.10.1 4.10.0 4.9.2 4.9.1 4.9.0 4.8.1 4.8.0 4.7.2 4.7.1 4.7.0 4.6.0 4.5.3 4.5.2 4.5.1 4.5.0 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.1 4.2.0 4.1.3 4.1.2 4.1.1 4.1.0 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0-beta.3 4.0.0-beta.2 4.0.0-beta.1 4.0.0-beta.0 Version 3.x# 3.25.6 3.25.4 3.25.3 3.25.2 3.25.1 3.25.0 3.24.6 3.24.5 3.24.4 3.24.3 3.24.2 3.24.1 3.24.0 3.23.4 3.23.3 3.23.2 3.23.1 3.23.0 3.22.1 3.22.0 3.21.0 3.20.1 3.20.0 3.19.1 3.19.0 3.18.2 3.18.1 3.18.0 3.17.1 3.17.0 3.16.4 3.16.3 3.16.2 3.16.1 3.16.0 3.15.1 3.15.0 3.14.0 3.13.4 3.13.3 3.13.2 3.13.1 3.13.0 3.12.2 3.12.1 3.12.0 3.11.2 3.11.1 3.11.0 3.10.0 3.9.1 3.9.0 3.8.7 3.8.6 3.8.5 3.8.1 3.7.1 3.7.0 3.6.0 3.5.1 3.4.2 3.4.1 3.4.0 3.3.0 3.1.1 3.1.0 3.0.1 3.0.0 Version 2.x# 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 Version 1.x# 1.2.0 1.1.0 1.0.0 Early Versions (0.x)# 0.8.0 0.7.0 0.6.3 0.6.2 0.6.1 0.6.0 0.4.2 0.4.1 0.4.0 0.3.0 0.2.4 0.2.3 0.2.2 Getting Updates# To update TaskNotes: Open Obsidian Go to Settings → Community Plugins Find TaskNotes and click \"Update\" Restart Obsidian if prompted Feedback# Found a bug or have a feature request? Please: Check existing GitHub Issues Create a new issue with details"},{"title":"Untitled","url":"/obsidian/releases/0.2.2/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2"},{"title":"Untitled","url":"/obsidian/releases/0.2.3/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3"},{"title":"Untitled","url":"/obsidian/releases/0.2.4/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4"},{"title":"Untitled","url":"/obsidian/releases/0.3.0/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0"},{"title":"Untitled","url":"/obsidian/releases/0.4.0/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0"},{"title":"Untitled","url":"/obsidian/releases/0.4.1/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1"},{"title":"Untitled","url":"/obsidian/releases/0.4.2/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2"},{"title":"Untitled","url":"/obsidian/releases/0.6.0/","description":"TaskNotes documentation.","product":"obsidian","text":""},{"title":"Untitled","url":"/obsidian/releases/0.6.1/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1"},{"title":"Untitled","url":"/obsidian/releases/0.6.2/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2"},{"title":"Untitled","url":"/obsidian/releases/0.6.3/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3"},{"title":"Untitled","url":"/obsidian/releases/0.7.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0"},{"title":"Untitled","url":"/obsidian/releases/0.8.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0"},{"title":"Untitled","url":"/obsidian/releases/1.0.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0"},{"title":"Untitled","url":"/obsidian/releases/1.1.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0"},{"title":"Untitled","url":"/obsidian/releases/1.2.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0"},{"title":"Untitled","url":"/obsidian/releases/2.0.0/","description":"TaskNotes 2.0.0 - Major Feature Release","product":"obsidian","text":"TaskNotes 2.0.0 - Major Feature Release Major New Features: Kanban Board View Visual task management with drag-and-drop functionality Dynamic grouping by status, priority, or context Search filtering across all columns Real-time updates and collapsible columns Enhanced Pomodoro System SVG progress circle with refined visual timer Persistent session history and statistics tracking Dedicated Pomodoro Statistics view with completion metrics Enhanced UI with improved controls and display Advanced Task Filtering & Grouping Unified filtering system with search, status, context, priority filters Date range filtering with overdue task support Flexible grouping options (status, priority, context, due date) Performance-optimized filtering using cache indexes Enhanced Recurring Tasks Visual distinction with special styling and indicators Per-date completion tracking with smart UI controls Context menus filtered to prevent status conflicts Clear completion status display for selected dates UI/UX Improvements: Task Management Enhanced task edit modal with improved form layout Context menu (right-click) for quick property changes Autocomplete for contexts and tags in task forms Optimistic UI updates for better responsiveness View Enhancements Agenda view with improved layout and timeline organization Enhanced note cards with consistent styling across views Improved calendar integration with better visual indicators Unified card styling system across all views Performance & Reliability Migrated to unified CacheManager from legacy FileIndexer DOM reconciliation system for efficient UI updates Enhanced async handling and error management Improved cache update handling and race condition prevention Additional Improvements: Enhanced due date modal with better styling Improved time tracking UX with visual feedback Better task archival feedback and UI consistency Refined keyboard navigation and accessibility Updated README with comprehensive feature documentation Bug Fixes: Fixed 'No due date' group positioning in task list Resolved various UI spacing and alignment issues Improved handling of edge cases in recurring task logic Enhanced stability of cache operations and file handling This major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions."},{"title":"Untitled","url":"/obsidian/releases/2.0.1/","description":"Bug Fixes and Enhancements:","product":"obsidian","text":"TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements# Bug Fixes and Enhancements: Recurring Task Improvements: Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.) Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern Enhanced recurring task visual styling with distinctive indicators and backgrounds Smart context menus for recurring tasks that prevent conflicting status changes Fixed recurrence values not loading properly in task edit modal Task Filtering and Grouping: Improved 'No due date' group positioning to appear at bottom of task list Enhanced FilterService with target date awareness for intelligent recurring task grouping Fixed cache integration issues where recurrence changes didn't trigger proper view updates All views now properly refresh and regroup tasks when recurrence properties change UI and Data Consistency: Fixed data format mismatch between stored abbreviations and UI display for day names Improved task edit modal to properly convert between storage format and UI format Enhanced cache workflow integration for seamless task property updates Better synchronization between task edits and view refreshes Technical Improvements: Added conversion helper methods for consistent day name handling Enhanced cache manager with proper recurring task support Improved event emission and handling for task updates Better error handling and data validation in task modals This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving the overall user experience."},{"title":"Untitled","url":"/obsidian/releases/2.0.2/","description":"Bug Fixes:","product":"obsidian","text":"TaskNotes v2.0.2# Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Settings Improvements: Enhanced Priorities settings tab with comprehensive usability improvements Added detailed descriptions, help sections, and column headers Added input validation and better visual organization Matches the improved usability of the Statuses settings tab Technical Details: Modified FilterService date range filtering to properly handle recurring tasks without due dates Added logic to check if recurring tasks should appear on any date within the specified range Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations Maintains full backward compatibility for all existing functionality"},{"title":"Untitled","url":"/obsidian/releases/2.0.3/","description":"Bug Fixes:","product":"obsidian","text":"Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Command Improvements: Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout) Removed popout window commands for cleaner command palette Added 'Refresh TaskNotes cache' command for troubleshooting Simplified ribbon icons to focus on core functionality Technical Details: Enhanced FilterService initial task set logic to include recurring tasks without due dates Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion Added async processing with batched performance optimizations Maintained backward compatibility and existing performance characteristics Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries The agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days."},{"title":"TaskNotes v2.0.4","url":"/obsidian/releases/2.0.4/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4 Allow multiple statuses to be filtered for at the same time, bringing status filtering in line with context and priority filtering Fix flickering during kanban drag and drop"},{"title":"TaskNotes v2.1.0 - Major Feature Release","url":"/obsidian/releases/2.1.0/","description":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.","product":"obsidian","text":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience. NEW FEATURES:# Instant Task Conversion One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons Streamlined workflow for transforming simple tasks into structured task files Configurable via settings to enable/disable the feature Interactive Task Link Overlays Live task previews displayed on wikilinks in live preview mode Hover and click interactions for editing tasks without leaving the current note Context menus and inline task information display Smart detection of task-related wikilinks with automatic enhancement Enhanced Date Handling Improved overdue task detection that considers both due and scheduled dates Better date consistency across all views and components Expanded field mapping support for time tracking and completion data IMPROVEMENTS:# Performance & Reliability Comprehensive resource cleanup to prevent memory leaks Enhanced error handling with better user feedback Performance optimizations in calendar view and task rendering Improved DOM reconciliation and widget management Accessibility & UX Enhanced accessibility with ARIA attributes and keyboard navigation Consistent BEM CSS naming across all components Better input validation and security measures Improved visual consistency throughout the interface Technical Enhancements Fixed deprecated Obsidian API usage for better compatibility Standardized date handling using date-fns library Configurable pomodoro field mapping Better separation of concerns in component architecture This release maintains full backward compatibility while adding new features that enhance the daily task management workflow."},{"title":"TaskNotes v2.2.0","url":"/obsidian/releases/2.2.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Major Features# Task Deletion: Added task deletion functionality with confirmation modal and proper event handling Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic Core Improvements# Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy UI/UX Enhancements# Visual Consistency: Updated font sizes and UI element widths for better readability Pomodoro Button Styling: Enhanced button styles with consistent visual feedback Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles Technical Improvements# Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset Performance Optimizations: Various refactoring improvements for better code maintainability and performance"},{"title":"Untitled","url":"/obsidian/releases/2.2.1/","description":"Fix #22 and #24","product":"obsidian","text":"Fix #22 and #24"},{"title":"Untitled","url":"/obsidian/releases/2.2.2/","description":"TaskNotes documentation.","product":"obsidian","text":""},{"title":"Untitled","url":"/obsidian/releases/2.2.3/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3"},{"title":"Untitled","url":"/obsidian/releases/3.0.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0"},{"title":"Untitled","url":"/obsidian/releases/3.0.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1"},{"title":"Untitled","url":"/obsidian/releases/3.1.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0"},{"title":"Untitled","url":"/obsidian/releases/3.1.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1"},{"title":"Release Notes: 3.10.0","url":"/obsidian/releases/3.10.0/","description":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.","product":"obsidian","text":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements. New Features# Option to Store Task Title in Filename# A new setting, storeTitleInFilename, is available under \"Task Filenames\" in the settings tab. This feature changes how task titles are stored. Implementation Details: When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter. For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks. When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity. Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom). This setting is disabled by default. Status Bar Component for Tracked Tasks# A new UI component has been added to the app's status bar to display tasks with active time-tracking sessions. Functionality: When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip. When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks. The status bar item is hidden when no tasks are being tracked. This feature is controlled by the \"Show tracked tasks in status bar\" setting and is disabled by default. Customizable First Day of Week for Mini Calendar# The mini calendar view now respects the \"First day of the week\" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday). Bug Fixes# Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations. File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed. Internal Improvements & Documentation# Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames. StatusBarService: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling. Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports. Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail."},{"title":"Release Notes: 3.11.0","url":"/obsidian/releases/3.11.0/","description":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.","product":"obsidian","text":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes. New Features# Project Management# A new project management system has been integrated, allowing for better organization and tracking of tasks within projects. Note-Based Projects: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note. Project Selection UI: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes. Filtering and Grouping by Project: The Filter Bar in all views now includes a \"Project\" filter, allowing you to see tasks for one or more specific projects. The \"Group By\" option now includes \"Project\", which organizes the Task List and Kanban views by project. Clickable Project Links: In task cards and other views, project names are now clickable links that take you directly to the project note. Workflow and UI Enhancements# Redesigned Pomodoro Timer: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience. New Interface: A more compact and visually appealing interface. Time Adjustment: You can now add or subtract time from the current session or the prepared timer. Skip Break: A \"Skip break\" button is now available after a work session. Enhanced Pomodoro Stats: The Pomodoro statistics view has been improved to provide more insights. Overview Section: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance. Instant Task Conversion: The \"Convert task to TaskNote\" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction. Quick Actions for Current Task: A new command, \"Quick actions for current task,\" allows you to open the action palette for the currently active TaskNote, providing quick access to common operations. Improved Sorting Logic: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: scheduled date -> due date -> priority -> title. This ensures a more predictable and logical ordering of tasks. Archive Button in Edit Modal: An \"Archive\" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks. Week Start Day Setting: All calendar views now respect the \"Start week on\" setting from Obsidian's calendar preferences. Bug Fixes and Minor Improvements# Recurring Task Date Consistency: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views. Pomodoro Daily Note Integration: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries. Template Processing: The {{parentNote}} template variable now correctly resolves to a properly formatted markdown link. YAML frontmatter in templates is now processed more safely to avoid parsing errors. Date Validation: The complete_instances field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity. Natural Language Processing: The natural language parser now correctly applies scheduled times (e.g., \"do something at 5pm\") to created tasks. Agenda View Quick Select: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed. Styling and CSS: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals. Documentation: The documentation has been updated to reflect the new project management features. New workflow guides for \"Habit Tracking\" and \"Project Management\" have been added."},{"title":"Release Notes 3.11.1","url":"/obsidian/releases/3.11.1/","description":"This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.","product":"obsidian","text":"API Modernization & Performance Improvements# This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management. Improved autocomplete# Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API Better keyboard navigation and visual consistency More responsive type-ahead support for contexts and tags in task modals API modernization# Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications Eliminates risk of data corruption during migration processes More reliable handling of YAML frontmatter updates Native Link Parsing: Switched to Obsidian's built-in parseLinktext API More robust wikilink parsing with better edge case handling Improved consistency with Obsidian's internal link processing Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage Fixes issue where settings were shared across different vaults Each vault now maintains its own view state and preferences Bug fixes & stability# Memory Leak Prevention: Properly register and cleanup event listeners Event listeners are now tracked with EventRef objects for proper cleanup Prevents memory leaks when plugin is disabled or reloaded Debounce Optimization: Uses Obsidian's built-in debounce function More efficient calendar refresh operations Better performance consistency UI Polish: Fixed sentence case issues throughout the interface Security & reliability# Resource Cleanup: Enhanced plugin lifecycle management Better cleanup of event listeners and cached data Improved plugin disable/enable reliability"},{"title":"Release Notes - 3.11.2","url":"/obsidian/releases/3.11.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Internal Improvements# API Standardization# Replaced custom wikilink parsing with Obsidian's native parseLinktext API Migrated from custom debounce function to Obsidian's built-in debounce utility Files Updated# TaskLinkOverlay.ts: Updated wikilink parsing FilterService.ts: Improved project link resolution TaskLinkDetectionService.ts: Simplified link detection MinimalNativeCache.ts: Standardized project link handling KanbanView.ts: Replaced custom debounce implementation Test files: Updated mocks accordingly"},{"title":"Release Notes - 3.12.0","url":"/obsidian/releases/3.12.0/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Project Subtasks Widget# Add a collapsible widget that displays tasks linked to the current project note Widget appears automatically in project notes and shows all tasks that reference the rpoject Includes collapsible interface with persistent state across sessions Updates automatically when tasks are modified or deleted Can be enabled or disabled in plugin settings under \"Show project subtasks widget\" Bug Fixes# FilterBar Improvements# Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138) Fixed archived tasks' contexts and projects still appearing in filter bar (#139) Resolved FilterBar showing projects with [[]] brackets Fixed empty status list display on initial load Improved initialization reliability with better event handling Task Display# Fixed wikilink alias handling in TaskCard and inline displays (#145, #147) Fixed projects not loading correctly in task edit modal (#141) Improved cursor positioning in live preview mode Documentation# Added documentation for project subtasks widget feature Updated inline task integration documentation Added configuration settings documentation"},{"title":"Release Notes - 3.12.1","url":"/obsidian/releases/3.12.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Project Subtasks Widget Enhancements# New button for task creation - Added \"New\" button to widget header for quick task creation Auto-populated project field - New tasks automatically reference the current note as their project Improved positioning - Widget now appears at the end of documents for better user experience Improve visual design - Added dashed border to indicate virtual/generated content and improved styling Bug Fixes# Timezone and Date Handling# Fixed timezone boundary issues in Agenda view date filtering (#153) Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift Enhanced date normalization in AgendaView for consistent behavior across timezones Improved task filtering with better date handling in getTasksForDate() UI and Display Improvements# Fixed cursor positioning to prevent cursor appearing after project subtasks widget Resolved pre-populated projects not displaying correctly in task creation modal Improved widget rendering with CSS-only styling approach for better performance Settings Reorganization# New Misc Tab# Renamed \"Performance\" tab to \"Misc\" and moved to end of settings tab list Consolidated miscellaneous features into a single organized location Improved settings navigation by grouping related toggles together Settings Moved to Misc Tab# Status bar toggle - Show tracked tasks in status bar Project subtasks widget toggle - Show project subtasks widget in notes Notes indexing toggle - Disable note indexing for performance optimization Documentation Updates# Settings Documentation# Updated all documentation to reflect new settings organization Created comprehensive Misc Settings documentation with detailed explanations Removed outdated references from Advanced Settings documentation Updated troubleshooting guides with correct setting locations Reference Updates# Updated inline task feature documentation to reference new Misc tab location Fixed all setting location references throughout documentation Maintained backward compatibility information for users upgrading"},{"title":"Release Notes - 3.12.2","url":"/obsidian/releases/3.12.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Bug Fixes# Calendar & Date Handling# Fixed off-by-one date bugs in completion calendar (#160) Resolved timezone inconsistency where calendar showed one date but completion was recorded for another Calendar rendering now uses UTC dates consistently across all components Fixed \"Friday tasks appearing on Saturday\" issue in completion tracking Task Management# Fixed project filters not working in agenda view (#161) Project filtering now works consistently across all views Fixed edit modal crash when tasks have empty project properties Added null checks to prevent \"Cannot read properties of null\" errors Handles null, undefined, and empty string project values gracefully Fixed autofill suggestions not updating internal state (#159) Context and tag suggestions now properly sync with modal internal state Clicking suggestions now correctly updates the task data UI & Styling# Fixed consistent styling for priorities and statuses settings tabs (#130) Added missing BEM classes for proper grid alignment Priority inputs now use same styling as status inputs Fixed table column misalignment issues Documentation# Improved README and documentation Enhanced overview section with better flow and natural language Added time-tracking and pomodoro feature descriptions Fixed broken documentation links Updated Core Features section with more accurate descriptions Testing# Added comprehensive tests for date handling issues Increased test coverage for calendar and completion functionality Added tests reproducing and verifying fixes for off-by-one date bugs"},{"title":"Release Notes - 3.13.0","url":"/obsidian/releases/3.13.0/","description":"##Technical Changes","product":"obsidian","text":"Major Changes# Filtering System Overhaul# Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface Saved Views: Users can save, manage, and switch between custom filter configurations FilterBar Redesign: Updated to use Obsidian components with improved styling UI Updates# FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management Dropdown Improvements: Status and priority filters now use display labels Dropdown Positioning: Fixed positioning and CSS styling issues New Features# Natural Language Processing# Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask) Interface# Project Note Decorations: Updated styling and visual elements Task Modal Styling: Refined task creation and editing interfaces Bug Fixes# Filter System# Fixed handling of empty arrays in \"Projects is not empty\" conditions Fixed incomplete filter conditions handling Fixed saved views dropdown persistence when filters change Fixed view options disappearing on refresh Fixed view selector dropdown behavior Testing# Fixed multiple unit and integration test failures Fixed migration workflow test for YAML parsing errors Expanded test coverage for task service completion Code Quality# Removed debug console.log statements Improved async handling and import organization Better search functionality implementation ##Technical Changes Refactoring# Refactored FilterBar with Obsidian components Updated filter rule definitions and UI components Improved state management across views Updated ViewStateManager Development# Updated Typescript configuration Added new Filter Utils.ts utility module Improved code organization"},{"title":"Release Notes - 3.13.1","url":"/obsidian/releases/3.13.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Saved Filter Views Storage# Saved filter views now sync across devices with your vault Views are stored in plugin data instead of browser localStorage Automatic migration from previous storage system on first load FilterBar Behavior# Filter panel now stays open when clicking elsewhere in the interface Panel only closes when the filter button is clicked again Eliminates accidental filter panel closures during normal use Performance Improvements# Filter Operations# Adding and removing filters is now significantly faster Reduced lag when building complex filter queries Search input state preserved during filter modifications Migration System# Early migration detection prevents DOM errors on first use Better error handling during plugin initialization Cleaner migration process for new users Bug Fixes# First-Time User Experience# Fixed \"removeChild\" DOM errors when using filters for the first time Resolved race conditions between migration and UI initialization Added fallback UI states for improved reliability FilterBar Stability# Added DOM connection checks before manipulation Improved error boundaries in filter rendering Better cleanup of event listeners on component destruction Technical Changes# View State Management# Saved views migrate from localStorage to plugin data system ViewStateManager now uses plugin settings for persistence Enhanced migration detection and completion tracking Error Handling# Added safety checks for DOM element manipulation Graceful degradation when filter operations fail Improved logging for troubleshooting migration issues"},{"title":"Release Notes - 3.13.2","url":"/obsidian/releases/3.13.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Performance Improvements# FilterBar and Saved Views# Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters Added \"Select...\" placeholder option for new filter conditions to prevent premature filtering Eliminated unnecessary cache re-indexing when saving or deleting saved views Made settings system smarter to only trigger cache updates when indexing-related settings actually change Filter Processing# Implemented index-backed filtering that processes significantly fewer tasks for filtered views Added intelligent query result caching with automatic expiration to eliminate redundant operations Improved candidate selection using existing status, date, and overdue task indexes Enhanced set intersection logic for multiple AND conditions to further reduce processing Bug Fixes# Filter Logic# Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups Improved query structure analysis to ensure filter correctness Saved Views# Fixed issue where modifying one saved view could affect others due to shared object references Added proper deep cloning of FilterQuery objects throughout the ViewStateManager Ensured saved views remain independent when modified Technical Details# Index Optimization Safety# Index optimizations now only apply when provably safe (AND relationships between indexed conditions) Added recursive query analysis to detect OR groups containing indexed conditions Maintains filter correctness while providing performance benefits where safe Cache Management# Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping Query result caching with 30-second auto-expiration and immediate invalidation on data changes Debug logging available for performance monitoring Performance Impact# Filter building is now responsive with no lag when adding conditions Saved view operations are instant with no unnecessary re-indexing Repeated filter operations are nearly instant due to intelligent caching Significant memory usage reduction for large vaults"},{"title":"Release Notes - 3.13.3","url":"/obsidian/releases/3.13.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Bug Fixes# Fixed recurring task completion date recording# Resolved issue where \"mark completed for this date\" context menu option recorded completion for the wrong date Fixed timezone inconsistency between completion date storage and checking logic Recurring tasks now properly track completion status per calendar date Improved recurring task filtering# Fixed \"Is completed\" filter condition to respect per-date completion status for recurring tasks Filter results now accurately reflect whether recurring tasks are completed for specific dates Enhancements# AgendaView improvements# Restored Today button with improved header layout Reorganized header into three sections: navigation controls, period title, and actions Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates Removed keyboard navigation shortcuts (left/right arrows) Interface updates# Enhanced AgendaView header styling with better spacing and visual hierarchy Added responsive design for mobile layouts Improved button styling with proper hover and focus states Technical Changes# Updated TaskService to use consistent local timezone formatting for completion dates Enhanced FilterService to properly evaluate recurring task completion status Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling Testing# Added comprehensive test coverage for timezone handling and date formatting consistency Added tests to verify recurring task completion behavior across different scenarios"},{"title":"Release Notes - 3.13.4","url":"/obsidian/releases/3.13.4/","description":"Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues.","product":"obsidian","text":"Bug Fixes# FilterBar Migration Issues# Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0 Resolved Cannot read properties of undefined (reading 'forEach') and Cannot read properties of undefined (reading 'find') errors in FilterBar rendering Added detection for old FilterQuery format and automatic replacement with fresh defaults Users upgrading from older versions now get clean filter states instead of broken data structures Preserved valid sort and grouping settings when replacing incompatible filter data Added error boundaries with console warnings for better debugging Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues. Features# Calendar View Improvements# Added ICS refresh button directly in the Advanced Calendar view toolbar ICS calendar subscriptions can now be refreshed without opening settings Button integrates with existing ICS subscription service and triggers immediate calendar re-render Improved ICS settings layout with horizontal button arrangement Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides Extended today highlight disable to timegrid columns for visual consistency Notes# This release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0. The ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings."},{"title":"Release 3.14.0","url":"/obsidian/releases/3.14.0/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Project Management Enhancements# Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191] Create Subtask Option: Added \"Create subtask\" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191] User Interface Improvements# Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191] Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR Bug Fixes# Calendar and Recurring Tasks# Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting Settings and State Management# Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report Technical Changes# Performance and Stability# Enhanced cache management and event handling for project-related functionality Improved error handling in project subtask operations Optimized project detection algorithms for better performance Code Organization# Refactored project-related services for better modularity Enhanced TypeScript type definitions for project functionality Improved service initialization and cleanup processes Documentation# Updated README with new project assets and feature documentation"},{"title":"Release 3.15.0","url":"/obsidian/releases/3.15.0/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# NLP Input Enhancements# Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131] Calendar Integration# ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220] ICS Settings: Added ICS integration settings to calendar tab Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this Time Entry Interaction: Added time entry interaction functionality to advanced calendar Time Management# Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184] Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request Pomodoro View: Added task card display and improved controls to pomodoro view [#184] Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion User Interface Improvements# Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements Bug Fixes# Task Management# Nested Tags: Fixed support for nested tags in FilterBar TypeError Resolution: Resolved TypeError when calling includes on non-array values Calendar Integration# Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233] Documentation# Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality ICS Integration Guide: Created detailed ICS calendar integration documentation Release Notes: Added comprehensive release notes documentation with links to all versions Inline Task Widget: Added screenshots and documentation for inline task widgets Technical Changes# Code Organization# Enhanced service architecture for ICS integration Improved field mapping system for calendar events Optimized auto-suggestion algorithms Enhanced type definitions for new functionality Performance# Improved rendering performance for pomodoro view Optimized calendar event handling Enhanced note picker search capabilities"},{"title":"Release 3.15.1","url":"/obsidian/releases/3.15.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Kanban Board Enhancements# Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation Calendar Improvements# All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., fc-tag-meeting, fc-tag-work), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation Bug Fixes# Kanban Board# Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report Subtask Widget Issues# Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234] Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207] Technical Changes# Documentation# Fixed line break formatting issues in documentation files Code Organization# Improved task grouping architecture with new options interface Enhanced calendar event rendering system for better tag-based customization Refined subtask widget positioning logic for better editor integration"},{"title":"TaskNotes 3.16.0","url":"/obsidian/releases/3.16.0/","description":"Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes","product":"obsidian","text":"New Features# Task Management# Bulk Task Conversion: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request Instant Task Conversion Enhancement: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions Default Project Setting: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request Advanced Tag and Project Parsing: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug Enhanced Filter Bar Integration: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion Calendar and Views# Custom Multi-Day Calendar View: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request Responsive Calendar UI: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion Locale-Aware Date Formatting: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue Saved Views Enhancement: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback Task Organization# Drag and Drop Status Reordering: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion Overdue Tasks Filter: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue Project Group Enhancements: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion Pomodoro Timer# Background Timer Continuity: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix System Notifications: Convert Pomodoro notices to system notifications for better visibility (#136) Manual Duration Adjustment: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing Task Completion Sorting: Sort completed tasks to end of Pomodoro task selector for better organization Bug Fixes# UI and Interaction# Tooltip Standardization: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report Open Note Button Stability: Stabilized Open note button hover behavior and made font size consistent with other modal buttons Date Context Menu Clarity: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion Project Removal: Fixed project removal in edit modal not saving changes properly (#213) Advanced Calendar Resizing: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix Calendar and Recurring Tasks# Timezone Bug Fixes: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug Custom Calendar Display: Fixed undefined days display in custom calendar view Calendar Recurrence: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug Task Management# Pomodoro Task Tracking: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report Plugin Conflict Protection: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict Instant Conversion Improvements: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues Improvements# User Interface# Minimalist Design System: Implemented consistent borderless button design system across all components UI Polish: Applied minimalist styling with cleaned up borders and shadows throughout the interface Settings Enhancement: Enhanced settings explanatory sections with improved minimalist styling Advanced Calendar Title: Made advanced calendar title smaller for better proportions Search and Filtering# Enhanced Search: Improved search functionality to preserve existing filters when performing new searches Filter Preservation: Better handling of filter states across different search operations Development and Code Quality# Code Documentation: Improved code comments and documentation throughout the codebase Linting Cleanup: Resolved various linting errors and improved code consistency Test Infrastructure: Updated timezone-related tests to work reliably in CI environment GitHub Actions: Added timeouts and offline preferences to improve CI reliability Technical Improvements# Reduced excessive console logging from filter components Updated Jest coverage thresholds to realistic levels Improved error handling in various components Improved defensive programming practices throughout the codebase Contributors# Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes"},{"title":"TaskNotes 3.16.1","url":"/obsidian/releases/3.16.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Task Management# Visual Filter State Indicators: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active Bug Fixes# Link Generation and Consistency# Obsidian Link Format Compliance: Fixed \"Insert tasknote link\" and \"Convert task to TaskNote\" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support Consistent Link Formatting: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred Timezone and Date Handling# Recurring Task Completion Fix: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views UTC Date Consistency: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking Calendar Date Normalization: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling User Interface# Sort Arrow Visibility: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode Duplicate Tooltip Prevention: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes Pointer Cursor Consistency: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution Error Handling and Stability# Daily Note Creation Protection: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing \"Cannot read properties of undefined\" errors Security Compliance: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations Improvements# User Interface# Calendar Styling Enhancements: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency Enhanced Visual Definition: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance Development and Code Quality# Test Infrastructure: Added missing setTooltip mock to resolve 39 failing TaskCard tests Documentation Updates: Improved documentation formatting and appearance Technical Improvements# Enhanced date handling throughout the codebase with UTC method standardization Improved defensive programming practices for timezone-sensitive operations Better error messaging for daily note creation failures Code security improvements with ESLint compliance"},{"title":"TaskNotes 3.16.2","url":"/obsidian/releases/3.16.2/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Task Link Integration# Markdown Link Support for Inline Task Widgets: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders [text](path) markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links Improvements# Link Processing# Link Detection: Improved TaskLinkDetectionService to detect both [[wikilinks]] and [markdown](links) with proper URL decoding for paths containing spaces Link Rendering: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently API Integration: Uses proper Obsidian API functions (parseLinktext() and getFirstLinkpathDest()) for reliable link resolution"},{"title":"TaskNotes 3.16.3","url":"/obsidian/releases/3.16.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Bug Fixes# User Interface# Create Task Modal Accessibility: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue Timezone Handling# Recurring Task Calendar Display: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view Task Completion Calendar: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones Task Conversion# Context Detection in Instant Tasks: Fixed instant task conversion to properly detect and preserve contexts specified with \"@context\" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue Time Preservation: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process Improvements# Code Quality# Test Coverage: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases"},{"title":"TaskNotes 3.16.4","url":"/obsidian/releases/3.16.4/","description":"This ensures users can always edit task titles regardless of the modal type or natural language input settings.","product":"obsidian","text":"Bug Fixes# User Interface# Task Modal Title Field: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic: Edit modals: Title field always visible in the details section Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea) Create modals with natural language input disabled: Title field only appears at the top of the modal This ensures users can always edit task titles regardless of the modal type or natural language input settings."},{"title":"TaskNotes 3.17.0","url":"/obsidian/releases/3.17.0/","description":"This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management...","product":"obsidian","text":"Major Features# Enhanced Recurring Tasks with DTSTART Support# This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering. Background and Motivation: The previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior. Key Improvements: DTSTART Integration: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern Dynamic Date Updates: The task.scheduled field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates Flexible Next Occurrence Scheduling: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling Visual Hierarchy: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task Independent Time Control: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern Dual Drag Behavior: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance Automatic DTSTART Addition: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions Manual Rescheduling Support: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications Expandable Project Subtasks# A new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy. Features: Chevron Controls: Click chevron icons on project task cards to expand/collapse subtask display Configurable: New \"Show expandable subtasks\" setting allows users to enable/disable the feature Responsive Pomodoro View# The Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design. Thanks to @oliverlalan for requesting this improvement (#339). Enhanced Filename Templates# Significant expansion of available template variables for task creation, providing much greater flexibility in filename patterns. New Template Variables: Date/Time Variations: shortDate, monthName, dayName, week, quarter, time12, time24 Unix Timestamps: unix (seconds), unixMs (milliseconds) Title Case Variations: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal Short Forms: priorityShort, statusShort for single-letter representations Unique Identifiers: zettel (Zettelkasten ID), nano (high-precision unique ID) The settings UI now documents all 40+ available template variables for easy reference. Thanks to @fastrick for the original unix timestamp request. Bug Fixes# Critical Timezone Handling Fixes# This release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the \"UTC Anchor\" principle for consistent date handling. Major Timezone Bugs Fixed: Recurring Task Completion: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314 Calendar Date Misalignment: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec) Weekly Task Display: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322 Task Completion Date Bug: Resolved bug where complete_instances was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314 Date Parsing Inconsistencies: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application Filter Date Handling: Fixed date filtering to work consistently across all timezones Agenda View \"Today\" Detection: Corrected timezone-sensitive today detection that affected agenda headers ICS Import Timezone Issues: Resolved timezone problems with both recurring and single events from ICS imports Technical Implementation: Introduced parseDateToUTC() function for consistent UTC anchoring of date-only strings Updated date comparison functions to use UTC anchors throughout Replaced timezone-sensitive date operations with consistent UTC-based alternatives Comprehensive audit and fix of all date handling patterns in the codebase Project Filtering Improvements# Resolved critical bugs in project filtering that prevented proper task display and project selection. Fixes: Wikilink Resolution: Fixed handling of relative vs absolute project wikilinks (e.g., [[../Projects/My Project]] vs [[My Project]]) - thanks to @xorander00 for the detailed bug report Filter Grouping Logic: Corrected AND/OR grouping in project filters to prevent showing too many tasks Missing Projects: Fixed issue where not all projects appeared in filter dropdown selection Cache Management: Improved cache invalidation and project name extraction with better validation Subtask Widget Improvements# Fixed several issues with the project subtasks widget affecting user experience and reliability. Widget Fixes: View State Persistence: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329) Filter State Isolation: Prevented filter settings from bleeding between different notes' subtask widgets Configurable Positioning: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164) Event Listener Management: Improved cleanup to prevent memory leaks and event accumulation Event Bubbling: Fixed issue where clicking subtasks would trigger both subtask and parent task modals Styling Isolation: Prevented completion styles from affecting nested subtasks incorrectly ICS Calendar Integration# Timezone Processing: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events. Performance and Reliability# Cache Optimization: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness. Type Safety: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues. Error Handling: Enhanced error handling and null safety checks throughout project filtering and service initialization. Technical Improvements# UTC Anchor Implementation# Comprehensive implementation of the UTC Anchor principle for robust timezone handling: All date-only strings now consistently parsed as UTC anchors Date comparison operations standardized using UTC methods Eliminated timezone-dependent date creation patterns Added comprehensive timezone test coverage Service Architecture# Expanded Projects Service: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management. View State Manager: Improved view state persistence across different contexts and note switches. Documentation Updates# Updated recurring tasks documentation to reflect new behavior Added timezone handling guides for developers Enhanced calendar views documentation with drag behavior explanations Comprehensive template variable documentation Breaking Changes# Date Handling: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle. Migration Notes# Existing recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling)."},{"title":"TaskNotes 3.17.1","url":"/obsidian/releases/3.17.1/","description":"This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These...","product":"obsidian","text":"Bug Fixes# Critical Timezone Handling Fixes# This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones. Completions Calendar Rendering (#322)# Fixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC: Day Number Display: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction Month Comparison Logic: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection Calendar Navigation: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months These fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users. Advanced Calendar Drag-and-Drop Operations (#344)# Resolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC. Thanks to @trang-ngn for reporting this issue with clear reproduction steps. Root Cause: The drag-and-drop system was using formatDateForStorage() which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI. Fixed Operations: All-day and timed event drag-and-drop (handleEventDrop) External task drag-and-drop from outside the calendar (handleExternalDrop) Modal-based task scheduling (scheduleTask) Date selection task creation (handleDateSelect) Timeblock creation and event resizing operations Event context menu date handling The fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data. Task Completion Status Checks (#322)# Fixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in getEffectiveTaskStatus(). Root Cause: The function was using timezone-sensitive date-fns format() for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users). Solution: Replaced timezone-sensitive formatting with formatDateForStorage() to ensure consistent UTC-anchored date strings that match the format used in complete_instances. This fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete. Technical Implementation# All fixes implement the established \"UTC Anchor\" principle for consistent timezone handling: Consistent use of UTC-anchored date operations for date-only comparisons Replacement of timezone-sensitive date formatting with UTC-based alternatives Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)"},{"title":"TaskNotes 3.18.0","url":"/obsidian/releases/3.18.0/","description":"A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.","product":"obsidian","text":"New Features# Task Reminders System# A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality. Core Features: Support for both relative reminders (e.g., \"15 minutes before due date\") and absolute reminders (specific date/time) Visual reminder indicators on task cards with clickable bell icons Integration with task creation and editing workflows User Interface: Reminder Modal: Modal for managing task reminders with form validation and real-time preview Reminder Context Menu: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates) Reminder management accessible from task creation modal, edit modal, and task cards Default Reminders: Configure default reminders that automatically apply to new tasks Support for multiple default reminders per task type Applies to both manual task creation and instant conversion workflows Property-Based Task Identification# Tasks can now be identified using frontmatter properties instead of requiring tags. Configure property name and value for task identification (e.g., categories: [[Tasks]]) Full backward compatibility with existing tag-based workflows Addresses modern Obsidian property-based vault organization patterns Thanks to @mdbraber for the feature request (#340) Enhanced Saved Views# Clicking an active saved view now clears all filters, providing quick access to unfiltered task list Preserves sort and group settings while resetting filters Thanks to @oldjove for the suggestion (#351) Parent Note as Project Option# New setting to automatically use parent note as project during instant task conversion Useful for users who organize tasks within project-specific notes Merges with existing default projects to avoid duplicates Thanks to @FindingJohnny for the feature request (#348) Bug Fixes# ICS Calendar Integration# Fixed recurring event exceptions: Properly handle EXDATE properties and RECURRENCE-ID for modified instances Eliminated duplicate events: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared Thanks to @robmikulec for reporting the recurring events issue (#342) Settings Persistence# Fixed settings reset during updates: Prevent user configuration loss when plugin updates introduce new default settings Apply deep merge strategy to preserve customizations in nested configuration objects Improvements# User Interface# Reminder modal uses consistent design patterns with task creation/edit modals Fixed task card icon overlap issues with proper spacing for multiple indicators Code Quality# Added unit test coverage for new reminder functionality Improved type safety with proper TypeScript interfaces for reminder data structures Improved error handling and user feedback across reminder operations Technical Details# Data Model Changes# Added optional reminders array field to TaskInfo interface Extended field mapping support for custom reminder property names Enhanced cache system to include reminder data in task extraction"},{"title":"TaskNotes 3.18.1","url":"/obsidian/releases/3.18.1/","description":"Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This...","product":"obsidian","text":"Bug Fixes# Cache Synchronization Race Conditions (#358)# Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations. Thanks to @willgraham345 for reporting the calendar auto-refresh issue Code Quality Improvements# Event Listener Management# Simplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array. Technical Details# Cache Synchronization Strategy: The implementation follows a \"wait-then-update\" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times."},{"title":"TaskNotes 3.18.2","url":"/obsidian/releases/3.18.2/","description":"Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic...","product":"obsidian","text":"Bug Fixes# Timeblock Date Shift Issue (#368)# Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs. Timeblocks now appear on the correct calendar day regardless of user timezone or DST transitions. Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information. Performance Issues with Task Views# Eliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing. New Features# Enhanced Filename Template Variables (#370)# Added new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility: {milliseconds}, {ms} - 3-digit milliseconds (000-999) {timezone}, {utcOffset} - UTC offset in ±HH:MM format {timezoneShort}, {utcOffsetShort} - UTC offset in ±HHMM format Thanks to @mnipritom for requesting these variables. Boolean Property Identification# Enhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter. A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage Boolean Status Field Support (#108)# Added automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values: String \"true\" → boolean true (in frontmatter) String \"false\" → boolean false (in frontmatter) Boolean true → string \"true\" (when read back) Boolean false → string \"false\" (when read back) Other status values remain unchanged as strings Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling. And thanks again to @renatomen--the boolean property identification fix inspired this change!"},{"title":"TaskNotes 3.19.0","url":"/obsidian/releases/3.19.0/","description":"TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natu...","product":"obsidian","text":"New Features# HTTP REST API with Natural Language Processing# TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing. Key API Features: Complete CRUD operations for tasks Time tracking endpoints Task statistics and filtering Bearer token authentication CORS support for browser extensions Desktop-only implementation with mobile-safe architecture Natural Language Processing Endpoints: /api/nlp/parse - Parse natural language into structured task data /api/nlp/create - Create tasks directly from natural language input Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence Intelligent parsing of expressions like \"Review PR #123 tomorrow high priority @work\" Companion Project Integration: The HTTP API enables two new companion projects: tasknotes-cli - Command-line interface for TaskNotes task management tasknotes-browser-extension - Browser extension for quick task creation Configuration: Enable via Settings → HTTP API tab (desktop only) Configurable port (default 8080) and optional authentication token Documentation at /docs/HTTP_API.md and /docs/nlp-api.md Enhanced Calendar Integration# Calendar Export and Context Menu System# Task Calendar Export: Add tasks to external calendars (Google, Outlook, Yahoo) Download ICS files Right-click context menu support for quick calendar actions Agenda View Calendar Improvements# ICS Integration in Agenda: Calendar event cards now display in Agenda view Toggle calendar subscriptions visibility via FilterBar Always-available \"Refresh calendars\" button Normalized scheduled date handling for all-day and timed events Thanks @scottaltham-payroc for the feature request! Bug Fixes# Task Styling Enhancement (#355)# Added CSS class task-card--has-projects to task cards that contain projects. Thanks @mdbraber for the suggestion Calendar Event Scheduling# Fixed scheduled date normalization when creating tasks from ICS events: All-day events: Use YYYY-MM-DD format Timed events: Use YYYY-MM-DDTHH:mm format Consistent behavior across all calendar interfaces File Copy Script Improvements# Enhanced copy-files script with better error handling: Improved default path handling Destination directory creation Better ENOENT error handling API Documentation# New Documentation Files# HTTP_API.md - Complete API reference with examples nlp-api.md - Natural language processing capabilities and usage Technical Enhancements# Core Infrastructure# API Service Architecture: Mobile-compatible implementation using Node.js http module Platform detection prevents mobile loading Express.js alternative for lightweight operation Full error handling and validation Calendar Service Integration: Extracted reusable CalendarExportService Unified TaskContextMenu component Enhanced event listener management Development Improvements# Code Organization: Modular component extraction for better reusability Consistent API response formats Comprehensive test coverage for new features TypeScript improvements for icon handling Migration Notes# HTTP API Setup# For users wanting to enable the new HTTP API: Navigate to Settings → HTTP API tab (desktop only) Configure desired port (default 8080) Optionally set authentication token for security Restart Obsidian to start the API server Test with: curl http://localhost:8080/api/health"},{"title":"TaskNotes 3.19.1","url":"/obsidian/releases/3.19.1/","description":"Added webhook system enabling integrations with external services and automation workflows.","product":"obsidian","text":"New Features# Webhook Support# Added webhook system enabling integrations with external services and automation workflows. Webhook Management: CRUD operations for webhook configuration HTTP API endpoints for webhook management (POST /api/webhooks, GET /api/webhooks, DELETE /api/webhooks/{id}) Delivery history tracking (GET /api/webhooks/deliveries) Settings UI integration with event subscription controls Event Types: Task events: created, updated, deleted, completed, archived, unarchived Time tracking: started, stopped Pomodoro: started, completed, interrupted Recurring tasks: instance completed Reminders: triggered Security and Reliability: HMAC-SHA256 signature verification for payload authentication Automatic retries with exponential backoff (3 attempts) 10-second delivery timeout with failure monitoring Auto-disable webhooks after repeated failures Non-blocking async delivery maintains TaskNotes responsiveness Documentation and testing utilities included in docs/webhooks.md and test-webhook.js. Bug Fixes# Boolean Property Identification Regression (#367)# Fixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification. During code refactoring, the comparePropertyValues function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean true/false frontmatter values to correctly match \"true\"/\"false\" setting values. Thanks to @renatomen for reporting this regression"},{"title":"TaskNotes 3.20.0","url":"/obsidian/releases/3.20.0/","description":"Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for conta...","product":"obsidian","text":"New Features# Task Organization and Filtering# Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. Addresses issue #369 reported by kmaustral Dynamic Task Folder Organization - Added template variable support for default task folder setting with task variables ({{context}}, {{project}}, {{priority}}, {{status}}, {{title}}) and date variables ({{year}}, {{month}}, {{day}}, {{date}}). Supports automatic folder creation and title sanitization. Addresses feature request #376 by Mara-Li Archive Task Organization - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (moveArchivedTasks, archiveFolder). Addresses feature request #402 by anareaty Enhanced UI and Controls# Enhanced Filter Bar - Improved filter bar with instant badge updates, right-click clear functionality, \"Clear All Filters\" button, and better UI synchronization across main and subtask views. Contributed by renatomen Collapsible Groups - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. Contributed by renatomen Expand/Collapse All Controls - Added \"Expand All\" and \"Collapse All\" buttons to task list toolbar that appear when grouping is active. Contributed by renatomen Configurable UI Elements - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. Contributed by renatomen Advanced API Architecture and Webhook System# Refactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility. Webhook System - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders. Webhook Testing and Development - Included standalone webhook testing server (test-webhook.js) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging. Improvements# UI and Visual Enhancements# TaskNotes Icons - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets. Task Card Polish - Improved status and priority dot alignment and reordered context menu (\"Copy task title\" moved to top). Addresses alignment issue #410 reported by kmaustral Button Styling - Fixed agenda view and filter popup button backgrounds with improved styling consistency. Technical Improvements# Settings Architecture - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability. Documentation - Added extensive webhook documentation in docs/examples/webhook-transforms/ with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification. Webhook Integration Services - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring. Bug Fixes# Mobile Modal Close Button - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. Addresses issue #404 reported by anareaty Test Suite Stabilization - Resolved test failures and linting errors HTTP API Field Consistency - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. Addresses issue #393 reported by @nightroman Missing Webhook Trigger - Added webhook trigger for recurring task completion events. Documentation Updates# Task defaults documentation with template variables Miscellaneous settings documentation Webhook transform documentation and examples Demo GIFs for new features Thanks @renatomen! Contributors# Special thanks to the following contributors: @Mara-Li - Feature request for template variables in task folders @kmaustral - Feature requests for folder filtering and UI alignment improvements @anareaty - Bug report for mobile modal close button issue @nightroman - Reported mislead API documentation A really big thanks to @renatomen whose very polished contributions form the bulk of this update!"},{"title":"TaskNotes 3.20.1","url":"/obsidian/releases/3.20.1/","description":"Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and...","product":"obsidian","text":"New Features# Enhanced View Organization and Visual Feedback# Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in \"completed / total\" format. Shows \"All\" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. Contributed by @renatomen Consistent Group Count Badges - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified \"completed / total\" format. Removed redundant bracketed counts for cleaner presentation. Contributed by @renatomen Collapsible Agenda Date Groups - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via \"Expand All\" / \"Collapse All\" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. Contributed by @renatomen Improved User Interface# Reorganized Task Context Menu - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality. Bug Fixes# Calendar Integration Fixes# Outlook Calendar 500 Errors - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. Fixes issue #458 reported by @girisumit and @heinzochsner Recurring Tasks Date Display - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. Fixes issue #439 reported by @brianarn and @jpmoo Task Management Fixes# Project Suggestions Crash Prevention - Fixed crash in Task Creation modal when typing \"+\" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with \", \", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. Contributed by @renatomen Documentation Updates# Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality Updated view documentation with new visual features Enhanced inline task documentation for Subtask Widget improvements Contributed by @renatomen Contributors# Special recognition goes to @renatomen for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality. Thanks to the following community members for their bug reports and feedback: @girisumit and @heinzochsner - Reported Outlook calendar integration issues @brianarn and @jpmoo - Identified recurring tasks date display bug with detailed reproduction steps"},{"title":"TaskNotes 3.21.0","url":"/obsidian/releases/3.21.0/","description":"Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Ad...","product":"obsidian","text":"New Features# Custom User Fields System# Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like \"2-Medium\" as numeric 2. Contributed by @renatomen Group and Sort by Custom User Fields - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. Contributed by @renatomen User Fields in Task Modals - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. Contributed by @callumalpass Enhanced Task Interaction# Configurable Click Behavior - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. Contributed by @fastrick Calendar Integration Enhancements# Calendar Event Filename Templates - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including {icsEventTitle}, {icsEventLocation}, {icsEventDescription}, and {icsEventTitleWithDate}. The {title} variable now uses clean event titles without date suffixes. Fixes issue #362 reported by @bepolymathe Chronological ICS Event Sorting - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. Fixes issue #472 reported by @Crunchnuggetz Bug Fixes# API Endpoint Improvements# Custom Status Configuration Support - Fixed API endpoints (/api/nlp/parse and /api/nlp/create) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. Fixes issue #487 reported by @23maverick23 Task Creation Defaults - Fixed REST API endpoint (POST /api/tasks) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. Fixes issue reported by @nightroman Project Management Fixes# Project Consolidation and Display - Fixed project grouping to consolidate different formats pointing to the same file (e.g., [[project]] and [[project|alias]] now group together). Improved display formatting with clickable headers showing absolute paths without .md extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty User Experience Improvements# Tag Input Sanitization - Added automatic sanitization to remove # prefixes from tag input, preventing duplicate tags like #tag1 and ##tag1. Applied to task creation, editing, and real-time input handling. Fixes issue #331 reported by @AndreMonthy Contributors# Special recognition goes to @renatomen for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities. Thanks to @fastrick for implementing the configurable click behavior feature. Thanks to the following community members for their bug reports and feature requests: @23maverick23 - Reported API custom status configuration issues with detailed technical analysis @Crunchnuggetz - Identified ICS calendar event sorting problem in agenda view @minchinweb - Reported project consolidation issues with wikilink variations @anareaty - Identified project display formatting problems in kanban view @bepolymathe - Requested calendar event filename template functionality @AndreMonthy - Reported tag input sanitization issues with clear examples @nightroman - Reported API issues where defaults were not being applied"},{"title":"TaskNotes 3.22.0","url":"/obsidian/releases/3.22.0/","description":"Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total t...","product":"obsidian","text":"Major Features# Modular Properties System# Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. Thanks to @renatomen for the initial implementation of this feature Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users. Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled. Bases-style Filter Bar Redesign# Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability. Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization. Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability. Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience. Added dedicated \"+ New\" task creation button to filter bar with neutral styling and proper view context awareness. Statistics view# Implement a new view to track statistics about projects and time tracking. UX# Task Interaction Improvements# Changed \"This Week\" grouping label to \"Next seven days\" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. Fixes issue #516 reported by @anareaty External Contributions# Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. Contributed by @renatomen Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. Contributed by @renatomen Fixed project names containing commas (e.g., [[Money, Org & Adm]]) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. Contributed by @renatomen Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. Contributed by @renatomen Fixed User Fields column order in settings to match Field mapping configuration for consistency. Contributed by @renatomen Bug Fixes# Timezone and Date Handling# Fixed timezone-dependent \"Today\" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. Fixes issue #452 reported by @MinchinWeb User Interface Fixes# Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings. Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. Fixes issue #529 reported by @motusira Removed title length limits that were causing text truncation, allowing full title display. Fixes issue #378 reported by @nsstrickland Added all-day slot toggle to calendar view for better event organization. Fixes issue #242 requested by @Crunchnuggetz Added calendar locale configuration for international calendar support with proper localization. Contributed by @pixeler Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. Fixes issue #527 reported by @jordandrako Fixed inline task overlay title wrapping using white-space: break-spaces for proper text display. Fixes issue #517 reported by @cathywu New Capabilities# Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. Fixes issue #238 requested by @girisumit Added tags to available sorting and grouping options for more flexible task organization. Fixes issue #169 requested by @bce283c Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. Fixes issue #299 requested by @0dfa1bc Added filename template variables to folder templates including support for additional customization options. Fixes issue #473 requested by @oliverlalan Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing. Infrastructure Improvements# Development and Testing# Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility. Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality. Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions. Contributors# Special recognition goes to @renatomen for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment. Thanks to the following community members for their bug reports and feature requests: @anareaty - Reported grouping label confusion with clear examples @MinchinWeb - Identified timezone handling inconsistencies across multiple views @motusira - Reported contrast issues with INTERRUPTED status badge @nsstrickland - Identified title truncation problems @Crunchnuggetz - Requested all-day slot toggle for calendar views @jordandrako - Reported task state refresh issues at midnight @cathywu - Identified text wrapping problems in overlays @girisumit - Requested enhanced date picker functionality @oliverlalan - Requested template variable enhancements"},{"title":"TaskNotes 3.22.1","url":"/obsidian/releases/3.22.1/","description":"Thanks to @jhedlund for implementing the configurable recurring task due date feature.","product":"obsidian","text":"New Features# Configurable Recurring Task Due Date Behavior# Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new \"Maintain due date offset in recurring tasks\" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. Contributed by @jhedlund, fixes issue #470 Bug Fixes# Calendar and Task Display# Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved timeEntries.filter is not a function errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. Fixes issue #520 reported by @cathywu Saved Views and Property Management# Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. Fixes issue #545 reported by @anareaty Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving. Added proper null safety checks for FilterBar interactions to prevent errors during view save operations. User Interface Improvements# Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. Fixes issue #549 reported by @TonyAtlas Development Improvements# Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting. Contributors# Thanks to @jhedlund for implementing the configurable recurring task due date feature. Thanks to the following community members for their bug reports: @cathywu - Reported calendar view task display issues with detailed technical information @anareaty - Identified property visibility persistence problems in saved views @TonyAtlas - Reported filter bar overflow issues in narrow sidebars with helpful screenshots"},{"title":"TaskNotes 3.23.0","url":"/obsidian/releases/3.23.0/","description":"We extend special thanks to @renatomen for his exceptional contributions to this release:","product":"obsidian","text":"New Features# ICS Export and Calendar Integration# Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows Added manual \"Export all tasks as ICS file\" command for bulk export operations Thanks to @mdbraber for requesting this feature (#422) Status-Based Auto-Archive# Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes) Added persistent queue that survives plugin restarts for reliable task archiving Implemented settings UI for fine-grained control over auto-archive behavior Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions Multi-Language Natural Language Processing# Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian Implemented locale-specific date parsing using chrono-node language support Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts Thanks to @pschoenbach for requesting German language support (#563) Enhanced Project Autosuggest# Implemented configurable multi-row project cards with customizable display fields Added selective search functionality across chosen fields with simple flag system Introduced fuzzy search option for broader, multi-word matching capabilities Enhanced project selection with clear metadata display (title, aliases, path) Thanks to @renatomen for implementing this feature (#555) Bases Plugin Integration# Added experimental integration with the Bases plugin for enhanced task management workflows Implemented direct formula computation and custom property support Added clickable tags and contexts with accessibility support Created simplified kanban view integration with proper lifecycle management Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature Settings UI Modernization# Complete redesign of settings interface with card-based design system Added collapsible functionality and live API documentation Enhanced calendar subscription interface with local file support Bug Fixes# Task Creation and File Handling# Fixed startup crash when templates contain empty reminders property (reported by @glpayson, #583) Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (reported by @glpayson, #590) Added support for platform-specific filename characters (hash, square brackets) Resolved inconsistent behavior between instant convert and manual task creation Project and Link Functionality# Added clickable project links in task edit modal for better navigation (requested by @anareaty, #432) Fixed completion date timezone handling to ensure consistent local time recording Corrected frontmatter property naming in Bases kanban drag-and-drop operations Property Display and Performance# Fixed custom property duplication when configured in both settings and filter bar Resolved unwanted total tracked time display showing zero values Standardized custom property identifiers with consistent prefix format Plugin Integration and Stability# Resolved Bases plugin integration issues and view switching problems Fixed kanban view loading with proper static imports and interface consistency Improved error handling and cleanup patterns for better stability Fixed API endpoints to respect custom status configurations (reported by @23maverick23, #487) Acknowledgments# Special Recognition# We extend special thanks to @renatomen for his exceptional contributions to this release: Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555) Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible! Community Contributors# We're grateful to the community members whose issues were resolved in this release: @glpayson for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590) @mdbraber for requesting ICS export functionality that became a major feature in this release (#422) @TonyAtlas for the auto-archive feature request that resulted in the new status-based auto-archive system (#547) @anareaty for requesting clickable project links (#432) and reporting the \"This Week\" grouping label issue (#516) @pschoenbach for requesting multi-language NLP support, specifically German language support (#563) @23maverick23 for reporting API status configuration issues that improved custom status handling (#487) @Burrish for the documentation correction (#597) Full Changelog: 3.22.1...3.23.0"},{"title":"TaskNotes 3.23.1","url":"/obsidian/releases/3.23.1/","description":"Full Changelog: 3.23.0...3.23.1","product":"obsidian","text":"Bug Fixes# Bases Plugin Integration# Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. Thanks to @anareaty for reporting this issue (#607) Full Changelog: 3.23.0...3.23.1"},{"title":"TaskNotes v3.23.2 Release Notes","url":"/obsidian/releases/3.23.2/","description":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks.","product":"obsidian","text":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks. New Features# Added agenda/list view to Advanced Calendar New {{contexts}} template variable for joining multiple context values New {{projects}} template variable for joining multiple project values Thanks to @Mara-Li for these additions Time Format Consistency# Plugin-wide 12hr/24hr time format preference support Consistent time display across all calendar views and components Thanks to @anareaty and @Astrusia for this suggestion #431 Performance Architecture# Centralized ViewPerformanceService for all TaskNotes views Global task version cache with change detection Debounced updates with configurable batching View-specific update handlers with selective refresh logic Memory management and automatic cache cleanup Bug Fixes# Fixed cursor positioning issues when creating subtask widgets Thanks to @jhedlund for this fix! Contributors# Special thanks to contributors: @jhedlund for fixing cursor positioning with subtasks @Mara-Li for implementing context/project template variables and bracket fixes @anareaty for reporting time format inconsistencies"},{"title":"TaskNotes v3.23.3 Release Notes","url":"/obsidian/releases/3.23.3/","description":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.","product":"obsidian","text":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities. New Features# Project Property Filter Support# Added property-based filtering for project picker dropdown Configure projects to appear in picker based on frontmatter properties (e.g., type: project) Complements existing folder and tag filtering options Thanks to @aubreyz for requesting this feature enhancement (#660) Bug Fixes# Project/Subtask Field Mapping# Fixed project and subtask functionality not working when users customize project field names ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues Test Infrastructure# Added missing test mocks for isTaskUsedAsProjectSync and formatDateForStorage functions Ensures test suite stability for project-related functionality"},{"title":"TaskNotes 3.23.4","url":"/obsidian/releases/3.23.4/","description":"Special thanks to contributors:","product":"obsidian","text":"Bug Fixes# Task Scheduling & Natural Language Processing# Fixed Russian weekday scheduling conflict where single weekdays (e.g., \"воскресенье\") were incorrectly interpreted as recurring tasks instead of single-day scheduling (#665, thanks to @anareaty for the report) Fixed issue where natural language processing failed to save parsed time estimates in task creation modal (#682, thanks to @RumiaKitinari for the detailed report) Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under \"Past Scheduled\" instead of \"Today\" (#384, thanks to @jcromwell for the report) Settings & Configuration# Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings (#664, thanks to @Yoav6 for identifying this issue) Calendar & Time Management# Fixed calendar not refreshing when task duration or time tracking changes (#382, thanks to @mdbraber) Fixed calendar not refreshing after task archive or move operations Fixed timeblock editing using stored date instead of current date for past day modifications (#647, thanks to @RumiaKitinari) Fixed Pomodoro timer not preserving task context when auto-starting sessions (#641, thanks to @RumiaKitinari) Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to Danny Talks Tech for reporting this in his video review) User Interface# Fixed mini calendar header overflow issue in sidebar view (#459, with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report) New Features & Enhancements# Visual Improvements# Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons (#662, thanks to @ras0q for the suggestion) Improved mini calendar styling, interactions, and legend display Enhanced task dot visualization to reflect accurate matching dates Settings Organization# Moved timeblocking settings to Features tab with improved usage instructions for better discoverability Documentation# Updated documentation to fix auto-archiving settings reference (#673, thanks to @antonio for pointing out the inconsistency) Contributors# Special thanks to contributors: @anareaty for reporting the Russian weekday scheduling conflict @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues @jcromwell for reporting the scheduled task grouping UTC regression @Yoav6 for identifying the excluded folders trailing comma issue @mdbraber for reporting calendar refresh issues with time tracking changes @girisumit for reporting the mini calendar header overflow issue @jsonshanks for providing CSS improvement suggestions for the mini calendar @ras0q for suggesting the file-text icon addition to agenda view @antonio for pointing out the auto-archiving documentation inconsistency Danny Talks Tech for reporting the all-day task rendering issue in his video review This release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish."},{"title":"TaskNotes 3.24.0","url":"/obsidian/releases/3.24.0/","description":"Special thanks to all this release's contributors:","product":"obsidian","text":"New Features# Agenda View Overdue Section# Added separate \"Overdue\" section in Agenda view instead of mixing overdue tasks with today's tasks (#557, thanks to @backyardbiomech for the detailed report) Collapsible section with task completion statistics and proper internationalization support Includes overdue recurring tasks based on their scheduled dates Task Dependencies and Blocking Relationships# Implemented blocking/blocked task dependencies with persistent relationships (#701, thanks to @prayidae for the detailed feature request) Tasks can be marked as blocking other tasks or blocked by other tasks Dependency relationships persist in frontmatter as structural links Dynamic blocked state computed based on blocking task completion status Task Card Widget in Notes# Added configurable task card widget displaying at the top of task notes (#576, thanks to @jhedlund for the request) Provides immediate access to task actions and context menus without requiring command palette Uses CodeMirror widget system for integration Appears above project subtasks widget when both enabled Can be disabled via settings Hierarchical Subgrouping# Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution) Allows two-level task organization (e.g., Group by Status, Subgroup by Priority) Cross-view support with consistent behavior State persistence for expand/collapse preferences Custom user fields supported as subgroup options Internationalization Support# Added i18n framework with multi-language support Support for German, Spanish, French, Russian, Chinese, and Japanese Translation coverage for command palette entries and UI strings Localized agenda and filter interface elements Template Variables# Added {{hashtags}} template variable for space-separated hashtag rendering (#612, thanks to @strazto for the suggestion) Added {{currentNoteTitle}} template variable for note-specific folder organization (#637, thanks to @Mara-Li for the request) Added template variable support for archive folder paths (#677, thanks to @dsebastien for the request) Fixed {{project}} variables to properly extract basenames from wikilinks (#490, thanks to @nsstrickland for the detailed bug report) Project and Subtask Management# Enhanced task modals with project and subtask management capabilities Added \"Add to project\" and \"Add subtasks\" sections in task creation/edit modals Context menu options for assigning tasks to projects and adding subtasks Collapsible lists with visual separators between form sections View and Grouping Enhancements# Added \"Completed Date\" as grouping option for analyzing productivity (#430, thanks to @anareaty for the suggestion) Added \"Status\" as sorting option in Kanban and Task List views (#633, thanks to @mdbraber for the report) Implemented per-grouping column persistence for Kanban views Smart default ordering respecting StatusManager and PriorityManager configurations Bug Fixes# Calendar and Advanced Calendar# Fixed calendar not refreshing when task duration or time tracking changes Fixed calendar not refreshing after task archive or move operations Fixed agenda duplication for all-day ICS events (#695, thanks to @realJohnDoe for the report) Added configurable eventMinHeight for Advanced Calendar to make short duration tasks readable (#718, thanks to @Ruboks-Cube for the detailed report) Fixed multi-day task creation in month/year view to properly calculate time estimates (#564, thanks to @same774 for the report) Kanban View# Fixed kanban view losing columns after upgrades (#689, thanks to @mikesale for the report) Fixed clearing filters defaulting to \"none\" instead of \"status\" grouping (#679, thanks to @camara-tech-pro for the question) Fixed column order changes when switching between views (#710, thanks to @phortx for the report) Fixed kanban drag-and-drop for custom field grouping (#494, thanks to @anareaty for the report) Enhanced save view modal functionality with improved styling and accessibility Task Management# Fixed HTTP API task creation to return sanitized title matching stored content (#635, thanks to @nightroman for the detailed report) Fixed #task tag being incorrectly added when using property-based task identification (#570, thanks to @RobbK17 for the report) Fixed recurring task completion styling in Bases views (#669, thanks to @jordandrako for the report) Hierarchical Tag Support# Added hierarchical tag support with exclusion patterns for Obsidian nested tags (#584, thanks to @renatomen for the detailed feature request) Hierarchical matching allows searching for parent tags to match child tags (e.g., t/ef matches t/ef/project, t/ef/task) Exclusion patterns support using - prefix to exclude specific tags and their children Maintains backward compatibility with existing substring matching Natural Language Processing and Tags# Fixed nested tags losing slashes in agenda view rendering (#712, thanks to @antonio for the report and fix) Added support for hyphens in NLP tag parsing (#568, thanks to @jordandrako for the report) Settings and Configuration# Fixed property value truncation in project autosuggest settings by adding input debouncing (#705, thanks to @aubreyz for the report) Improved webhook transform error handling with detailed logging (#719, thanks to @stephen-netu for the detailed report) Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation) Code Quality and Development# Configured Prettier formatter for consistent code formatting (#717, thanks to @ras0q for the request) Applied ESLint fixes reducing problems from 209 to 97 Added format and format:check scripts for development workflow Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction) Enhancements# Performance and Reliability# Added debouncing to project autosuggest property inputs Improved error handling for webhook transform failures User Interface# Added time display based on timeEstimate property in task statistics (thanks to Sergen Aras for the implementation) Enhanced language selection display with native scripts Settings Organization# Reorganized settings with improved categorization Added collapsible functionality to various UI sections Enhanced accessibility with proper button labeling Documentation# Added documentation for task dependencies feature Updated comprehensive subgrouping feature documentation Enhanced template variable documentation Updated various view documentation for new features Contributors# Special thanks to all this release's contributors: Feature Contributors# @renatomen for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584) @antonio for implementing nested tag slash preservation and providing the fix @elijahmanor for fixing the browser extension repository URL @sergenaras for implementing time display based on timeEstimate property in task statistics @hamlim for implementing save button disable logic to prevent duplicate task creation Issue Reporters and Feature Requesters# @backyardbiomech for the detailed overdue recurring tasks report (#557) @prayidae for the detailed task dependencies feature request (#701) @jhedlund for requesting task context menu in notes (#576) @anareaty for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494) @mdbraber for reporting missing status sorting option (#633) @strazto for requesting hashtags template variable (#612) @Mara-Li for requesting currentNoteTitle template variable (#637) @dsebastien for requesting archive folder template support (#677) @nsstrickland for the detailed project variable bug report (#490) @realJohnDoe for reporting ICS all-day event duplication (#695) @Ruboks-Cube for reporting short duration task rendering issues (#718) @same774 for reporting multi-day task creation issues (#564) @mikesale for reporting kanban column loss (#689) @camara-tech-pro for the kanban grouping question (#679) @phortx for reporting column order changes (#710) @nightroman for the detailed HTTP API title sanitization report (#635) @RobbK17 for reporting property identification tag issue (#570) @jordandrako for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568) @aubreyz for reporting project autosuggest truncation issue (#705) @ras0q for requesting code formatting improvements (#717) @stephen-netu for the detailed webhook transform script loading report (#719)"},{"title":"TaskNotes 3.24.1","url":"/obsidian/releases/3.24.1/","description":"This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.","product":"obsidian","text":"Bug Fixes# Task Card Widget# Fixed task card widget appearing on all notes instead of only task notes Widget now properly respects task identification settings (tag or property-based) This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes."},{"title":"TaskNotes 3.24.2","url":"/obsidian/releases/3.24.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#766) Fixed tag parsing incorrectly identifying notes with tags containing \"task\" (like \"pkm-task\") as task notes Added exact hierarchical tag matching for task identification to prevent false positives Preserved substring matching behavior for filter bar searches where it's desired Only exact matches or hierarchical children (like \"task/work\") now identify notes as tasks Thanks to @anareaty and @fastrick for reporting this issue (#767) Fixed subgroups not rendering under the \"Overdue\" agenda group Thanks to @renatomen for reporting this issue (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values Added time validation in settings UI with proper error messages and debouncing Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00) Prevents \"Cannot read properties of null (reading 'years')\" error from FullCalendar Thanks to @kmaustral for reporting (#769) Fixed NLP processor incorrectly assigning hardcoded \"waiting\" status when \"blocked\" appears in task titles NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns Prevents unexpected status assignments for users with custom status workflows Fallback patterns still work when no custom status configurations are defined Thanks to @renatomen for reporting this issue"},{"title":"TaskNotes 3.24.3","url":"/obsidian/releases/3.24.3/","description":"TaskNotes documentation.","product":"obsidian","text":"(#776) Fixed screens failing to load with \"toLowerCase is not a function\" error Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.) Added type validation to filter out non-string values before processing tags Valid string tags continue to work normally while invalid types are safely skipped Thanks to @kmf and @Andre-Ioda for help debugging this issue"},{"title":"TaskNotes 3.24.4","url":"/obsidian/releases/3.24.4/","description":"(#768) Fixed calendar view crashes when tasks contain null values in grouping fields","product":"obsidian","text":"Fixed# (#768) Fixed calendar view crashes when tasks contain null values in grouping fields Added null/undefined checks in sort comparisons to prevent localeCompare errors Calendar now handles null values in tags, contexts, and custom fields gracefully Thanks to @kmaustral for reporting (#601) Fixed Unicode characters not displaying in tags and contexts Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts Affects Agenda View, Task List View, and all other views displaying tags Thanks to @Kapinekas for reporting (#778) Fixed cursor artifacts in CodeMirror widgets Thanks to @jhedlund for the fix Fixed task card widgets in note editor not updating for archive and time tracking changes Task card widgets now properly detect when tasks are archived/unarchived Task card widgets now properly detect when time tracking starts/stops Blue \"tracking\" border now appears/disappears correctly in live preview Archive styling now updates correctly in live preview Changed# (#751) Status bar tracked task click behavior now opens task notes directly Single tracked task: opens the task note immediately Multiple tracked tasks: shows selector modal to choose which task note to open Provides faster access to tracked tasks compared to previous task list view (#727) \"Create New Inline Task\" command now respects the \"Include Current Note in Project\" setting When enabled, the current note is automatically added as a project to inline tasks Provides consistency with instant convert functionality Thanks to @chrisfeagles for the suggestion Improved link handling throughout the plugin using Obsidian's native APIs Replaced manual wikilink generation with FileManager.generateMarkdownLink() Now respects user's link format settings (wikilink vs markdown, relative paths) Replaced manual link parsing with parseLinktext() for proper alias handling Better compatibility with future Obsidian updates Added centralized link utilities in linkUtils.ts Refactored widget cursor styles into reusable utility class Consolidated shared CSS into .cm-widget-cursor-fix utility Improved maintainability across widget components"},{"title":"TaskNotes 3.24.5","url":"/obsidian/releases/3.24.5/","description":"(#806) Fixed Bases views crashing on Obsidian 1.10.0 startup","product":"obsidian","text":"Fixed# (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter Added support for markdown link format [text](path) in projects and blockedBy fields Handles URL-encoded paths like [Car Maintenance](../../projects/Car%20Maintenance.md) Markdown links now render as clickable links showing display text instead of raw [text](path) format Links are properly resolved for grouping, filtering, and project-task associations Previously only wikilink format [[path]] was supported Prevents automatic removal of project assignments when editing tasks Thanks to @minchinweb for reporting (#780) Fixed \"Cannot Create Timeblocks\" error when daily notes folder doesn't exist Added proper error handling when createDailyNote fails due to missing folder Improved error messages to guide users to check Daily Notes plugin configuration Prevents uncaught errors from obsidian-daily-notes-interface package Thanks to @uberunix for reporting"},{"title":"TaskNotes 3.24.6","url":"/obsidian/releases/3.24.6/","description":"(#440) Fixed inline task replacement not working for links with relative paths","product":"obsidian","text":"Added# Added release notes viewer New view displays release notes in a dedicated tab when plugin updates Automatically opens after updating to a new version Access anytime via command palette \"TaskNotes: View release notes\" or Settings > General Release notes are rendered using native Obsidian markdown rendering Includes link to view all releases on GitHub Fully internationalized with i18n support Auto-generation system ensures correct version is loaded without manual updates Fixed# (#440) Fixed inline task replacement not working for links with relative paths Markdown links with relative paths like [task](../../../GTD/tasks/task.md) now display inline previews Wikilinks with relative paths now work correctly Removed overly aggressive path sanitization that was stripping .. from all link paths Works in both Live Preview and Reading Mode Thanks to @minchinweb for reporting (#814) Fixed markdown links in projects field not being recognized on Project notes Tasks with markdown-style project links [text](path) now appear in project's Subtasks section Updated project link detection to use parseLinkToPath utility which handles both wikilinks and markdown links Handles URL-encoded paths like [z Test Project](z%20Test%20Project.md) Thanks to @minchinweb for reporting (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings Project links in frontmatter are now always generated as wikilinks [[link]] by default for Obsidian compatibility Obsidian does not support markdown links in frontmatter properties without third-party plugins Added optional setting to enable markdown links in frontmatter for users with obsidian-frontmatter-markdown-links plugin Setting only appears when user has markdown links enabled globally in Obsidian Thanks to @nightroman for reporting"},{"title":"TaskNotes 3.25.0","url":"/obsidian/releases/3.25.0/","description":"Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)","product":"obsidian","text":"Added# Added Calendar view for Bases plugin integration (requires Bases 1.10.0+) Supports month, week, day, year, and list views Property-based events from note date properties (configurable start date, end date, and title properties) Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based) Date validation to handle invalid property values Drag-and-drop to update property-based event dates in frontmatter Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese) Added grouped rendering support for Bases integration list and kanban views List view displays collapsible groups with toggle controls Kanban view renders grouped columns with drag-drop support Automatically detects ungrouped views and renders as flat list (#842) Added keyboard navigation support for task forms Action bar icons now focusable with proper tab order and ARIA attributes Enter and Space keys trigger actions on focused elements Added submenu support for reminders button for better keyboard accessibility Improved focus indicators for better visual feedback Thanks to @maybetm for this excellent contribution! Changed# Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions Fixed# (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths Changed debounce to trailing mode to ensure final value is saved instead of partial input Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths Thanks to @sascha224 for reporting (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#825) Fixed single/double click settings not applying to calendar views Shared click handling now works consistently across Advanced Calendar and Bases Calendar Ctrl/Cmd+click opens tasks in new tab as expected Single and double-click actions respect user settings (#699) Fixed Obsidian freezing when moving calendar tab to new window Skip calendar resize during window transfer to prevent freeze Calendar may display incorrectly after move but can be fixed by switching views Prevents complete UI lockup during tab transfer (#816) Fixed template variables not processing in ICS subscription note folder paths Template variables like {{year}}, {{month}}, {{date}} now work in ICS note folder settings Extracted folder template processing into shared utility for consistency Added support for ICS-specific variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Users can now organize ICS notes in date-based hierarchies (e.g., Daily/{{year}}/{{month}}/) Thanks to @j-peeters for reporting (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views Added 5-minute grace period after cache expiration to keep events visible during refresh Trigger automatic background refresh when cache is stale or missing Initialize ICS service instances early so views can register event listeners before data loads Prevents disappearance during network errors or when calendar opens at Obsidian startup Thanks to @j-peeters for reporting (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion Added timeEstimate field to ParsedTaskData interface Time estimates from natural language parsing now properly transferred to task frontmatter Parsed values now take priority over default settings RRule strings passed directly without conversion (preferred format) Thanks to @Justin-Burg for reporting (#826) Fixed task card widget not appearing when Obsidian starts with task note open Deferred dispatch calls to avoid \"EditorView.update not allowed during update\" error Widget now renders correctly on startup without requiring workarounds Thanks to @nightroman for reporting (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues Events with non-IANA timezone identifiers (e.g., TZID=Zurich without VTIMEZONE) now display at correct local times Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone Replaced unreliable toJSDate() conversion with toUnixTime() for accurate UTC timestamp handling Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats Thanks to @chrlaney for reporting and @wilf80 for detailed analysis (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view Recurring tasks now check both due and scheduled dates for overdue status Previously only scheduled was checked for recurring tasks, causing tasks with overdue due dates to be hidden Ensures consistent overdue detection logic between recurring and non-recurring tasks Thanks to @skyrunner15 for reporting (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones UTC-anchored dates are now converted to local calendar dates before formatting Fixes off-by-one day error that affected date selection and display Thanks to @kenhsmith for reporting"},{"title":"TaskNotes 3.25.1","url":"/obsidian/releases/3.25.1/","description":"(#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice","product":"obsidian","text":"Fixed# (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones) All-day events no longer appear twice in Agenda view Updated all date parsing throughout the codebase to handle date-only format correctly Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695 (#859) Fixed multi-day task creation in Bases calendar view Extracted shared task creation logic to calendar-core.ts for consistency between calendar views Multi-day all-day selections now correctly set time estimate based on number of days dragged Timed task selections (week view) now correctly calculate duration in minutes Single-day clicks no longer override default time estimate settings Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar) Follows UTC Anchor principle for date-only strings Thanks to @anareaty for reporting"},{"title":"TaskNotes 3.25.2","url":"/obsidian/releases/3.25.2/","description":"(#857) Fixed Mini Calendar opening previous day's daily note when clicked","product":"obsidian","text":"Fixed# (#857) Fixed Mini Calendar opening previous day's daily note when clicked Affects users in negative UTC offset timezones (Americas, Pacific) Thanks to @tsweezy for reporting (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields Added support for both Bases 1.10.0+ format ({property: string, direction: string}) and legacy string format Note: GroupBy is not exposed in the Bases public API (config.get('groupBy') returns undefined) Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths Tasks with different wikilink formats pointing to the same project file will appear in separate columns Example: [[Project]], [[path/to/Project]], and [[Project|Alias]] create separate columns This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths Thanks to @kmaustral for reporting Added# Added date navigation configuration for Bases calendar views Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load Property-based navigation: Automatically navigate to dates from filtered note properties Three navigation strategies: First result, Earliest date, or Latest date Changed# Release notes now bundle all versions from current and previous minor series with collapsible sections Added setting to disable automatic release notes display after updates"},{"title":"TaskNotes 3.25.3","url":"/obsidian/releases/3.25.3/","description":"(#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled","product":"obsidian","text":"Added# (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility Fixes issue where themes like Retroma couldn't distinguish active tabs Thanks to @Bregor for the contribution Fixed# (#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled Setting now always visible since it affects command palette task conversion Resolves confusion for users who convert tasks via command palette Thanks to @nnnell for the fix (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions Custom field wikilink suggestions ([[) now show all vault files instead of only filtered projects Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal Thanks to @renatomen for the thorough fix and tests"},{"title":"TaskNotes 3.25.4","url":"/obsidian/releases/3.25.4/","description":"(#937), (#956) Added optional setting to hide identification tags in task cards","product":"obsidian","text":"Added# (#937), (#956) Added optional setting to hide identification tags in task cards New \"Hide identification tags in task cards\" setting (only visible when using tag-based identification) Hides exact matches (e.g., #task) and hierarchical children (e.g., #task/project, #task/work/urgent) Reduces visual clutter while keeping tags in frontmatter for organizational purposes Backward compatible - disabled by default Thanks to @renatomen for implementing this feature and @edakimling for reporting (#911) Added custom field suggestion filtering New autosuggestFilter field to UserMappedField interface allows filtering suggestions by current filter context Added collapsible filter section in settings with visual indicator Comprehensive test coverage for custom field filtering feature Thanks to @renatomen for this enhancement Fixed# (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done Edit Task modal now correctly adds completedDate when changing status to completed Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions) Thanks to @nightroman for reporting (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured All tasks were appearing in a single \"None\" column Columns now appear in the order defined in TaskNotes settings (not alphabetical) Detects invalid Bases grouping and falls back to status-based grouping Tasks are properly distributed across status columns Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting"},{"title":"Tasknotes 3.25.6","url":"/obsidian/releases/3.25.6/","description":"(#1013) Fixed inability to subscribe to Apple iCloud calendars","product":"obsidian","text":"Fixed# (#1013) Fixed inability to subscribe to Apple iCloud calendars Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly Previously required manually changing the URL format before it would be accepted Works with both standard and secure calendar URLs (webcal:// and webcals://) Thanks to @nickbirch51 for reporting (#1022) Fixed tasks randomly disappearing from views and not being recognized Tasks would appear initially but disappear after a few seconds, especially during long sessions Restarting Obsidian or using \"Refresh Cache\" would only temporarily fix the issue Thanks to @seepage87 for reporting and @alejandrospoz for help debugging (#968) Fixed timeEntries being duplicated when mapped to custom property name When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property FieldMapper now correctly uses only the configured property name for time tracking data Thanks to @minchinweb for reporting this issue (#953) Fixed non-task notes incorrectly appearing as subtasks in views Notes with Parent or project properties but no task tag/property no longer show up as tasks Views now update correctly when task tags are removed from files Improved performance for large vaults by optimizing cache invalidation Thanks to @renatomen for reporting and submitting PR #955"},{"title":"Untitled","url":"/obsidian/releases/3.3.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0"},{"title":"Untitled","url":"/obsidian/releases/3.4.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0"},{"title":"Untitled","url":"/obsidian/releases/3.4.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1"},{"title":"Untitled","url":"/obsidian/releases/3.4.2/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2"},{"title":"Untitled","url":"/obsidian/releases/3.5.1/","description":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.","product":"obsidian","text":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1"},{"title":"Untitled","url":"/obsidian/releases/3.6.0/","description":"Fix task tag check. Add optional timeblocking.","product":"obsidian","text":"Fix task tag check. Add optional timeblocking."},{"title":"TaskNotes v3.7.0 Release Notes","url":"/obsidian/releases/3.7.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0","product":"obsidian","text":"Reading Mode Task Previews (thank you @amithkk)# Task link previews now work in Reading Mode in addition to Live Preview Consistent interactive experience across all Obsidian view modes Same functionality: click to edit, right-click for context menu, hover for file preview New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling Task Action Palette# New quick-action command palette for rapid task management Access via command palette: \"TaskNotes: Open Task Action Palette\" Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks Handles recurring task instances vs. series intelligently Fully keyboard navigable with categorized actions Natural Language Task Input# Parse natural language when creating tasks: \"Buy groceries tomorrow 3pm high priority @home #errands\" Powered by chrono-node for robust date/time parsing Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates Multi-line support: first line parsed, additional lines become task details Toggle in Settings → Basic Defaults UI/UX Improvements# Enhanced Task Creation Modal# Smart input mode with simplified interface when natural language is enabled Progressive disclosure to detailed form when needed Better conversion flow with pre-populated forms Live filename preview as you type Settings & Modal Improvements# Moved Natural Language Input to Basic Defaults section Updated task link overlay description to mention both view modes Reusable confirmation modal for consistent dialogs Better error handling and accessibility improvements Bug Fixes# Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)# Problem: Inline task conversion applied \"none\" instead of configured defaults Solution: Changed useDefaultsOnInstantConvert default from false to true Timer Function Standardization# Fixed browser compatibility by replacing Node.js timer types with browser-native timers Resolved timing issues across different environments Enhanced Task Link Overlays# Better path resolution with security enhancements Graceful fallbacks for invalid or missing task files Improved handling of rapid view changes Technical Improvements# Enhanced Date Support# Full due date and scheduled date support in task creation and filename generation New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format) Support for ISO dates, relative dates, named dates, and natural language Performance & Code Quality# Improved event handling with better refresh logic Layout change listeners for immediate overlay updates Enhanced error handling with user-friendly messages Better TypeScript types and modular design New Files & Dependencies# New Files# src/editor/ReadingModeTaskLinkProcessor.ts src/modals/TaskActionPaletteModal.ts src/services/NaturalLanguageParser.ts src/modals/ConfirmationModal.ts styles/task-action-palette-modal.css New Dependency# chrono-node: Natural language date parsing library What's Changed# Feat/task previews in reading mode by @amithkk in https://github.com/callumalpass/tasknotes/pull/57 New Contributors# @amithkk made their first contribution in https://github.com/callumalpass/tasknotes/pull/57 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0"},{"title":"Version 3.7.1","url":"/obsidian/releases/3.7.1/","description":"Files with Major Changes:","product":"obsidian","text":"Major UI/UX Enhancements# Interactive Inline Task Previews# Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing Enhanced Visual Design: Redesigned with minimal styling Improved spacing and vertical alignment between status dots, priority indicators, and task titles Better hover effects with brightness and subtle animations Status dots now use bordered design for better visibility Modernized Task Card Design# Interactive Status Cycling: Click status dots on task cards to quickly change task status Improved Mobile Support: Better touch targets and responsive behavior Enhanced Animations: Smooth hover effects, scaling, and transition animations Cleaner Layout: Streamlined design with better visual hierarchy Enhanced Natural Language Processing# Advanced Date Parsing# Explicit Trigger Recognition: Now recognizes specific phrases: Due dates: \"due on\", \"deadline\", \"must be done by\", \"needs to be completed\" Scheduled dates: \"scheduled for\", \"start on\", \"work on\", \"planned for\" Configurable Defaults: New setting to choose whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Recurrence Patterns: \"every [weekday]\" patterns (every monday, every friday) Plural day patterns (mondays, tuesdays, etc.) \"Every other\" interval patterns (every other week, every 2 days) Multiple days (\"every tuesday and thursday\") Improved Date/Time Handling# Better Time Component Support: Enhanced parsing of specific times with dates Robust Validation: Improved handling of edge cases and malformed input Smart Cleanup: Automatic removal of duplicate tags and contexts Performance & Developer Experience# Instant Task Conversion Improvements# Real-time Updates: Task link overlays refresh immediately after task conversion Smart Caching: Improved metadata cache management for newly created tasks Better Error Handling: Enhanced validation with user-friendly error messages Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines Technical Improvements# Improved Event Handling: Fixed n.dispatch is not a function error with proper validation BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization Performance Optimizations: Reduced unnecessary re-renders and improved widget caching Enhanced State Management: Better synchronization between UI updates and task data Modal & Interface Enhancements# Enhanced Date/Time Modals# Better Keyboard Navigation: Enter to save, Escape to cancel Separate Time Inputs: Dedicated date and time fields for precision Quick Date Buttons: Common date selections for faster input Improved Accessibility: Proper ARIA labels and screen reader support Better User Experience# One-Click Status Changes: Direct status cycling from any task preview Direct Date Editing: Click any date to immediately edit it Enhanced Visual Feedback: Better hover states, transitions, and loading animations Accessibility Improvements: Enhanced keyboard navigation and screen reader support Bug Fixes & Stability# Fixed: Inline task widget dispatch errors that caused console warnings Fixed: Vertical alignment issues with different-sized status and priority indicators Fixed: Layout conflicts between flexbox and inline display properties Fixed: Spacing issues in inline task previews causing cramped appearance Fixed: Missing task link overlay refreshes after instant task conversion Configuration & Settings# New User Settings# Natural Language Default: Configure whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Task Creation: Improved default value application for instant task conversion Technical Details# Files with Major Changes: Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts) Modernized task card design (TaskCard.ts) Advanced natural language processing (NaturalLanguageParser.ts) Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts) Comprehensive CSS overhaul with BEM methodology"},{"title":"Untitled","url":"/obsidian/releases/3.8.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1"},{"title":"TaskNotes 3.8.5 Release Notes","url":"/obsidian/releases/3.8.5/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5","product":"obsidian","text":"UI/UX Improvements# Compact Filter Bar (Special thanks to @amithkk :tada: )# Complete redesign of FilterBar component with compact, modern interface Native Obsidian dropdowns replace basic HTML select elements for better consistency Collapsible controls - settings are hidden by default with expandable controls via settings button Visual indicators showing active filter count on settings button Integrated search bar with search icon and improved visual hierarchy Right-aligned control buttons for better layout organization Advanced Calendar View Integration# Unified view options - calendar view toggles now integrated into FilterBar dropdown Streamlined interface - removed separate toggle controls in favor of FilterBar integration Consistent UX across different view types with shared filter/view controls Dynamic option management with real-time updates and state synchronization Enhanced Natural Language Processing# Improved Text Processing# Better whitespace handling with new cleanupWhitespace() function for consistent text normalization Enhanced priority detection with improved pattern matching and conflict resolution Completion status support - added isCompleted field to parsed task data More robust text extraction across tags, contexts, priorities, and dates Date and Time Handling Improvements# Enhanced date parsing with better timezone handling for date-only strings Improved date normalization with direct Date constructor to avoid timezone issues Better error handling for invalid date strings and edge cases More robust timestamp formatting with validation checks Testing Infrastructure# Comprehensive Test Suite# Complete testing infrastructure with Jest configuration for both unit and integration tests Enhanced mocking system with improved Obsidian API mocks and better type safety Integration test helpers with utilities for end-to-end workflow testing Improved test coverage across core components and services Mock Improvements# Updated mock factories with better type consistency and realistic data generation Enhanced DOM simulation for better UI component testing Improved date-fns mocking with support for \"MMM d, yyyy h:mm a\" format Better Obsidian API compatibility in test mocks Developer Experience# Type Safety Enhancements# Refactored type definitions for improved consistency across the codebase Better TypeScript integration with enhanced type checking and inference Improved callback types for better development experience Build and Deployment# Updated GitHub Actions with artifact uploader v4 for improved CI/CD Enhanced development workflow with better testing and build processes User Interface Polish# Task Creation Modal# Improved placeholder text with more natural language examples Better user guidance for natural language task input format Clearer instruction formatting for enhanced user experience Visual Consistency# Native Obsidian styling throughout filter and control components Consistent iconography using Obsidian's icon system Improved responsive design with better mobile and small screen support Bug Fixes and Stability# Error Handling# Improved error handling in date parsing and normalization functions Better validation for user input and edge cases Enhanced robustness in text processing and natural language parsing Code Quality# Refactored components for better maintainability and performance Simplified scheduled date logic with cleaner default handling Enhanced code organization with better separation of concerns What's Changed# Add compact filter bar by @amithkk in https://github.com/callumalpass/tasknotes/pull/73 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5"},{"title":"Untitled","url":"/obsidian/releases/3.8.6/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6"},{"title":"Untitled","url":"/obsidian/releases/3.8.7/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7"},{"title":"Release Notes v3.9.0","url":"/obsidian/releases/3.9.0/","description":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful...","product":"obsidian","text":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance. A special thank you to amithkk (https://github.com/amithkk) for their contributions to this release! New Features# RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible recurring task schedules. A migration assistant will help you update your existing tasks to the new format. Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage individual completions of recurring tasks. \"Show\" Dropdown in Filter Bar: A unified \"Show\" dropdown has been added to the filter bar, providing enhanced filtering options for your tasks. Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow. Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save tasks in the same folder as the current note. \"Show Due Dates When Scheduled\" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view. Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!) Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features. \"Highlight Today\" in Calendar View: The calendar view now highlights the current day for better visibility. New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability. CI/CD and Testing: A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions. GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases. Enhancements# UI/UX Improvements: The task edit and creation modals have been redesigned for a more minimalist and intuitive experience. Task-related icons have been updated for better clarity. Context menus have been added to task cards for quick actions. The agenda view sorting options have been fixed. The recurring calendar widget is now centered and on a separate line from its label. Dropdown menus now handle clicks on text labels more reliably. Performance and Reliability: The task link overlay has been refactored to use a ViewPlugin for better performance. The Advanced Calendar view now handles resizing and being moved to a new window more gracefully. The natural language processing for task creation has been improved with a fallback mechanism. Date parsing and handling have been made more robust, especially for UTC and different date formats. Development Workflow: ESLint configuration has been updated with new rules and plugins for better code consistency. The build process for CSS has been improved. The development guidelines have been updated to reflect the new architecture. Bug Fixes# Fixed an issue where agenda view sorting options were not working correctly. Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window. Resolved a TypeError in the task modal's suggestion filtering. Fixed an issue where the Pomodoro task selector did not show all un-archived tasks. Corrected the filtering of daily notes in the getNotesForDate function. Fixed a bug where the underlying markdown of a task link was not revealed on hover. Removed misleading placeholder symbols from the settings. Addressed various linting issues and improved code quality. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0"},{"title":"Release Notes: 3.9.1","url":"/obsidian/releases/3.9.1/","description":"New Features","product":"obsidian","text":"New Features GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided. Bug Fixes Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended. Task Creation: The \"Magic Wand\" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input. What's Changed# Add github issue templates by @amithkk in https://github.com/callumalpass/tasknotes/pull/101 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1"},{"title":"TaskNotes 4.0.0-beta.0","url":"/obsidian/releases/4.0.0-beta.0/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. What's New in v4# TaskNotes v4 migrates all views to the Bases system. Breaking Changes# Minimum Obsidian version: 1.10.1 View commands now use Bases files - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open .base files created automatically in your vault Saved filter views - Custom saved views can be converted to .base files using a conversion button in settings Added# OAuth Calendar Integration# Google Calendar and Microsoft Outlook integration via OAuth 2.0 View and sync calendar events in Bases calendar Drag events in the TaskNotes bases calendar to change the event's time online Events sync every 15 minutes or upon local change Requires creating your own OAuth application (approximately 15 minutes) See Calendar Setup Guide Time Entry Editor Modal# Dedicated interface for managing time entries Alt-drag on Bases calendar to create time entries View total tracked time per task Edit and delete time entries Access via Task Action Palette (Alt/Opt + Enter) Kanban Swimlane Layout# Horizontal swimlane grouping option for Bases Kanban Group tasks by status, priority, or other fields Hide empty columns Configurable column widths Improved drag-and-drop in swimlane mode Saved View Converter# Conversion button in settings to convert saved filter views to .base files Original settings preserved Converted views created in TaskNotes/Views/ Changed# View System Architecture# All views now use Bases architecture Calendar, Kanban, Tasks, Agenda, and Project Subtasks are .base files Views stored in TaskNotes/Views/ Keyboard shortcuts and ribbon icons map to .base files Configure file paths in Settings → Integrations → Bases Integration Calendar# Control which calendar sources display Toggle Google Calendar, Microsoft Calendar, and ICS events independently Configurable list view with custom day count (2-10 days) Improved timezone handling for recurring events Settings# Reorganized settings tabs OAuth calendar settings in Integrations tab Updated help text Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting Thanks to @jack2game Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events Migration Guide# First Launch# Default view files are created automatically in TaskNotes/Views/ Ribbon and command palette commands now open .base files Review Settings → General to customize view file paths Converting Saved Filter Views# Go to Settings → General Click the conversion button to convert saved filter views to .base files Converted views appear in a file in TaskNotes/Views/ Calendar Integration (Optional)# Go to Settings → Integrations → OAuth Calendar Integration Follow the Calendar Setup Guide Create OAuth applications with Google and/or Microsoft (approximately 15 minutes) Enter Client ID and Secret in calendar cards Click Connect Known Limitations# Quick OAuth setup is disabled - only advanced setup (your own credentials) is available Saved filter views require manual conversion using the button in settings Migration is one-way - downgrading to v3 may require manual reconfiguration OAuth setup requires creating applications with Google/Microsoft Feedback# Report issues on GitHub. Include: Obsidian version Steps to reproduce Console errors (Ctrl/Cmd + Shift + I) Whether issue occurs after migration or fresh install"},{"title":"TaskNotes 4.0.0-beta.1","url":"/obsidian/releases/4.0.0-beta.1/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Added context menus for time entries and ICS events in calendar Time entries: Right-click shows task context menu, left-click opens time entry editor modal ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info Added calendar icon to ICS event titles for better visual distinction Added hover tooltips for timeblocks in calendar views Added MiniCalendar view for Bases integration Monthly calendar grid with dot indicators on days with notes Configurable date property (file.ctime, note.dateCreated, etc.) Fuzzy selector modal for selecting notes on clicked days Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell) Tested with up to 30,000 notes with no performance degradation Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help Changed# Refactored Bases integration to use public API and trust pre-sorted data Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture Removed legacy view files and ~500 lines of redundant sorting/grouping logic Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API Reduced code duplication by 40% while maintaining full feature parity Refactored calendar modules to use ES6 imports instead of lazy require() calls Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts Consolidated all imports at module top level Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices Time entry events now show task context menu on right-click (previously had no context menu) Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability Removed complex index synchronization in favor of direct MetadataCache queries Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.) Added minimal DependencyCache for task dependencies and project references only Zero startup time (no index building required) Always provides fresh, accurate task data from Obsidian's MetadataCache Completed internationalization with 100% translation coverage across all supported languages Added 90 missing translation keys to English base Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese) All locales now have complete coverage (1745/1745 keys) Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components Migrated to i18n-state-manager CLI tool for translation management Replaced custom scripts with more robust i18n-state-manager package Added i18n-state.config.json for project-specific patterns New features: find-unused, check-duplicates, improved stale detection Hash-based state tracking and ripgrep-based scanning for performance Bases view templates now generate dynamically based on user settings Task filters adapt to user's task identification method (tag or property) Property ordering reflects defaultVisibleProperties setting Uses correct YAML object notation for Bases filters Maintains backward compatibility with legacy static templates Updated Bases CalendarView to show TaskNotes in property-based events Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.) Previously all TaskNotes were filtered out from property-based events Fixed# (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled Eliminated race condition caused by index synchronization delays TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes No more timing-sensitive code that could conflict with other plugins' metadata processing Tasks will always be visible regardless of other plugins' processing times Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging. (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar Removed unnecessary dynamic imports that were causing module resolution failures Consolidated imports at top of calendar-core.ts module Thanks to @jalooc for reporting this issue Fixed task dependencies not displaying on task cards TaskManager now properly calculates isBlocked and isBlocking flags from dependency data Added missing property extractors and renderers in TaskCard for all dependency-related fields Dependency information now shows correctly in Bases views, task note widgets, and other views Shows \"Blocked (n)\" and \"Blocking (n)\" pills, plus detailed task links Fixed Bases property mapping for user-configured field names PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations Example: User configures \"state\" → \"status\", Bases provides \"note.state\", now correctly maps to \"status\" Ensures TaskCard properly recognizes and renders user-configured properties Fixed Bases views not respecting user-configured visible properties Now prioritizes Bases 1.10.0+ public API config.getOrder() method Removed reliance on internal API paths that no longer work Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy) Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter DateValue objects have {date: Date, time: boolean} structure Now properly checks for value.date instanceof Date before legacy conversion methods Fixes property-based events in CalendarView"},{"title":"TaskNotes 4.0.0-beta.2","url":"/obsidian/releases/4.0.0-beta.2/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# (#1090) Portuguese (Brazil) translation Full Portuguese (pt-BR) localization support A big thanks to @andysteel for the contribution Configurable task modal fields New \"Modal Fields\" settings tab for complete control over task creation and edit modals Configure which fields appear in creation vs edit modals independently Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom) Enable/disable individual fields (including core fields like contexts, tags, time estimate) Organize fields into groups Automatic migration of existing user-defined fields Title and details fields support visibility toggling (ordering fixed for consistency) Rich markdown editor for NLP task creation Replaced plain textarea with full CodeMirror markdown editor Live preview, syntax highlighting, and wikilink support Ctrl/Cmd+Enter keyboard shortcut to save task Esc/Tab keyboard shortcuts for modal control Customizable NLP triggers with autocomplete Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority) Supports user-defined field triggers CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab) Quote support for multi-word values in user fields Native tag suggester integration when using # trigger Inline task link overlay enhancements Configurable visible properties for inline task cards PropertySelectorModal for selecting which properties to display Improved layout: title prioritized, horizontal scrolling for metadata Real-time updates when task data changes New utility services TriggerConfigService - manages NLP trigger configurations PropertySelectorModal - reusable multi-select property picker Property helpers for consistent property handling across views Kanban column reordering via drag and drop Drag column headers to reorder columns Column order is saved per grouping property Visual feedback during drag operations Mini calendar enhancements (in progress) Week numbers column Heat map intensity visualization Note preview tooltips on hover Keyboard navigation Unified Relationships widget Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban) Tabs automatically show/hide based on available relationship data Bases views handle all data updates reactively - no manual refresh needed Single configuration setting: show/hide and position (top/bottom) Significantly reduced code complexity (430 fewer lines) Fixed# (#1084) Fixed word wrapping in NLP preview items Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space Embedded bases now scroll internally instead of expanding to show all tasks Consistent behavior between task list and kanban embedded views Thanks to @same774 for reporting with screenshot Bases Calendar view options now working correctly Fixed \"Highlight today\" toggle not applying - now properly adds/removes CSS class when toggled Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons View type is now persisted when users click month/week/day buttons in the calendar UI (#1050) Task modal no longer adds unwanted empty contexts and projects arrays FieldMapper now checks if arrays are empty before writing to frontmatter Thanks to @nightroman for reporting this issue Inline task link overlay fixes Fixed layout prioritization: title now prioritized over metadata Added horizontal scrolling for metadata to prevent overflow Fixed real-time update listeners for task data changes Fixed group collapse/expand functionality in TaskListView Re-registered click event listener for group headers using Component API Groups can now be properly collapsed and expanded Fixed config loading race condition in KanbanView and CalendarView Config is now properly loaded in onload() lifecycle method Views wait for config before rendering options Fixed MiniCalendarView to use direct Bases API like other views Consistent use of Component lifecycle methods Proper cleanup in onunload() Changed# NLP system overhaul Replaced StatusSuggestionService wrapper with direct NaturalLanguageParser usage Consolidated trigger configuration into unified TriggerConfigService Enhanced NaturalLanguageParser with full trigger and user field support Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger) Task card and editor improvements Simplified TaskCard interface - removed unused options (showCheckbox, showArchiveButton, groupByDate) Refactored TaskLinkWidget to use unified TaskCard component for consistency Added support for inline vs. block layout modes in task cards Improved task card BEM CSS with better styling for inline mode Settings UI enhancements NLP triggers now configurable through Settings > Features tab Added settings for inline task card visible properties Improved appearance tab with property selector integration Better organization of NLP-related settings Refactored Bases views to use Component lifecycle properly Views now extend Component and use onload()/onunload() Automatic cleanup of event listeners via Component.registerDomEvent() Improved state management and ephemeral state handling Improved development experience Converted ESLint errors to warnings for non-blocking development Fixed various linting issues and unused imports Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Breaking Changes# Relationships widget settings consolidated (automatic migration) Old settings removed: showProjectSubtasks, projectSubtasksPosition, showTaskDependencies, taskDependenciesPosition New unified settings: showRelationships, relationshipsPosition Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible Migration: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default Bases file change: The command mapping changed from 'project-subtasks': 'TaskNotes/Views/project-subtasks.base' to 'relationships': 'TaskNotes/Views/relationships.base' Run \"Create Default Files\" in Settings > General to create the new relationships.base file"},{"title":"TaskNotes 4.0.0-beta.3","url":"/obsidian/releases/4.0.0-beta.3/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Updated task card styling Increased status dot size from 16px to 18px Added subtle shadows and transitions to card hover states Updated hover effects on status and priority dots with scaling and removed glow Modified metadata pills with backdrop blur and adjusted spacing Added box shadows to interactive elements (dates, projects, tags) on hover Updated animations to use cubic-bezier easing Added gradient accents to subtask and blocking task borders Fixed subtasks appearing behind parent card hover backgrounds Fixed subtask click and context menu events bubbling to parent cards Fixed subtasks inheriting parent priority and status colors (#361) Added completion-based recurrence support with recurrence_anchor field Tasks can now recur based on completion date instead of scheduled date Set recurrence_anchor: completion in task frontmatter to enable this behavior When completing a recurring task, the next occurrence will be scheduled relative to the completion date The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates Defaults to scheduled (original behavior) if not specified Useful for tasks like \"Exercise weekly\" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date) Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Added support for skipped recurrence instances with skipped_instances field Recurring tasks can now have individual instances marked as \"skipped\" without completing them Skipped instances are stored in the skipped_instances frontmatter array (e.g., [\"2025-11-15\", \"2025-11-22\"]) Right-click on a recurring task instance in calendar views to skip/unskip it Visual styling differentiates skipped instances: Calendar views: Gray background with muted appearance Task cards: Strike-through text with gray styling Skipped instances don't affect the recurrence pattern - future instances continue as scheduled Useful for holidays, vacations, or other planned exceptions to recurring tasks Thanks to @mdbraber for the suggestion to use an array similar to complete_instances, and @jerzy-dudzic for reporting the issue Fixed# (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years) Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days) Ensures the next occurrence is always found when completing recurring task instances Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views Extended the look-ahead period for yearly recurring tasks when generating calendar instances Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges Only displays instances that fall within the actual visible calendar range Weekly recurring tasks were unaffected and continued to work correctly Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata Calendar subscription lastFetched and lastError fields are now stored in memory instead of being saved to disk Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions The \"last synced\" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules The custom recurrence modal now correctly parses and displays the start date and time fields Fixed parser that was splitting on = instead of : for DTSTART values (#1097) Fixed custom properties and formulas not displaying in Bases views Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties Formulas now work correctly using formula.NAME syntax Custom note properties now work correctly using note.PROPERTY syntax Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation Fixed double-prefix bug in relationships template that generated invalid filter expressions like note.note.projects Fixed race condition where files created during plugin load wouldn't appear in file explorer Default Bases files now generate with correct property paths and appear reliably in the file explorer Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view Removed stale selectedDate property that was never updated in v4 Tasks view now uses fresh UTC-anchored \"today\" for correct recurring task completion status Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones Also fixed KanbanView to use UTC-anchored dates for consistency Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion User-defined fields like >customfield value now properly convert to frontmatter when using the \"TaskNote: Convert task to TaskNote\" command Fixed fields appearing with internal IDs (e.g., field_1761435101864) instead of configured frontmatter key names Array values are now properly joined with commas Added userFields property to ParsedTaskData interface to support custom fields throughout the conversion flow Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range Column width slider now works correctly across the full 200-500px range Kanban view now shows empty columns for all user-defined statuses when grouping by status Empty columns appear for custom statuses defined in settings, even when no tasks have that status Allows users to drag tasks into empty status columns Works in both flat kanban view and swimlane mode Respects the existing \"Hide empty columns\" setting Thanks to @williamcheuk03 for reporting this issue"},{"title":"TaskNotes 4","url":"/obsidian/releases/4.0.1/","description":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda...","product":"obsidian","text":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on .base files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault. Highlights# New features and improvements: Performance improvements Virtual scrolling in Task List and Kanban views handles 30,000+ tasks without performance degradation OAuth calendar integration Google Calendar and Microsoft Outlook bi-directional sync Drag calendar events in the TaskNotes calendar to update them online Configurable modals and NLP New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals Rich markdown editor and customizable NLP triggers, including autocomplete for user fields Time management features Time Entry Editor Modal Improved Timeblock creation and management Completion-based recurrence with recurrence_anchor field Skippable recurrence instances Bases architecture changes: Bases-first architecture Task views ship as .base files inside TaskNotes/Views/ Commands and ribbon buttons now open files you control Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI Agenda is a dedicated list-mode calendar .base file for fast daily/weekly reviews Inline workflows stay in sync Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place Task cards inside notes honor the same Bases filtering/grouping rules as standalone views Why Bases?# Moving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which: Reduces maintenance overhead and improves reliability Lets advanced users version-control and audit their view definitions Makes saved views portable between vaults Keeps TaskNotes behavior consistent with other Obsidian-native workflows Upgrade Notes# Obsidian 1.10.1 or later is required (Bases public API with group-by support) Enable the Bases core plugin before opening TaskNotes views Run Settings → TaskNotes → General → Create Default Files if you need fresh .base files Use Export All Saved Views to Bases to convert any legacy FilterBar saved views into .base files The Relationships widget uses TaskNotes/Views/relationships.base; adjust that file to change what appears inside notes Breaking Changes# The old FilterBar UI has been removed—all filtering and saved views live in .base files Legacy widget settings (showProjectSubtasks, showTaskDependencies, etc.) were replaced with showRelationships and relationshipsPosition Task view commands now fail if their mapped .base file is missing; configure paths under Settings → TaskNotes → General → View Commands Priority sorting now uses alphabetical order instead of custom weights In v3, TaskNotes used priority \"weights\" to determine sort order (higher weight = higher priority) In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value The weight field has been removed from the settings UI Workaround: Name your priority values to sort alphabetically in your desired order Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Agenda view has been replaced by the list view in Calendar Grouping is not supported in this view, so the \"Overdue\" group is no longer provided A separate \"Overdue\" view is available in the \"Task List\" base file Known Issues# Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views Details# Added# Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create) Kanban Swimlane Layout with horizontal grouping and configurable column widths Saved View Converter button in settings to convert v3 saved filter views to .base files Context menus for time entries and ICS events in calendar views Calendar icon to ICS event titles for better visual distinction Hover tooltips for timeblocks in calendar views MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution Configurable task modal fields with drag-and-drop reordering in new \"Modal Fields\" settings tab Rich markdown editor for NLP task creation with syntax highlighting and wikilink support Customizable NLP triggers with autocomplete and keyboard navigation Inline task link overlay enhancements with configurable visible properties Kanban column reordering via drag and drop with saved order per grouping property Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs Updated task card styling with improved hover effects, shadows, and gradient accents (#361) Completion-based recurrence support with recurrence_anchor field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Support for skipped recurrence instances with skipped_instances field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups Documentation for default Bases templates showing all default .base file templates with examples Changed# All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with .base files Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling Reorganized settings tabs with OAuth calendar settings in Integrations tab Refactored Bases integration to use public API and trust pre-sorted data Refactored calendar modules to use ES6 imports instead of lazy require() calls Time entry events now show task context menu on right-click Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data Completed internationalization with 100% translation coverage across all 6 supported languages Migrated to i18n-state-manager CLI tool for improved translation management Bases view templates now generate dynamically based on user settings with adaptive task filters Updated Bases CalendarView to show TaskNotes in property-based events NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage Simplified TaskCard interface and refactored TaskLinkWidget for consistency Settings UI enhancements with NLP triggers configurable through Features tab Refactored Bases views to use Component lifecycle properly with automatic cleanup Improved development experience by converting ESLint errors to warnings Renamed \"Advanced Calendar\" to \"Calendar\" throughout the UI Improved timeblock visual styling in calendar views with reduced border width and softer shadows Updated \"Export All Views\" button to \"Export V3 Views\" to clarify it migrates v3 saved views Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys Changed default Tasks List template view order with \"All Tasks\" first and added \"Unscheduled\" view Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" - Thanks to @jack2game for reporting Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags Fixed Bases property mapping for user-configured field names Fixed Bases views not respecting user-configured visible properties Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot Fixed \"Highlight today\" toggle and calendar view type persistence in Bases Calendar view options (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata Fixed group collapse/expand functionality in TaskListView Fixed config loading race condition in KanbanView and CalendarView Fixed MiniCalendarView to use direct Bases API like other views (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings slider range Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting (#1133) Fixed empty priority columns not showing in Kanban view when \"Hide empty columns\" is disabled - Thanks to @luckb0x for reporting Fixed OAuth calendar cards showing \"Unknown account\" by removing non-functional Account field - Thanks to @Oblique for reporting Fixed incorrect Bases syntax in default template files with correct parameter naming Fixed incorrect Bases syntax in \"Export V3 Views\" feature with correct YAML structure (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting (#1043) Fixed inability to set \"at time of event\" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting (#1055) Fixed break sessions being logged as type: work when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting Fixed time entries not showing in calendar view for tasks without scheduled or due dates (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting (#1086) Fixed calendar \"+more\" popover showing white text on white background in dark mode - Thanks to @same774 for reporting (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Removed legacy FilterBar UI - all filtering now lives in .base files Removed legacy views"},{"title":"TaskNotes 4.0.2","url":"/obsidian/releases/4.0.2/","description":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have repor...","product":"obsidian","text":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks. Added# Added \"Not Blocked\" view to default task list template Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies) Uses Bases list.filter() to check completion status of each blocking task This new view can be accessed by regenerating the Task List view, or by copying the filters from the default base templates documentation Fixed# (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration Default Kanban template now automatically includes groupBy property set to status Resolves \"Kanban requires a 'Group by' property to be configured\" error on first use Users no longer need to manually configure grouping through the Sort menu Thanks to @randomness42 and @seepage87 for reporting Fixed user-defined custom fields appearing as user:field_xxx in generated base templates Custom fields now use their actual property names (e.g., effort instead of user:field_1761435303709) Ensures Bases can properly query user-defined properties Also fixed totalTrackedTime to correctly map to the configured timeEntries property name (#1145) Improved Kanban error message when no 'Group by' property is configured Now includes instructions: \"Click the 'Sort' button and select a property under 'Group by'\" Thanks to @randomness42 for the suggestion (#1139, #1141) Fixed relationships widget not appearing in project notes Project references are now resolved to full file paths when indexing Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths Restores v3.x behavior where subtasks appear in parent project notes Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing Fixed dependency blocking status to be status-aware \"Blocked (x)\" pill now only appears when tasks have incomplete blocking dependencies Tasks with all completed blocking dependencies no longer show as blocked Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks When a task is modified, only forward dependencies are cleared (stored in its frontmatter) Reverse dependencies are preserved (stored in other tasks' frontmatter) Changed# Removed custom TaskNotes icon from task modals Task creation and edit modals now use Obsidian's standard title styling Thanks to @kepano for the suggestion Moved default base templates documentation to docs/views/ Location: docs/views/default-base-templates.md Added cross-references to official Obsidian Bases documentation Updated code comments to reference new documentation path Fixed incorrect quote escaping in default base templates documentation YAML examples now use proper single quotes for strings containing double quotes"},{"title":"TaskNotes 4.0.3","url":"/obsidian/releases/4.0.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists Changed inline task cards to use span elements instead of divs for proper inline flow Added max-width constraint to prevent wrapping when tasks are wider than editor Task embeds now display correctly inline with bullet points during live preview Thanks to @3zra47 for reporting (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar Thanks to @DearHaruHaru for reporting (#1161, #1162) Fixed \"unexpected scalar\" YAML parsing error in generated tasks-default.base template Changed nested quotes in \"Not Blocked\" filter from double to single quotes Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix Changed# Updated task modal UI to use native Obsidian patterns for better theme compatibility Thanks to @kepano for feedback"},{"title":"TaskNotes 4.0.4","url":"/obsidian/releases/4.0.4/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals Thanks to @luckb0x, @hamlim and @nightroman for the feature requests Fixed# (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks Prevents cards from extending beyond column boundaries before virtualization activates Thanks to @lomarcanys for reporting (#1177) Bases views now anchor recurring completion and calendar navigation to the right date Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of \"today\" (fixes complete_instances) Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps Thanks to @nslee123 for flagging the issue Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day Corrected all-day end date calculation to prevent off-by-one spans Added regression test for the UTC anchor behavior Thanks to KaCii for flagging the issue Changed# Refactored plugin styling to better align with Obsidian's native UI conventions Replaced all cursor: pointer with cursor: var(--cursor) (100+ instances) to follow Obsidian's cursor convention Removed forced border: none; box-shadow: none rules that were fighting against Obsidian's native button styling Scoped custom .tn-btn button system to settings modal only (.mod-settings), allowing Obsidian's native button styles to work elsewhere Thanks to @kepano for guidance"},{"title":"TaskNotes 4.0.5","url":"/obsidian/releases/4.0.5/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# (#790) Task edit modal now shows unresolved project links with appropriate styling Similar to how dependencies are displayed, unresolved projects now appear with visual indication Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved Thanks to @aubreyz for reporting Fixed# (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks Project index was incorrectly adding all linked files instead of only files referenced in the projects field Now properly parses the projects field and only indexes those specific files as projects Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution Thanks to @craziedde for reporting (#1200) Fixed kanban drag & drop not updating task properties correctly Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks) Previously, kanban updates bypassed updateProperty and directly modified frontmatter Thanks very much to @tvoklov for the PR (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries Configure CodeMirror tooltips to render in document.body instead of constrained editor container Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height Thanks to @Andrei-Ioda for reporting (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor Remove padding-left override on .cm-line to allow CodeMirror decorations (checkboxes, indentation) to render properly Content padding is now handled by .cm-content while .cm-line uses natural spacing Thanks to @nightroman for reporting Fixed relationships widget not appearing on project notes without frontmatter Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter Fixed task card and relationships widgets not appearing when opening notes in source mode Removed live preview mode restriction to allow widgets to render in both source and live preview modes (#901) Fixed calendar view toolbar buttons overflowing on narrow screens Added flex-wrap: wrap to calendar header toolbar to allow buttons to wrap to multiple lines Thanks to @RumiaKitinari for reporting (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences Calendar view initialization now correctly uses plugin.settings.calendarViewSettings as the fallback Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting Fixed calendar to ensure that it respects user's locale Tries to use calendar locale, then tries UI language, then system language, then falls back to English (#1043) Fixed default reminders with \"at time of event\" (0 offset) not being applied to tasks UI was displaying \"1\" instead of \"0\" for zero-offset reminders in settings Thanks to @dblinnikov for reporting (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords Manually typing status trigger + label now correctly parses (e.g., *Done when label is Done) Status values containing temporal keywords no longer misparsed as dates (e.g., Expedite = Now) Thanks very much to @renatomen for the PR (#1212) Fixed \"Show release notes on update\" toggle not saving correctly Thanks to @Jon-dog for reporting (#1197) Add Portuguese language to list of translations in general tab settings Allows users to select the Portuguese translation option Thanks to @andysteel for the PR Fixed file properties displaying incorrectly in Bases views File properties like file.name, file.basename, file.size, etc. were showing as \"Title\" or returning null Now correctly extracts and displays all file properties from Obsidian's file metadata Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)"},{"title":"TaskNotes 4.1.0","url":"/obsidian/releases/4.1.0/","description":"(#1245), (#793) Added custom icon support for task statuses","product":"obsidian","text":"Added# (#1245), (#793) Added custom icon support for task statuses Configure a Lucide icon name (e.g., check, circle, clock) per status in Settings → Task Properties → Task Statuses Icons display instead of the colored dot, inheriting the status color Browse available icons at lucide.dev Improves accessibility by allowing shape-based status differentiation Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators (#1259) Added Property Types Reference documentation Documents expected data types (text, list, date, number) for all frontmatter properties Includes format specifications, examples, and a complete YAML reference Thanks to @Oblique82 for the suggestion (#1248) Added formula property support for sub-grouping in Bases Task List view Formula properties (e.g., formula.myFormula) now appear in the Sub-group by dropdown Supports all Bases Value types including strings, numbers, booleans, dates, and lists Thanks to @prayidae for the feature request (#1070) Added formula property support for swimlanes in Bases Kanban view Formula properties now appear in the Swim Lane dropdown Fixed swimlanes displaying empty when grouping by formula properties Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values) Thanks to @cathywu for reporting (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views Shift+click to select multiple tasks Right-click selected tasks to open batch context menu Batch operations: change status, priority, due date, scheduled date, archive, delete Drag multiple selected cards in Kanban to move them together Click the selection count indicator to clear selection Thanks to @jalooc and @solidabstract for the feature requests (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar) Enable via \"Enable search box\" toggle in view settings Searches across title, status, priority, tags, contexts, projects, and visible custom properties Press Escape or click × to clear search Thanks to @renatomen for the PR (#363) Added \"Create or open task\" command with NLP-based quick task creation Open via command palette or assign a hotkey Search existing tasks or type natural language to create new tasks (e.g., \"Buy groceries tomorrow #shopping\") Press Enter to select an existing task, Shift+Enter to create a new task Real-time preview shows parsed title, due date, priority, tags, and other metadata Can be used when adding sub-tasks to create sub-tasks on-the-fly Thanks to @luciolebrillante for the feature request (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal Detects modifications to any field (title, dates, priority, tags, etc.) Shows confirmation dialog with Save/Discard/Keep Editing options Prevents accidental data loss from clicking outside the modal or pressing Escape Thanks to @renatomen for the PR and @0-BSCode for the feature request (#904) Added visual highlighting for overdue and past dates on task cards Overdue due dates now display in red text Past scheduled dates now display in blue text Thanks to @ras0q for the suggestion (#1164) Added priorityWeight formula to all default Bases templates for priority-based sorting Formula maps each priority value to a numeric weight based on your custom priority configuration Sort by formula.priorityWeight in ascending order to get highest priority tasks first Example: if(priority==\"high\",0,if(priority==\"normal\",1,if(priority==\"low\",2,999))) Thanks to @jhedlund for the suggestion (#1257), (#1064) Added configurable event stacking options for Bases Calendar view Allow events to overlap: Toggle whether timed events visually overlap or display side-by-side in week/day views Max stacked events: Limit horizontal event stacking in week/day views (0 = unlimited) Max events per day: Limit events shown per day cell in month view (0 = auto based on cell height) Max event rows per day: Limit event rows per day cell in month view (0 = unlimited) Configure per-view in the Bases Calendar view settings under Layout Thanks to @3zra47 and @hasanyilmaz for the feature requests Changed# Improved inline task conversion to merge TasksPlugin and NLP parsing results Previously, if a task had hashtags (e.g., - [ ] Buy milk tomorrow #groceries), NLP parsing was skipped entirely Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values Tags, contexts, and projects from both sources are combined and deduplicated Polished task card styling for a more native Obsidian look Simplified hover and focus states to use native Obsidian colors Removed blur filter and shadows from metadata pills Fixed subtask chevron vertical alignment with status dot Reduced swimlane label column width in Kanban view (#1151) Increased mini calendar heatmap color intensity for better visibility Days with notes now show more noticeable colors, especially with low note counts Intensity levels increased from 10/25/45/65% to 25/40/55/70% Thanks to @arreme for the suggestion Fixed# (#1271) Fixed custom user fields not appearing in task modals after creation New custom fields are now automatically added to both creation and edit modals Deleting a custom field also removes it from modal configuration Updating a field's display name syncs to the modal configuration Thanks to @craziedde for reporting (#1256) Fixed links in custom properties not rendering as clickable in task cards Wikilinks ([[Note]]) now render correctly in Bases views Markdown links ([text](url)) now render correctly in all views Links in list-type properties are also properly rendered Thanks to @3zra47 for reporting (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed Thanks to @3zra47 for reporting (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist Thanks to @Anthonyhunter100 for reporting (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column Tasks with multiple values now appear in each individual column (e.g., a task with contexts: [work, call] appears in both \"work\" and \"call\" columns) Added \"Show items in multiple columns\" option (enabled by default) to control this behavior Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list Fixed swimlane mode to also respect list property explosion Thanks to @dictionarymouse for reporting (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab Added middle-click support for opening in new tab Thanks to @diegomarzaa for reporting (#1265) Fixed task edit modal corrupting markdown-style project links on save Links like [Project Name](path.md) were being wrapped in extra brackets: [[[Project Name](path.md)]] Plain text project names are now preserved as-is instead of being converted to wikilinks Markdown-style project links now resolve properly and display as linked (not orange/unresolved) Thanks to @minchinweb for reporting (#1266) Fixed Kanban view scroll position resetting to top of column after any change Clicking status dots, priority, or other task properties no longer jumps the column back to top Scroll position is now preserved for both regular columns and swimlane cells Thanks to @essouflenfer for reporting (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects Tags like #investigación were being truncated at accented characters (e.g., #investigaci) Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., @家, #杂事, @ознакомиться) Parser now uses Unicode-aware regex patterns to support all languages and scripts Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting (#1249) Fixed project preview in task creation modal showing quadruple brackets ([[[[Project]]]]) Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display Thanks to @2vzqwz8tvg-png for reporting (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive Priority cards are now draggable to reorder (like statuses) Priorities are displayed in weight order (lowest to highest priority) New priorities are added at the end (highest priority) instead of with a fixed weight Thanks to @2vzqwz8tvg-png for reporting (#1272) Fixed recurrence anchor not being saved when set to \"completion\" during task creation Selecting \"completion\" as the recurrence anchor now correctly persists to the task frontmatter Thanks to @blaxcky for reporting (#1128) Fixed NLP parser not allowing slashes in context names Contexts like @shopping/groceries were being split into @shopping and /groceries Hierarchical context names now work the same as tags and projects Thanks to @wealthychef1 for reporting (#1170) Fixed dateCreated and dateModified not using custom property names when creating notes from calendar events Notes created from ICS events now respect the field mapping configured in settings Thanks to @maddie-m for reporting (#1171) Fixed calendar event toggles not responding to changes after initial load Toggling \"Show scheduled tasks\", \"Show due tasks\", and other event filters now correctly updates the calendar Previously, changing these toggles had no effect until the view was reloaded Thanks to @hangryscribe3 for reporting (#1198) Fixed project links being created relative to the wrong file when editing from Bases views Relative paths in project links are now correctly resolved relative to the task note file Previously, editing a task from a Bases view would create project links relative to the .base file Thanks to @minchinweb for reporting"},{"title":"TaskNotes 4.1.1","url":"/obsidian/releases/4.1.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1277) Icon autosuggestion for custom status settings Type to search through all available Lucide icons Thanks to @Arachnidai for the suggestion New formula properties in default Base templates Date calculations: daysUntilDue, daysUntilScheduled, daysSinceCreated, daysSinceModified Boolean helpers: isOverdue, isDueToday, isDueThisWeek, isScheduledToday, isRecurring, hasTimeEstimate Time tracking: timeRemaining, efficiencyRatio, timeTrackedThisWeek, timeTrackedToday, timeTrackedFormatted Grouping: dueMonth, dueWeek, scheduledMonth, scheduledWeek, dueDateCategory, timeEstimateCategory, ageCategory, createdMonth, modifiedMonth, priorityCategory, projectCount, contextCount, trackingStatus Combined due/scheduled: nextDate, daysUntilNext, hasDate, isToday, isThisWeek, nextDateCategory, nextDateMonth, nextDateWeek - work with whichever date comes first Sorting: priorityWeight, urgencyScore (combines priority with date proximity) Display: dueDateDisplay (relative dates like \"Today\", \"Tomorrow\", \"3d ago\") Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first See Default Base Templates documentation for full details Note: To get these new formulas, either copy them from the documentation, or delete your .base files in TaskNotes/Views/ and restart Obsidian to regenerate them Changed# (#1282) Added spacing between task title and metadata in inline task widgets for improved readability Thanks to @3zra47 for the suggestion Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals) Added embedded video guide for Google Calendar OAuth setup in documentation Thanks to @antoneheyward for the tutorial Fixed# (#1279) Fixed Kanban column width setting not being respected on mobile devices Thanks to @guncav for reporting (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening The bug caused complete_instances to record the next day instead of the user's current calendar day Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps"},{"title":"TaskNotes 4.1.2","url":"/obsidian/releases/4.1.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# Significant performance improvements for Bases views (TaskList, Kanban, Calendar) Reduced extractDataItems time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks) Computed file properties (file.backlinks, file.links, etc.) are now fetched lazily during render instead of upfront Only visible items (with virtualization) trigger expensive property computations Added debouncing to onDataUpdated to prevent UI freezes during typing Timeblock generation now uses Obsidian's metadataCache instead of file reads Added date range filtering for calendar events to skip events outside visible range (#1285) Calendar view uses 5-second debounce to prevent flickering while typing Thanks to @steven-murray for reporting Calendar view switching (month/week/day/list) is now much faster View type is now saved on unload instead of on every change Fixed task edit modal archive button being too narrow on mobile devices (#1319) Added missing properties to Field Mapping settings recurrence_anchor - now in Settings > Task Properties > Task Details skipped_instances - now in Settings > Task Properties > Metadata Properties Thanks to @kazerniel for reporting (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits Text that cannot fit in the filename is now preserved in the task note's body Thanks to @prayidae for reporting (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible Thanks to @Richard-UMPV for reporting (#1317) Fixed project autosuggest filters not working correctly when only \"Required Property Key\" is configured NLP + trigger now properly filters by property existence when no property value is specified Modal \"Add to project\" button now shows consistent results with inline autosuggest Thanks to @JacksonMcDonaldDev for reporting (#1287), (#1307) The \"New\" button in Bases views now opens the TaskNotes creation modal Tasks created from Bases views now respect default properties (status, priority, etc.) Tasks are now created in the configured default folder instead of the views folder Thanks to @anareaty and @sylvainfct-dot for reporting (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI Added instructions for configuring via Azure manifest editor Thanks to @PlecotusAustriacus for reporting Added# (#803) New command \"Convert current note to task\" to add task properties to an existing note Thanks to @GardarikanetS and @diegomarzaa for suggesting (#1080) Custom user fields now support default values Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list Defaults are applied when creating tasks via modal, instant conversion, \"Create or open task\" command, or HTTP API Thanks to @bradyrx for suggesting Changed# Added documentation link to settings panel (links to tasknotes.dev) Reorganized settings panel for improved discoverability Removed \"Defaults\" tab - default values are now configured alongside each property in the Task Properties tab Moved task filename format settings to the Title property section Moved project autosuggest settings to the Projects property section Body template setting moved to the Features tab Added descriptions to each property explaining its purpose Moved \"Folder for converted tasks\" setting to General tab under Task Storage for better discoverability Updated setting description to clarify that leaving empty uses the default tasks folder"},{"title":"TaskNotes 4.1.3","url":"/obsidian/releases/4.1.3/","description":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals.","product":"obsidian","text":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals. Added# Split layout for task modals on wide screens (900px+) Details editor appears in a dedicated right column when the modal is expanded New setting \"Split layout on wide screens\" in Modal Fields settings tab to toggle this behavior Improves usability by showing form fields and details side-by-side Fixed# (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions Initial calendar load is now immediate again User interactions (drag/drop, creating timeblocks, etc.) respond instantly Removed redundant date filtering (FullCalendar handles this more efficiently) Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting"},{"title":"TaskNotes 4.10.0","url":"/obsidian/releases/4.10.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# New companion plugin: TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See TaskNotes Workflows. (#1530) Auto-start time tracking starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up. (#222, #184) Stop time tracking on complete stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up. (#265) Stamp started timestamp records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion. (#1703) Clear scheduled when started clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request. (#1293) Rollover overdue scheduled tasks moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request. (#1896) Escalate upcoming due tasks raises priority as due dates approach. Thanks to @Neptune-Illusion for the request. (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion. (#1166) Blocked task review provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up. Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See JavaScript API. Added documentation for the companion-plugin model. See Companion Plugins. (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See Recurring Tasks and Property Types Reference. Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests. (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request. (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs. Changed# Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling. Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's occurrence_date identity. See Recurring Tasks. Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode. Fixed# (#1976) Fixed embedded Calendar and Agenda Bases so \"Navigate to date from property\" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this. (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this. Fixed the release notes view using cramped interface typography instead of regular reading typography. (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion. (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events. (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this. (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this. (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views. (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue."},{"title":"TaskNotes 4.10.1","url":"/obsidian/releases/4.10.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser. (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default .base files from the current TaskNotes templates. Thanks to @businessBoris for the request. (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap. Fixed# (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots. (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this. (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting. (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor. (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting. (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this."},{"title":"TaskNotes 4.10.2","url":"/obsidian/releases/4.10.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this. (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this."},{"title":"TaskNotes 4.11.0","url":"/obsidian/releases/4.11.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#730, #1897, #1942, #1998) Added Canvas Bases, an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See Canvas Bases for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion. Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views. Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu. (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split. (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level occurrence_template support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request. (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See Pomodoro View for the timer behavior. Thanks to @abbiefalls90 for suggesting this. (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See Integrations Settings for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion. Changed# (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback. (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this. Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission. Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes. Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans. Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened. Fixed# (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this. (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this. (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this. (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this. (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this. (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this. Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped blockedBy property from the note."},{"title":"TaskNotes 4.11.1","url":"/obsidian/releases/4.11.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an Occurrences tab. See Relationships Widget. Thanks to @3zra47 for requesting this. (#2022) Added a Skip instance / Unskip instance action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See Recurring Tasks. Thanks to @AmonAmarthFTW for requesting this. (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this. (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this. (#2060) Added date-type custom fields to the task right-click menu under Custom dates. Thanks to @chmac for requesting this. (#2067) Added an Edit task action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this. (#2068) Added reminders input support to the MCP tasknotes_create_task and tasknotes_update_task tools. Thanks to @Spirit597 for requesting this. (#2069) Added an Add project action to the Quick Actions palette. Thanks to @chmac for requesting this. Fixed# (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report. (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this. (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this. (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this. (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this. (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this. (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this. (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this. (#2079) Fixed the reminder modal's Absolute tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue. Changed# Improved local review checks so unsafe direct Object.prototype method access is caught before submission."},{"title":"TaskNotes 4.2.0","url":"/obsidian/releases/4.2.0/","description":"Added Korean (한국어) language support","product":"obsidian","text":"Added# Added Korean (한국어) language support Full translation of all 1911 localization keys Korean language option now available in Settings → General → Language Adopted Obsidian 1.11.0 API features with backwards compatibility Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+) Settings sections now use native SettingGroup for improved visual grouping (Obsidian 1.11.0+) Falls back gracefully to traditional section headers on older Obsidian versions (#59) Added shortYear template variable for custom filename and folder templates Use {shortYear} in filename templates (e.g., \"25\" for 2025) Use {{shortYear}} in folder templates Thanks to @Pixeltica for the feature request (#1393) Option to prevent auto-creation of default Base view files on startup New \"Auto-create default files\" toggle in Settings → Integrations → Bases Integration When disabled, deleted sample Base files will not be recreated on plugin load The manual \"Create Default Files\" button remains available for on-demand recreation Thanks to @wealthychef1 for the feature request (#1408) Shift+click on status icon to cycle backwards through statuses Normal click cycles forward through status order Shift+click cycles in reverse order Thanks to @JerryLu086 for the feature request (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled Previously required pressing 'i' before typing when Obsidian vim mode was active The modal now automatically enters insert mode on focus, allowing immediate typing Thanks to @Leo310 for the feature request Added button tooltips to calendar view toolbar Hovering over navigation and view buttons now shows descriptive hints Buttons include: Today, Previous, Next, Month, Week, Day, Year, List Added tooltips to task modal action icons Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover Improves discoverability for new users (#503) Settings now sync automatically across devices via Obsidian Sync Changes to custom statuses, priorities, and other settings apply immediately without restart Thanks to @jhedlund for the feature request and @l-mb for the implementation (#1403) Kanban view option to consolidate status icons in column headers New \"Show status icon in column header only\" toggle in Kanban view settings (disabled by default) When enabled and grouped by status, shows the icon in the column header and hides it on cards Reduces visual redundancy when the column already indicates the status Thanks to @l-mb for the feature request and implementation (#1401) Calendar view option to span tasks between scheduled and due dates New \"Span tasks between scheduled and due dates\" toggle in Calendar view Layout settings When enabled, tasks with both scheduled and due dates display as multi-day bars Provides Gantt chart-style visualization for project planning Thanks to @0atman for the feature request (#1334) {{currentNotePath}} now works for \"Create new inline task\" command The inline task folder setting with {{currentNotePath}} previously only worked for checkbox conversion Now also applies when using the \"Create new inline task\" command from the command palette Thanks to @kmaustral for the feature request (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel New \"Mobile sidebar\" setting in Settings → Features → Pomodoro Timer Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar Allows quick swipe access to the timer without switching notes on mobile devices Thanks to @Evthestrike for the feature request (#1220) Option to use ICS event end time as task due date New \"Use ICS event end time as task due date\" toggle in Settings → Integrations → Calendar Subscriptions When enabled, tasks created from calendar events will have their due date set to the event's end time For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec) For timed events, includes the exact end time Defaults to disabled to preserve existing behavior Thanks to @MiserMagus for the feature request (#1108) Option to use task duration instead of due date for ICS calendar export New \"Use task duration for event length\" toggle in Settings → Integrations → Automatic ICS Export When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines When disabled (default), preserves existing behavior using due date as DTEND Thanks to @bepolymathe for the feature request Fixed# (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified Input like \"Task scheduled for tomorrow due next week\" now correctly sets both scheduled and due dates Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers Thanks to @wealthychef1 for reporting (#1384) Fixed title being sanitized even when \"Store Task Title in Filename\" is disabled Characters like ?, <, >, :, etc. are now preserved in task titles when they won't be used in filenames When storeTitleInFilename is false, only minimal sanitization (whitespace normalization, control character removal) is applied Thanks to @allison-casey for reporting (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon Changed default Agenda template to disable property-based events (showPropertyBasedEvents: false) Users can re-enable property-based events in view settings if needed for non-task date properties Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting (#1386) Fixed timeEstimateCategory formula showing \"Long (>2h)\" instead of \"No estimate\" for new tasks The condition didn't properly handle null values when timeEstimate property is unset Also fixed the same issue in trackingStatus formula Thanks to @nicou for reporting and @osxisl for the PR (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes Also fixed CalendarView corrupting other view files when saving state on unload Thanks to @music-soul1-1 for reporting (#1398) Fixed overdue strikethrough showing on completed tasks Completed tasks with past due dates no longer display overdue styling Respects the \"Hide completed from overdue\" setting which defaults to true (#1363) Fixed calendar view showing nothing when a task has an invalid date format Tasks with malformed dates (e.g., \"262025-12-16\" instead of \"2025-12-16\") no longer crash the entire calendar Invalid tasks are now skipped with a console warning, allowing other events to display normally Thanks to @Erelen for reporting Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent Today's column now uses a tint of the theme accent color for consistent styling (#1399) Fixed drag-and-drop not working in Kanban view on mobile Cards and columns can now be dragged using long-press gesture on touch devices Includes haptic feedback and auto-scroll when dragging near edges Thanks to @l-mb for reporting and the fix (#1381) Fixed Pomodoro \"Change Task\" menu not showing newly created tasks Tasks created while the Pomodoro view was open would not appear in the task selector Improved metadata cache synchronization to properly wait for new files to be indexed Thanks to @Ghosthael for reporting (#1344) Fixed \"Unsaved Changes\" popup appearing randomly when closing task edit modal The popup would appear even when no changes were made to the task Caused by inconsistent trailing whitespace normalization when comparing details content Thanks to @hasanyilmaz for reporting (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula After editing task metadata, cards would jump to \"None\" column until Obsidian reload Column assignment now uses Bases' computed grouping instead of cached formula outputs Thanks to @bailob for the fix (#1352) Fixed date context menu not preserving time when using increment options Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., 2025-12-10T16:00) now preserves the time Previously the time would be stripped, changing 2025-12-10T16:00 to 2025-12-11 instead of 2025-12-11T16:00 Thanks to @cathywu for the feature request Fixed v3 saved views exporting incorrectly to Bases format Title filters now correctly use file.name instead of note.title Archived filters now generate valid boolean expressions instead of malformed comparisons \"Is Blocked\" filters now generate correct expressions with proper operator precedence (#1036) Due dates can now be dragged in the calendar view Previously only scheduled dates were draggable; due dates were locked in place Dragging a due event now updates the task's due date property Thanks to @same774 for reporting Improved calendar view responsiveness for user interactions Task creation, editing, timeblock changes, and view option toggles now update immediately Previously these actions waited 5 seconds due to the debounce intended for external file changes The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing Improved visual affordance for Pomodoro timer duration adjustment buttons The +/- buttons below the timer now have visible backgrounds and borders Hover states show accent color border for clearer interactivity feedback Previously buttons were nearly invisible with transparent backgrounds (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows Drag-and-drop in Kanban view now works correctly when the view is in a new window Context menus (status, priority, task) now work correctly in pop-out windows Stats view drill-down modal now appears in the correct window Search boxes, task cards, and grouped task lists render correctly Root cause: Code was using global document and standard instanceof checks which fail across windows Solution: Use ownerDocument for DOM operations and Obsidian's cross-window instanceOf() method Known limitation: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global document for mouse event listeners. Use context menus or edit modals as a workaround. Updated FullCalendar to v6.1.20 Thanks to @Snakiest, @same774, and @3zra47 for reporting (#1337) Fixed \"Convert current note to task\" hotkey not applying default values from settings When user configured default status/priority as \"None\", the modal would show \"Open\" and \"Normal\" instead Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults Now preserves constructor-provided task data when converting non-task files Thanks to @guihasparyk for reporting (#1304) Fixed \"Cannot find function map on type Link\" error in Blocking view Error occurred when embedding the Relationships base and opening the Blocking view Root cause: When blockedBy contained a single dependency, Bases returned it as a Link object without a .map() method Fixed by wrapping blockedBy with list() before calling .map(), consistent with the Blocked By view Thanks to @prayidae for reporting (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev The page existed but was not accessible from the site navigation Thanks to @Arachnidai for reporting (#1223) Fixed \"Go to today's note\" command opening wrong date in positive UTC offset timezones In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note Root cause: Incorrectly extracting UTC date components instead of local timezone date Thanks to @BrucePlumb for reporting"},{"title":"TaskNotes 4.2.1","url":"/obsidian/releases/4.2.1/","description":"(#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder","product":"obsidian","text":"Added# New Calendars API endpoint for access to calendar data Access calendar provider information and connection status Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions Filter events by date range tasknotes-cli has been updated to make use of this endpoint Fixed# (#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder \"Create New Task\" now correctly uses the configured default task folder \"Create New Inline Task\" continues to use the inline task folder setting Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified Entering something like \"task due Jan 9 at Jan 9\" now correctly sets both the due date and scheduled date Thanks to @wealthychef1 and @dblinnikov for reporting (#1410) Fixed vim insert mode not activating in task creation modal The modal now correctly enters insert mode when vim keybindings are enabled Thanks to @Leo310 for the feature request (#1422) Fixed tags with dashes not being parsed correctly Tags like #my-tag were being truncated to #my Thanks to @JerryLu086 for reporting (#1419) Fixed custom statuses and priorities not saving in settings Values entered in text fields were sometimes lost when closing the settings modal Thanks to @s33a for reporting"},{"title":"TaskNotes 4.3.0","url":"/obsidian/releases/4.3.0/","description":"(#1361) Option to disable inline task overlay for aliased wikilinks","product":"obsidian","text":"Changed# (#1437) Unified template variable syntax and available variables across filename and body templates Both systems now use double-brace {{variable}} syntax consistently Single-brace {variable} syntax remains supported for backwards compatibility but is deprecated Settings UI shows a warning when deprecated single-brace syntax is detected Filename templates gain body template variables: {{contexts}}, {{tags}}, {{hashtags}}, {{timeEstimate}}, {{details}}, {{parentNote}} Body templates gain filename template variables: {{zettel}}, {{nano}}, and all extended date/time variables Thanks to @23maverick23 for reporting Added# (#1361) Option to disable inline task overlay for aliased wikilinks New setting in Features → Inline Tasks: \"Disable overlay for aliased links\" When enabled, links with aliases like [[Task|Check Status]] render as plain links Links without aliases continue to show the interactive task widget Useful when embedding tasks in prose where the widget would be disruptive Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117 (#1199, #1205) Google Calendar export for tasks Sync tasks to Google Calendar based on scheduled or due dates Automatic sync on task create, update, complete, and delete Configurable event title templates with placeholders ({{title}}, {{status}}, {{priority}}, etc.) Event descriptions include task metadata and optional Obsidian deep link Support for all-day or timed events with customizable duration Event color customization using Google Calendar's color palette Default reminder setting for popup notifications Bulk sync and unlink actions in settings Task-event linking stored in frontmatter (googleCalendarEventId) Recurring tasks sync as Google Calendar recurring events Completed or skipped recurring instances are automatically excluded Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input Fixed# (#1413) Fixed angle-bracket links and project title display Angle-bracket links like [Spec]() now resolve correctly Project links display frontmatter title instead of raw filename/path when available Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants Many thanks to @normenmueller for the contribution (#1414) Kanban column headers now display configured priority labels instead of raw values Many thanks to @normenmueller for the contribution (#1416) Fixed property-based task identification mutating tags unexpectedly Tags are only written when explicitly changed by the user Task tag is only added in tag-based identification mode Fixes #1391 Thanks to @loukandr for reporting and @normenmueller for the fix (#1187) Fixed \"Unknown view types\" error when opening Bases views after upgrading from pre-V4 Users who had disabled Bases support in earlier versions could not open Bases views after upgrading Settings migration now automatically re-enables Bases support since the toggle was removed in V4 Thanks to @MiracleXYZ for reporting (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs The top-level task filter was excluding non-task files from the Projects view Projects can be any file type (not just tasks), so the filter is now applied per-view Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not Users with existing relationships.base files should delete and regenerate them to get the fix Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution Fixed calendar view type not persisting or applying when changed View type changes via header buttons (week/day/month) are now saved to the .base file View type changes via Bases settings panel now apply immediately without reload (#1441) Fixed task dragging broken with \"Span tasks between scheduled and due dates\" enabled Span events can now be dragged to move tasks in time Dragging shifts both scheduled and due dates proportionally, preserving the span duration Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position Thanks to @Peeeet for reporting"},{"title":"TaskNotes 4.3.1","url":"/obsidian/releases/4.3.1/","description":"(#1546) Added sticky kanban column headers that remain visible while scrolling","product":"obsidian","text":"Added# (#1546) Added sticky kanban column headers that remain visible while scrolling Thanks to @normenmueller for the contribution (#1458) Added CSS color classes to context tags for custom styling Each context tag now receives a unique CSS class based on its name (e.g., context-tag--color-0 through context-tag--color-19) Enables styling individual contexts via CSS snippets Thanks to @phortx for the contribution Added mdbase-spec type definition generation New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (mdbase.yaml and _types/task.md) at the vault root Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change Enables interoperability with other tools that support the mdbase-spec format Fixed# (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter Dependencies now retain their [[wikilink]] format when saved, preventing them from breaking on file rename Thanks to @renekalff for reporting (#1443) Fixed default status/priority not updating when the referenced custom value is deleted Deleting a custom status or priority that was set as the default now resets the default to the first available value Thanks to @l-mb for the contribution (#1448) Fixed project removals not persisting from the task edit modal Removing all projects from a task now correctly clears the projects field Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection Thanks to @normenmueller for the contribution (#1514), (#1517) Fixed task reminders not syncing to Google Calendar Task-specific reminders (both relative and absolute) now sync to Google Calendar Previously only the global default reminder setting was used, ignoring per-task reminders Thanks to @christenbc for the contribution (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked Status dot, checkbox, and card styling now update instantly when cycling status Thanks to @christenbc for the contribution (#1537) Fixed Google Calendar errors during bulk sync Added rate limiting to space out API calls, preventing errors when syncing many tasks at once Thanks to @Lorite for the contribution (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day Clearing recurrence from a task now also removes it from the synced Google Calendar event Thanks to @christenbc for the contribution (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., #project/sub-project) being truncated in link text Tags containing slashes, hyphens, and Unicode characters now render correctly Thanks to @normenmueller for the contribution and @ysafonov for reporting (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart The dropdown now re-populates once calendars are fetched during startup Thanks to @N-HEDGER for reporting (#1567) Fixed inline task card widgets disappearing momentarily When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link Thanks to @scztt for reporting (#1568) Fixed deleted tasks not being removed from Google Calendar When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically Thanks to @kmaustral for reporting Fixed Integrations tab spacing and layout issues Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections"},{"title":"TaskNotes 4.3.2","url":"/obsidian/releases/4.3.2/","description":"(#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus","product":"obsidian","text":"Added# (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus Previously required typing at least one character before suggestions appeared Already-selected values are excluded from the suggestion list Thanks to @Glint-Eye for the suggestion (#1506) Added setting to configure the default color for new timeblocks New color picker in Settings > Features > Timeblocking Previously hardcoded to indigo; now user-configurable Thanks to @phillipadsmith for the suggestion Fixed# Fixed mdbase-spec type definition generation not triggering when settings change (#1456) Fixed inline tasks jumping visually when marked as completed Thanks to @3zra47 for reporting (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances Thanks to @slipstyle for reporting (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder Thanks to @Jomo94 for reporting (#1470) Fixed cursor showing as default instead of pointer on interactive elements Thanks to @TheFrostedDev for reporting (#1491) Fixed boolean property values being quoted as strings in Bases filter generation When using a boolean property (e.g. tasknote: true) for task identification, the filter now correctly handles the value Thanks to @denisgorod for reporting (#1494) Fixed Kanban swimlane resetting to \"None\" on initial load and after navigation Thanks to @tnguyen2018 for reporting (#1555) Fixed \"Folder already exists\" error when creating tasks or converting inline tasks Thanks to @jkune5 for reporting (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height Thanks to @willfanguy for reporting (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view Thanks to @karenchoe428 for reporting (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large Thanks to @kazerniel for reporting (#1492) Fixed hardcoded \"open\" status leaking into filenames, recurring task displays, and parsing fallbacks Users with custom default statuses (e.g. \"inbox\") no longer see \"open\" where their configured default should appear Recurring tasks now show their actual configured status instead of always displaying \"open\" when not completed Thanks to @macdrifter for reporting (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior Added today indicator highlighting to list view day headers Thanks to @Robubble for the suggestion"},{"title":"TaskNotes 4.3.3","url":"/obsidian/releases/4.3.3/","description":"Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase","product":"obsidian","text":"Changed# Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase Works on the same vault and _types/task.md schema that TaskNotes generates, without requiring the plugin or HTTP API Preferable over tasknotes-cli as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL Extracted shared natural language parsing logic into the standalone npm package tasknotes-nlp-core The NLP parser and related language configuration are now shared through this package This keeps behavior consistent between the plugin and CLI tools Added# (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed When enabled, all checked checkboxes (- [x]) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled Useful for recurring tasks with subtask checklists that need to be repeated each instance Configurable via Settings > Features > Recurring Tasks > \"Reset checkboxes on recurrence\" Thanks to @phortx for the feature request (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view When clicking or dragging to select a time slot, a new \"Create calendar event\" option appears in the context menu Opens a modal to enter event title, description, location, and select which calendar to create on Supports both Google Calendar and Microsoft Calendar providers Thanks to @Robubble for the feature request (#1597) Added MCP server for AI agent integration Exposes TaskNotes tools at /mcp endpoint, gated behind enableMCP setting Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics Thanks to @dstotijn for the contribution Fixed# Fixed generated mdbase type definitions for task dependencies using the wrong field type In _types/task.md, blockedBy[].uid now uses type: link (was type: string) Better matches how dependency links are serialized in task frontmatter ([[...]]) Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data In _types/task.md, reminders[].type now uses enum values absolute|relative reminders[].relatedTo now uses enum values due|scheduled reminders[].absoluteTime now uses type: datetime (was type: string) (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data Thanks to @dstotijn for the fix (#1581) Fixed Pomodoro starting break instead of work session after app restart After completing a work session and restarting, pressing Start would incorrectly start a break Now properly resets nextSessionType when clearing stale sessions or stopping the timer Thanks to @Sirnii for the detailed bug report and root cause analysis (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height Added vertical scroll to modal content area while keeping buttons pinned at bottom Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion (#1600) Fixed kanban view grouping not working when more than 20 views exist The getGroupByPropertyId() method had a hardcoded loop limit of 20 iterations Views at index 20 or higher would not be found, causing groupBy to return null Thanks to @IHaveNoShame for reporting (#1595) Fixed task modal floating buttons blocking content on mobile Added mobile-specific (body.is-mobile) CSS to ensure proper flex layout Button container now stays pinned at bottom without overlapping scrollable content Thanks to @Jomo94 for reporting (#1590) Fixed HTTP API not allowing blockedBy dependencies when creating tasks Added blockedBy field support to TaskService.createTask() Updated API documentation with blockedBy, recurrence, and reminders fields Thanks to @hGriff0n for reporting (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11) Fixed date boundary comparisons in both generateRecurringInstances() and generateRecurringTaskInstances() to compare dates only, not timestamps Thanks to @benefitbug for reporting (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: \"Failed to refresh google token: Request failed, status 400\" Now detects irrecoverable token errors (invalid_grant, invalid_client) and automatically disconnects the OAuth connection Shows actionable error message: \"Google Calendar connection expired. Please reconnect in Settings > Integrations.\" Prevents repeated failed refresh attempts and error message spam Thanks to @osxisl for reporting and @Naesue for helping in discussion (#1584) Fixed DOMTokenList error when task status values contain spaces Clicking the status ring on a task card threw an error when status contained spaces (e.g., \"In Progress\") Status and priority values are now sanitized before being used as CSS class names Thanks to @omber for reporting"},{"title":"TaskNotes 4.4.0","url":"/obsidian/releases/4.4.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# Mdbase type generation now includes tn_role annotations so external tools can identify each field's role even when frontmatter names are customized (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed Thanks to @jimbo108108 for reporting Mdbase type status fields now include tn_completed_values so external tools can reliably identify which status values count as completed (#1576) Added an optional Checklist Progress task-card property that renders a compact progress bar and completed/total count from top-level markdown checkboxes Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps In Bases views, map tasks (file.tasks) to Checklist Progress Existing .base files need file.tasks added to the view order YAML manually Newly generated .base templates now include file.tasks in view order by default Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion Changed# Mdbase type generation no longer overwrites mdbase.yaml if the file already exists, preserving user customisations Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP Webhook runtime state now syncs automatically when plugin settings change Shared HTTP response/body parsing utilities are now consolidated in a dedicated httpUtils module Release notes now include a reminder on every release page that default generated .base template changes never overwrite existing user .base files, and that users can regenerate templates from Settings to pick up updates Fixed# (#1608) Fixed task title frontmatter being removed when storeTitleInFilename is enabled title is now retained in frontmatter while filename derivation from title remains unchanged Thanks to @victoraraujo105 for the PR (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View Updated range calculations to use local calendar-day boundaries consistently (#1602) Fixed inconsistent timeEntries timestamp formats across create/edit/drag/resize flows Time entry timestamps are now written in canonical UTC ISO format (toISOString() with Z) across all write paths (#1602) Fixed denormalized timeEntries.duration drift after edits Time tracking calculations now derive duration from startTime/endTime Time entry save paths now strip legacy duration values instead of persisting them Thanks to @dy66 for opening #1602"},{"title":"TaskNotes 4.5.0","url":"/obsidian/releases/4.5.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup Applied the same protection to task cards so overlapping refreshes are coalesced there too Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events Thanks to @bepolymathe for the request and interoperability details (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task Added a per-view \"Expanded relationships\" option so you can switch between inherited filters and showing all related tasks Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion Improved custom view and search-pane activation when reopening deferred tabs (#1720) Fixed Bases Task List cards showing icon tokens such as clock instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs Thanks to @Sirnii for reporting (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs Thanks to @Sarryaz for reporting (#1651) Fixed date is query filtering so date-only searches also match timed scheduled and due values during prefiltering Thanks to @36mimu36 for reporting (#1644) Fixed generated default task views so recurring tasks without a complete_instances property still appear as incomplete where appropriate Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix Fixed documentation deployment CI failures caused by docs-builder/src/js/main.js being excluded by a broad .gitignore rule Reduced background calendar-sync overhead when persisting sync tokens Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened (#1630) Fixed TaskNote inline task cards ignoring centered \"Readable line length\" layout in the Minimal theme Thanks to @martin-forge for reporting Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings Fixed docs site links so internal Markdown links resolve to app routes instead of broken .md paths Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar Added# (#1704) Added an option to widen the current day column in multi-day calendar time-grid views You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both Thanks to @dictionarymouse for the feature request Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available Thanks to @hokfujow for the feature request (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views Supports grouped Task List moves, manual ordering via the tasknotes_manual_order property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls To use it, sort the view by the Manual Order field (tasknotes_manual_order by default), or regenerate the built-in .base templates from Settings → TaskNotes → General → Create Default Files Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR Added a standalone TaskNotes Specification repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests Added tasknotes-tui, a terminal UI for working with TaskNotes vaults Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette Changed# Refactored several internal modules to reduce coupling and make maintenance safer Updated generated _types/task.md output so dateCreated and dateModified include generated timestamp values, and recurrence_anchor defaults to scheduled Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations"},{"title":"TaskNotes 4.5.1","url":"/obsidian/releases/4.5.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1672) Fixed custom date ranges in the MCP time summary tool so from and to dates work as expected Thanks to @pib for the fix (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward Thanks to @ysafonov for the report and screenshot"},{"title":"TaskNotes 4.5.2","url":"/obsidian/releases/4.5.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal. Thanks to @fastrick for the request and @renatomen for the PR. (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values. Thanks to @Treygec for the request and PR. (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior. Thanks to @P-Sc for the PR. Changed# Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations. Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully. Fixed# (#1778) Fixed MCP initialize requests using newer protocol versions such as 2025-11-25 failing instead of negotiating down to TaskNotes' supported MCP version. Thanks to @SakulaPor for reporting. (#1781) Fixed duplicate metadata properties on Bases task cards when bare and note.-prefixed property IDs map to the same TaskNotes field. Thanks to @loukandr for reporting and tracing the issue. (#1787) Removed the \"(click to change)\" helper text from recurrence tooltips on task cards. Thanks to @kazerniel for reporting. (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects. Thanks to @prepare4robots for reporting. (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections. Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus. Thanks to @3zra47 for reporting. (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled. Thanks to @spiv for reporting. (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone. Thanks to @3zra47 for reporting and following up. (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes. Thanks to @3zra47 for reporting and following up. (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation. Thanks to @renatomen for the PR. (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling. Thanks to @sigma7863 for the PR. (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties. Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue. (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations. Thanks to @berzernberg for reporting Russian translation gaps. (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder. Thanks to @martin-forge for reporting and the PR. (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date. Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues. (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency. Thanks to @martin-forge for reporting. Published mdbase-tasknotes 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas. Includes clearer create-path diagnostics, natural-language mtn list --due filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct mtn --version reporting. Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR. (#1667) Fixed NLP scheduled-date parsing so standalone scheduled and start triggers can set scheduled dates alongside due dates. Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR. Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases. (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight. Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone. Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date. Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758. (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick. Pomodoro stats now refresh on initial render and session completion instead of once per second. Pomodoro daily-note stats now read the relevant date/range instead of routing through all history. Native Pomodoro notifications now respect the notification setting and granted permission before showing. Thanks to @Szu-Szu for reporting and @its-thex for confirming. (#1744) Fixed Bases Task List views so changing the per-view Expanded relationships option takes effect on re-render. Restores the expected show-all behavior for setups that hide subtasks at the top level with note.projects.isEmpty(). Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow. Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards."},{"title":"TaskNotes 4.5.3","url":"/obsidian/releases/4.5.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1834, #1847) Fixed empty Bases formula and custom properties showing null or undefined on TaskNotes task cards. A big thanks to @Glint-Eye and @3zra47 for reporting. (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates. A big thanks to @kmaustral for reporting."},{"title":"TaskNotes 4.6.0","url":"/obsidian/releases/4.6.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin. Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes. Fixed# Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file."},{"title":"TaskNotes 4.7.0","url":"/obsidian/releases/4.7.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit any usage. Clarified privacy documentation for optional integrations that make periodic background network refreshes. Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views. (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date Thanks to @loukandr for the contribution Fixed# Fixed project autocomplete searches so non-empty + queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows. (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as 2025-08-12 18:00 Thanks to @bepolymathe for requesting this and @m4to-3pe for following up Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing. (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as {{project}} before moving the file Thanks to @OXI-717 for reporting (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title Thanks to @Sineapple for reporting (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks Thanks to @macbikegeek for reporting (#1880) Fixed the status bar time-tracking label for task titles that contain a dash Thanks to @ubidev for reporting (#1854) Fixed modal task completion so completed tasks receive a completed date consistently Thanks to @misolex for reporting (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons Thanks to @kmaustral for reporting and @loukandr for the fix Removed# Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported."},{"title":"TaskNotes 4.7.1","url":"/obsidian/releases/4.7.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of main.js, manifest.json, and styles.css."},{"title":"TaskNotes 4.7.2","url":"/obsidian/releases/4.7.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission. Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance. Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup. Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals. Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions. Prevented a console error when plugin listeners are cleaned up after reloads. Added a local lint check to prevent interval-based polling in files that also perform network requests."},{"title":"TaskNotes 4.8.0","url":"/obsidian/releases/4.8.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#353) Added a Has Subtasks filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this. (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this. (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up. (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this. (#1052) Added a public JavaScript API for in-vault scripts at app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text), so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this. (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this. (#1254) Added ../ and ./ normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as {{currentNotePath}}/../Tasks. Thanks to @rdick for suggesting this. (#1267) Added Daily Notes-style date tokens such as YYYY, MM, DD, MMMM, and dddd to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this. (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this. (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this. (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this. (#1376) Added backslash escapes for NLP trigger tokens, so text like \\@context, \\*done, or \\tomorrow can stay in the task title. Thanks to @JerryLu086 for suggesting this. (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this. (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up. (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this. (#144) Added an \"Open note in new tab\" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback. (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback. (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up. (#1541) Added {{currentNotePath}} and {{currentNoteTitle}} support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback. (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback. (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case. (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case. (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this. (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this. (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as \"tomorrow at 3pm\" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this. (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback. (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this. (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this. (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this. (#1625) Added Shift + Cmd/Ctrl + Enter in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this. (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this. (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short projectId. Thanks to @bendavis987 for the contribution. (#923) Added {{projectFilePath}} and {{projectFilePaths}} folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this. (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this. (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback. (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this. (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this. (#1776) Allowed calendar timeline end times after midnight, such as 26:00 for a 2 AM next-day end. Thanks to @chrabia for suggesting this. (#1784, #1833) Added a per-view pinnedColumns option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this. (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this. (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up. (#1808) Added advanced Kanban swimlane ordering through swimLaneOrder, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback. (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this. (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this. (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this. (#561) Added a \"Last day\" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up. (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this. (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this. (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this. (#1176) Added advanced Kanban WIP limits through wipLimits, so column headers can show (current/limit) counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this. (#914) Added a generated Due in countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this. (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this. (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this. (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback. (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this. (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions. (#791) Added a UUID v4 task filename format and {{uuid}} custom filename template variable. Thanks to @bangbangbanggit for suggesting this. (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback. (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this. (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this. (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback. (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this. Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes. Changed# Expanded the bug report template to ask for Obsidian \"Show debug info\" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots. Release notes now show the default .base file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes. Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project. (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion. (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up. Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards. Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected. Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage. (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this. (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this. Made task-card priority dots and configured priority icons slightly larger for better visibility. (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this. (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this. (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this. (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this. (#1392) Made TaskNotes date fields accept compact YYYYMMDD typing and pasted dates. Thanks to @kazerniel for suggesting this. (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this. (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this. (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this. Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers. (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first "},{"title":"TaskNotes 4.8.1","url":"/obsidian/releases/4.8.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space. Thanks to @3zra47 for reporting the issue and sharing the screen recording. (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices. Thanks to @pxxush for reporting the issue. (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00. Thanks to @AndreMonthy for the report. (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views. Thanks to @kmaustral for reporting the issue. (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like high or low. Thanks to @RumiaKitinari for reporting the issue. (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards. Long tag pills can now wrap across lines and break within very long tag names on narrow screens. Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution. (#1901) Fixed the task context menu creating an undefined property when adding or removing tags. Hardened task property updates so invalid frontmatter property names are rejected instead of written. Thanks to @mgrecar for reporting the issue. (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages. Thanks to @minchinweb for reporting the issue. Changed# Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain."},{"title":"TaskNotes 4.9.0","url":"/obsidian/releases/4.9.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Security# (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins. Thanks to @martin-forge for reporting. Added# (#1932) Added middle-click support for opening task cards in a new tab. Thanks to @imsuck for the request. Fixed# (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views. Thanks to @KittehBit for reporting. (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find. Thanks to @rayvermey for reporting. (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening. Thanks to @sumiyalairu03 for reporting. (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task. Thanks to @sumiyalairu03 for reporting. (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes. Thanks to @rchaklashiya for reporting and following up with the embed case. (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields. Thanks to @AndreMonthy for reporting. (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects. Thanks to @martin-forge for reporting and verifying the direct-edit reproduction. (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes. Thanks to @RumiaKitinari for reporting. (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views. Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1. (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid. Thanks to @benmartinek for suggesting this. Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens. (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay. Thanks to @minchinweb for reporting. (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view. Thanks to @mikhailmarka for reporting. (#1912) Fixed \"Create subtask\" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming."},{"title":"TaskNotes 4.9.1","url":"/obsidian/releases/4.9.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active. Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea. Fixed# (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions. Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case. (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date. Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event. Thanks to @martin-forge for reporting and contributing the fix. (#1912) Fixed \"Create subtask\" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming. (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits. TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup. Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes. Thanks to @martin-forge for reporting and contributing the fix. (#1938) Fixed partial HTTP API task updates rewriting native tags with # prefixes or duplicate task tags. Thanks to @joseluisgonzalezdelgado-ctrl for reporting. (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back. Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact. Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled. (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable. Thanks to @pxxush for reporting. (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts. Thanks to @jordankbartos for reporting and proposing a fix in #1944. (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up. Thanks to @martin-forge for reporting and contributing the fix. (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar. Thanks to @3zra47 for reporting. (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row. Thanks to @Jomo94 for reporting. (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern. Thanks to @Jomo94 for reporting."},{"title":"TaskNotes 4.9.2","url":"/obsidian/releases/4.9.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option. Thanks to @renatomen for the contribution. Fixed# Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes. (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps. Thanks to @thechonta for reporting. (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards. Thanks to @sruiz-savia for reporting. (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata. Thanks to @christenbc for reporting. (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use. Thanks to @chmac for reporting. (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility. Thanks to @christenbc for reporting. (#1959) Fixed the MCP tasknotes_list_tasks tool so circular internal task data and live Obsidian object references no longer break task-list responses. Thanks to @kmaustral for reporting. (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short. Thanks to @sumiyalairu03 for reporting. (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark. Thanks to @jacksoluke for reporting. (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text. Thanks to @bgk0018 for reporting. (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering. Thanks to @KFrancoD for reporting. (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact YYYYMMDD entry when a date is already set. Thanks to @kazerniel for reporting and following up. (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile. Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem."},{"title":"TaskNotes - Unreleased","url":"/obsidian/releases/unreleased/","description":"[!info] TaskNotes v5 beta","product":"obsidian","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Security# Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' data.json, with automatic migration for existing connections. See Calendar Integration. Thanks to @mcuste for the contribution Added# (#2142) MCP tasknotes_create_task and tasknotes_update_task now accept customProperties for configured TaskNotes user fields. Thanks to @phillipadsmith for suggesting this. (#2126, #2134) Added optional filename templates for materialized recurring occurrence notes, with explicit date, ISO week, month, year, and month-name variables plus per-parent overrides. Existing naming remains unchanged until a template is configured. See Recurring Tasks. Thanks to @raphaelfaouakhiri for reporting and implementing this. (#2105) Added {{projectFolder}} and {{projectFolders}} folder template variables for storing tasks alongside linked project notes. See Template Variables. Thanks to @carypruitt for this contribution. Changed# Generated TaskNotes type contracts now include configured natural-language capture triggers, allowing compatible clients to offer the same field suggestions. Rebuilt the TaskNotes documentation with reorganized navigation, full-text search, mobile and accessibility improvements, and references generated from the current commands, settings, compatibility metadata, HTTP routes, and default Bases. Added practical guides for adopting TaskNotes in an existing vault, mobile use, custom Bases, and backup and recovery. See the TaskNotes documentation. (#2088) Convert current note to task now uses your default scheduled date when the note does not already have scheduled frontmatter, while the None default still leaves converted notes unscheduled. See Task Properties. Thanks to @e-zz for suggesting this. Fixed# (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview notes, matching the behavior of directly opened Bases and Reading mode embeds. Thanks to @jimbo108108 for reporting this. (#2182) Checklist progress on task cards now excludes cancelled markdown checklist items such as [-] from the completed/total count. Thanks to @ctrl-q for reporting this. (#2180) Inline task cards in Live Preview now keep their click and context menu handlers active on Obsidian 1.13, so clicking a rendered task link opens the edit modal instead of revealing the raw wikilink. Thanks to @npondel for the detailed diagnosis and @minchinweb for confirming the issue. (#2171) Stopped recurring notification and status-bar scans from reading unindexed notes directly from disk while preserving the fallback for direct task lookups. Thanks to @tgrosinger for identifying and diagnosing the excessive vault reads. (#2174) Open or create occurrence note from Quick Actions now uses the recurring task's scheduled occurrence date, preventing duplicate occurrence notes keyed to the day the action was run. Thanks to @chmac for reporting this. (#2169) Regenerated default Base views now include tasks whose identifying property is stored as a list containing the configured task value. Thanks to @GlebYavorski for reporting this. (#2166) Fixed Task List views configured to start collapsed so the first chevron click expands only the selected group instead of expanding every other group. Thanks to @renatomen for reporting and fixing this. (#2165) Convert current note to task now reads configured field mappings, including list-valued title fields such as aliases, and preserves an existing aliases list when the title is unchanged. Thanks to @jkuball for reporting this. (#2164) Flat Kanban boards now clear stale swimlane layout state when they rerender, preventing columns from occasionally stacking into one vertical strip after switching tabs. Thanks to @brienna for reporting this. (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status property and configuration block. Rich Bases status values render as their configured labels, while pinned columns and saved column order are honored. Thanks to @kevin-4c for the detailed reports and diagnosis. (#2111, #2159) Recurring task instances now remain visible through the final day of Calendar and Agenda ranges in positive-offset time zones, regardless of the configured first day of the week. Thanks to @Arachnidai and @odxn0803 for reporting this. (#2155) Regenerated default Calendar Bases now inherit the app-level time slot duration instead of hardcoding 30 minutes. Existing per-Base time settings remain intentional overrides. Thanks to @SZZ504232 for reporting this. (#2154) Timed ICS events without a TZID now preserve their floating wall time in the user's local timezone instead of being interpreted as UTC. Thanks to @cloesophia for the reproducible calendar sample. (#2152) Fixed paginated Google Calendar refreshes for calendars with many events so secondary calendars do not disappear after Google returns a second page. Thanks to @wobafett for reporting and diagnosing this. (#2141) Fixed Task List groups for tasks without scheduled or due dates showing a raw Bases icon object instead of None. Thanks to @ks-studio-net for reporting this. (#2140) The edit task modal now shows saved task-identification tags when hiding identification tags is disabled. Thanks to @3zra47 for reporting this. (#2148) Empty list-like frontmatter values no longer become literal \"null\" entries when tasks are edited. Thanks to @minchinweb for reporting this. (#2120, #2135) Long all-day event titles in Calendar week and day views now truncate instead of stretching the all-day row. Thanks to @same774 and @ks-studio-net for reporting this. (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately after moving a task between list-valued swimlanes such as contexts. Thanks to @Decia-C for reporting this. (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring task now advances the parent from the moved occurrence date instead of an earlier original occurrence date. Thanks to @chrabia for reporting this. (#2113) Failed Google Calendar manual refreshes no longer make the next immediate refresh show a misleading success notice. Thanks to @JohWQ for reporting this. (#2109) TaskNotes no longer injects instant-conversion controls into embedded or detached Markdown editors, preventing checkbox notes opened from unrelated Bases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear reproduction and recording. (#2107, #2108) Creating tasks with Store title in filename enabled now handles duplicate or case-variant titles without failing or replacing the task title with a suffixed filename. Thanks to @AdmiralClackington for reporting and diagnosing this. (#2106) Regenerated default Calendar Base files now use your configured first day of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly, and @idontcode34 for reporting this. (#2100) Tags added while creating a task now keep the same frontmatter order as tags added later from the task context menu. Thanks to @mgrecar for reporting this. (#2092) New non-recurring tasks created directly in a completed status now get a completed date, so completed-date views can find them immediately. Thanks to @Crell for reporting this. (#2096) Fixed TaskNotes Kanban swimlanes falling back to None when the swimlane used a Bases formula that was not already cached by Bases. Thanks to @ddevaal for reporting this. (#2093) TaskNotes now retries custom Bases view registration when the Bases core plugin is enabled after TaskNotes, preventing default views from showing Unknown view type until TaskNotes is reloaded. Thanks to @yaye-work for reporting this. (#2084) The Relationships widget no longer prevents editor text selection from autoscrolling when dragging below the bottom edge of a task note. Thanks to @lostwildland for reporting this. (#2081, #2103) Kept task card and relationships widgets visible in reading mode when Obsidian scroll or preview updates remove their DOM, and refreshed visible widgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and debugging this and @martin-forge for fixing it. (#2064, #2066) Recurring tasks now advance correctly after their next scheduled date is manually adjusted, preserving due-date offsets and times without jumping back to an earlier occurrence. Thanks to @chmac for reporting and fixing this. (#2018) Fixed Hide empty columns in Kanban views with swimlanes so columns with no visible tasks are hidden while pinned columns remain. Thanks to @scottTomaszewski for reporting and fixing this. Fixed recurring all-day ICS subscription events keeping the original end date on later instances, which could cause calendar list views to show events under the wrong day. Thanks to @abbiefalls90. (#2033) Fixed the project folder badge on task cards so, when expandable subtasks are enabled, it expands or collapses inline subtasks instead of showing an unavailable-action notice. Thanks to @abbiefalls90. (#2040, #2041) Stopped newly created tasks from filling the Google Calendar retry queue when calendar export is disabled. Thanks to @chmac for reporting and fixing this. (#2046, #2051) The date and time picker now focuses the natural-language input when it is enabled, making keyboard-driven quick actions ready for immediate typing. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it. (#2125, #2129) Materialized recurring occurrence notes now record the date they were actually completed, while the parent recurring task continues to track the occurrence date. Thanks to @raphaelfaouakhiri for reporting and fixing this. (#2173, #2175) Completion-anchored recurring tasks with materialized occurrence notes now schedule the next occurrence from the day the occurrence was actually completed. Thanks to @chmac for reporting and fixing this. (#1982) Preserved the Task List's own scroll position during Bases refreshes so long mobile lists do not jump back to the top after task updates. Thanks to @3zra47 for the follow-up report. (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar IDs instead of failing local validation before contacting Microsoft Graph. Thanks to @fmacondray for reporting this and providing the follow-up stack trace."},{"title":"Settings","url":"/obsidian/settings/","description":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.","product":"obsidian","text":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior. General# The General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures. For more information, see the General Settings documentation. Task Properties# Task Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration. For more detailed information, see the Task Properties Settings documentation. Modal Fields# Modal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise. For more information, see the Modal Fields Settings documentation. Appearance & UI# Appearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance. For more detailed information, see the Appearance & UI Settings documentation. Features# Features groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults. For more information, see the Features Settings documentation. Integrations# Integrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints. For more detailed information, see the Integrations Settings documentation."},{"title":"Appearance & UI Settings","url":"/obsidian/settings/appearance/","description":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.","product":"obsidian","text":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements. Task Cards# Use Default visible properties to decide what metadata appears on task cards without opening each task. This is the primary control for card density. Checklist progress is available as a visible property in task cards. In Bases view order arrays, the corresponding source property is file.tasks (shown as tasks in Bases property pickers once present in the view order list). Nested task cards use CSS variables for their indentation. Add a CSS snippet if you want a denser hierarchy than the default: .tasknotes-plugin { --tn-nested-task-indent: 12px; --tn-nested-task-padding: 8px; } body.is-mobile .tasknotes-plugin { --tn-nested-task-indent: 8px; --tn-nested-task-padding: 6px; } If task links inside normal markdown lists feel visually doubled with both a list marker and the task status indicator, a CSS snippet can hide those markers for task-link lines: .markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker { content: \"\"; } .markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list { display: none; } Display Formatting# Use Time format to switch between 12-hour and 24-hour display across all TaskNotes surfaces. Calendar View# Calendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. Selection mirror controls whether drag selections show a visual preview before committing. Use Calendar locale for region-specific formatting and calendar systems (for example en, de, or fa). Leave it empty to use automatic detection. Default Event Visibility# This section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events. Time Settings# Time settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape. UI Elements# UI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button. Related Settings# Some appearance-related settings are configured elsewhere: Task filename format: Configured in Task Properties → Title card Project autosuggest display: Configured in Task Properties → Projects card"},{"title":"Features Settings","url":"/obsidian/settings/features/","description":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notific...","product":"obsidian","text":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications. Inline Tasks# Inline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. Task link overlay enables the Live Preview card behavior for task links, while Instant task convert surfaces conversion buttons next to list items and checkboxes. Keep checkbox when converting leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, Inline task convert folder sets destination behavior and supports {{currentNotePath}}, and Use task defaults on instant convert applies your default task values at conversion time. The separate Convert current note to task command keeps the current note body as the task details. If the note has no scheduled frontmatter, the command uses the Scheduled Date default from Task Properties; it does not apply body templates. Body Template# Body template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, {{contexts}}, {{tags}}, and {{projects}}. Materialized occurrence notes can use a separate template. Set Occurrence note template file to provide a global fallback for occurrence notes; a recurring task's occurrence_template frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior. Natural Language Processing# NLP settings define how text input is interpreted during task capture. Enable natural language task input activates date and metadata parsing, Default to scheduled changes ambiguous date handling, NLP language selects parsing patterns, and Status suggestion trigger controls optional status autocomplete activation. Wrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, BIO \"123H\" - HW1 keeps 123H in the title instead of treating it as a 123-hour estimate, while Review \"Today\" notes keeps Today as text instead of parsing it as a date. Pomodoro Timer# Pomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. Pomodoro data storage chooses whether history is kept in plugin data or daily notes. Notifications# Use this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control. Performance & Behavior# Performance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing. Time Tracking# Time tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification. Recurring Tasks# Use Maintain due date offset in recurring tasks to keep due/scheduled spacing consistent when recurring tasks roll forward. Occurrence note behavior is configured per recurring task from the task context menu: open Recurrence → Occurrence notes to choose manual creation or automatic creation of the next materialized occurrence after completion. See Recurring Tasks for the workflow and storage model. Timeblocking# Timeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views. Usage# In the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select \"Create timeblock\" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration."},{"title":"General Settings","url":"/obsidian/settings/general/","description":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.","product":"obsidian","text":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior. Task Storage# Task storage settings define where new and inline-created task files are created and how archived tasks are relocated. Default tasks folder sets the base location and supports folder template variables, including {{currentNotePath}} and {{currentNoteTitle}} for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as {{year}} and Daily Notes-style date tokens such as YYYY/MM/DD. Folder for inline-created tasks controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use {{currentNotePath}} and {{currentNoteTitle}} placeholders for contextual routing. Relative path segments such as ../ are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder. Task Identification# TaskNotes can identify task notes using either a tag or a frontmatter property. Use Identify tasks by to select a strategy. Tag mode uses a configured task tag (for example task) and can optionally hide that identifying tag in card displays. Property mode matches a property/value pair (for example isTask: true or category: task) and is useful when you avoid tag-based identification. If you change the task tag after creating default Base views, existing .base filters will still point at the old tag until you update the default Base files or edit those filters. Hide Identification Tags# When using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter. The Hide identification tags in task cards setting allows you to do this. When enabled: Tags that exactly match your task identification tag (e.g., #task) will be hidden Hierarchical child tags (e.g., #task/project, #task/work/urgent) will also be hidden Other tags that don't match the identification pattern will still be displayed The setting only affects the visual display—tags remain in the frontmatter Example: If your task identification tag is task and a task has the tags #task, #task/project, #important, and #review: With the setting disabled (default): All tags are shown: #task, #task/project, #important, #review With the setting enabled: Only non-identifying tags are shown: #important, #review Folder Management# Use Excluded folders to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing. Views & Base Files# TaskNotes uses Obsidian Bases files (.base) to power its task views. By default, missing view files are created automatically on startup. Use Create files to generate missing default files in TaskNotes/Views/ without overwriting existing files. Use Update files to overwrite the configured default files with templates generated from your current TaskNotes settings. Frontmatter# This section only appears when you have markdown links enabled globally in Obsidian settings. Use markdown links in frontmatter switches project/dependency serialization from wikilinks ([[path]]) to markdown links ([text](path)). This requires the obsidian-frontmatter-markdown-links plugin. Task Interaction# Task interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click). Release Notes# View release notes opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette."},{"title":"Integrations Settings","url":"/obsidian/settings/integrations/","description":"These settings control the integration with other plugins and services, such as Bases and external calendars.","product":"obsidian","text":"These settings control the integration with other plugins and services, such as Bases and external calendars. Bases# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see Core Concepts. View Commands Configuration# View command settings map TaskNotes commands and ribbon actions to specific .base files. This is useful when you maintain custom variants of the default views and want first-class command access to those files. Access these settings in Settings → TaskNotes → General → Views & base files. Default mappings: Open Mini Calendar View → TaskNotes/Views/mini-calendar-default.base Open Kanban View → TaskNotes/Views/kanban-default.base Open Tasks View → TaskNotes/Views/tasks-default.base Open Calendar View → TaskNotes/Views/calendar-default.base Open Agenda View → TaskNotes/Views/agenda-default.base Pomodoro Statistics Base → TaskNotes/Views/pomodoro-stats.base Relationships Widget → TaskNotes/Views/relationships.base Each command allows you to specify a custom .base file path and includes a reset button to restore the default path. Auto-create default files: When enabled, TaskNotes creates missing default .base files automatically on startup. Create files: Button to generate all default .base files in the TaskNotes/Views/ directory. Existing files are not overwritten. The generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from Settings → TaskNotes → Features before using that Base file. OAuth Calendar Integration# Connect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule). Enable Disable calendar integrations on mobile when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally. Setup Requirements# OAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider. Setup Guide: See Calendar Integration Setup for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal. Google Calendar# Provide Client ID and Client Secret from Google Cloud Console, then use Connect Google Calendar to complete OAuth loopback authentication. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. The Target calendar setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar. For timed task exports, Default reminder accepts one or more minute offsets separated by commas, such as 60, 1440. All-day task exports use the target Google Calendar's default reminder settings. When connected, displays: Connected account email Connection time Last sync time Manual refresh button Microsoft Outlook Calendar# Provide Client ID and Client Secret from Azure App Registration, then use Connect Microsoft Calendar to authenticate. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. When connected, displays: Connected account email Connection time Last sync time Security# OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system OAuth credentials and account tokens are not written to TaskNotes' data.json Access tokens refresh automatically Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers) Disconnect at any time to revoke account access; use Forget saved credentials to remove the OAuth app credentials Calendar subscriptions (ICS)# ICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use Add Calendar Subscription to register URLs or local files, and Refresh all subscriptions for manual synchronization. Recurring event related notes controls how notes linked from recurring external calendar events are matched. Series-wide keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. Selected instance only limits related notes and counts to the exact recurrence instance that was linked. Automatic ICS export# Automatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use Export now for immediate output. Export filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates. HTTP API# HTTP API settings control the local server lifecycle, listening port, and request authentication token. Changes to API enablement or port require an Obsidian restart to take effect. WarningThe HTTP API binds to loopback only and browser CORS is limited to loopback origins. If the authentication token is empty, local API requests are still unauthenticated. Set a token unless your local environment is fully trusted. Webhooks# Add Webhook: Register a new webhook endpoint."},{"title":"Modal Fields Settings","url":"/obsidian/settings/modal-fields/","description":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration.","product":"obsidian","text":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration. Field Groups# Fields are organized into draggable groups: Basic Information – Title and Details Metadata – Contexts, Tags, Time Estimate Organization – Projects and Subtasks Dependencies – Blocked By and Blocking Custom Fields – Any user-defined fields that you add through Task Properties Each group can be collapsed, and their order in the manager matches the order shown in the modal. Managing Fields# Every field entry includes: Visibility toggles for creation and edit modals Enable/disable checkbox Drag handle for ordering within its group Required toggle (where applicable, e.g., Title) Changes are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow. Syncing User Fields# The Sync User Fields button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields. Resetting to Defaults# Select Reset to Defaults to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility."},{"title":"Property-based Task Identification","url":"/obsidian/settings/property-identification/","description":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.","product":"obsidian","text":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value. Boolean values# Enter the setting value as true or false (without quotes) in the settings UI. Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly: \"true\" in settings matches frontmatter boolean true \"false\" in settings matches frontmatter boolean false Arrays are supported (e.g., property: [false, true]) Tip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent. Examples# Setting: Property Name = isTask, Property Value = true Matches: isTask: true Does not match: isTask: false Setting: Property Name = isTask, Property Value = false Matches: isTask: false Does not match: isTask: true For related configuration details, see Task Properties."},{"title":"Property Types Reference","url":"/obsidian/settings/property-types-reference/","description":"This reference documents the expected data types for each frontmatter property that TaskNotes uses.","product":"obsidian","text":"This reference documents the expected data types for each frontmatter property that TaskNotes uses. Quick Reference# Property Type Example title text \"My Task\" status text \"open\", \"in-progress\", \"done\" priority text \"low\", \"normal\", \"high\" due text (date) \"2025-01-15\" scheduled text (date) \"2025-01-10\" completedDate text (date) \"2025-01-20\" dateCreated text (datetime) \"2025-01-01T08:00:00Z\" dateModified text (datetime) \"2025-01-15T10:30:00Z\" tags list [\"work\", \"urgent\"] contexts list [\"office\", \"home\"] projects list [\"[[Project A]]\"] timeEstimate number 120 (minutes) recurrence text \"FREQ=WEEKLY;BYDAY=MO\" recurrence_anchor text \"scheduled\" or \"completion\" timeEntries list (objects) See Time Entries blockedBy list (objects) See Dependencies reminders list (objects) See Reminders complete_instances list [\"2025-01-08\", \"2025-01-15\"] skipped_instances list [\"2025-01-22\"] recurrence_parent text (link/path) \"[[Tasks/Weekly review]]\" occurrence_date text (date) \"2025-01-15\" occurrence_materialization text \"manual\" or \"on_completion\" occurrence_next_trigger text \"completion\" or \"completion_or_skip\" occurrence_template text (link/path) \"[[Templates/Occurrence]]\" occurrence_past_horizon text (duration) \"P7D\" occurrence_future_horizon text (duration) \"P14D\" icsEventId list [\"event-abc123\"] Use this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values. Property Details# The sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct. Text Properties# title# Type: text (string) Description: The task's title or name Example: title: \"Complete project documentation\" status# Type: text (string) Description: The task's current status. Must match one of the status values configured in your settings. Default values: \"open\", \"in-progress\", \"done\" Example: status: \"in-progress\" Note: Also supports boolean values (true/false) for Obsidian checkbox compatibility. See Boolean Status Values. priority# Type: text (string) Description: The task's priority level. Must match one of the priority values configured in your settings. Default values: \"low\", \"normal\", \"high\" Example: priority: \"high\" Date Properties# All date properties are stored as text strings in your frontmatter. TaskNotes expects specific formats: When in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently. due# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: The task's due date Examples: due: \"2025-01-15\" due: \"2025-01-15T17:00:00\" scheduled# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: When the task is scheduled to be worked on Examples: scheduled: \"2025-01-10\" scheduled: \"2025-01-10T09:00:00\" completedDate# Type: text (date string) Format: YYYY-MM-DD Description: The date when the task was completed Example: completedDate: \"2025-01-20\" dateCreated# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was created Example: dateCreated: \"2025-01-01T08:00:00Z\" dateModified# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was last modified Example: dateModified: \"2025-01-15T10:30:00Z\" List Properties# List properties must be arrays, even when containing a single value. Single-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics. tags# Type: list (array of strings) Description: Tags associated with the task Examples: tags: [\"work\", \"documentation\"] tags: - work - documentation contexts# Type: list (array of strings) Description: Context labels for the task Examples: contexts: [\"office\", \"computer\"] contexts: - \"office\" - \"computer\" projects# Type: list (array of strings) Description: Project references (typically wiki-links) Examples: projects: [\"[[Website Redesign]]\", \"[[Q1 Planning]]\"] projects: - \"[[Website Redesign]]\" - \"[[Q1 Planning]]\" Numeric Properties# timeEstimate# Type: number Unit: minutes Description: Estimated time to complete the task Example: timeEstimate: 120 (2 hours) Recurrence Properties# recurrence# Type: text (string) Format: RFC 5545 RRULE format Description: Defines how the task repeats Examples: recurrence: \"FREQ=DAILY\" recurrence: \"FREQ=WEEKLY;BYDAY=MO,WE,FR\" recurrence: \"FREQ=MONTHLY;BYMONTHDAY=1\" recurrence_anchor# Type: text (string) Valid values: \"scheduled\" or \"completion\" Description: Determines whether the next occurrence is calculated from the scheduled date or when the task was completed Example: recurrence_anchor: \"scheduled\" complete_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were completed Example: complete_instances: - \"2025-01-08\" - \"2025-01-15\" skipped_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were skipped Example: skipped_instances: - \"2025-01-22\" Materialized Occurrence Properties# Materialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments. When an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as recurrence, complete_instances, skipped_instances, completedDate, provider event IDs, or timeEntries. recurrence_parent# Type: text (link or path string) Description: Parent recurring task for a materialized occurrence note Example: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date# Type: text (date string) Format: YYYY-MM-DD Description: Target recurrence date represented by a materialized occurrence note Example: occurrence_date: \"2025-01-15\" occurrence_materialization# Type: text (string) Valid values: \"manual\", \"on_completion\", \"rolling\" Description: Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet. Example: occurrence_materialization: \"on_completion\" occurrence_next_trigger# Type: text (string) Valid values: \"completion\" or \"completion_or_skip\" Description: Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to on_completion Example: occurrence_next_trigger: \"completion_or_skip\" occurrence_template# Type: text (link or path string) Description: Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings. Example: occurrence_template: \"[[Templates/Weekly occurrence]]\" occurrence_past_horizon and occurrence_future_horizon# Type: text (ISO 8601 duration string) Description: Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin. Examples: occurrence_past_horizon: \"P7D\" occurrence_future_horizon: \"P14D\" Complex Properties# These properties contain structured data with multiple fields. For these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks. Time Entries# Type: list (array of objects) Description: Time tracking entries for the task Structure: timeEntries: - startTime: \"2025-01-15T10:30:00Z\" # Required: ISO 8601 timestamp endTime: \"2025-01-15T11:15:00Z\" # Optional: ISO 8601 timestamp description: \"Initial work\" # Optional: text Dependencies (blockedBy)# Type: list (array of objects) Description: Tasks that must be completed before this task can start Structure: blockedBy: - uid: \"path/to/blocking-task.md\" # Required: path to blocking task reltype: \"FINISHTOSTART\" # Required: relationship type gap: \"P1D\" # Optional: ISO 8601 duration offset Relationship types accepted in stored data: FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH Current behavior: Dependencies created from the UI use FINISHTOSTART. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different reltype values or gap. Reminders# Type: list (array of objects) Description: Reminder notifications for the task Structure for relative reminders: reminders: - id: \"rem_1\" # Required: unique identifier type: \"relative\" # Required: \"relative\" or \"absolute\" relatedTo: \"due\" # Required for relative: \"due\" or \"scheduled\" offset: \"-PT1H\" # Required for relative: ISO 8601 duration description: \"1 hour before due\" # Optional: description Structure for absolute reminders: reminders: - id: \"rem_2\" type: \"absolute\" absoluteTime: \"2025-01-15T09:00:00Z\" # Required for absolute: ISO 8601 timestamp description: \"Morning reminder\" icsEventId# Type: list (array of strings) Description: ICS calendar event IDs linked to this task Example: icsEventId: - \"event-abc123\" - \"event-def456\" Complete Example# Here's a complete task with all property types: --- title: \"Complete quarterly report\" status: \"in-progress\" priority: \"high\" due: \"2025-01-31\" scheduled: \"2025-01-25\" tags: - work - reports contexts: - office projects: - \"[[Q1 Planning]]\" timeEstimate: 240 dateCreated: \"2025-01-01T08:00:00Z\" dateModified: \"2025-01-20T14:30:00Z\" timeEntries: - startTime: \"2025-01-20T10:00:00Z\" endTime: \"2025-01-20T11:30:00Z\" blockedBy: - uid: \"tasks/gather-data.md\" reltype: \"FINISHTOSTART\" reminders: - id: \"rem_1\" type: \"relative\" relatedTo: \"due\" offset: \"-P1D\" description: \"Due tomorrow\" --- Field Mapping# All property names can be customized via Settings → Task Properties → Field Mapping. If you change a field mapping, TaskNotes will read and write using your custom property name. Custom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as note[\"TN-status\"] or note[\"Task Type\"] instead of dot notation. Dot notation only works reliably for simple identifier-style names. For example, if you map due to dueDate, TaskNotes will expect: dueDate: \"2025-01-15\" See Task Properties settings for configuration details. Custom User Fields# You can define additional properties with these types: text - Single text value number - Numeric value date - Date string (YYYY-MM-DD) boolean - true/false list - Array of values See Custom User Fields for configuration details."},{"title":"Task Properties Settings","url":"/obsidian/settings/task-properties/","description":"This tab configures all task properties. Each property is displayed as a card containing its configuration options.","product":"obsidian","text":"This tab configures all task properties. Each property is displayed as a card containing its configuration options. Looking for property type documentation?See the Property Types Reference for detailed documentation on the expected data types (text, list, date, etc.) for each frontmatter property. Property Card Structure# Each property card contains: Property key: The frontmatter field name used to store this property Default: The default value applied to new tasks (where applicable) NLP trigger: Toggle and character configuration for natural language parsing (where applicable) Property-specific settings: Additional configuration options specific to that property This tab defines the task schema used by creation flows, NLP parsing, views, and API payloads. Property keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example note[\"TN-status\"], rather than dot syntax such as note.TN-status. Core Properties# Title# The task title property. Configuration options: Property key: Frontmatter field name (default: title) Store title in filename: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes. Filename format: When \"Store title in filename\" is disabled, choose how filenames are generated: Title-based Zettelkasten-style Timestamp-based UUID v4 Custom template Custom template: Define a custom filename pattern using variables (shown when \"custom\" format is selected) Status# Task completion state. Configuration options: Property key: Frontmatter field name (default: status) Default: Default status for new tasks NLP trigger: Character that triggers status parsing (default: *) Status Values: Expandable section containing individual status cards Each status value has: Value: Internal identifier stored in frontmatter (e.g., \"in-progress\") Label: Display name shown in the interface (e.g., \"In Progress\") Color: Visual indicator color Icon: Optional icon identifier Completed: Whether this status represents a finished task Skip when cycling: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits Next status: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence Auto-archive: Automatically archive tasks after a delay (1-1440 minutes) Status cards support drag-and-drop reordering. Use the Value field as the stable stored identifier and the Label field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored Value, so use prefixes such as 1-open, 2-doing, 3-done if you need predictable native Bases order. Boolean Status Values# TaskNotes supports using boolean values (true and false) as status values, which integrates with Obsidian's native checkbox property format: When you set a task's status to \"true\" or \"false\" (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter When reading tasks with boolean status values from frontmatter, they are converted back to the strings \"true\" or \"false\" This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes Example: --- status: true # Boolean checkbox in Obsidian --- Priority# Task priority level. Configuration options: Property key: Frontmatter field name (default: priority) Default: Default priority for new tasks (can be set to \"No default\") NLP trigger: Character that triggers priority parsing (default: !, disabled by default) Priority Values: Expandable section containing individual priority cards Each priority value has: Value: Internal identifier stored in frontmatter (e.g., \"high\") Label: Display name shown in the interface (e.g., \"High Priority\") Color: Visual indicator color Priority cards support drag-and-drop reordering. Status and priority values are stored in frontmatter; renaming them later may require migration of existing task files. Note for Bases plugin users: Obsidian's Bases plugin sorts priorities alphabetically by their Value. To control sort order, name values to sort alphabetically in the desired order: Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Date Properties# Due Date# When the task must be completed. Configuration options: Property key: Frontmatter field name (default: due) Default: Default due date for new tasks (None, Today, Tomorrow, Next Week) Scheduled Date# When to work on the task. Configuration options: Property key: Frontmatter field name (default: scheduled) Default: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week) When you use Convert current note to task, this default is also applied if the source note does not already have scheduled frontmatter. Choose None to keep converted notes unscheduled by default. due tracks commitment deadlines, while scheduled tracks intended execution time. Organization Properties# Contexts# Where or how the task can be done. Configuration options: Property key: Frontmatter field name (default: contexts) Default: Comma-separated list of default contexts (e.g., @home, @work) NLP trigger: Character that triggers context parsing (default: @) Projects# Projects the task belongs to. Configuration options: Property key: Frontmatter field name (default: projects) Default projects: Select project notes to automatically link to new tasks Use active note for new tasks: Automatically link the active note as a project when opening task creation from the command palette or ribbon Use parent note for inline/instant conversion: Automatically link the source note as a project when using inline task creation or instant task conversion NLP trigger: Character that triggers project parsing (default: +) Autosuggest Filters: Expandable section to filter which notes appear in project suggestions Customize Display: Expandable section to configure how project suggestions appear Autosuggest Filters# Control which notes appear when selecting projects: Required tags: Comma-separated list of tags (shows notes with ANY of these tags) Include folders: Comma-separated list of folder paths (shows notes in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) These filters reduce suggestion noise in large vaults. A \"Filters On\" badge appears when any filters are configured. Customize Display# Configure project suggestion appearance: Enable fuzzy matching: Allow typos and partial matches in project search Row 1, 2, 3: Configure up to 3 lines of information for each project suggestion Tags# Obsidian tags for categorization. Configuration options: Default: Comma-separated list of default tags (without #) NLP trigger: Character that triggers tag parsing (default: #) Note: Tags use native Obsidian tags and do not have a separate property key setting. Task Details# Time Estimate# Estimated time to complete the task. Configuration options: Property key: Frontmatter field name (default: timeEstimate) Default: Default time estimate in minutes (0 = no default) Recurrence# Pattern for repeating tasks. Configuration options: Property key: Frontmatter field name (default: recurrence) Default: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly) Recurring tasks also use the Recurrence anchor metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under Recurrence → Occurrence notes rather than as a global default. Reminders# Notifications before task deadlines. Configuration options: Property key: Frontmatter field name (default: reminders) Default Reminders: Expandable section containing default reminder cards Each default reminder can be: Relative reminders (triggered relative to due or scheduled date): Anchor date (due date or scheduled date) Offset amount and unit (minutes, hours, days) Direction (before or after) Description Absolute reminders (triggered at specific times): Date Time Description Metadata Properties# These properties are system-managed and typically only require property key configuration: Date Created: When the task was created Date Modified: When the task was last modified Completed Date: When the task was completed Archive Tag: Tag used to mark archived tasks Time Entries: Time tracking entries for the task Complete Instances: Completion history for recurring tasks Skipped Instances: Skip history for recurring tasks Recurrence Anchor: Whether recurring progression is based on scheduled date or completion date Blocked By: Tasks that must be completed first Materialized occurrence notes also use system-managed frontmatter fields such as recurrence_parent, occurrence_date, occurrence_materialization, occurrence_next_trigger, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the Property Types Reference and are normally changed through recurrence and occurrence-note controls instead of by hand. Feature Properties# These properties are used by specific TaskNotes features and are not stored in task frontmatter: Pomodoros: Property key for Pomodoro session counts. When Pomodoro data storage is set to \"Daily notes\", this property is written to daily notes rather than task files. ICS Event ID: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event. ICS Event Tag: Property key for calendar event tags. Added to notes created from ICS calendar events for identification. Custom User Fields# Define custom frontmatter properties to appear as filter options across views. Configuration options for each field: Display Name: How the field appears in the UI Property Key: The frontmatter property name Type: Data type (text, number, boolean, date, or list) Default Value: Pre-fill value for new tasks (format varies by type) NLP trigger: Toggle and character for natural language parsing Autosuggest Filters: Filter which files appear when using [[ wikilink autocomplete Custom fields are most maintainable when they map to repeated workflow decisions (for example effort, owner, or client). Link Values# Use a Text custom field for a single link and a List custom field for multiple links. Task cards render [[wikilinks]], [label](https://example.com), , and bare https://example.com values as clickable links. Autosuggest filters work with text and list fields when entering [[ wikilinks, so a field such as Related Note can suggest only files from a chosen folder or tag. Default Values# Each field type has a different input format for default values: Text: Enter the default text value Number: Enter the default number Boolean: Toggle switch to set default checked/unchecked state Date: Select from presets (None, Today, Tomorrow, Next Week) List: Enter comma-separated default values Default values are applied when creating tasks via: Task creation modal Instant task conversion \"Create or open task\" command HTTP API (when using task creation defaults) Autosuggestion Filters# Each custom field can configure filters to control which files appear in wikilink suggestions: Required tags: Comma-separated list of tags (shows files with ANY of these tags) Include folders: Comma-separated list of folder paths (shows files in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) A \"Filters On\" badge appears when filters are configured. See User Fields Feature Documentation for detailed examples."},{"title":"Troubleshooting","url":"/obsidian/troubleshooting/","description":"Common issues and solutions for TaskNotes.","product":"obsidian","text":"Common issues and solutions for TaskNotes. When debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from About, the operating system, and whether the problem also occurs in a fresh default Base. First checks# Confirm Obsidian meets the current version requirement and Bases is enabled. Open the affected task as Markdown and validate the --- frontmatter delimiters and indentation. Confirm the task matches Settings → TaskNotes → General → Task identification and is not in an excluded folder. Run TaskNotes: Refresh cache from the command palette. Close and reopen the affected .base file. Restart Obsidian only after the targeted checks above. If the issue remains, enable Settings → TaskNotes → Features → Debug logging, reproduce it once, and inspect the developer console with Ctrl/Cmd + Shift + I. Disable debug logging after collecting the relevant entries. Bases and Views (v4)# Views Not Loading# Symptoms: TaskNotes views show errors or don't display tasks First confirm Bases is enabled (Settings -> Core Plugins -> Bases), then restart Obsidian once. If views are still missing, verify .base files exist in TaskNotes/Views/. If needed, regenerate defaults from Settings -> TaskNotes -> General -> Views & base files (Create files). Commands Open Wrong Files# Symptoms: Ribbon icons or commands open unexpected files Check command mappings in Settings -> TaskNotes -> General (View Commands). Reset mappings that were changed unintentionally, then verify each referenced .base file exists at the configured path. Common Issues# Tasks Not Appearing in Views# Symptoms: Tasks you've created don't show up in TaskNotes views Follow this decision tree: Does Quick actions for current task work on the note? No: compare its tag or identification property with General → Task identification. Yes: task recognition works; continue to the Base filter. Is the note inside an excluded folder? Yes: move it or update Excluded folders. No: continue. Does a newly generated default task Base show it? Yes: the custom Base has a stale property name or filter. No: run TaskNotes: Refresh cache and validate the frontmatter. Did identification or field mapping change recently? Yes: update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change. Task Link Widgets Not Working# Symptoms: Links to task files appear as normal wikilinks instead of interactive widgets Check that Task link overlay is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design. Instant Conversion Buttons Missing# Symptoms: Convert buttons don't appear next to checkbox tasks Instant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox. Calendar View Performance Issues# Symptoms: Calendar views are slow or unresponsive Reduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below. Natural Language Parsing Not Working# Symptoms: Natural language input doesn't extract expected task properties Enable NLP in Settings -> TaskNotes -> Features, then verify your trigger characters (@, #, ! by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in NLP API. Time Tracking Issues# Symptoms: Time tracking doesn't start/stop properly or data is lost Most tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter. Data Issues# Corrupted Task Files# Symptoms: Tasks appear broken or cause errors in views Open the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption. Missing Task Properties# Symptoms: Tasks missing expected properties or using default values unexpectedly Check field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied. Date Format Issues# Symptoms: Dates not displaying correctly or causing parse errors Use supported formats (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling. Performance Troubleshooting# Slow View Loading# To improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use. External Calendar Issues# OAuth Calendar Not Connecting# Symptoms: Google Calendar or Microsoft Outlook won't connect Verify credentials and loopback redirect configuration (127.0.0.1 with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use Calendar Setup. OAuth Calendar Not Syncing# Symptoms: Connected calendar shows old events or doesn't update Run manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior. ICS Subscriptions Not Loading# Symptoms: ICS calendar events don't appear in calendar views Confirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures. Calendar Sync Problems# Symptoms: External calendar changes not reflected in TaskNotes Check refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state. Getting Help# Reporting Issues# Report bugs on GitHub Issues. Include: Exact TaskNotes and Obsidian versions Operating system The smallest affected task frontmatter with private values removed The .base path and whether a regenerated default has the same problem Steps to reproduce from a fresh Obsidian start Relevant console errors and TaskNotes debug entries Screenshots if relevant Configuration Reset# Use a reversible reset only after the checks above: Close Obsidian Navigate to .obsidian/plugins/tasknotes/ Copy data.json to a backup outside the plugin directory Rename the original to data.json.backup-YYYY-MM-DD Restart Obsidian WarningA reset affects settings, status and priority configurations, integration state, saved views, and plugin-stored Pomodoro history. Keep the backup until the problem is resolved. Restore it only while Obsidian is closed. For full restore and uninstall guidance, see Backup, restore, and removal."},{"title":"Views","url":"/obsidian/views/","description":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and requi...","product":"obsidian","text":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and require Obsidian's Bases core plugin to be enabled. For details on Bases integration and how to enable it, see Core Concepts. For view templates and configuration examples, see Default Base Templates. Task-Focused Views# Task-focused views are different entry points into the same underlying task notes. The Task List View is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format. When you want workflow by status, Kanban View organizes cards into columns and can optionally add swimlanes for an extra organizational layer. Calendar Views are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support. Agenda View is a preconfigured list-oriented calendar layout designed for short-horizon planning, while MiniCalendar View gives a compact month heatmap and fast keyboard navigation. Productivity-Focused Views# These views support time management and work tracking. Pomodoro View supports focused intervals directly inside Obsidian, and Pomodoro Stats View summarizes completed sessions so you can see pace and consistency over time. Screenshots in this section are captured via the Playwright docs suite (npm run e2e:docs)."},{"title":"Agenda View","url":"/obsidian/views/agenda-view/","description":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without ne...","product":"obsidian","text":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually. File Location# Default file: TaskNotes/Views/agenda-default.base Command: Open Agenda View (ribbon icon and command palette) Configure the file path in Settings → TaskNotes → General → View Commands TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled. You can replace the command path with your own .base file if you maintain multiple agendas. Default Configuration# The stock agenda file renders the calendar in listWeek mode: views: - type: tasknotesCalendar name: \"Agenda\" calendarView: \"listWeek\" listDayCount: 7 startDateProperty: file.ctime titleProperty: file.basename order: - note.status - note.priority - note.due - formula.dueIn - note.scheduled This configuration displays seven days at a time, derives entries from file.ctime/file.basename, shows the generated Due in countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view. Customization# Edit the .base file to tailor the agenda: Change calendarView to listDay or listMonth for different spans Adjust listDayCount for shorter or longer agendas; the Bases option supports up to 365 days Add filters to focus on specific projects, tags, or statuses Modify order to control which task properties appear in the row layout Because the view runs inside Bases, any YAML changes are applied immediately after saving the file. Usage Tips# Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries Saved views within Bases let you maintain multiple agenda variants (e.g., \"Work Week\" vs. \"Personal\") Calendar display options (show due, show scheduled, etc.) persist when you save the .base file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks"},{"title":"Calendar Views","url":"/obsidian/views/calendar-views/","description":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled i...","product":"obsidian","text":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled in Obsidian. Mini Calendar is date-density and navigation focused, while Calendar View is scheduling focused. Bases View Architecture# Calendar views in TaskNotes v4 are implemented as Bases views, which means: Calendar views are created as .base files in your vault Configuration is controlled through YAML frontmatter in the base file The Bases plugin is an official Obsidian core plugin and must be enabled Views can be opened in tabs, pinned, and managed like other Obsidian views This architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups. Mini Calendar View# The Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time. Features# Date Navigation: Click any date to open a fuzzy selector modal showing all notes associated with that date Keyboard Navigation: Navigate the calendar using arrow keys and select dates with Enter Heatmap Styling: Visual indicators show the density of tasks or notes on each day Configurable Date Property: Set which date property to track (not limited to tasks - can display any dated notes based on configured property) Month Navigation: Browse forward and backward through months to view historical and future task distribution Mini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution. Calendar View# The Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times. View Modes# The Calendar View supports the following view modes: Month: Month grid showing all-day and timed events Week: Week view with hourly time slots for detailed scheduling Day: Single day view with hourly breakdown Year: Annual overview showing event distribution across months List: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own .base file for quick reviews. Custom Days: Configurable multi-day view (2-10 days) View modes can be switched within a single .base file based on planning horizon (day, week, month, year, or custom range). Week View Day View Year View Performance Improvements# The Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness. Custom Days View# The Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view. Key Features# Configurable Duration: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count TimeGrid Format: Uses the same hourly time slots and time-based event layout as Week and Day views Real-time Updates: The view updates immediately when the day count setting is changed Default Configuration: Ships with 3 days displayed by default for optimal space utilization Use Cases# The Custom Days view is particularly useful for: Users who find the single-day view too wide and wasteful of screen space Planning workflows that require seeing a few days at a glance without the full week Detailed scheduling tasks that benefit from the time-grid format Customizing the viewing window to match personal preference and screen size Configuration# Select the View: Choose \"Custom Days\" from the calendar toolbar alongside Month, Week, Day, and Year views Adjust Day Count: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days Set as Default: Optionally set \"Custom Days\" as your default view in Settings > Calendar > Default view Recurring Task Support# The Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior. Visual Hierarchy# Recurring tasks are displayed with distinct visual styling: Next Scheduled Occurrence: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance Pattern Instances: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule Drag and Drop Behavior# The calendar provides different behaviors depending on which type of recurring event you drag: Dragging Next Scheduled Occurrence (Solid Border): Updates only the scheduled field in the task Reschedules just that specific occurrence to the new date/time Leaves the recurrence pattern unchanged Notice: \"Rescheduled next occurrence. This does not change the recurrence pattern.\" Dragging Pattern Instances (Dashed Border): Updates the DTSTART time in the recurrence rule Changes when all future pattern instances appear Does not affect the independently scheduled next occurrence Notice: \"Updated recurring pattern time. All future instances now appear at this time.\" Flexible Scheduling# The next scheduled occurrence can appear on any date, even: Before the DTSTART date On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern) At different times than the pattern instances This flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling. View Options# The Calendar View provides several display options that control what types of events appear on the calendar: Show scheduled: Display tasks with scheduled dates Show due: Display tasks with due dates Show timeblocks: Display time-blocking entries Show recurring: Display recurring task events Show ICS events: Display events from imported ICS calendars Show time entries: Display time tracking entries All-day slot: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views) Create daily notes from date links: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes. Drag/drop resolution: Set snapDuration when you want events to drag or resize in smaller increments than the visible slotDuration, such as 5-minute dragging on a 30-minute grid. Span tasks between scheduled and due dates: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below) Multiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles. The All-day slot option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view. Multi-Day Task Spans# The Span tasks between scheduled and due dates option provides a visual representation of task duration on the calendar. When enabled: Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date This replaces the separate scheduled and due markers for qualifying tasks Tasks with only a scheduled date or only a due date continue to display as single-day events Span events are shown as all-day bars with the task's priority color Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify) This option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views. These display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions. OAuth Calendar Integration# The Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication: Google Calendar: Connect to Google Calendar accounts to display and sync events Microsoft Outlook: Connect to Microsoft Outlook accounts for calendar integration Synchronization Behavior# External calendar events appear alongside TaskNotes tasks in all calendar views Drag and drop events to reschedule them - changes sync back to the external calendar service Events from external calendars respect the same view options and display settings as native TaskNotes tasks Configuration# OAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services. Time Entry Editor Modal# The Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface. Creating Time Entries# Drag on the calendar to select a time range When the selection menu appears, choose Create time entry The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone Editing Time Entries# Time entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata. Filtering and View Configuration# Calendar filtering is configured through the Bases YAML frontmatter in the .base file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin. Saved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes."},{"title":"Kanban View","url":"/obsidian/views/kanban-view/","description":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag o...","product":"obsidian","text":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag operations over dense list scanning. Configuration# Kanban views are stored as .base files in TaskNotes/Views/. The groupBy property determines the column structure—each unique value becomes a column in the board. Open a .base file and access the view settings panel to configure options. Core Settings (Bases)# Data source: Select which files or folders to include in the view Filter: Define criteria to include or exclude specific tasks Sort: Specify the order of tasks within each column Group by: Required. Defines the property that creates columns (e.g., status, priority) Choosing a stable groupBy field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder. Kanban-Specific Options# Access these options through the Bases view settings panel: Swim Lane: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane) Column Width: Controls the width of columns in pixels. Range: 200-500px. Default: 280px Max Swimlane Height: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px Hide Empty Columns: When enabled, columns containing no tasks are hidden from the view Pinned Columns: Optional comma-separated list of column values that should stay visible even when empty. This is useful with Hide Empty Columns when each board needs a small stable subset of shared statuses or categories WIP Limits: Advanced JSON configuration for showing per-column work-in-progress limits in column headers Hide Empty Swimlanes: When enabled, ordered swimlanes with no tasks are hidden from the view Card Layout: Chooses the task card density for this board. Default uses the standard TaskNotes card layout. Compact uses a tighter card layout for denser boards Show items in multiple columns: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with contexts: [work, call] appears in both the \"work\" and \"call\" columns. When disabled, tasks appear in a single combined column (e.g., \"work, call\") Hide top-level subtasks: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks Column Order: Managed automatically when dragging column headers. Stores custom column ordering Swim Lane Order: Advanced JSON configuration for pinning swimlane rows in a stable order A common setup is to keep one board grouped by status and another grouped by project or context, each in a separate .base file. Interface Layout# Standard Layout# In standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the groupBy property. Each column includes: A header showing the property value and task count A scrollable area containing task cards An add button that opens the TaskNotes creation modal with the column value filled in Drag-and-drop functionality for reordering columns or moving tasks between columns Swimlane Layout# When a swimLane property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes. Each swimlane row includes: A label cell showing the swimlane property value and total task count Multiple cells, each representing a column within that swimlane Scrollable cells containing task cards Add buttons inside cells that fill in both the column value and swimlane value To pin swimlanes in a stable order, set the advanced swimLaneOrder option to a JSON object keyed by the swimlane property: config: swimLane: note.contexts swimLaneOrder: '{\"note.contexts\":[\"transitcal\",\"bill\",\"cycles-research\",\"astrolabe\"]}' Listed swimlane values render first in the configured order. Values not listed in swimLaneOrder render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If hideEmptySwimLanes is disabled, listed values can remain visible even when no matching tasks are currently present. To show WIP limits in column headers, set the advanced wipLimits option to a JSON object keyed by column value: config: wipLimits: '{\"in-progress\":5,\"review\":2}' Columns with limits display counts as (current/limit). When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes. Task Cards# Each task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date. Use the Card Layout setting when a board needs a different density from other task views. Existing boards use Default unless cardLayout: compact is set in the view options. To show checklist progress on cards, include file.tasks in the view order array. For existing .base files, add this in YAML manually first; after it is in order, it appears in the Bases picker as tasks. Click a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties. Column Operations# Reordering Columns# Drag column headers to reorder columns. The new order persists across sessions and is stored in the columnOrder configuration. Drag-and-Drop Tasks# Drag task cards between columns to update the groupBy property value. In swimlane mode, dragging a task to a different cell updates both the groupBy and swimLane properties. When grouping by a list property (contexts, tags, projects) with \"Show items in multiple columns\" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the \"work\" column to the \"home\" column changes contexts: [work, call] to contexts: [call, home]. Drag operations write directly to task metadata, so consistent grouping values reduce ambiguity. The add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location. Manual Reordering Within Columns# Kanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering within Kanban columns: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions. In swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the \"In Progress\" column for the \"High\" swimlane only adjusts the tasks in that cell. Important constraints: Manual drag-to-reorder only works when the view sort includes the manual-order property. Moving a card to a different column or swimlane still updates the grouped property values as usual. In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists. Performance Optimization# The Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks. Virtual scrolling activates automatically based on task count. No configuration is required. Example Configuration# A typical Kanban view .base file includes: --- type: query source: TaskNotes view: TaskNotes Kanban views: - name: TaskNotes Kanban type: tasknotesKanban groupBy: property: task.status config: swimLane: task.priority swimLaneOrder: '{\"task.priority\":[\"high\",\"normal\",\"low\"]}' columnWidth: 300 hideEmptyColumns: true pinnedColumns: to-do, in-progress, done wipLimits: '{\"in-progress\":5}' --- This configuration creates a Kanban board with: Columns based on task status Swimlanes based on task priority Priority swimlanes pinned in high, normal, low order 300px column width Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets A WIP limit of 5 tasks on the in-progress column Filtering and Sorting# Filtering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column."},{"title":"Pomodoro View","url":"/obsidian/views/pomodoro-view/","description":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.","product":"obsidian","text":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique. Timer Interface# The Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete. Pomodoro Stats View# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks."},{"title":"Task List View","url":"/obsidian/views/task-list/","description":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured...","product":"obsidian","text":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML. This view is optimized for high task volume and explicit filter definitions. Bases Architecture# Task List is implemented as a .base file located in TaskNotes/Views/tasks-default.base by default. It requires the Bases core plugin to be enabled. What is Bases?# Bases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks. To enable Bases: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes view commands will now open .base files from TaskNotes/Views/ If commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended .base file. View File Location# When you use the \"Open Tasks View\" command or ribbon icon, TaskNotes opens the .base file configured under Settings -> TaskNotes -> General -> Views & base files (initially TaskNotes/Views/tasks-default.base). TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled, and you can point the command to any other .base file if you maintain multiple task-list layouts. Configuration# Task List views are configured through YAML frontmatter in the .base file. The YAML defines which tasks to show, how to sort them, and how to group them. Basic Structure# # All Tasks views: - type: tasknotesTaskList name: \"All Tasks\" order: - note.status - note.priority - note.due - note.scheduled - note.projects - note.contexts - file.tags sort: - column: due direction: ASC Configuration Options# type: Must be tasknotesTaskList for Task List views name: Display name shown in the view header order: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., note.status, note.priority, note.due, file.tasks). For existing .base files, add file.tasks in YAML manually; once present in order, it appears in the Bases picker as tasks. sort: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria. column: Property to sort by (e.g., due, scheduled, priority, title) direction: ASC (ascending) or DESC (descending) groupBy: Optional grouping configuration property: Property to group by (e.g., note.status, note.priority) direction: Sort direction for group headers hideTopLevelSubtasks: Optional boolean. When true, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks. filters: Optional filter conditions using Bases query syntax filters: and: - note.status == \"Open\" - note.priority == \"High\" Start with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites. Property Mapping# TaskNotes properties are accessed in Bases YAML using these paths: TaskNotes Property Bases Property Path Description Status note.status Task status value Priority note.priority Priority level Due date note.due Due date/time Scheduled date note.scheduled Scheduled date/time Projects note.projects Associated projects Contexts note.contexts Task contexts Tags file.tags File tags Checklist progress file.tasks First-level markdown checkbox progress shown as the TaskNotes checklist progress bar Time estimate note.timeEstimate Estimated duration Recurrence note.recurrence Recurrence pattern Blocked by note.blockedBy Blocking dependencies Title file.name Task title (file name) Created file.ctime File creation date Modified file.mtime File modification date The exact property names depend on your TaskNotes field mapping settings (Settings -> TaskNotes -> Task Properties). The table above shows default mappings. Filtering and Sorting# Adding Filters# Edit the .base file to add filter conditions using Bases query syntax: views: - type: tasknotesTaskList name: \"High Priority Tasks\" filters: and: - note.priority == \"High\" - note.status != \"Completed\" order: - note.status - note.priority - note.due Filter Operators# Bases supports standard comparison operators: == (equals), != (not equals) >, <, >=, <= (comparison) contains() (substring/array membership) Boolean logic: and, or For detailed filter syntax, see the Bases documentation. Sorting Examples# Single sort criterion: sort: - column: due direction: ASC Multiple sort criteria: sort: - column: priority direction: DESC - column: due direction: ASC - column: title direction: ASC Drag-to-Reorder# Task List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering in a Task List view: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions. If your field mapping changes the sort-order property name, use that mapped property name instead of tasknotes_manual_order. Drag-to-Reorder with Grouping# Grouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the \"In Progress\" group updates the manual order for tasks in that group. Important constraints: Drag-to-reorder only works when the view sort includes the manual-order property. Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly. In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes task-list templates include a Manual Order view that is already configured for this behavior. Grouping# Groups organize tasks under collapsible headers based on a property value. Enable Grouping# Add groupBy configuration to your view: views: - type: tasknotesTaskList name: \"Tasks by Status\" groupBy: property: note.status direction: ASC order: - note.status - note.priority - note.due Available Grouping Properties# Common grouping properties: note.status - Group by task status note.priority - Group by priority level note.contexts - Group by first context note.projects - Group by project (tasks can appear in multiple groups) Interactive Group Headers# Group headers support interaction: Click to expand/collapse the group Click on project links in headers to navigate to project notes Hover over project links with Ctrl to preview project notes Collapsed State Persistence# Collapsed/expanded state for each group is preserved across sessions. Creating Multiple Views# You can create multiple .base files for different task perspectives: Duplicate an existing .base file in TaskNotes/Views/ Rename it (e.g., High Priority.base) Edit the YAML configuration for that view Open the file to see the customized view Example: Context-Specific View# # Work Tasks views: - type: tasknotesTaskList name: \"Work Context\" filters: and: - note.contexts.contains(\"work\") groupBy: property: note.priority direction: DESC order: - note.status - note.priority - note.due Migrating from v3 Saved Views# TaskNotes v3 stored filter configurations in plugin settings. These saved views are not automatically migrated to v4. To recreate a v3 saved view: Create a new .base file in TaskNotes/Views/ Translate your v3 filter conditions to Bases YAML syntax Configure sorting and grouping through YAML Save the file The v3 FilterBar UI component no longer exists - all configuration is done through YAML editing. Task Actions# The Task List View provides interaction with tasks through clicking and context menus: Click on a task: Opens the task for editing or navigates to the task note (behavior configured in Settings -> TaskNotes -> General in click-action controls) Right-click on a task: Opens a context menu with actions: Mark as complete Change priority Change status Edit dates Delete task And more Context menu availability depends on your TaskNotes settings and task properties. Virtual Scrolling# The Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides: Approximately 90% memory reduction for large lists Elimination of UI lag when scrolling through hundreds of tasks Smooth performance with unlimited task counts Virtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll. Further Reading# Default Base Templates - Complete templates for all TaskNotes views Bases Plugin Documentation - Official Obsidian documentation for Bases syntax and features Kanban View - Alternative board-based task visualization Calendar Views - Time-based task visualization Views Overview - All available TaskNotes views"},{"title":"TaskNotes Webhooks","url":"/obsidian/webhooks/","description":"TaskNotes webhooks send HTTP POST requests when selected events occur.","product":"obsidian","text":"TaskNotes webhooks send HTTP POST requests when selected events occur. Prerequisites# Enable HTTP API in Settings -> TaskNotes -> Integrations -> HTTP API. Create at least one webhook (settings UI or API). Subscribe it to one or more events. Event Types# Task events: task.created task.updated task.deleted task.completed task.archived task.unarchived Time events: time.started time.stopped Pomodoro events: pomodoro.started pomodoro.completed pomodoro.interrupted Recurring events: recurring.instance.completed recurring.instance.skipped Completing a materialized occurrence note emits recurring.instance.completed with the reconciled parent task plus the completed occurrence and date in the event data. Skipping virtual recurring instances emits recurring.instance.skipped; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook. Reminder events: reminder.triggered Payload Shape# All webhook payloads use the same top-level envelope: { \"event\": \"task.created\", \"timestamp\": \"2026-02-21T10:30:00.000Z\", \"vault\": { \"name\": \"My Vault\", \"path\": \"/path/to/vault\" }, \"data\": {} } data is event-specific. Register and Manage Webhooks via API# Create# POST /api/webhooks Required fields: url (string) events (non-empty array) Optional fields: id secret (auto-generated if omitted) active (default true) transformFile corsHeaders (default true) Example: curl -X POST http://localhost:8080/api/webhooks \\ -H \"Content-Type: application/json\" \\ -d '{ \"url\": \"https://example.com/tasknotes\", \"events\": [\"task.completed\", \"task.created\"], \"transformFile\": \"TaskNotes/webhooks/slack.json\" }' List# GET /api/webhooks Returns registered hooks. Secrets are not returned. Delete# DELETE /api/webhooks/:id Delivery History# GET /api/webhooks/deliveries Returns last 100 in-memory deliveries. Delivery Behavior# Current implementation behavior: Webhook processing is asynchronous (fire-and-forget from task operation). Each delivery starts with one attempt. Failed deliveries retry with exponential backoff: 1s, 2s, 4s. Maximum retries: 3 retries after initial attempt (up to 4 attempts total). If cumulative failureCount for a webhook exceeds 10, webhook is auto-disabled. No explicit request timeout is set in delivery fetch. Because retries and duplicates are possible, handlers should be idempotent. Signature Verification# When corsHeaders is enabled (default), delivery includes: X-TaskNotes-Event X-TaskNotes-Signature X-TaskNotes-Delivery-ID Signature is HMAC-SHA256 over JSON.stringify(payload) using webhook secret. Node.js example: const crypto = require(\"crypto\"); function verifyWebhook(payload, signature, secret) { const expected = crypto .createHmac(\"sha256\", secret) .update(JSON.stringify(payload)) .digest(\"hex\"); return signature === expected; } Payload Transformations# A webhook can specify transformFile pointing to a file in your vault. Supported file types: .json: event template map with variable interpolation If transform execution fails, TaskNotes falls back to original payload. JavaScript transform files are no longer supported. JSON Transform Files# Structure: { \"task.completed\": { \"text\": \"Task completed: ${data.task.title}\", \"vault\": \"${vault.name}\" }, \"default\": { \"text\": \"TaskNotes event: ${event}\" } } Rules: Matching order: exact event key, then default. Variables use ${path.to.value}. Missing variables are left unchanged. CORS and Headers# Webhook delivery requests are outbound server-side requests from TaskNotes. corsHeaders behavior: true (default): sends TaskNotes custom headers including signature. false: only sends Content-Type: application/json. Disable custom headers for endpoints that reject non-standard headers. Testing# Local Test Server# Use repository script: node test-webhook.js Optional custom port: node test-webhook.js 8080 Default server values: URL: http://localhost:3000/webhook Test secret: test-secret-key-for-tasknotes-webhooks External Inspection# For quick inspection, use a request-bin tool such as webhook.site. Troubleshooting# No deliveries# Confirm HTTP API is enabled. Confirm webhook is active. Confirm event is subscribed. Signature mismatch# Confirm secret matches webhook config. Verify your verifier hashes the exact JSON body. Verify hex digest comparison. Webhook disabled automatically# If failures continue and failureCount exceeds 10, webhook is disabled. Fix endpoint availability or response handling. Re-enable webhook in TaskNotes settings, or recreate it via POST /api/webhooks. Transform errors# Confirm transformFile exists in vault. Confirm the file is a .json transform template. Check Obsidian console logs for transform exceptions."},{"title":"Workflows","url":"/obsidian/workflows/","description":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit toge...","product":"obsidian","text":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use. Habit Tracking with Recurring Tasks# Habit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, \"Exercise daily\" or \"Gym every Monday and Wednesday\") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions. Once a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in complete_instances, so a recurring task can remain open while still recording daily/weekly completion behavior. title: Morning Exercise recurrence: \"FREQ=DAILY\" scheduled: \"07:00\" complete_instances: - \"2025-01-01\" - \"2025-01-02\" - \"2025-01-04\" Use Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view. For richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose Open or create occurrence note. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern. Project-Centered Planning# Projects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation. title: \"Research competitors\" projects: [\"[[Market Research]]\", \"[[Q1 Strategy]]\"] During task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on note.projects contains [[Project Name]] to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly. When work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization. title: \"Prepare presentation slides\" projects: [\"[[Q4 Planning]]\"] contexts: [\"computer\", \"office\"] tags: [\"review\"] Execution Workflow (Daily)# A typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system. If you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes. Maintenance Workflow (Weekly)# A weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health. For teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes."},{"title":"TaskNotes privacy overview","url":"/privacy/","description":"How the TaskNotes app and Obsidian plugin store data and when optional services are involved.","product":"shared","text":"Last updated: August 6, 2026 TaskNotes products are built around portable Markdown records. The storage and network boundaries depend on the client and collection you choose. TaskNotes app# The TaskNotes app opens every collection through mdbase and requires a connection to read or change it. A hosted collection stores the authoritative Markdown with the hosted provider. A computer collection keeps the authoritative Markdown on that computer. TaskNotes reaches it through an end-to-end encrypted relay that cannot read record contents; the computer must remain reachable and run mdbase Connect. TaskNotes keeps only a temporary in-memory session cache. It does not retain a separate offline collection after the app or page closes. Reminder notifications for mdbase collections require explicit permission and use content-free event payloads. Task content is refreshed through the authorized collection connection. Obsidian plugin# The plugin keeps task and note content in the local Obsidian vault. Plugin settings live in Obsidian's plugin configuration. Network access occurs only for enabled features that require it, including release checks, calendar providers, ICS subscriptions, webhooks, and remotely loaded API documentation assets. Analytics# TaskNotes does not include a product telemetry or analytics pipeline. Services you choose to connect may keep their own operational, account, security, or billing records under their respective policies. Removal# Removing a client does not necessarily remove its authoritative collection. Use the hosted provider's controls for a hosted collection, or manage the Markdown folder on the computer that owns a computer collection. Back up records before removing an authoritative copy. Questions and source code# Use the relevant TaskNotes GitHub repository to report a privacy problem or inspect the implementation: TaskNotes app TaskNotes Obsidian plugin"}] +[{"title":"TaskNotes documentation","url":"/","description":"Guides and reference material for the TaskNotes app, the Obsidian plugin, and the portable task format they share.","product":"shared","text":"TaskNotes keeps structured task information in portable Markdown records. Use the dedicated app on the web, Android, or iOS, or work inside Obsidian with the TaskNotes plugin. Beta · Web · Android · iOS TaskNotes app Manage portable TaskNotes v5 collections on the web, Android, and iOS through mdbase. Open the app guide → Obsidian TaskNotes plugin Task and note management inside an Obsidian vault using Bases and Markdown. Open the plugin guide → One portable task model# Both clients understand the same TaskNotes concepts: status, priority, dates, projects, contexts, recurrence, reminders, relationships, and custom fields. The interface and available integrations differ, but your task records are not locked to one screen or application. Start with portable task records if you want to understand what the products share. Read the formal specification when implementing or integrating with TaskNotes. Review the privacy overview before choosing a hosted or computer-connected collection."},{"title":"TaskNotes app","url":"/app/","description":"Use TaskNotes on the web, Android, and iOS with portable Markdown through mdbase.","product":"app","text":"The TaskNotes app is currently in beta. It is a web-first client packaged for Android and iOS, designed for quick capture, daily review, editing, and completion while keeping task records portable. The app is compatible with TaskNotes v5 collections, which use the mdbase 0.3.0 specification. The same collection can be used by other compatible TaskNotes and mdbase tools. Every TaskNotes session opens an mdbase collection. You can use a collection hosted online or connect to a Markdown collection on your computer through the encrypted mdbase relay. TaskNotes reads and writes that collection directly, so changes require a connection. The Today workspace in the desktop layout. Disposable sample collection Try TaskNotes before connecting your own collection. Explore Today, Scratchpad, search, and saved views with sample tasks. Your changes disappear when the demo resets. Open the interactive demo → Begin here# Try TaskNotes with sample tasks or open or install TaskNotes. Learn how mdbase supports TaskNotes. Choose where your collection lives. Create a task and open Today. Turn on reminders only if the collection and platform support delivery. What the app includes# Today, Upcoming, Projects, lists, boards, and calendars Capture, editing, completion, archive, and search Projects, contexts, tags, priorities, relationships, and custom fields Recurrence, materialized occurrence notes, reminders, and time tracking Hosted mdbase and end-to-end encrypted relay connections Browser, Android, and iOS packaging from the same application Plugin-only functionality such as inline Obsidian widgets, the command palette, external calendar integrations, HTTP APIs, and companion plugins is documented under the Obsidian plugin."},{"title":"Choose a collection","url":"/app/collections/","description":"Compare hosted mdbase with a collection connected from your own computer.","product":"app","text":"TaskNotes opens every collection through mdbase. The choice is where the main copy of your Markdown lives: hosted online or on your own computer. If mdbase is new to you, start with mdbase and TaskNotes for a plain-language explanation of the format, Connect desktop app, and hosting choices. Hosted mdbase# Hosted mdbase is the recommended choice for convenient access across the web, Android, and iOS. The provider keeps the main collection online, so it is available from any TaskNotes device with a network connection and can deliver reminders while TaskNotes is closed. TaskNotes reads and writes the hosted collection directly. It does not keep a separate offline copy, so you need a network connection to open the collection or make changes. Connect to a computer# mdbase Connect can make a Markdown collection on your computer available to TaskNotes. Requests and responses travel through an end-to-end encrypted relay; the relay cannot read your task contents and you do not need to open a port on your router. The computer holds the main copy, so it must be awake, online, and running the mdbase Connect background service whenever you use TaskNotes. See how to install mdbase Connect and use a computer collection. Change collections later# Open More and choose Change collection. Opening another collection does not copy or move records from the collection you were using."},{"title":"Connection and availability","url":"/app/connection/","description":"Understand when TaskNotes can reach hosted and computer-connected mdbase collections.","product":"app","text":"TaskNotes reads and writes the selected mdbase collection directly. It does not keep a separate offline collection or a queue of changes waiting to sync. What each status means# Status Meaning Connected TaskNotes can read and change the selected collection Connecting TaskNotes is checking the collection connection Collection unavailable The hosted service or connected computer cannot be reached Open More to see the current status and use Refresh now to read the latest collection state. Hosted collections# A hosted collection needs a network connection and an available hosted mdbase service. If either is unavailable, TaskNotes cannot open the collection or save changes. Reconnect the collection if its authorization has expired. Collections on your computer# A computer collection also needs the computer holding the Markdown to be awake, online, and running the mdbase Connect background service. TaskNotes reaches it through the end-to-end encrypted relay. If the computer becomes unavailable, access returns when the computer and connector return. During a connection problem# Tasks already visible in the current session may remain on screen during a short interruption, but TaskNotes cannot safely save new changes until mdbase is reachable. A failed action is not silently queued for later. If the problem continues, open More and choose Change collection to use another mdbase collection."},{"title":"Interactive demo","url":"/app/demo/","description":"Explore the TaskNotes app with disposable sample tasks before connecting a collection.","product":"app","text":"Explore the TaskNotes app using a disposable collection of sample tasks. You can complete and edit tasks, use Scratchpad, search, and move between views without signing in or connecting a collection. The demo keeps changes only for the current session. Reloading or resetting it starts again with the original sample data."},{"title":"Get started with the TaskNotes app","url":"/app/getting-started/","description":"Open TaskNotes, connect an mdbase collection, create a task, and find your way around the app.","product":"app","text":"TaskNotes app is currently in beta. Features, availability, and setup steps may change before the stable release. The app supports TaskNotes v5 collections based on the mdbase 0.3.0 specification. 1. Open TaskNotes# Use app.tasknotes.dev in a supported browser or install the Android or iOS application when it is available through its store. The web and native applications use the same task interface. 2. Choose a collection# TaskNotes opens every collection through mdbase. Choose Hosted mdbase for a collection available anywhere with a network connection, or Connect to a computer to use a Markdown collection kept on your own computer through the encrypted relay. Read What is mdbase? if this is new to you, then Choose a collection to compare the two options. 3. Create a task# Use Add task, enter a title, and save. Capture understands the collection's configured status, priority, project, context, and tag values. 4. Review the starter views# Open Today for current work, Upcoming for scheduled tasks, and Views for the complete collection of lists, boards, calendars, and project views. Navigation belongs to the current collection and can be reordered from Views. 5. Check collection status# Open More to see the collection location, connection state, last refresh, notification access, task model settings, and appearance preference."},{"title":"mdbase and TaskNotes","url":"/app/mdbase/","description":"Understand how TaskNotes uses hosted mdbase or the encrypted relay to reach a collection on your computer.","product":"app","text":"mdbase lets TaskNotes work with a portable Markdown collection instead of hiding your tasks in a TaskNotes-only database. Every TaskNotes session opens one mdbase collection: either a collection hosted online or one kept on your computer and reached through the encrypted relay. What is mdbase?# Two related names appear in TaskNotes: mdbase is the open collection format and specification. A collection is a folder of Markdown files plus a small description of what those files mean. mdbase Connect is the access service TaskNotes uses to ask for permission and connect to a hosted collection or a collection on your computer. Read the mdbase introduction for a visual explanation of the wider ecosystem. What it gives TaskNotes# TaskNotes understands what a task looks like inside an mdbase collection. That compatibility is defined by the TaskNotes v5 collection format and its mdbase 0.3.0 binding. That means TaskNotes can: use the same task fields, projects, tags, saved views, and settings on the web, Android, and iOS; ask for access to one collection without seeing your other folders; and keep reminders running while TaskNotes is closed when your collection supports them. Behind the scenes, mdbase checks that each change is valid and writes it to the main collection. You still own readable Markdown files rather than a database that only TaskNotes can open. How the connection works# The mdbase collection is the source of truth. TaskNotes reads and writes it directly and does not keep a separate offline collection, so opening tasks and saving changes require a connection. Choice Where the Markdown lives What must be available Hosted mdbase With the hosted provider Your device must have a network connection Connect to your computer In a folder on your computer Both devices must be online, and your computer must be running mdbase Connect Choose a collection compares the TaskNotes behavior of these options in more detail. Use a collection on your computer# Install the Electron-based mdbase Connect desktop app to make a folder on your computer available to TaskNotes. It runs a small background service that keeps TaskNotes connected to the Markdown folder. The download also includes command line tools. The mdbase editor is online and is not part of the desktop app. Open the mdbase Connect download page and choose the package for macOS, Windows, or Linux. Install and open mdbase Connect. Follow any platform-specific beta installation notes shown on the download page. Add an existing mdbase folder on the computer, or create a collection. In TaskNotes, choose Connect to a computer and select that collection. Review the requested actions and approve the connection. TaskNotes requests and responses travel through an end-to-end encrypted relay. The relay passes the encrypted data along but cannot read your task contents. You do not need to open an inbound port on your router. The background service on your computer checks that TaskNotes has permission, then reads or changes the Markdown files. It does not create another hosted or offline copy of the collection. Do I need to leave my computer on?# Yes. Your computer holds the main copy, so it is part of the connection: It must be awake, connected to the internet, and running the mdbase Connect background service whenever TaskNotes needs remote access. Sleep, shutdown, a network outage, or a stopped connector makes the collection unavailable until the computer returns. Reminder delivery also depends on the computer remaining available. You are responsible for the computer's security, disk health, and backups. This works well for an always-on desktop or home server. It is less convenient for a laptop that sleeps or travels regularly. Hosted mdbase removes the always-on-computer requirement, but it moves the main copy to a provider you must trust. Both choices require a network connection while you use TaskNotes. For more detail about how Connect protects and routes your data, read How mdbase Connect works. A practical recommendation# Choose Hosted mdbase if dependable access across several devices and reminder delivery matter most. Choose Connect to a computer if keeping the main Markdown folder on your own machine matters more and that machine can remain available."},{"title":"App integration manifest","url":"/app/reference/manifest/","description":"Generated reference for the TaskNotes app's mdbase integration requirements and capabilities.","product":"app","text":"This page is generated from the integration manifest shipped by TaskNotes app 0.1.0. Field Value Application ID dev.tasknotes.app Manifest version 1 Homepage https://app.tasknotes.dev/ Collection access full_collection Required contracts# tasknotes.task version 0.3.0-rc.3 File capabilities# list read add replace move delete Notification criteria# task.reminder listens for mdbase.runtime.timer.fired version 1.0.0."},{"title":"Reminders in the TaskNotes app","url":"/app/reminders/","description":"Understand reminder data, notification delivery, permissions, and collection requirements.","product":"app","text":"Task records can contain relative reminders anchored to scheduled or due dates, or absolute reminders fixed to a particular time. Saving reminder data does not by itself guarantee notification delivery. Delivery by collection# Collection Reminder data Notification delivery Hosted mdbase Saved in the collection Available after opt-in Computer through the relay Saved in the collection Available while the computer and connector remain available For mdbase collections, the authority schedules reminder events so delivery does not depend on one TaskNotes screen remaining open. Notification payloads are content-free; selecting one refreshes authorized collection state in the app. Turn on reminders# Open More, select Turn on reminders, and approve the browser or operating system permission. Some existing mdbase grants require Review notification access before the channel can be enabled. An unsupported or insecure browser reports that notification delivery is not available. The reminder definitions remain in the task record."},{"title":"Work with tasks","url":"/app/tasks/","description":"Capture, edit, organize, complete, archive, and search tasks in the TaskNotes app.","product":"app","text":"A task opens beside its source view on wider screens. Capture# Use Add task from navigation or from a saved view. When a view has safe creation defaults, TaskNotes applies them automatically so the new task remains in that view. Edit# A task can contain: Status and priority Scheduled and due dates Markdown notes Projects, contexts, and tags Dependencies and subtasks Collection-defined custom properties Time estimates and tracked sessions Recurrence and occurrence-note policies Relative and absolute reminder definitions Background saves remain ordered if you navigate away while a write is still in progress. Complete, archive, and delete# Complete a task from its row or detail screen. Archive retains the record and may move its Markdown file according to collection settings. Delete offers a short undo period before committing the removal. Search# Search runs across the current collection and matches titles, notes, projects, contexts, and tags. Use Refresh now under More if a change made by another tool does not appear yet."},{"title":"Troubleshoot the TaskNotes app","url":"/app/troubleshooting/","description":"Diagnose mdbase connection, authorization, refresh, and notification problems in the app.","product":"app","text":"Start by recording the app version, platform, collection type, collection status shown under More, and the smallest sequence that reproduces the problem. The collection is unavailable# For a hosted collection, confirm that the device is online and try Reconnect this collection. For a computer collection, also confirm that the computer holding the Markdown is awake, online, and running mdbase Connect. An authorization error appears# Use the reconnect action for the current collection and review the access that mdbase requests. If you no longer want to use that collection, open More and choose Change collection. A change did not save# TaskNotes writes directly to mdbase and does not queue failed changes for later. Restore the connection, then retry the action. Capture and editing screens keep recoverable input visible when they can do so safely. A change from another tool is missing# Open More and choose Refresh now. If the record still does not appear, confirm that the other tool wrote to the same mdbase collection and that the record uses a compatible TaskNotes task definition. Notifications do not arrive# Confirm that the current collection is an mdbase collection, reminders are enabled in More, the browser or operating system permission is granted, and the task contains a valid future reminder. For a computer collection, the computer and mdbase Connect must remain available."},{"title":"Views and navigation","url":"/app/views/","description":"Use and arrange lists, boards, calendars, projects, and saved views in the TaskNotes app.","product":"app","text":"Views are saved ways of selecting, sorting, grouping, and presenting records in a collection. They travel with the collection; the set pinned to navigation is a preference on each device. The Views manager controls navigation order and saved view definitions. Starter views# TaskNotes creates managed starter views such as Today, Upcoming, Calendar, and Projects. They use the same saved-view catalog as user-created views while providing focused presentations for common work. Presentations# Task list supports grouping, visible properties, section moves, and manual ordering. Kanban groups tasks into columns and can update the grouped property when a task moves. Calendar shows task dates in month, week, day, and list layouts. Mini calendar combines a month picker with tasks for the selected day. Projects finds project records referenced by active tasks. Navigation# Open Views to add or remove a view from navigation and to change its order. The first navigation item is the collection's home. Mobile displays the first three views directly and keeps the rest in the Views destination. Create and edit views# The view editor controls the name, presentation, query, grouping, sort order, visible properties, and safe defaults for tasks created from the view. View documents remain ordinary collection resources rather than being stored only inside the TaskNotes app."},{"title":"Portable task records","url":"/concepts/task-records/","description":"The Markdown records, collection configuration, and task concepts shared by TaskNotes clients.","product":"shared","text":"A TaskNotes task is an ordinary Markdown record with structured properties. Those properties describe the task; the Markdown body remains available for notes, checklists, links, and supporting detail. Collections# A collection is a group of records plus the configuration that explains how to interpret them. The configuration defines field names, statuses, priorities, custom properties, record locations, and saved views. The TaskNotes app uses collection throughout. The Obsidian plugin usually describes the containing folder as a vault and presents saved views through Obsidian Bases. Source of truth# Where the authoritative copy lives depends on the client and connection: Client and collection Source of truth Availability TaskNotes app · hosted mdbase Hosted collection Requires a network connection TaskNotes app · computer through relay Collection on that computer Requires the network, computer, and connector Obsidian vault Markdown files in the vault Controlled by Obsidian and your sync choice Portability and compatibility# Portable does not mean every client exposes every feature. Inline task widgets, Obsidian commands, external calendar integrations, and companion plugins belong to the Obsidian client. mdbase collection access and background reminder delivery belong to the TaskNotes app. Use the client-specific guide for interface instructions and the specification for normative data semantics."},{"title":"0. Overview","url":"/developers/specification/","description":"TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editabl...","product":"specification","text":"0.0 About tasknotes# TaskNotes is an Obsidian plugin that stores tasks as individual markdown files with YAML frontmatter in a user's vault. Each task is a first-class file: readable and editable with any text editor, version-controllable, and searchable without special tooling. A minimal task file looks like this: --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. Tasks are identified within the vault by a configurable detection method — by default, by the presence of a specific tag (e.g. #task in body or frontmatter). The plugin stores its configuration in .obsidian/plugins/tasknotes/data.json within the vault root. This specification was derived from the behavior of the tasknotes plugin and is intended to serve as a stable, testable contract for: CLI tools and scripts that process task files outside Obsidian, any application that wants to interoperate with a tasknotes vault. The spec is deliberately language-agnostic. It does not require any particular runtime, and the executable conformance suite (in conformance/) can be driven by an adapter written in any language. The tasknotes plugin is the primary reference for how this spec was derived, but the specification is normative — where the spec and the plugin behavior differ, the spec defines the intended behavior. Known deviations are disclosed via conformance claims (§7.5). 0.1 Status and authority# This document is part of tasknotes-spec version 0.3.0-rc.3. This specification is normative for implementations that claim conformance. No single implementation is normative; implementations are expected to conform to the specification. 0.2 Motivation# TaskNotes-style systems store tasks as markdown files with YAML frontmatter. This model has practical advantages: Task records are plain files that can be inspected and edited without proprietary tooling. Data remains portable across environments. Files are suitable for version control and collaboration workflows. As soon as more than one tool reads and writes the same task files, implicit assumptions become an interoperability risk. In practice, these risks appear in three areas: Field semantics and naming drift. Date and timezone interpretation differences. Recurring-task state transitions that are handled differently by different clients. When these rules are not explicit, users can get inconsistent results from equivalent operations. A shared specification reduces that risk by making behavior testable and versioned. 0.3 Objectives# This specification defines a stable contract for: Representing task records in markdown frontmatter. Mapping storage keys to canonical semantic roles. Defining effective collection configuration via provider model (for example tasknotes.yaml and/or TaskNotes data.json). Interpreting date and datetime values consistently. Applying recurrence, per-instance completion/skip behavior, and optional materialized occurrence notes. Managing time tracking sessions and time_entries lifecycle behavior. Parsing and resolving links consistently across task fields. Defining dependency and reminder behavior. Optionally applying deterministic create-time templating behavior. Executing write operations with predictable side-effects. Validating task records and reporting issues. 0.4 Non-objectives# This specification does not standardize: UI layout, styling, command palettes, or interaction design. Internal caching architecture or rendering pipelines. Transport protocols (HTTP, IPC, etc.) except where they affect persisted task semantics. Rich template-language features beyond the portable create-time templating contract in §5/§7/§9. 0.5 Scope# This specification is standalone. It does not require conformance to any other specification. Implementations MAY internally reuse other libraries or specifications, but conformance claims under tasknotes-spec are evaluated only against this document. Templating is optional and profile-gated; implementations that do not claim the templating profile remain conformant without template support. References to TaskNotes plugin behavior, Obsidian behavior, or external specifications are informative context only unless this specification explicitly marks a requirement as normative. 0.6 Design principles# 0.6.1 File-first persistence# Task state is represented in user-visible files. Derived indexes and caches are non-canonical. 0.6.2 Deterministic semantics# Equivalent inputs MUST produce equivalent persisted outputs under the same configuration and active runtime timezone. 0.6.3 Explicit mapping# Semantic roles are canonical. Storage key names are configurable and therefore must be mapped explicitly. 0.6.4 Backward evolution# The specification supports migration from legacy keys and historical behaviors through explicit compatibility rules. 0.7 Conformance# Conformance is profile-based (see §7). A minimal implementation can conform to a narrow profile while remaining interoperable for core operations. 0.8 Normative language# The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY are to be interpreted as described in RFC 2119. 0.9 Example collection# A default tasknotes vault looks like this: MyVault/ ├── TaskNotes/ │ ├── Tasks/ │ │ ├── buy-groceries.md ← task file (title-derived filename by default) │ │ └── weekly-review.md │ └── Archive/ ← archive folder (if moveArchivedTasks=true) ├── .obsidian/ │ └── plugins/ │ └── tasknotes/ │ └── data.json ← plugin settings (primary config provider) └── tasknotes.yaml ← optional spec-level config (secondary provider) Task files are identified by the #task tag by default (configurable). The full default collection state is described in §9.21. Configuration provider semantics and effective configuration rules are defined in §9. An implementation MAY use either provider, both, or additional providers, based on its documented precedence policy. A task file example (using default field mapping): --- title: Buy groceries status: open priority: normal due: 2026-02-21 tags: [task, errands] contexts: [\"town\"] dateCreated: 2026-02-20T11:15:00Z dateModified: 2026-02-20T11:15:00Z --- Buy fruit and cleaning supplies. 0.10 Versioning policy# This specification uses semantic versioning. A major version introduces breaking semantic changes. A minor version introduces additive behavior or optional features. A patch version clarifies wording or fixes non-breaking defects. Implementations MUST reject unsupported major versions when strict mode is enabled. 0.11 Change governance# Specification changes SHOULD be accompanied by: a motivation statement, precise normative edits, migration notes when behavior changes, updated examples."},{"title":"1. Terminology","url":"/developers/specification/01-terminology/","description":"This section defines terms used normatively in this specification.","product":"specification","text":"This section defines terms used normatively in this specification. 1.1 Collection# A collection is a filesystem scope within which task files are discovered and managed under a single TaskNotes configuration. 1.2 Task file# A task file is a markdown file identified as a task record by collection rules. 1.3 Frontmatter# Frontmatter is the YAML block at the start of a markdown file delimited by --- markers. 1.4 Task record# A task record is the semantic task object obtained from parsing a task file frontmatter (plus optional derived metadata). 1.5 Semantic role# A semantic role is a canonical meaning defined by this specification, independent of storage key names. Examples: title, status, date_created, complete_instances. 1.6 Storage key# A storage key is the YAML property name used in frontmatter. Examples: dateCreated, date_created, completedDate. 1.7 Field mapping# Field mapping is the configuration that maps semantic roles to storage keys for reads and writes. 1.8 Alias# An alias is a non-canonical storage key accepted for compatibility during reads. 1.9 Canonical write key# The canonical write key is the configured storage key that conforming writers use for persisted output. 1.10 Date value# A date value represents a calendar day with no time-of-day and no timezone. Canonical form: YYYY-MM-DD. 1.11 Datetime value# A datetime value represents an instant in time. Canonical form: ISO 8601 UTC with trailing Z. 1.12 Target date# A target date is the calendar date to which a recurrence instance operation applies (for example complete instance on 2026-02-20). 1.13 Recurrence rule# A recurrence rule is a tasknotes recurrence string stored in the recurrence semantic role. It uses RFC 5545 RRULE-style parameters inside a single semicolon-delimited field value and MAY include an explicit inline DTSTART prefix segment as defined in §4.3. 1.14 Recurrence anchor# Recurrence anchor defines how next-instance progression is computed. Allowed values: scheduled completion 1.15 Complete instances# Complete instances is the set/list of target dates marked completed for a recurring task. 1.16 Skipped instances# Skipped instances is the set/list of target dates marked skipped for a recurring task. 1.17 Materialized occurrence note# A materialized occurrence note is a task file created for one target date of a recurring parent task. It stores user-authored per-occurrence content and, when supported by the implementation, owns the authoritative task state for that occurrence date. 1.18 Recurrence parent# A recurrence parent is the recurring task record referenced by a materialized occurrence note. The reference is stored in semantic role recurrence_parent and resolved as a link according to §11. 1.19 Occurrence materialization# Occurrence materialization is the creation and reconciliation of materialized occurrence notes from a recurring parent task according to §4.18 and §5.20. 1.20 Effective status# Effective status is the status presented for a given date context after applying recurrence instance state. 1.21 Completed-status list# The completed-status list is the configured ordered list of status values treated as completed for non-recurring completion semantics. When a single value must be chosen deterministically, the first list entry is used unless explicit operation input overrides it. 1.22 Idempotent operation# An operation is idempotent if applying it multiple times with the same input produces the same persisted state as applying it once. 1.23 Unknown field# An unknown field is a frontmatter property not mapped to a semantic role in current configuration. 1.24 Validation issue# A validation issue is a structured report containing at least: machine-readable code, severity, optional path/field context, human-readable message. 1.25 Strict validation mode# Strict validation mode is a mode where invalid required semantics are treated as hard errors and write operations fail. 1.26 Legacy compatibility mode# Legacy compatibility mode is a mode where specific historical behaviors or aliases are accepted for migration but are not canonical for new writes. 1.27 Configuration provider# A configuration provider is an adapter that loads configuration from a source (for example tasknotes.yaml or .obsidian/plugins/tasknotes/data.json) and normalizes it to the schema in §9. 1.28 Effective configuration# The effective configuration is the final resolved configuration after applying provider precedence and fallback rules. 1.29 Template file# A template file is a markdown document used at create time to generate frontmatter and/or body content through variable expansion. When templating is enabled, template behavior is defined by §5.3.5 and §9.14. 1.30 Template expansion# Template expansion is deterministic replacement of template variables with create-time task data and runtime date/time values, followed by template merge rules. 1.31 Time entry# A time entry is a structured record in time_entries containing startTime, optional endTime, and optional description. 1.32 Active time entry# An active time entry is a time entry with startTime present and endTime absent. 1.33 Time tracking management# Time tracking management is the set of operations that start, stop, edit, and remove time_entries, including completion-triggered auto-stop behavior when configured."},{"title":"2. Model and Field Mapping","url":"/developers/specification/02-model-and-mapping/","description":"A task record consists of:","product":"specification","text":"2.1 Task record model# A task record consists of: frontmatter object (structured fields), markdown body (freeform text), file metadata (path, created/modified time) where available. Frontmatter is normative for task semantics. Body content is non-normative except where an implementation exposes body search or body-derived features. 2.2 Required semantic roles# Conforming implementations MUST support these semantic roles: Semantic role Type Required title string support required (value required via configured title source, see §2.2.2) status string/enum yes completed_date date support required (conditionally required, see §2.2.1) date_created datetime yes date_modified datetime yes If storage omits a role marked yes, validation MUST report an error (see §6). For operation-required roles, validation and operation rules in §5 and §6 apply. 2.2.1 Conditional requiredness (completed_date)# completed_date support is mandatory, but presence is conditional: For non-recurring tasks with status in configured status.completed_values, completed_date MUST be present. For non-recurring tasks with non-completed status, completed_date MAY be absent. For recurring tasks, completed_date is not required by recurrence completion semantics and MAY be absent. Validators MUST apply this conditional rule and MUST NOT treat completed_date as unconditionally required. 2.2.2 Conditional requiredness (title)# Semantic title is always required, with deterministic read resolution and storage-mode-dependent read/write behavior: Readers MUST resolve semantic title using storage-mode-aware precedence (§9.13): when title.storage=frontmatter: mapped title key when present and non-empty, then file basename fallback; when title.storage=filename: file basename first, then mapped title fallback when basename is unavailable. If mapped title and filename-derived title both exist and differ, the source authoritative for active title.storage MUST win and implementations SHOULD emit title_source_conflict. When title.storage=filename, implementations MAY keep mapped title as a synchronized compatibility mirror, but filename-derived title remains authoritative. Title storage mode controls canonical writes (§9.13): frontmatter favors mapped-key writes; filename favors filename-derived title with rename-on-title-change behavior. Validators MUST enforce semantic title presence using the active title-resolution policy (§9.13), not frontmatter key presence alone. 2.3 Common semantic roles# Implementations conforming beyond minimal scope SHOULD support: Semantic role Type Notes id string stable task identity token; see §2.6.5 priority string/enum configurable values due date or datetime see §3 scheduled date or datetime see §3 tags list free tags contexts list commonly prefixed with @ projects list project references, see §11 attachments list ordered file references owned by the task, see §2.6.7 and §11.8.3 time_estimate integer >= 0 minutes time_entries list see §2.6 recurrence string tasknotes recurrence string; see §4 recurrence_anchor enum scheduled or completion complete_instances list recurring completion state skipped_instances list recurring skip state recurrence_parent link-or-string parent recurring task reference for materialized occurrence notes; see §4.18 occurrence_date date target date represented by a materialized occurrence note occurrence_materialization enum parent task materialization mode: manual, on_completion, or rolling occurrence_next_trigger enum parent task next-note trigger: completion or completion_or_skip occurrence_template link-or-string optional template used when creating materialized occurrence notes occurrence_past_horizon duration optional rolling materialization lookbehind bound occurrence_future_horizon duration optional rolling materialization lookahead bound blocked_by list dependency records, see §10 and §11 reminders list reminder records, see §10 Optional extended roles are defined in §7 profiles. 2.4 Field mapping requirements# 2.4.1 Mapping presence# An implementation MUST have an effective mapping from each supported semantic role to a canonical write key. Mapping configuration is defined in §9. If semantic role id is supported, it MUST also have a canonical write key. 2.4.2 Read behavior# Readers MUST: Read the canonical mapped key if present. Support configured aliases where enabled. Resolve conflicts deterministically when canonical and alias keys coexist. When canonical and alias keys both exist for the same semantic role, canonical key value MUST win. When canonical key wins over alias, validator/loader SHOULD emit warning alias_conflict_ignored. 2.4.3 Write behavior# Writers MUST: write only canonical keys, avoid introducing alias keys in new writes, preserve unknown fields unless the operation explicitly opts into normalization. 2.5 Legacy alias compatibility# Implementations SHOULD accept these aliases on read for interoperability: Semantic role Canonical example Alias examples recurrence_anchor recurrence_anchor recurrenceAnchor complete_instances complete_instances completeInstances skipped_instances skipped_instances skippedInstances recurrence_parent recurrence_parent recurrenceParent occurrence_date occurrence_date occurrenceDate occurrence_materialization occurrence_materialization occurrenceMaterialization occurrence_next_trigger occurrence_next_trigger occurrenceNextTrigger occurrence_template occurrence_template occurrenceTemplate occurrence_past_horizon occurrence_past_horizon occurrencePastHorizon occurrence_future_horizon occurrence_future_horizon occurrenceFutureHorizon date_created dateCreated date_created date_modified dateModified date_modified completed_date completedDate completed_date time_entries timeEntries time_entries time_estimate timeEstimate time_estimate blocked_by blockedBy blocked_by attachments attachments — This table is compatibility guidance, not a requirement to choose camelCase or snake_case as canonical. 2.6 Structured role schemas# 2.6.1 time_entries# time_entries items MUST be objects with: startTime datetime (required) endTime datetime (optional) description string (optional) Additional constraints: a task MUST NOT contain more than one active time entry (entry with startTime and no endTime) at commit time. an entry with missing endTime is interpreted as an active/running session. an implementation MAY accept duration on read for backward compatibility, but canonical duration is derived from start/end and SHOULD NOT be persisted on canonical writes. Nested key names in time_entries are fixed by this specification and are not independently configurable in mapping. 2.6.2 projects# projects SHOULD be represented as links when link semantics are supported, but plain strings MAY be accepted. When interpreted as links, parsing and resolution MUST follow §11. 2.6.3 blocked_by# blocked_by items MUST be objects with: uid link-or-string task reference (required) reltype enum (required; default allowed by §10 when omitted) gap ISO 8601 duration string (optional) Detailed semantics are defined in §10. uid parsing and resolution MUST follow §11. 2.6.4 reminders# reminders items MUST be objects with: id string (required) type enum absolute|relative (required) relative-only fields: relatedTo, offset absolute-only fields: absoluteTime description string (optional) Detailed semantics are defined in §10. 2.6.5 id (stable task identity)# When semantic role id is present: value MUST be a non-empty string. value MUST be treated as stable identity metadata and MUST NOT be rewritten by rename, move, or title-change operations. readers and link resolution MAY use it as an identity lookup key (see §11.4 Step 3). implementations SHOULD keep id unique within a collection; duplicate IDs SHOULD produce a validation issue. 2.6.6 Materialized occurrence roles# The roles in this subsection are required only for implementations claiming profile materialized-occurrences (§7.3.4). Parent recurring task roles: occurrence_materialization: enum manual|on_completion|rolling; controls when occurrence notes are created (§4.18.5). occurrence_next_trigger: enum completion|completion_or_skip; controls whether skip/cancel transitions advance creation of the next occurrence note (§4.18.6). occurrence_template: link-or-string reference to a template file used when creating occurrence notes. Link parsing/resolution follows §11 when supported. occurrence_past_horizon and occurrence_future_horizon: ISO 8601 durations used by rolling materialization (§4.18.7). Materialized occurrence note roles: recurrence_parent: link-or-string reference to the parent recurring task. Wikilinks are the default interoperable representation in Obsidian-oriented collections. occurrence_date: date value identifying the target date this occurrence note represents. Implementations claiming materialized-occurrences MUST treat recurrence_parent and occurrence_date together as the occurrence identity key. Within a resolved parent task, at most one materialized occurrence note SHOULD exist for each occurrence_date; duplicate notes MUST be reported when detected (§6.4). Materialized occurrence notes MAY also use normal task roles such as status, completed_date, scheduled, due, time_entries, reminders, contexts, projects, and body content. For dates where a materialized occurrence note exists, its own task state is authoritative as defined in §4.18.3. 2.6.7 attachments# attachments is the authoritative task-membership list for files associated with a task. It MUST be represented as an ordered list of non-empty link-or-string values. Each value MUST identify one collection file and MUST follow the parsing, resolution, and canonical-write rules in §11.8.3. The list itself intentionally contains references only. MIME type, byte size, content digest, storage revision, timestamps, and other binary metadata belong to the collection's file descriptor or filesystem metadata and MUST NOT be duplicated into canonical task frontmatter. The Markdown body MAY embed or link an attached file for inline presentation, but body links and embeds do not add or remove task membership. A file is a task attachment if and only if it appears in the mapped attachments list. Readers MAY accept a single scalar reference as compatibility input and normalize it to a one-item list. Canonical writes MUST use a list, preserve its order, and MUST NOT contain empty or duplicate normalized targets. 2.7 Unknown fields# Unknown frontmatter keys MUST be preserved by default during updates, complete/uncomplete, skip/unskip, dependency mutations, reminder mutations, and archive operations. Unknown fields MAY be removed only when: explicit normalization/migration is requested, or strict schema replacement is explicitly requested. 2.8 Example mapping# Example effective mapping: mapping: id: id title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrence_anchor complete_instances: complete_instances skipped_instances: skipped_instances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_estimate: timeEstimate time_entries: timeEntries blocked_by: blockedBy reminders: reminders 2.9 Example task record# --- id: task-2026-01-10-weekly-review title: Weekly review status: open priority: high scheduled: 2026-02-20 recurrence: FREQ=WEEKLY;BYDAY=FR recurrence_anchor: scheduled complete_instances: [2026-02-13] skipped_instances: [] blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: P1D reminders: - id: rem_day_before type: relative relatedTo: due offset: -P1D - id: rem_start type: absolute absoluteTime: 2026-02-20T09:00:00Z dateCreated: 2026-01-10T09:30:00Z dateModified: 2026-02-20T08:02:11Z --- Review completed work and plan next week. 2.10 Deterministic load example# Given frontmatter: recurrence_anchor: scheduled recurrenceAnchor: completion If canonical key is recurrence_anchor, a conforming loader using canonical-precedence policy MUST resolve semantic recurrence_anchor as scheduled and SHOULD emit a compatibility warning."},{"title":"3. Temporal Semantics","url":"/developers/specification/03-temporal-semantics/","description":"This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values.","product":"specification","text":"3.1 Purpose# This section defines how implementations MUST interpret, compare, and serialize task-related date and datetime values. 3.2 Supported temporal value classes# Implementations MUST support: Date values: calendar day without time or timezone. Datetime values: instant in time. 3.3 Canonical serialization# 3.3.1 Date# Canonical date serialization is: YYYY-MM-DD 3.3.2 Datetime# Canonical datetime serialization is UTC ISO 8601 with Z, for example: 2026-02-20T13:45:00Z Canonical datetime writes MUST use second precision (YYYY-MM-DDTHH:MM:SSZ) and MUST NOT include fractional seconds. Implementations MAY accept alternative inbound datetime forms but MUST normalize outbound canonical writes. If an accepted inbound datetime includes fractional seconds, writers MUST normalize deterministically by truncating fractional precision to whole seconds. 3.4 Parsing requirements# 3.4.1 Date parsing# Date parsing MUST reject invalid calendar dates. valid: 2026-02-28 invalid: 2026-02-30 3.4.2 Datetime parsing# Datetime parsing MUST reject malformed values. In strict mode, datetime parsing MUST reject ambiguous local datetimes without offset (for example 2026-02-20T09:00:00 with no timezone offset). In permissive mode, implementations MAY accept such values only under an explicitly documented compatibility policy and SHOULD emit a warning. 3.4.3 Mixed input tolerance# Implementations MAY accept both date and datetime values for roles like due and scheduled if configured to do so. The accepted form MUST be documented. 3.4.4 Inbound acceptance matrix# To avoid ambiguity, conforming parsers MUST follow this matrix. Date forms: Form Example Strict Permissive Canonical date 2026-02-20 accept accept Basic date (no separators) 20260220 reject (invalid_date_value) MAY accept only under documented compatibility policy; SHOULD emit warning Datetime forms: Form Example Strict Permissive Canonical UTC 2026-02-20T09:00:00Z accept accept ISO with explicit offset 2026-02-20T09:00:00+10:00 accept accept ISO with fractional seconds 2026-02-20T09:00:00.250Z accept (normalize to second precision on write) accept (normalize to second precision on write) Offset-less local datetime 2026-02-20T09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Space-separated datetime 2026-02-20 09:00:00 reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning Basic datetime (no separators) 20260220T090000Z reject (invalid_datetime_value) MAY accept only under documented compatibility policy; SHOULD emit warning When permissive-mode compatibility accepts a non-canonical form, canonical writes MUST still follow §3.3. 3.5 Day semantics vs instant semantics# 3.5.1 Date roles# Date roles represent days, not instants, and MUST NOT be timezone-shifted. 3.5.2 Datetime roles# Datetime roles represent instants and MUST preserve instant equality through normalization. Example: input 2026-02-20T08:00:00-05:00 canonical write 2026-02-20T13:00:00Z 3.5.3 Implementation guidance: UTC-anchor strategy (non-normative)# Because date-only fields are human-readable (YYYY-MM-DD) while implementations often compute using datetime objects, a common strategy is to use a UTC-midnight anchor for date-only internals. Recommended approach: Parse date-only values to a UTC-midnight anchor instant for internal computations. Format date-only values from UTC calendar components when writing YYYY-MM-DD. Keep date-only roles as date-only on write unless an explicit conversion operation is requested. Evaluate user-facing day semantics (today, overdue, day grouping) using local calendar-day boundaries per §3.6. Implementations MAY use different internal representations as long as all normative requirements in this section are preserved. 3.6 Local calendar-day evaluation# 3.6.1 Active runtime timezone# For day-level semantics, the active runtime timezone is: the caller-provided temporal execution context, when present the collection authority's configured timezone the process/system local timezone. The timezone is runtime context, not TaskNotes type-binding configuration. A remote caller SHOULD send its current IANA timezone for interactive operations; a headless authority SHOULD use its durable collection timezone. Every operation MUST resolve this precedence once and use one effective timezone for all day-level semantics in that operation. Implementations MUST make the effective timezone discoverable. 3.6.2 Local calendar-day rules# When calculating day-level concepts (for example overdue/day grouping/calendar day cells), implementations MUST evaluate against local calendar-day boundaries of the active runtime timezone. This requirement prevents off-by-one day drift in positive and negative UTC offsets. 3.7 Comparison rules# 3.7.1 Date-to-date# Compare by calendar day ordering. 3.7.2 Datetime-to-datetime# Compare by instant ordering. 3.7.3 Date-to-datetime# If compared, implementations MUST document coercion policy. Recommended policy: convert date to local start-of-day for day-level comparisons, avoid implicit coercion for instant-level comparisons. 3.8 due and scheduled semantics# due and scheduled MAY be either date or datetime by configuration. Implementations MUST: preserve stored granularity unless explicit conversion is requested, avoid silently converting date to datetime during unrelated writes, require documented explicit policy for date-to-datetime conversion operations, apply consistent coercion policy in filters and status calculations. 3.9 Completion date semantics# completed_date is a date role. For non-recurring completion, writers MUST set completed_date using §5 semantics: explicit completion-day input when provided, otherwise current local day in active runtime timezone. 3.10 Created/modified timestamps# date_created and date_modified are datetime roles. Writers MUST: set both on create, update date_modified on successful mutating operations that change persisted state, preserve date_created unless explicit migration/edit operation changes it. 3.11 time_entries semantics# 3.11.1 Timestamp format# time_entries.startTime and time_entries.endTime MUST be datetime instants in canonical form on write. 3.11.2 Range validity# If both times exist, endTime MUST be greater than or equal to startTime. 3.11.3 Duration handling# If duration is present, implementations SHOULD treat it as derived and MAY rewrite or remove stale duration values during normalization. 3.11.4 Active session semantics# An entry with startTime and no endTime represents an active/running session. Implementations that support time-tracking management operations (§5.19) MUST enforce at most one active session per task at commit time. 3.11.5 Derived time calculations# For interoperability, implementations SHOULD expose both derived views when reporting tracked time: closed_minutes: sum of entries where both startTime and endTime exist. live_minutes: closed_minutes plus elapsed minutes of active entries (if any). Implementations MUST document which derived view is used by each reporting surface (for example task cards, stats, APIs). 3.12 reminder temporal semantics# Reminder time fields are governed by §10.3 and MUST follow canonical datetime and duration formats from this section. Rules: reminders[].absoluteTime MUST be a canonical datetime on write. reminders[].offset MUST be a valid ISO 8601 duration string. relative reminder base conversion for date-only values MUST use reminders.date_only_anchor_time from §9, or 00:00 local time if unset. 3.13 Example: local-day overdue evaluation# Assume local timezone America/Los_Angeles and local date 2026-02-20. Task A: due: 2026-02-19 status: open Task A is overdue. Task B: due: 2026-02-20 status: open Task B is not overdue at start of day; it becomes overdue on 2026-02-21 local day. 3.14 Example: preserving granularity# Before update: due: 2026-02-20 priority: normal Operation: update priority only. After update (conforming): due: 2026-02-20 priority: high Non-conforming behavior would silently rewrite due to a datetime. 3.15 Example: canonical datetime write# Input: timeEntries: - startTime: 2026-02-20T09:30:00+01:00 endTime: 2026-02-20T10:00:00+01:00 Canonical write: timeEntries: - startTime: 2026-02-20T08:30:00Z endTime: 2026-02-20T09:00:00Z 3.16 Example: UTC-anchor roundtrip for date-only field# Input: due: 2026-02-20 Internal computation anchor: 2026-02-20T00:00:00Z After unrelated update, conforming write: due: 2026-02-20 Non-conforming behavior would rewrite due as a datetime or shift it to another day based on local offset."},{"title":"4. Recurrence","url":"/developers/specification/04-recurrence/","description":"This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state.","product":"specification","text":"4.1 Purpose# This section defines recurrence semantics, including rule representation, anchor behavior, and per-instance completion/skip state. 4.2 Recurrence applicability# A task is recurring when semantic role recurrence contains a valid tasknotes recurrence string. If recurrence is absent or empty, the task is non-recurring. 4.3 Rule format# 4.3.1 Required format# recurrence MUST be a tasknotes recurrence string. This syntax is RRULE-derived but is not a full RFC 5545 content line or multi-line iCalendar fragment. The RRULE parameter portion MUST use RFC 5545 RRULE property syntax. It MAY include a leading inline DTSTART segment. If DTSTART is present, it MUST use one of: DTSTART:YYYYMMDD (date-only) DTSTART:YYYYMMDDTHHMMSSZ (UTC datetime) Canonical combined form is: DTSTART:...;FREQ=... Implementations MAY accept inbound RRULE: prefixes or multi-line iCalendar-like inputs for compatibility, but canonical writes SHOULD use the combined single-field form above. Examples: FREQ=DAILY FREQ=WEEKLY;BYDAY=MO,WE,FR FREQ=MONTHLY;BYMONTHDAY=1 DTSTART:20260220;FREQ=WEEKLY;BYDAY=FR 4.3.2 Invalid rule handling# Invalid recurrence rules MUST produce a validation error in strict mode and SHOULD produce at least a warning in permissive mode. 4.4 Recurrence anchor# recurrence_anchor controls progression semantics and MUST be one of: scheduled completion If missing, implementations SHOULD default to scheduled unless collection configuration defines another default. 4.4.1 Recurrence seed precedence# When recurrence generation requires a seed/start date, implementations MUST resolve it in this order: DTSTART embedded in recurrence, semantic scheduled, semantic date_created. If no seed can be resolved, recurrence materialization MUST fail deterministically and validation MUST report an error. 4.4.2 Anchor progression behavior# For recurrence_anchor=scheduled, progression is based on the scheduled chain and DTSTART MUST remain fixed after it is set. For recurrence_anchor=completion, complete-instance operations MUST advance progression by updating DTSTART to the completion target (date or datetime per §4.4.3). 4.4.3 DTSTART update semantics# When recurrence_anchor=completion and instance completion succeeds for resolved target day D: Instance-list state (complete_instances, skipped_instances) MUST always use day D. If the caller provided an explicit datetime target, DTSTART MUST be rewritten as DTSTART:YYYYMMDDTHHMMSSZ using that target instant normalized to UTC. Otherwise, DTSTART MUST be rewritten as DTSTART:YYYYMMDD for day D. RRULE components other than DTSTART MUST be preserved unless an explicit recurrence-edit operation changes them. If DTSTART is absent, completion-anchor progression MUST insert it before RRULE parameters. 4.4.4 Recalculation semantics for recurrence_anchor=completion# When calculating the next candidate occurrence for recurrence_anchor=completion: Implementations MUST treat DTSTART progression as the consumed-history mechanism. complete_instances MUST NOT be used as an exclusion set for future occurrence selection in this mode. skipped_instances MUST still exclude matching candidate dates. Candidate selection MUST choose the first RRULE occurrence strictly after the current DTSTART anchor (or resolved seed if DTSTART is absent). This matches the completion-anchor progression model where each completion advances the chain by rewriting DTSTART. This model is intentionally not fully reversible via ordinary uncomplete instance; progression history lives in DTSTART, not only in complete_instances. 4.4.5 DTSTART canonicalization on recurring writes# To ensure stable recurrence materialization across implementations, writers that persist recurring tasks MUST ensure DTSTART is present after create or successful recurring-instance completion. Rules: If persisted recurrence already contains DTSTART, keep it unless an explicit operation updates it per §4.4.3. If persisted recurrence omits DTSTART, writers MUST resolve a seed using §4.4.1 and insert DTSTART before RRULE parameters. For recurrence_anchor=scheduled, inserted DTSTART becomes the fixed progression baseline and MUST NOT be rewritten by later scheduled-anchor completions. If seed resolution fails, operation MUST fail deterministically and emit missing_recurrence_seed. 4.5 Instance state fields# Per-instance state is represented by: complete_instances: list of date values skipped_instances: list of date values These lists represent day-level instance outcomes. 4.6 Invariants# Implementations MUST enforce: Items in instance lists are valid date values. No date appears in both lists simultaneously. Duplicate dates are normalized (set semantics) or rejected deterministically. Validators MUST NOT reject an instance date solely because it is not an RRULE-generated occurrence. 4.7 Instance completion semantics# Operation: complete instance for target date D. Conforming behavior: Add D to complete_instances. Remove D from skipped_instances if present. Leave base task status unchanged unless explicit policy states otherwise. Update date_modified when state changes. Operation MUST be idempotent. 4.8 Instance uncompletion semantics# Operation: uncomplete instance for target date D. Conforming behavior: Remove D from complete_instances if present. Do not add D to skipped_instances implicitly. For recurrence_anchor=completion, uncomplete MUST NOT rewrite or roll back DTSTART; restoring prior progression requires an explicit recurrence edit or implementation-specific rewind operation. Update date_modified when state changes. Operation MUST be idempotent. 4.9 Instance skip semantics# Operation: skip instance for target date D. Conforming behavior: Add D to skipped_instances. Remove D from complete_instances if present. Update date_modified when state changes. Operation MUST be idempotent. 4.10 Instance unskip semantics# Operation: unskip instance for target date D. Conforming behavior: Remove D from skipped_instances if present. Do not add to complete_instances implicitly. Update date_modified when state changes. Operation MUST be idempotent. 4.11 Effective instance state# For target date D, effective state MUST be resolved in this order: If D in complete_instances: state is completed. Else if D in skipped_instances: state is skipped. Else: state is unresolved/default for that instance. Because overlap is invalid, this ordering is deterministic. 4.12 Interaction with base status# For recurring tasks: Base status is task-level metadata and MUST NOT be forcibly rewritten to a completed status on instance completion unless explicitly configured. Instance state determines completion for recurrence-aware views and operations. Dependency blocked/unblocked evaluation for v0.1 follows §10.2.5 and is not recurrence-instance-aware unless explicitly extended by implementation policy. For non-recurring tasks, completion uses base status semantics (§5). 4.13 Completed-status configuration# Implementations MUST define which status values are treated as complete for non-recurring tasks. The completed-status list MUST be configurable or schema-driven and MUST NOT rely on a hardcoded single literal. 4.14 Example: complete then skip same day# Initial: recurrence: FREQ=DAILY completeInstances: [2026-02-20] skippedInstances: [] Skip target date 2026-02-20: recurrence: FREQ=DAILY completeInstances: [] skippedInstances: [2026-02-20] 4.15 Example: idempotent complete# Initial: completeInstances: [2026-02-20] skippedInstances: [] Complete 2026-02-20 again: persisted instance lists remain unchanged, operation succeeds without duplicate entries. 4.16 Example: anchor semantics# Task: recurrence: FREQ=WEEKLY;BYDAY=FR recurrenceAnchor: completion If implementation supports next-occurrence materialization, it MUST compute next occurrence relative to completion progression when anchor is completion, not solely by scheduled chain. Implementations using DTSTART progression MUST update DTSTART to the completion date for this mode. Worked example (recurrence_anchor=completion): recurrence: DTSTART:20260220;FREQ=DAILY recurrence_anchor: completion complete_instances: [2026-02-20, 2026-02-21] skipped_instances: [2026-02-23] Conforming recalculation: does not exclude 2026-02-22 because it is absent from skipped_instances, does exclude 2026-02-23 because it is skipped, ignores complete_instances for future exclusion in this mode (§4.4.4). 4.17 Validation examples# Invalid overlap: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Result: validation error instance_state_overlap. Invalid date in list: completeInstances: [2026-02-30] Result: validation error invalid_date_value. 4.18 Recurrence materialization# This subsection is required only for implementations claiming profile materialized-occurrences (§7.3.4). Recurrence materialization creates ordinary task files for specific target dates of a recurring parent task. It is additive behavior: implementations that do not claim materialized-occurrences continue to use the instance-list model in §4.5-§4.12. Materialized occurrence notes MUST be task files according to the collection's task-detection rules (§9.7). 4.18.1 Parent and occurrence ownership# The parent recurring task owns series-level semantics: recurrence recurrence_anchor recurrence generation and DTSTART progression parent instance-list compatibility state (complete_instances, skipped_instances) materialization policy fields (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon) A materialized occurrence note owns per-date task semantics for its occurrence_date, including: status completed_date body content and checklists time_entries per-occurrence due, scheduled, reminders, contexts, projects, and unknown fields 4.18.2 Occurrence identity and parent reference# A materialized occurrence note MUST store: recurrence_parent: a link-or-string reference to the parent recurring task occurrence_date: the target date represented by the occurrence note The preferred Obsidian-compatible representation for recurrence_parent is a wikilink, for example: recurrence_parent: \"[[Weekly Review]]\" occurrence_date: 2026-02-27 Implementations claiming materialized-occurrences MUST resolve recurrence_parent using §11 link semantics for this role, even if they do not claim full extended. If the parent cannot be resolved, validation SHOULD report invalid_recurrence_parent. For one resolved parent, there SHOULD be at most one materialized occurrence note per occurrence_date. Duplicate detected occurrence notes SHOULD report duplicate_occurrence_note and MUST NOT be chosen nondeterministically for writes. 4.18.3 Effective state precedence# For target date D, recurrence-aware effective state MUST be resolved in this order: If a materialized occurrence note exists for (parent, D), derive state from that note's own task state: completed when its status is in status.completed_values; skipped when its status is in status.skipped_values; otherwise unresolved/default for that instance. Else if D is in parent complete_instances: state is completed. Else if D is in parent skipped_instances: state is skipped. Else: state is unresolved/default for that instance. If a materialized occurrence note disagrees with the parent instance lists, the materialized occurrence note wins for D. Validators SHOULD report occurrence_state_conflict, and repair/normalization operations MAY update parent lists to match occurrence notes. 4.18.4 Parent instance lists as compatibility state# When materialized occurrence notes are supported, parent complete_instances and skipped_instances remain part of canonical persisted state. They serve as interoperability state for unmaterialized occurrences and as a compatibility index for clients that do not read occurrence notes. Conforming writers SHOULD reconcile parent lists after materialized occurrence completion, skip, uncompletion, or unskip: completed child state: add D to complete_instances, remove D from skipped_instances; skipped child state: add D to skipped_instances, remove D from complete_instances; active/unresolved child state after uncompletion/unskip: remove D from the relevant parent list. Reconciliation failure MUST NOT silently change the occurrence note state. Implementations SHOULD surface a recoverable error or warning. 4.18.5 Materialization modes# occurrence_materialization controls when materialized occurrence notes are created. Allowed values: manual: occurrence notes are created only by explicit user or API action. on_completion: completing a materialized occurrence note creates the next occurrence note. rolling: the implementation maintains a bounded materialized window, such as today through the next 14 days. If absent, occurrence_materialization MUST default to manual. on_completion does not by itself create the first occurrence note in a series. The first materialized occurrence MUST be created by explicit materialization, rolling materialization, or a documented create-time option. Conforming implementations MUST NOT create occurrence notes merely as a side effect of read-only browsing. 4.18.6 Next-occurrence trigger# occurrence_next_trigger controls whether skip/cancel transitions also create the next occurrence note when occurrence_materialization=on_completion. Allowed values: completion: only completion creates the next occurrence note. completion_or_skip: completion and skip/cancel create the next occurrence note. If absent, occurrence_next_trigger MUST default to completion. The next occurrence MUST be computed from the parent recurring task after applying the triggering state transition and §4.4 anchor semantics. Materializing the next occurrence MUST be idempotent: if the next occurrence note already exists, the operation MUST return or reuse it rather than creating a duplicate. 4.18.7 Rolling materialization bounds# For occurrence_materialization=rolling, implementations MUST enforce finite bounds. Unbounded future materialization is non-conformant. Bounds SHOULD be expressed with ISO 8601 durations such as: occurrence_past_horizon: P0D occurrence_future_horizon: P14D If bounds are absent and rolling mode is enabled, implementations MUST use documented finite defaults. 4.18.8 Recurrence edits and historical notes# Materialized occurrence notes are durable task files. Editing the parent recurrence rule MUST NOT silently delete, rewrite, or move existing materialized occurrence notes. If an existing occurrence note's occurrence_date is no longer generated by the current parent recurrence rule, validators MAY report materialization_target_not_generated as a warning. This condition MUST NOT be treated as an error by default because recurrence edits can make historical notes intentionally non-generated."},{"title":"5. Operations","url":"/developers/specification/05-operations/","description":"This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state.","product":"specification","text":"5.1 Purpose# This section defines normative behavior for task mutations and read-facing resolution concerns that affect persisted state. 5.2 General operation rules# For all mutating operations: Validation MUST run before commit in strict mode. Writes MUST be atomic at file level (all-or-nothing per file). date_modified MUST be updated on successful state change. Unknown fields MUST be preserved unless explicit normalization is requested. This applies to every operation in this section: create, update, complete, uncomplete, skip, unskip, dependency mutations, reminder mutations, archive, and time-tracking operations. Operations identified as idempotent MUST remain safe under repetition. 5.2.1 Target day/date resolution# Recurring instance operations act on a target day/date (complete instance, uncomplete instance, skip, unskip). Non-recurring complete uses completion-day semantics for completed_date. Resolution MUST be deterministic: If caller provides an explicit target date/datetime, that value is authoritative. If caller omits target for recurring instance operations, implementations MUST resolve in this order: task scheduled, if present and target-day-resolvable, else task due, if present and target-day-resolvable, else current local day in active runtime timezone (§3.6). Target-day resolution for fallback task fields (scheduled / due) MUST use this extraction policy: if stored value is canonical date (YYYY-MM-DD), use it as-is; if stored value is datetime, use the literal date token before T (YYYY-MM-DD) without timezone shifting; if stored value is non-canonical but accepted by compatibility policy, implementations MAY normalize to a date token and SHOULD emit a warning; if a candidate value is unusable, continue to the next fallback source. For non-recurring complete, if caller omits explicit completion-day input, implementations MUST use current local day in active runtime timezone. When an explicit target is datetime: operations that require day semantics MUST use its calendar date part in active runtime timezone, for recurring complete instance with recurrence_anchor=completion, the same explicit datetime target MUST also drive DTSTART rewrite semantics in §4.4.3. This explicit-target datetime rule is intentionally distinct from persisted-field fallback extraction above. 5.2.2 Idempotency and date_modified# For operations marked idempotent: first application MAY change state and date_modified, repeated application with semantically equivalent input MUST leave persisted state unchanged. When a repeated idempotent operation is a no-op, date_modified MUST remain unchanged. 5.3 Create# 5.3.1 Input requirements# Create MUST provide at minimum semantic roles required by §2, directly or via defaults. 5.3.2 Required behavior# Create MUST: apply default values, generate date_created and date_modified when absent, resolve semantic title and filename/path behavior according to §9.13, apply create-time templating when enabled and supported (§5.3.5, §9.14, §7), serialize canonical keys and canonical temporal formats, when recurrence is present, canonicalize DTSTART per §4.4.5, preserve caller-provided semantic id when present, fail with validation errors if required constraints are unmet, apply default reminders according to §10.3.9 when configured. 5.3.3 Title and filename resolution on create# Create MUST produce a deterministic initial filename/path. Rules: Generated filenames MUST use filename-safe sanitization and MUST avoid invalid/empty basenames. If title.storage=filename: basename MUST derive from semantic title, title changes after create are handled by update semantics (§5.4.4), implementations MAY also persist mapped title as a synchronized compatibility mirror, title.filename_format and title.custom_filename_template MUST be ignored. If title.storage=frontmatter, create-time basename MUST follow title.filename_format: title: sanitized semantic title, zettel: implementation-defined zettel pattern (MUST be documented), timestamp: implementation-defined timestamp pattern (MUST be documented), custom: title.custom_filename_template expansion. If generated path already exists, implementation MUST resolve collision deterministically (for example numeric suffixing). 5.3.4 Example# Input intent: title: \"Pay electricity bill\" Assume defaults: status default open priority default normal Persisted frontmatter (example): title: Pay electricity bill status: open priority: normal dateCreated: 2026-02-20T14:00:00Z dateModified: 2026-02-20T14:00:00Z 5.3.5 Optional create-time templating# This subsection is required only for implementations claiming profile templating (§7.3.3). Create-time templating pipeline MUST be deterministic: Compute base create payload from explicit input, defaults (§9.8), and generated/system values (date_created, date_modified, resolved title policy). Expand template variables using that base payload and active runtime date/time context. Merge template frontmatter into base frontmatter with base payload precedence (base keys MUST win on conflict). Resolve body output: if expanded template body is non-empty, use it; otherwise use caller-provided body/details (if any). Template parse rules: If template content begins with ---, implementations MUST treat the first --- ... --- block as template frontmatter and the remainder as template body. Frontmatter variable expansion MUST run before YAML parsing of template frontmatter. Portable variable support: Implementations claiming templating MUST support all variables in the Required column of the table below. Implementations MAY support any variable in the Extended column. Required task-data variables: Variable Value Format / separator {{title}} Semantic title string; YAML-quoted if needed {{status}} Task status value string {{priority}} Task priority value string {{dueDate}} Due date if set YYYY-MM-DD or empty {{scheduledDate}} Scheduled date if set YYYY-MM-DD or empty {{details}} Caller-provided body/description string {{contexts}} Contexts list comma-separated, e.g. \"work, home\" {{tags}} Tags list comma-separated, e.g. \"task, errands\" {{hashtags}} Tags list as hashtags space-separated, e.g. \"#task #errands\" {{timeEstimate}} Time estimate in minutes integer string or empty {{parentNote}} Parent note name/path string; YAML-quoted if needed Required date/time variables (expansion time): Variable Value Format {{date}} Current date yyyy-MM-dd {{time}} Current time (24h) HH:mm {{year}} Full year yyyy {{month}} Month number MM {{day}} Day of month dd Extended variables (optional): Variable Value Format {{dateTime}} Date + time yyyy-MM-dd-HHmm {{timestamp}} Full timestamp yyyy-MM-dd-HHmmss {{shortDate}} Short date yyMMdd {{shortYear}} Two-digit year yy {{monthName}} Month full name e.g. February {{monthNameShort}} Month short name e.g. Feb {{dayName}} Weekday full name e.g. Monday {{dayNameShort}} Weekday short name e.g. Mon {{week}} ISO week number ww {{quarter}} Quarter number 1–4 {{hour}} Hour (24h) HH {{minute}} Minute mm {{second}} Second ss {{time12}} Time with AM/PM hh:mm a {{time24}} Time (24h) HH:mm {{timezone}} UTC offset long e.g. +05:30 {{utcOffset}} UTC offset long e.g. +05:30 {{unix}} Unix timestamp (seconds) integer string {{unixMs}} Unix timestamp (ms) integer string {{zettel}} Zettelkasten ID date + seconds-since-midnight base-36 {{titleLower}} Title lowercase string {{titleUpper}} Title uppercase string {{titleSnake}} Title snake_case string {{titleKebab}} Title kebab-case string {{titleCamel}} Title camelCase string {{titlePascal}} Title PascalCase string {{priorityShort}} First letter of priority uppercase char {{statusShort}} First letter of status uppercase char Unknown variables (not in the above lists) MUST be handled per templating.unknown_variable_policy (§9.14): preserve: leave the {{...}} placeholder as-is. empty: replace with an empty string. Deterministic expansion context: date/time variable expansion MUST use the active runtime timezone from §3.6. locale-sensitive variables (monthName, monthNameShort, dayName, dayNameShort, time12) MUST use English locale outputs for portability (January, Jan, Monday, Mon, AM/PM). template-generated datetime-like outputs used in frontmatter MUST normalize to second precision when written as canonical datetime roles (§3.3.2). Failure behavior: templating.failure_mode=error: template read/parse failures MUST abort create. templating.failure_mode=warning_fallback: template read/parse failures MUST continue create using non-templated behavior (base frontmatter + caller body/details) and SHOULD emit warnings (template_missing or template_parse_failed). 5.3.6 Identity handling on create# If semantic id is provided on create, writers MUST preserve it. If implementation supports auto-generation of semantic id, generation policy MUST be documented and resulting id MUST remain stable after create. 5.4 Update# 5.4.1 Patch semantics# Update MUST be patch-by-default: only targeted semantic roles are changed. 5.4.2 Preservation rules# Update MUST preserve: unrelated known roles, unknown fields, original date/datetime granularity for untouched fields. 5.4.3 Example# Before: title: Weekly review scheduled: 2026-02-20 priority: normal customClient: ACME Operation: set priority to high. After: title: Weekly review scheduled: 2026-02-20 priority: high customClient: ACME 5.4.4 Title updates and filename updates# If an update changes semantic title, behavior MUST follow title.storage: title.storage=filename: implementation MUST rename file basename to match updated title (with sanitization and deterministic collision handling), preserving parent folder unless caller requested a move. title.storage=frontmatter: implementation MUST update mapped title field and MUST NOT rename file unless an explicit rename operation is requested. If implementation keeps frontmatter title for compatibility while title.storage=filename, it MUST keep stored title synchronized with effective filename-derived title. 5.5 Complete (non-recurring)# For non-recurring tasks, complete MUST: Set status to a configured completed value, unless already completed. If multiple completed values are configured, implementation MUST choose deterministically (default: first entry in status.completed_values). Set completed_date to completion day: explicit completion-day input when provided, otherwise current local day in active runtime timezone (§5.2.1). Apply overwrite policy deterministically (overwrite or preserve_if_present). Update date_modified on state change. Implementations MUST document completion-day input handling and completed_date overwrite policy. Operation MUST be idempotent. 5.6 Uncomplete (non-recurring)# For non-recurring tasks, uncomplete MUST: Set status to configured active/default status according to policy (default: status.default). Clear or retain completed_date according to policy. Update date_modified on state change. Policy MUST be documented and deterministic. Operation MUST be idempotent. 5.7 Complete instance (recurring)# For recurring tasks, complete with resolved target date D (§5.2.1) MUST follow §4.7. Writers MUST NOT convert recurring completion into a base status rewrite unless explicit configuration requires it. When recurrence_anchor=completion and caller supplies an explicit datetime target, implementations MUST apply §4.4.3 datetime DTSTART rewrite behavior. When recurrence_anchor=scheduled and DTSTART is absent, implementations MUST insert DTSTART deterministically per §4.4.5. Next-occurrence recalculation in this mode MUST follow §4.4.4. 5.8 Uncomplete instance (recurring)# For recurring tasks, uncomplete with resolved target date D (§5.2.1) MUST follow §4.8. For recurrence_anchor=completion, ordinary uncomplete is intentionally non-reversible and MUST NOT roll back DTSTART. 5.9 Skip and unskip instance# Skip/unskip for recurring tasks with resolved target date D (§5.2.1) MUST follow §4.9 and §4.10. 5.10 Dependency operations# Dependency operations MUST follow §10.2. 5.10.1 Add dependency# Add dependency MUST: validate dependency entry schema, parse and resolve uid per §11, enforce duplicate and self-reference rules, preserve existing non-target dependency entries, update date_modified on change. 5.10.2 Remove dependency# Remove dependency by uid MUST be idempotent. 5.10.3 Replace dependency list# Replace dependency list MUST be explicit (not default patch behavior). 5.11 Reminder operations# Reminder operations MUST follow §10.3. 5.11.1 Add reminder# Add reminder MUST: validate reminder schema, enforce unique id within task, update date_modified on change. 5.11.2 Update reminder# Update reminder MUST target a reminder by id and be patch-by-default. 5.11.3 Remove reminder# Remove reminder by id MUST be idempotent. 5.12 Archive# Implementations MAY support archive semantics through: archive tag, archive status, dedicated boolean/archive field. Archive behavior MUST be documented. Archive MUST NOT implicitly delete the task. 5.13 Delete# Delete MUST remove the task file. Delete MUST NOT implicitly delete files referenced by attachments. An implementation MAY offer a separate, explicit cleanup action subject to §5.21.4. Optional safety behavior: Implementations MAY perform backlink/dependency checks. If checks are enabled, implementation MUST provide a bypass option for explicit force delete. 5.14 Rename# Rename operation changes file path/filename while preserving semantic record identity. 5.14.1 Rename interaction with title storage mode# If title.storage=filename, basename changes from rename MUST update effective semantic title. If title.storage=frontmatter, rename MUST NOT implicitly rewrite mapped title unless explicitly requested. Implementations that persist frontmatter title in title.storage=filename mode MUST either update that field on rename or remove it to prevent divergence. If semantic id is present, rename/move MUST preserve its value unchanged. If implementation supports link/reference updating, it MUST: update resolvable references deterministically, report unresolved or ambiguous updates, update dependency uid and projects references consistently with normal links. If implementation does not support reference updates, this limitation MUST be disclosed in conformance claim. 5.15 Batch operations# Batch operations MAY be supported. If supported, implementation MUST report per-item outcomes and summary counts: total succeeded failed Partial success behavior MUST be documented. 5.16 Concurrency# Implementations SHOULD provide write-conflict detection (for example based on modified timestamp or file hash). When conflict is detected, operation MUST fail safely unless explicit overwrite is requested. 5.17 Dry run# If dry run mode is supported, operation MUST: execute validation and transformation logic, report intended changes, perform no file write. 5.18 Error model# Implementation-native operation failures MUST provide structured error information with: operation name, error code, message, optional field/path context. For conformance adapter envelopes (§5.23), failures MAY be represented as a compact error string for transport compatibility, but implementations SHOULD also expose the structured fields (for example via error_details). 5.19 Time tracking management# This subsection applies to implementations that support time_entries. 5.19.1 Start time tracking# Start on task T MUST: fail when T already has an active time entry, append a new entry with canonical startTime and no endTime, MAY set a default description, update date_modified, persist canonical time_entries shape (including removal of legacy/stale duration fields when normalizing). Recommended error code when already active: time_tracking_already_active. 5.19.2 Stop time tracking# Stop on task T MUST: fail when T has no active time entry, set endTime on the active entry to canonical current datetime, update date_modified, preserve non-target entries and unknown frontmatter fields. Recommended error code when no active"},{"title":"6. Validation","url":"/developers/specification/06-validation/","description":"Validation ensures persisted task records conform to this specification and collection configuration.","product":"specification","text":"6.1 Purpose# Validation ensures persisted task records conform to this specification and collection configuration. 6.2 Validation phases# Implementations SHOULD validate in these phases: Parse validation (YAML/frontmatter structure) Schema validation (types and role constraints) Semantic validation (cross-field invariants) 6.3 Validation modes# Conforming implementations MUST support: strict: errors block writes. Implementations MAY additionally support: permissive: writes may continue with warnings. Current mode MUST be discoverable. 6.4 Required checks# A conforming validator MUST implement checks required by the claimed profile(s): Check ID Requirement Required for 1 Unconditionally required semantic roles are present (status, date_created, date_modified). core-lite and above 1a completed_date conditional requiredness is enforced per §2.2.1. core-lite and above 1b title resolves via active title policy (§2.2.2 and §9.13): storage-mode-aware precedence and fallback. core-lite and above 2 Field values match role type requirements. core-lite and above 3 Temporal values conform to §3. core-lite and above 4 Recurrence values conform to §4 (including tasknotes recurrence-string syntax and anchor-seed resolution rules). recurrence and above 5 Per-instance lists contain valid dates with no overlap. recurrence and above 6 date_modified is not earlier than date_created when both exist. core-lite and above 7 time_estimate is non-negative when present. any profile that supports time_estimate 8 time_entries entries include required startTime, ranges are valid when endTime exists, and at most one active entry exists per task. any profile that supports time_entries 9 blocked_by entries conform to §10.2 (shape, enum, duplicates, self-reference). extended 10 reminders entries conform to §10.3 (shape, type-specific fields, unique ids). extended 11 relative reminders have resolvable base fields or produce configured error/warning behavior. extended 12 link-bearing fields (projects, blocked_by.uid, and supported attachments) conform to §11 parsing/resolution and traversal safety. extended, or any implementation supporting attachments 13 templating configuration is valid when provided (templating schema and enums). templating 14 create-time template failures obey configured failure mode (error vs fallback). templating 15 semantic id (when present) is a non-empty string; duplicate collection-level IDs SHOULD be reported when detectable. any profile that supports semantic id 16 materialized occurrence notes contain valid recurrence_parent and occurrence_date roles. materialized-occurrences 17 no duplicate materialized occurrence notes exist for the same resolved (recurrence_parent, occurrence_date) pair. materialized-occurrences 18 materialization policy values and rolling horizons conform to §4.18 and §9.17. materialized-occurrences 19 attachments is a list of non-empty, unique normalized file references with explicit extensions. any implementation supporting attachments 6.5 Unknown field policy# Unknown fields: MUST NOT fail validation by default unless collection is configured for strict schema closure. SHOULD generate informational warnings when strict schema closure is desired but not enabled. 6.6 Issue structure# Validation issues MUST include: code (machine-readable) severity (error, warning, or info) message (human-readable) Issues SHOULD include: field or path expected and actual details where useful 6.7 Recommended issue codes# Code Severity (default) Meaning missing_required error required role missing invalid_type error value type mismatch invalid_enum_value error value not in configured set invalid_date_value error malformed or impossible date invalid_datetime_value error malformed datetime invalid_recurrence_rule error recurrence not valid tasknotes recurrence syntax missing_recurrence_seed error recurrence has no resolvable seed/start date invalid_recurrence_anchor error anchor not allowed instance_state_overlap error same date in complete and skipped lists invalid_time_range error end before start in time entry missing_time_entry_start error time entry is missing required startTime multiple_active_time_entries error more than one active time entry exists in one task invalid_dependency_entry error dependency object missing required fields invalid_dependency_reltype error dependency reltype not allowed invalid_dependency_gap error dependency gap not valid ISO 8601 duration duplicate_dependency_uid error in strict mode when dependencies.enforce_unique_uid=true; warning otherwise by policy repeated dependency uid in task self_dependency error task depends on itself unresolved_dependency_target warning dependency target not resolvable invalid_reminder_entry error reminder object missing required fields duplicate_reminder_id error repeated reminder id in task invalid_reminder_type error reminder type not allowed invalid_reminder_offset error relative reminder offset not valid duration invalid_reminder_related_to error relatedTo must be due or scheduled invalid_reminder_absolute_time error absoluteTime invalid datetime unresolvable_reminder_base error relative reminder base field missing/unusable invalid_link_format error link value cannot be parsed as supported format ambiguous_link warning link resolves to multiple candidates path_traversal error resolved path escapes collection root unresolved_link_target warning link target cannot be resolved invalid_attachment_reference error attachment reference is empty, lacks an explicit extension, or targets a directory duplicate_attachment_reference error attachment list repeats the same normalized target invalid_task_id error semantic id is empty or invalid type duplicate_task_id warning duplicate semantic id detected in collection scope alias_conflict_ignored warning alias key ignored due to canonical conflict unresolvable_title error title cannot be resolved from title resolution policy title_source_conflict warning mapped title and filename title differ; active title-storage policy selected authoritative source template_missing warning configured template file cannot be read/found template_parse_failed warning template frontmatter/body parsing or expansion failed missing_recurrence_parent error materialized occurrence note omits recurrence_parent invalid_recurrence_parent warning occurrence note parent reference cannot be resolved or does not reference a recurring task missing_occurrence_date error materialized occurrence note omits occurrence_date duplicate_occurrence_note warning more than one materialized occurrence note exists for the same parent/date occurrence_state_conflict warning materialized occurrence state disagrees with parent instance lists materialization_target_not_generated warning occurrence date is not generated by current parent recurrence rule missing_skipped_status error skip of materialized occurrence requires configured skipped status next_occurrence_materialization_failed warning triggering operation succeeded but next occurrence note could not be created orphan_occurrence_note warning materialized occurrence note has no resolvable recurring parent or parent state references a deleted occurrence note unknown_field info unmapped field encountered Implementations MAY extend this code set but SHOULD preserve existing meanings. 6.8 Write-time validation behavior# In strict mode, mutating operations MUST fail if any error-severity issue is present after applying intended changes. Warnings SHOULD NOT block writes unless explicitly configured. Datetime/date acceptance and rejection in validation MUST follow the normative matrix in §3.4.4. 6.9 Validation examples# 6.9.1 Missing required role# Input: title: Plan workshop status: open dateCreated: 2026-02-20T09:00:00Z Issue: code: missing_required severity: error field: dateModified message: Required field 'dateModified' is missing. 6.9.2 Invalid recurrence anchor# Input: recurrence: FREQ=DAILY recurrenceAnchor: due Issue: code: invalid_recurrence_anchor severity: error field: recurrenceAnchor message: recurrence anchor must be 'scheduled' or 'completion'. 6.9.3 Overlap in instance state# Input: completeInstances: [2026-02-20] skippedInstances: [2026-02-20] Issue: code: instance_state_overlap severity: error message: same date exists in complete and skipped instance lists. 6.9.4 Invalid dependency reltype# Input: blockedBy: - uid: \"[[task-a]]\" reltype: BLOCKS Issue: code: invalid_dependency_reltype severity: error field: blockedBy[0].reltype message: reltype must be one of FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH. 6.9.5 Unresolvable reminder base# Input: reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D Issue when due missing: code: unresolvable_reminder_base severity: error field: reminders[0] message: relative reminder references due but no due value exists. 6.9.6 Unknown field in permissive mode# Input: title: Plan workshop status: open vendorPriority: p1 Issue example: code: unknown_field severity: info field: vendorPriority message: field is not mapped to a known semantic role. 6.9.7 Multiple active time entries# Input: timeEntries: - startTime: 2026-02-20T10:00:00Z - startTime: 2026-02-20T11:00:00Z Issue: code: multiple_active_time_entries severity: error field: timeEntries message: task contains more than one active time entry."},{"title":"7. Conformance","url":"/developers/specification/07-conformance/","description":"This section defines conformance profiles and claim requirements for implementations.","product":"specification","text":"7.1 Purpose# This section defines conformance profiles and claim requirements for implementations. 7.2 Conformance principles# An implementation MUST NOT claim conformance to a profile unless all required capabilities of that profile are implemented. Implementations MAY implement additional behavior beyond a profile, but extra behavior MUST NOT violate profile requirements. 7.3 Profile model# Profiles are cumulative unless explicitly marked otherwise. 7.3.1 Profile: core-lite# Required capabilities: task identification and loading semantic-role mapping and canonical writes (§2) required role support (title, status, completed_date, date_created, date_modified) create, update, delete operations (§5) non-recurring complete/uncomplete (§5) temporal parsing/canonical serialization basics (§3) strict validation mode support (§6.3) validation core checks (§6.4 items 1,1a,1b,2,3,6) 7.3.2 Profile: recurrence# Additional required capabilities: tasknotes recurrence-string parsing/validation, including RRULE parameter syntax and inline DTSTART handling recurrence anchor semantics, including seed precedence and completion-anchor progression complete/uncomplete instance skip/unskip instance instance-list invariants and effective state resolution validation checks for recurrence and instance overlap 7.3.3 Profile: templating (non-cumulative extension)# This profile is not cumulative; it MAY be claimed alongside core-lite, recurrence, materialized-occurrences, and/or extended. templating MUST NOT be claimed alone. Required capabilities: create-time template processing semantics per §5.3.5 templating configuration support per §9.14 deterministic template/frontmatter/body merge behavior deterministic failure-mode behavior for template read/parse failures support for portable double-brace template variables defined in §5.3.5 7.3.4 Profile: materialized-occurrences (non-cumulative extension)# This profile is not cumulative; it MUST be claimed alongside recurrence. It MAY be claimed alongside extended and/or templating, but it does not require either. Required capabilities: materialized occurrence roles and identity semantics (§2.6.6) recurrence materialization semantics (§4.18) materialize/complete/skip/uncomplete/unskip materialized occurrence operations (§5.20) occurrences configuration defaults (§9.17) parent-reference link parsing/resolution for recurrence_parent (§11), without requiring full extended validation checks for materialized occurrence identity, duplicates, and state conflicts (§6.4 items 16-18) Claiming materialized-occurrences also has required capability-token implications: meta.claim.capabilities MUST include materialized-occurrences. meta.claim.profiles MUST also include recurrence. Omitting either token while claiming materialized-occurrences is a non-conformant claim. 7.3.5 Profile: extended# Additional required capabilities: dependency schema support (blocked_by) reminder schema support (reminders) link parsing/resolution semantics for link-bearing fields (§11) time-tracking management semantics for time_entries (§5.19), including per-task active-session constraints dependency operations and validation per §10.2 reminder operations and validation per §10.3 If extended is claimed, all of the above baseline capabilities MUST conform to documented semantics. Claiming extended also has required capability-token implications: meta.claim.capabilities MUST include dependencies, reminders, links, and time-tracking. Omitting any of these tokens while claiming extended is a non-conformant claim (even if capability-gated fixtures are skipped by a runner). Optional capability extensions within extended: rename capability: reference-aware rename behavior (including dependency UID references) archive capability: archive semantics (§5.12) batch capability: batch operations with per-item outcomes (§5.15) concurrency capability: write-conflict detection semantics (§5.16) dry-run capability: dry-run semantics (§5.17) When an optional capability token is claimed, corresponding behavior MUST conform to documented semantics. 7.4 Conformance claim format# A conformance claim MUST include: implementation name and version, tasknotes-spec version, claimed profile list, validation mode support (strict required; permissive optional), known deviations, compatibility mode status (if any), configuration provider status (active provider chain, precedence policy, and fallback state). Example: Implementation: example-task-cli v1.4.0 Spec: tasknotes-spec 0.3.0-rc.3 Profiles: core-lite, recurrence, templating Validation modes: strict, permissive Known deviations: none Compatibility mode: disabled Configuration providers: tasknotes_plugin_data_json > built_in_defaults Configuration fallback: none 7.5 Deviation disclosure# Any known deviation from normative text MUST be explicitly disclosed in conformance output/documentation. A deviation entry SHOULD include: affected section, deviation summary, impact, planned resolution version. 7.6 Feature detection# Implementations SHOULD expose machine-readable capability metadata, including: profiles effective runtime timezone active configuration providers and precedence chain enabled compatibility modes configurable status sets supported mapping aliases templating support flags and effective templating failure mode dependency and reminder support flags attachment membership, reference normalization, and host-provided binary operation flags (including whether physical deletion is available) time-tracking support flags, including active-session policy and auto-stop-on-complete behavior materialized occurrence support flags, including materialization mode, next trigger, and rolling bounds configured natural-language capture triggers when the optional nlp block is present 7.7 Strictness disclosure# Conformance requires strict validation mode support (§6.3). Conformance claims MUST indicate whether permissive mode is also supported. 7.8 Example profile matrix# Capability core-lite recurrence templating materialized-occurrences extended create/update/delete required required companion-profile required companion-profile required required non-recurring complete required required companion-profile required companion-profile required required recurring instance complete/skip - required optional required via companion recurrence claim required materialize occurrence notes (§4.18, §5.20) - - optional required optional recurrence parent link resolution - - optional required for recurrence_parent only required template expansion/merge (§5.3.5) - - required optional optional double-brace portable variable support - - required optional optional recurrence-string validation - required optional required via companion recurrence claim required link parsing/resolution (§11) - - optional required for recurrence_parent only required attachment membership and ops (§5.21) optional via attachments capability optional via attachments capability optional via attachments capability optional via attachments capability optional via attachments capability dependency schema and ops - - optional optional required reminder schema and ops - - optional optional required time tracking start/stop/edit semantics (§5.19) - - optional optional required rename updates dependency/project links - - optional optional optional via rename capability archive semantics (§5.12) - - optional optional optional via archive capability batch per-item outcomes (§5.15) - - optional optional optional via batch capability write-conflict detection (§5.16) - - optional optional optional via concurrency capability dry-run reporting (§5.17) - - optional optional optional via dry-run capability 7.9 Executable fixture suite# This specification includes an executable fixture suite in conformance/. language-neutral fixtures are stored in conformance/fixtures/*.json section/profile/operation coverage is tracked in conformance/manifest.json coverage guard tests MUST enforce both section representation and minimum-depth thresholds for key sections/operations. adapters execute fixture operations per conformance/docs/ADAPTER_CONTRACT.md runners MUST execute fixtures only when both conditions hold: fixture profile is satisfied by claimed adapter profiles under cumulative profile rules (§7.3), all fixture requires capability tokens are present. Fixture expectations MUST be profile-modular: they MUST NOT assume capability values or profile memberships beyond what the fixture's own profile/requires gating guarantees. Fixtures for optional extension capabilities (rename, archive, batch, concurrency, dry-run) MUST be capability-gated via requires and MUST NOT rely on extended profile membership alone. Conformance claims SHOULD report fixture pass/fail results against the claimed profiles. 7.10 Meta operations# The following operations are part of the conformance interface and MUST be supported by any adapter that participates in the conformance suite, regardless of claimed profile. These meta operations MUST be callable without requiring any capability token. meta.claim# Returns the adapter's self-reported metadata. Input: {} (empty object) Output: { \"ok\": true, \"result\": { \"implementation\": \"my-tool\", \"version\": \"1.0.0\", \"spec_version\": \"0.3.0-rc.3\", \"validation_modes\": [\"strict\"], \"profiles\": [\"core-lite\", \"recurrence\"], \"capabilities\": [\"dependencies\", \"links\"] } } Fields: Field Type Required Description implementation string yes Human-readable implementation name version string yes Implementation version string spec_version string yes tasknotes-spec version targeted by this adapter validation_modes string[] yes Supported validation modes; MUST include strict profiles string[] yes Claimed conformance profiles; valid values: core-lite, recurrence, extended, templating, materialized-occurrences capabilities string[] yes Optional capability tokens; known tokens listed in §7.11 profiles lists explicitly claimed profiles. Cumulative profile expansion is applied by runners for fixture selection (§7.3, §7.9), but does not change literal membership semantics of meta.has_profile. Profile-token consistency rules: If profiles contains extended, capabilities MUST include dependencies, reminders, links, and time-tracking. If profiles contains templating, capabilities MUST include templating. If profiles contains materialized-occurrences, profiles MUST also contain recurrence and capabilities MUST include materialized-occurrences. Runners and fixture suites SHOULD validate these claim-consistency rules directly from meta.claim, not only by capability-gating feature fixtures. meta.has_capability# Tests whether the adapter claims a specific capability. Input: { \"capability\": \"dependencies\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the capability is in the capabilities array returned by meta.claim, and false otherwise. meta.has_profile# Tests whether the adapter claims a specific conformance profile. Input: { \"profile\": \"recurrence\" } Output: { \"ok\": true, \"result\": { \"value\": true } } result.value MUST be true if the profile is in the profiles array returned by meta.claim, and false otherwise. 7.11 Known capability tokens# The following capability tokens are defined by this specification. Implementations MAY define additional tokens. Token Required by profile Meaning dependencies extended Supports blocked_by, dependency operations, and dependency validation reminders extended Supports reminders, reminder operations, and reminder validation attachments optional extension under any profile Treats the mapped attachments list as authoritative membership; validates and normalizes its collection-file references; and implements §5.21 attachment operations using host-owned binary storage. A claim MUST separately disclose which host file actions are available; it does not by itself promise physical deletion where the host cannot perform an authoritative reference check. links extended Supports link parsing and resolution (§11) time-tracking extended Supports time-tracking management operations (§5.19) materialized-occurrences materialized-occurrences Supports recurrence materialization and materialized occurrence operations (§4.18, §5.20) rename optional extension under extended Supports file rename with reference updates archive optional extension under extended Supports archive semantics (§5.12) batch optional extension under extended Supports batch operations with per-item outcomes (§5.15) concurrency optional extension under extended Supports write-conflict detection (§5.16) dry-run optional extension under extended Supports dry-run mode (§5.17) migration — Supports migration operations (§8) templating templating Supports create-time templating (§5.3.5)"},{"title":"8. Compatibility and Migrations","url":"/developers/specification/08-compatibility-and-migrations/","description":"This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage.","product":"specification","text":"8.1 Purpose# This section defines how implementations transition from historical behavior to canonical specification behavior without silent data breakage. 8.2 Compatibility modes# Implementations MAY support compatibility modes for legacy behavior. If supported, compatibility modes MUST: be explicitly enabled or disabled, be discoverable through configuration or capability metadata, not be silently enabled by default in new collections. 8.3 Migration expectations# When canonical behavior differs from historical behavior, implementations SHOULD provide: deterministic migration rules, dry-run preview support, rollback-safe workflow guidance. 8.4 Alias normalization migration# For legacy key aliases, a migration SHOULD: read both canonical and alias keys, choose canonical value deterministically (recommended: canonical key precedence), rewrite persisted file using canonical keys, preserve unrelated unknown fields. 8.4.1 Example# Before: recurrenceAnchor: scheduled recurrence_anchor: completion After normalization: recurrenceAnchor: scheduled With warning: alias_conflict_ignored: alias value ignored because canonical key present. 8.5 Temporal normalization migration# If historical writes include mixed datetime styles, migration SHOULD normalize to canonical UTC ISO Z for datetime roles while preserving date-only roles as dates. Example: Before: dateCreated: 2026-02-20 10:00:00+00:00 After: dateCreated: 2026-02-20T10:00:00Z 8.6 Recurrence state migration# If historical data allows overlapping complete/skip dates, migration MUST resolve overlap deterministically. Recommended resolution policy: if overlap exists, prefer most recent user action where recoverable, otherwise prefer complete_instances and remove overlapping skip entries, emit migration report for affected dates. Policy choice MUST be documented. 8.7 Materialized occurrence migration# When introducing materialized occurrence notes into an existing collection, implementations SHOULD avoid automatic bulk creation. Recommended migration behavior: do not materialize historical or future occurrence notes unless explicitly requested; preserve existing parent complete_instances and skipped_instances; when importing existing per-occurrence task files, require deterministic parent/date matching before adding recurrence_parent and occurrence_date; when materialized occurrence state conflicts with parent instance lists, prefer the occurrence note for that date and report occurrence_state_conflict; provide a dry-run report before converting existing task files into materialized occurrence notes. Migration tooling MUST NOT silently delete occurrence notes or parent recurring tasks. 8.8 Dependency migration# When migrating legacy dependency data, implementations SHOULD: normalize dependency key names to mapped canonical key, ensure each entry has uid and canonical reltype, normalize legacy string/path references into configured canonical reference style, remove duplicate dependency entries by policy. If historical data omits reltype, migration MAY apply dependencies.default_reltype and SHOULD report count of inferred values. 8.9 Reminder migration# When migrating legacy reminder data, implementations SHOULD: normalize reminder key names, normalize type values to canonical enum (absolute or relative), normalize relatedTo values to canonical enum (due or scheduled), normalize absoluteTime to canonical UTC ISO Z, validate and normalize offsets to ISO 8601 duration syntax. If reminder id values are missing, migration MAY generate IDs and MUST report generated count. 8.10 Link migration# When migrating legacy link values, implementations SHOULD: normalize supported link syntaxes according to §11 parsing rules, preserve alias and anchor components where possible, normalize resolved targets into canonical write format by policy, detect and report ambiguous links instead of silently choosing non-deterministically. 8.11 Divergence register# Implementations SHOULD maintain a divergence register with columns: section current behavior target canonical behavior migration strategy deprecation timeline 8.12 Deprecation policy# For any behavior deprecated by the specification: announce deprecation in release notes, provide warning period, provide migration tooling where feasible, remove deprecated behavior only in a version aligned with compatibility commitments. 8.13 Data safety requirements# Migrations MUST NOT: silently drop unknown fields, silently convert valid date-only fields to datetime, silently rewrite recurrence semantics without explicit policy, silently materialize occurrence notes outside explicit user/configured materialization policy, silently delete materialized occurrence notes during recurrence edits, silently drop unresolved dependency entries, silently rewrite link targets to different destinations without explicit policy, silently delete reminders unless explicitly requested. 8.14 Suggested migration report format# spec_version_from: 0.1.0-draft spec_version_to: 0.3.0-rc.3 files_scanned: 214 files_changed: 67 warnings: alias_conflict_ignored: 3 instance_state_overlap_resolved: 2 occurrence_state_conflict: 1 unresolved_dependency_target: 4 changes: normalized_datetime_fields: 41 alias_keys_removed: 29 instance_overlaps_fixed: 2 occurrence_state_conflicts: 1 inferred_dependency_reltype: 5 generated_reminder_ids: 8 normalized_link_targets: 14 8.15 Compatibility statement example# Compatibility mode: legacy-aliases=true, legacy-timeentry-duration=true Planned removal: v2.0.0 Migration command: tasknotes migrate --normalize-frontmatter"},{"title":"9. Configuration","url":"/developers/specification/09-configuration/","description":"This section defines the normative configuration model for collections using tasknotes-spec.","product":"specification","text":"9.1 Purpose# This section defines the normative configuration model for collections using tasknotes-spec. 9.2 Configuration provider model# Implementations MUST derive an effective configuration from one or more configuration providers. A provider is a source adapter that returns a partial configuration normalized to this section's schema. Implementations MUST: support at least one provider, document supported providers, document provider precedence order, disclose active providers and fallback behavior in conformance output (§7). 9.2.1 Common provider types# Common providers include: yaml_file: a tasknotes.yaml document at collection root, tasknotes_plugin_data_json: .obsidian/plugins/tasknotes/data.json, built_in_defaults: implementation defaults, optional runtime/CLI/env overrides. This list is not exhaustive. 9.2.2 Deterministic precedence and merge# Provider precedence MUST be deterministic. Unless explicitly documented otherwise, implementations MUST resolve configuration per top-level key: for each key in §9.3/§9.4, the highest-precedence provider that supplies that key wins, winning object values replace lower-precedence object values as whole objects (no implicit deep merge), after top-level selection, implementations MUST apply documented schema defaults for missing nested keys before exposing effective configuration. If an implementation supports deep-merge behavior, it MUST be explicitly documented and deterministic. 9.2.3 Strict vs permissive provider behavior# In strict mode: failure to resolve required effective keys (spec_version, mapping) MUST be a configuration error. If permissive mode is implemented, then in permissive mode: implementations MAY continue with defaults when providers are missing/unreadable, implementations MUST emit configuration warnings, implementations MUST disclose that effective configuration is partial/default-derived. 9.2.4 TaskNotes plugin provider (data.json)# The TaskNotes plugin stores settings in .obsidian/plugins/tasknotes/data.json within the vault root. When using this file as a configuration provider, normalization MUST apply the field mapping in the table below. Key mapping table (data.json key → spec effective config): data.json key Spec key Notes fieldMapping mapping Normalize role names: dateCreated→date_created, completedDate→completed_date, recurrenceAnchor→recurrence_anchor, completeInstances→complete_instances, skippedInstances→skipped_instances, recurrenceParent→recurrence_parent, occurrenceDate→occurrence_date, occurrenceMaterialization→occurrence_materialization, occurrenceNextTrigger→occurrence_next_trigger, occurrenceTemplate→occurrence_template, occurrencePastHorizon→occurrence_past_horizon, occurrenceFutureHorizon→occurrence_future_horizon, blockedBy→blocked_by, timeEntries→time_entries, timeEstimate→time_estimate storeTitleInFilename title.storage true → \"filename\", false → \"frontmatter\" taskFilenameFormat title.filename_format Values: \"title\", \"zettel\", \"timestamp\", \"custom\"; used only when title.storage=frontmatter for canonical writes, but preserved as compatibility input when present customFilenameTemplate title.custom_filename_template Template string, e.g. \"{title}\"; used only when title.storage=frontmatter and filename_format=custom taskCreationDefaults.useBodyTemplate templating.enabled boolean taskCreationDefaults.bodyTemplate templating.template_path Path to template file customStatuses[*].value status.values Ordered array of status value strings defaultTaskStatus status.default Default status string customStatuses[isCompleted=true][*].value status.completed_values Statuses where isCompleted: true defaultTaskPriority defaults.priority Default priority string autoStopTimeTrackingOnComplete time_tracking.auto_stop_on_complete boolean autoStopTimeTrackingNotification time_tracking.auto_stop_notification boolean taskIdentificationMethod task_detection.method \"tag\" or \"property\" taskTag task_detection.tag Tag string used when method=\"tag\" taskPropertyName task_detection.property_name Frontmatter key used when method=\"property\" taskPropertyValue task_detection.property_value Expected value; empty means key must exist tasksFolder task_detection.default_folder Default folder for new tasks excludedFolders task_detection.excluded_folders Comma-separated folder paths to exclude moveArchivedTasks archive.move_on_archive boolean archiveFolder archive.folder Archive destination folder useFrontmatterMarkdownLinks links.use_markdown_format boolean; see §11 Key data.json fields with defaults (for cold-start reading of a vault with no tasknotes.yaml): Field Type Default Meaning tasksFolder string \"TaskNotes/Tasks\" Default folder for new task files taskIdentificationMethod \"tag\" | \"property\" \"tag\" How task files are identified taskTag string \"task\" Tag that identifies task files (when method=\"tag\") taskPropertyName string \"\" Frontmatter key for property-based identification taskPropertyValue string \"\" Expected value for property-based identification (empty = key presence) storeTitleInFilename boolean true Title storage mode taskFilenameFormat \"title\" | \"zettel\" | \"timestamp\" | \"custom\" \"title\" Filename generation format customFilenameTemplate string \"{title}\" Template for \"custom\" filename format defaultTaskStatus string \"open\" Default status on create defaultTaskPriority string \"normal\" Default priority on create customStatuses StatusConfig[] see object shape below Ordered status definitions autoStopTimeTrackingOnComplete boolean true Auto-stop active session on completion autoStopTimeTrackingNotification boolean false Show notification when auto-stopping useFrontmatterMarkdownLinks boolean false Use markdown links in frontmatter (requires obsidian-frontmatter-markdown-links plugin) moveArchivedTasks boolean false Move task file to archive folder on archive archiveFolder string \"TaskNotes/Archive\" Archive destination folder excludedFolders string \"\" Comma-separated folders to exclude from task indexing StatusConfig object shape: { \"id\": \"done\", \"value\": \"done\", \"label\": \"Done\", \"color\": \"#00aa00\", \"isCompleted\": true, \"order\": 3, \"autoArchive\": false, \"autoArchiveDelay\": 5 } spec_version is not present in data.json. Implementations MUST synthesize an effective spec_version as described in §9.5. Provider keys not listed above MAY be ignored by tasknotes-spec consumers. 9.3 Required top-level keys# Required keys apply to the effective configuration after provider resolution. Key Type Required Description spec_version string yes target spec version (provider-supplied or synthesized per §9.5) mapping object yes semantic role to storage key mapping 9.4 Recommended top-level keys# Key Type Description task_detection object task file identification rules defaults object role defaults used during create status object status set and completed-value semantics validation object validation behavior (strict required, permissive optional) links object link parsing/resolution behavior title object title source and filename behavior policy templating object optional create-time templating behavior policy dependencies object dependency behavior policy reminders object reminder behavior policy time_tracking object time-tracking management behavior policy occurrences object recurrence materialization defaults and bounds compatibility object legacy alias/behavior switches 9.5 spec_version behavior# spec_version MUST be a semantic version string. Pre-release identifiers are valid (for example 0.3.0-rc.3). Implementations in strict mode MUST reject unsupported major versions. If permissive mode is implemented, permissive mode MAY proceed with warning when major version differs. If a provider does not supply spec_version (for example TaskNotes data.json), implementations MUST synthesize an effective spec_version matching their target tasknotes-spec version and SHOULD disclose that it was synthesized. 9.6 mapping schema# mapping MUST map semantic roles (from §2) to string storage keys. Minimum required roles in mapping: title status completed_date date_created date_modified If semantic role id is supported (§2.6.5), mapping SHOULD include id. If profile materialized-occurrences is claimed, mapping MUST include recurrence_parent and occurrence_date, and SHOULD include parent policy roles (occurrence_materialization, occurrence_next_trigger, occurrence_template, occurrence_past_horizon, occurrence_future_horizon). Example: mapping: title: title status: status date_created: dateCreated date_modified: dateModified completed_date: completedDate recurrence: recurrence recurrence_anchor: recurrenceAnchor complete_instances: completeInstances skipped_instances: skippedInstances recurrence_parent: recurrence_parent occurrence_date: occurrence_date occurrence_materialization: occurrence_materialization occurrence_next_trigger: occurrence_next_trigger occurrence_template: occurrence_template occurrence_past_horizon: occurrence_past_horizon occurrence_future_horizon: occurrence_future_horizon time_entries: timeEntries blocked_by: blockedBy reminders: reminders attachments: attachments 9.7 task_detection schema# task_detection controls how task files are identified within the vault. Detection methods# The tasknotes plugin natively supports two identification methods, controlled by taskIdentificationMethod in data.json (mapped to task_detection.method): tag (default) — A markdown file is a task if it contains the configured tag (default #task) in its frontmatter tags array or inline in the body. Configured by task_detection.tag. property — A markdown file is a task if a specified frontmatter property has a specified value (or exists, if value is empty). Configured by task_detection.property_name and task_detection.property_value. Schema and selection rules: task_detection MAY specify either: method (single-method form), or methods (multi-method form; non-empty list). If both are present, methods MUST take precedence and implementations SHOULD emit a configuration warning. If neither is present, effective detection method MUST default to tag. method MUST be tag or property. methods entries MUST be unique and MUST be from: tag property field_presence field_match Method-specific required keys: when tag is enabled, effective task_detection.tag MUST be non-empty (default task when absent); when property is enabled, task_detection.property_name MUST be provided and non-empty; task_detection.property_value MAY be empty (empty means key-exists semantics). If methods has more than one entry, task_detection.combine controls combination semantics (§9.7.3). If omitted, it MUST default to or. 9.7.1 Tag matching semantics# When task_detection.method=tag, matching MUST follow these rules: Normalize configured task_detection.tag by stripping one leading # when present. Compare tag names case-insensitively after normalization. Frontmatter matching: tags MAY be a list of strings or a single string. each tag value is normalized by trimming surrounding whitespace and stripping one leading #. match requires exact normalized equality (for example task matches #task; task does not match tasking). Body matching: only markdown text outside fenced code blocks and inline code spans is considered, a match requires a hashtag token with exact normalized name (for example #task), partial-word matches MUST NOT count (for example #tasking does not match configured task). If either frontmatter or body matches, the file is identified as a task. 9.7.2 Property matching semantics# When property detection is enabled (method=property or methods includes property): task_detection.property_name MUST name the frontmatter key to inspect. If task_detection.property_value is non-empty, match requires semantic equality with the configured value. If task_detection.property_value is empty or absent, match requires key presence only. 9.7.3 Multi-method extension semantics# tasknotes.yaml-level providers MAY additionally support: field_presence (example: required key status) field_match (example: type == \"task\") Extension-key shape: field_presence: string or list of required frontmatter keys. field_match: object map of key -> expected scalar value for exact semantic equality checks. If multiple methods are configured in tasknotes.yaml, task_detection.combine MUST define combinator semantics: or (default): file is a task if any enabled method matches. and: file is a task only if all enabled methods match. If task_detection.combine is absent, implementations MUST default to or. Implementations MUST exclude folders listed in task_detection.excluded_folders from task indexing. Executable conformance: adapters participating in the fixture suite SHOULD expose config.detect_task_file to evaluate these detection semantics against fixture inputs. Example (tasknotes.yaml, equivalent to tag-based default): task_detection: method: tag tag: task default_folder: TaskNotes/Tasks Example (property-based): task_detection: method: property property_name: type property_value: task 9.8 defaults schema# defaults defines values used at create time when caller input omits a role. Defaults MUST NOT override explicit user input. Example: defaults: status: open priority: normal recurrence_anchor: scheduled reminders: - id: due_minus_1d type: relative relatedTo: due offset: -P1D defaults.reminders behavior is defined in §10.3.9. 9.9 status schema# status defines known status values and completion semantics. Example: status: values: [open, in-progress, done, cancelled] default: open completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled Rules: default MUST be one of values. completed_values MUST be a non-empty list. Each completed_values entry MUST be in values. skipped_values, when present, MUST be a list whose entries are in values. default_skipped, when present, MUST be in skipped_values. For implementations claiming materialized-occurrences, skipped_values MUST NOT overlap completed_values. Implementations claiming materialized-occurrences MUST provide at least one skipped value or fail skip of materialized occurrence notes deterministically (§5.20.3). Non-recurring completion MUST use this list, not hardcoded literals. When a complete operation does not provide an explicit target status, writers MUST use the first entry of completed_values. When a materialized occurrence skip operation does not provide an explicit skipped status, writers MUST use default_skipped when present, otherwise the first entry of skipped_values. 9.10 validation schema# Example: validation: mode: strict reject_unknown_fields: false Rules: mode MUST be strict or permissive when present. If mode is absent, effective mode MUST default to strict. Conforming implementations MUST support strict. Implementations MAY support permissive. If mode=permissive is configured but not implemented, configuration MUST fail in strict mode and SHOULD emit warning/fallback in permissive mode. reject_unknown_fields=true enforces closed-schema behavior for mapped roles. 9.11 dependencies schema# Example: dependencies: default_reltype: FINISHTOSTART treat_missing_target_as_blocked: true enforce_unique_uid: true unresolved_target_severity: warning require_resolved_uid_on_write: false Rules: default_reltype MUST be one of the allowed reltype values in §10.2. treat_missing_target_as_blocked controls whether missing/unresolvable dependency targets contribute to blocked-state evaluation (§10.2.5). If treat_missing_target_as_blocked is absent, effective value MUST default to true. enforce_unique_uid=true enforces uniqueness at validation/write time. If enforce_unique_uid is absent, effective value MUST default to true. unresolved_target_severity MUST be warning or error. require_resolved_uid_on_write=true requires dependency UID resolution success for add/update operations. 9.12 links schema# Example: links: extensions: [\".md\"] unresolved_default_severity: warning update_references_on_rename: true Rules: extensions defines extension trial order for extensionless targets"},{"title":"10. Dependencies and Reminders","url":"/developers/specification/10-dependencies-and-reminders/","description":"This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders).","product":"specification","text":"10.1 Purpose# This section defines canonical semantics for task dependencies (blocked_by) and task reminders (reminders). 10.2 Dependencies (blocked_by)# 10.2.1 Data shape# blocked_by MUST be a list of dependency entries. Each entry MUST be an object with: uid (required): reference to a blocking task (link or string) reltype (required): one of FINISHTOSTART STARTTOSTART FINISHTOFINISH STARTTOFINISH gap (optional): ISO 8601 duration string If reltype is omitted on read in compatibility mode, implementations MAY treat it as FINISHTOSTART and SHOULD emit a warning. 10.2.2 UID normalization# Implementations SHOULD normalize uid values to a canonical reference representation on write. If link formats are supported, both wikilink and markdown-link forms MAY be read. Canonical write form MUST be documented. Link parsing and resolution MUST follow §11. 10.2.3 Dependency uniqueness# Within a task, dependency entries are keyed by normalized uid. Policy is configuration-driven and MUST be deterministic: when dependencies.enforce_unique_uid=true (default), duplicate normalized uid values MUST NOT be accepted as canonical persisted state: strict mode: duplicates MUST fail validation/write with duplicate_dependency_uid; permissive mode: implementations MAY either fail or normalize to one entry, but MUST emit duplicate_dependency_uid. when dependencies.enforce_unique_uid=false, duplicates MAY be preserved as compatibility behavior. The active policy MUST be documented in conformance claims. 10.2.4 Self-dependency# A task MUST NOT depend on itself. Self-dependency is a validation error. 10.2.5 Blocking semantics (v0.1)# For v0.1, blocking evaluation MUST be status-presence based: A task is blocked if it has at least one unresolved dependency. A dependency on a resolvable task is unresolved when the referenced task is not in a completed status. Completed status MUST be determined from configured status.completed_values. For recurring referenced tasks in v0.1, unresolved/resolved evaluation MUST use base status only; complete_instances/skipped_instances are not consulted. When a referenced task is missing/unresolvable, whether that missing target contributes to blocked-state evaluation MUST follow dependencies.treat_missing_target_as_blocked (§9.11, default true). For v0.1, reltype and gap are preserved and validated but MUST NOT change the unresolved/resolved decision. 10.2.6 Missing referenced task# When uid cannot be resolved: implementations SHOULD emit unresolved_dependency_target. blocked-state contribution for this missing target MUST follow dependencies.treat_missing_target_as_blocked (§9.11). issue severity SHOULD follow dependencies.unresolved_target_severity (default: warning). for blocked_by.uid, this dependency-specific severity policy MUST take precedence over links.unresolved_default_severity. parse failures that produce invalid_link_format and containment violations that produce path_traversal remain error-severity conditions from §11. if dependencies.require_resolved_uid_on_write=true, add/update MUST fail with error. 10.2.7 Cycles# Implementations MUST reject direct self-cycles. Detection of multi-hop dependency cycles is RECOMMENDED but not required for core-lite or recurrence profiles. 10.2.8 Reverse relation field# Some implementations maintain reverse relationships (for example blocking). Such fields are derived and non-canonical in this spec unless explicitly mapped. If maintained, reverse updates SHOULD remain consistent with blocked_by edits. 10.2.9 Dependency operation semantics# Add dependency# Add dependency MUST: validate entry shape, handle duplicates by policy (preserve, normalize, or reject), preserve unrelated dependency entries, update date_modified on change. Remove dependency# Remove dependency MUST remove by normalized uid and be idempotent. Replace dependencies# Replace behavior MUST be explicit operation mode (not default for patch update). 10.2.10 Dependency examples# Example entry: blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART gap: PT4H Example unresolved dependency (target missing): blockedBy: - uid: \"[[non-existent-task]]\" reltype: FINISHTOSTART 10.3 Reminders (reminders)# 10.3.1 Data shape# reminders MUST be a list of reminder entries. Each reminder MUST include: id (required): unique string within the task type (required): absolute or relative Optional field: description string Type-specific fields: absolute: requires absoluteTime datetime relative: requires relatedTo (due or scheduled) and offset (ISO 8601 duration) 10.3.2 Reminder uniqueness# Reminder id values MUST be unique within the task. If duplicates occur: strict mode: MUST raise duplicate_reminder_id. permissive mode: MAY normalize deterministically and emit warning. 10.3.3 Relative reminder base# relatedTo MUST reference semantic role due or scheduled. If the referenced role is absent, the reminder is unresolved. 10.3.4 Trigger instant computation# Trigger instant MUST be computed as follows: If type=absolute, trigger = absoluteTime instant. If type=relative, resolve base field from relatedTo, if base is datetime: use that instant, if base is date: convert to local datetime at configured reminders.date_only_anchor_time, trigger = base + offset. If reminders.date_only_anchor_time is not configured, implementations MUST use 00:00 local time. 10.3.5 Offset semantics# offset MUST be a valid ISO 8601 duration with optional sign. negative offset = before base positive offset = after base zero offset = at base instant 10.3.6 Invalid mixed fields# Entries with incompatible field combinations MUST fail validation in strict mode. Examples: type=absolute with relatedTo and no absoluteTime type=relative with absoluteTime and missing offset 10.3.7 Reminder ordering# When computing reminder schedules, implementations MUST sort by trigger instant ascending. For identical trigger instants, implementations MUST use stable tie-break ordering by id ascending. 10.3.8 Reminder operation semantics# Add reminder# Add reminder MUST validate shape and unique id, then update date_modified. If id is omitted by caller and implementation supports auto-ID generation, generated IDs MUST be unique within the task. Update reminder# Update reminder MUST address reminders by id and be patch-by-default. Remove reminder# Remove reminder by id MUST be idempotent. 10.3.9 Default reminders# If defaults.reminders is configured (see §9): create without explicit reminders MUST apply defaults. create with explicit reminders MUST follow reminders.apply_defaults_when_explicit (§9.15): false (default): explicit reminders replace defaults. true: explicit reminders are merged with defaults. Deterministic merge rules when apply_defaults_when_explicit=true: Start with explicit reminders in caller order. Append each default reminder whose id is not already present. If explicit and default reminders share an id, explicit reminder MUST win. 10.3.10 Reminder examples# Relative reminder: reminders: - id: due_minus_15m type: relative relatedTo: due offset: -PT15M Absolute reminder: reminders: - id: call_now type: absolute absoluteTime: 2026-02-20T09:00:00Z 10.3.11 Reminder resolution error handling# If relative reminder base is unavailable (relatedTo=due but no due field): strict mode: validation error unresolvable_reminder_base. permissive mode: warning and reminder excluded from trigger computation. 10.4 Interactions# 10.4.1 Rename interaction# If implementation supports rename/reference updates, dependency uid references SHOULD be updated consistently with other link references. 10.4.2 Completion interaction# Changing task completion state does not automatically remove dependencies or reminders unless explicitly configured. 10.4.3 Archive interaction# Archive operations MAY suppress reminder delivery in runtime systems, but archive MUST NOT silently delete reminder records from persisted frontmatter unless explicitly requested."},{"title":"11. Links","url":"/developers/specification/11-links/","description":"This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects, blocked_by.uid, and attachments. Alignment w...","product":"specification","text":"11.1 Purpose# This section defines link syntax, parsing, resolution, and write-format semantics for link-bearing task fields — primarily projects, blocked_by.uid, and attachments. Alignment with Obsidian and other ecosystems is informative context only; normative conformance is defined entirely by this section. Applicability: Implementations claiming profile extended (§7.3.5) MUST conform to this section for supported link-bearing roles. Implementations claiming profile materialized-occurrences (§7.3.4) MUST conform to this section for recurrence_parent links, but are not required to support unrelated extended link-bearing roles solely because of that profile. Implementations supporting the attachments role MUST conform to this section for attachment references regardless of profile. Implementations that claim neither extended nor materialized-occurrences MAY treat link-shaped strings as opaque data and are not required to implement §11 behavior. 11.2 Link formats# Implementations that conform to §11 (see §11.1 applicability) MUST support three link formats. 11.2.1 Wikilinks# [[target]] [[target|alias]] [[target#anchor]] [[target#anchor|alias]] [[folder/target]] [[./relative]] [[../parent/target]] Components: target: The file being linked to (without extension by default) alias: Display text; does not affect resolution anchor: A heading or block reference within the target path: May be absolute (from collection root) or relative (from current file) Examples in frontmatter: projects: - \"[[home-project]]\" - \"[[projects/alpha|Alpha Project]]\" blockedBy: - uid: \"[[prepare-metrics]]\" reltype: FINISHTOSTART 11.2.2 Markdown links# [text](path.md) [text](./relative.md) [text](../other/file.md) [text](path.md#anchor) The text portion is treated as an alias and does not affect resolution. Markdown links in frontmatter require the obsidian-frontmatter-markdown-links Obsidian plugin. Implementations MUST NOT write markdown-format links by default unless links.use_markdown_format=true is configured (§11.7). 11.2.3 Bare paths# ./sibling.md ../other/file.md folder/file.md Bare paths follow the same resolution rules as markdown links (relative to containing file's directory unless starting with /). 11.3 Link parsing# When a link value is read, implementations MUST parse it into a structured representation: Component Type Description raw string Original string value exactly as written target string File path or identifier (without anchor or alias) alias string? Display text if provided, otherwise null anchor string? Heading or block reference if provided, otherwise null format enum One of: wikilink, markdown, path is_relative boolean Whether target begins with ./ or ../ Parsing examples: Input target alias anchor format is_relative [[task-001]] task-001 null null wikilink false [[task-001|My Task]] task-001 My Task null wikilink false [[docs/api#auth]] docs/api null auth wikilink false [[./sibling]] ./sibling null null wikilink true [Link](file.md) file.md Link null markdown false ./other.md ./other.md null null path true 11.4 Resolution algorithm# Resolution transforms a parsed link into an absolute path (relative to collection root) pointing to the target file. Given a parsed link and the path of the source file containing it: Step 1: Parse the link into components (target, format, is_relative)# Step 2: Route by format# If format is markdown or path: If target starts with /, resolve from collection root (strip the leading /) Otherwise, resolve relative to the source file's directory (standard markdown behavior) Example: link [Docs](docs/api.md) in notes/meeting.md resolves to notes/docs/api.md If format is wikilink: If target starts with ./ or ../, resolve relative to the source file's directory If target starts with /, resolve from collection root (strip the leading /) If target contains / (and is not relative), resolve from collection root Example: [[docs/api]] resolves to docs/api If simple name (no /, no ./ or ../): proceed to Step 3 Step 3: Simple-name resolution (wikilinks only)# For simple wikilink names (no path separator): Define the search scope: For blocked_by.uid: scope to files matching task_detection (task files only) For projects: scope to all markdown files in the collection unless narrowed by explicit configuration For attachments: scope to all non-directory files in the collection ID match pass: search scoped files for semantic role id (§2.6.5) equal to the name. Implementations MAY treat literal frontmatter key id as compatibility input when semantic mapping for id is unavailable. Equality MUST be exact string equality. If exactly one match: resolve to that file If multiple matches: fail with ambiguous_link Filename match pass: if no ID match, search scoped markdown files by filename (without extension). Implementations MUST deduplicate normalized candidate paths before final selection. If exactly one filename candidate remains after normalization and extension handling, resolve to that file. If multiple filename candidates remain, resolve to null and emit ambiguous_link. Callers SHOULD use a path-qualified or relative target to disambiguate. Step 4: Extension handling# If the target has no extension, implementations SHOULD try configured extensions in order. Default extension order: [\".md\"]. Example: [[readme]] tries readme.md, readme.mdx, etc. Step 5: Path traversal check# After resolution and normalization, if the resolved path would escape the collection root, abort with path_traversal. See §11.5. Step 6: Return result# The normalized collection-relative path if found null if no matching file exists Resolution examples# Given collection structure: / ├── TaskNotes/ │ ├── Tasks/ │ │ ├── task-001.md │ │ └── subtasks/ │ │ └── task-002.md ├── notes/ │ └── meeting.md └── projects/ └── alpha.md Resolution from TaskNotes/Tasks/subtasks/task-002.md: Link value Resolved path Notes [[task-001]] TaskNotes/Tasks/task-001.md Simple-name search [[../task-001]] TaskNotes/Tasks/task-001.md Relative wikilink [[./task-003]] TaskNotes/Tasks/subtasks/task-003.md Relative (may not exist) [[notes/meeting]] notes/meeting.md Absolute from root [[alpha]] projects/alpha.md Simple-name search (projects scope) [link](../task-001.md) TaskNotes/Tasks/task-001.md Markdown, relative ../task-001.md TaskNotes/Tasks/task-001.md Bare path, relative 11.5 Path sandboxing# Link resolution MUST NOT produce paths outside the collection root. Rules: After resolving relative paths (applying ../ segments), the resulting path MUST be within the collection root directory If resolution would escape the collection root, the link MUST resolve to null and implementations MUST emit a path_traversal error This applies to all link formats: wikilinks, markdown links, and bare paths Implementations MUST normalize paths (resolve . and .. segments) before checking containment Examples (collection rooted at /home/user/MyVault/): Link From file Result [[../../../etc/passwd]] TaskNotes/Tasks/task.md null + path_traversal [[../../secrets/key]] deep/nested/file.md null + path_traversal [[../task-001]] TaskNotes/Tasks/subtasks/t.md Resolves normally 11.6 Canonical write format# When creating new link values or changing a link target, implementations MUST use a deterministic canonical form. Default (wikilink format)# By default (links.use_markdown_format=false), the canonical write format is a simple wikilink: blockedBy: - uid: \"[[task-001]]\" reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" Rules: Use the filename without extension as the target when the file can be identified by simple-name resolution within the appropriate scope. Use a path-qualified target (folder/name) when the simple name would be ambiguous. Do NOT include the alias component in dependency uid writes. Do NOT include the anchor component in dependency uid writes. Preserve the alias component in projects entries when the alias was provided by the user. For attachments, always write a path-qualified collection-relative target with its file extension, for example [[Attachments/01K1-photo.jpg]]. Attachment writes MUST NOT include an alias or anchor. Markdown link format (links.use_markdown_format=true)# When links.use_markdown_format=true is configured (requires the obsidian-frontmatter-markdown-links Obsidian plugin), the canonical write format for link-bearing fields is a markdown link using the collection-relative path: blockedBy: - uid: \"[task-001](TaskNotes/Tasks/task-001.md)\" reltype: FINISHTOSTART Round-trip preservation# When writing an existing link field and the resolved target is unchanged, implementations MUST preserve the original format when possible: If the user wrote [[task-001|My Task]], preserve alias for projects entries. If the user wrote a relative path, preserve relativity when possible. For blocked_by.uid, alias and anchor components MUST still be removed on canonical writes. If preservation is not possible (for example unresolved/ambiguous reconstruction), implementations MUST fall back to canonical write rules in this section. 11.7 Configuration# links configuration keys (see §9.12): links: extensions: [\".md\"] # Extension trial order for extensionless targets use_markdown_format: false # Write markdown links instead of wikilinks unresolved_default_severity: warning # \"warning\" or \"error\" update_references_on_rename: true # Update link targets when files are renamed Rules: extensions MUST be a non-empty list when present unresolved_default_severity MUST be \"warning\" or \"error\" update_references_on_rename=true enables rename-time link rewrite behavior (§11.9) use_markdown_format=true requires the obsidian-frontmatter-markdown-links plugin in Obsidian deployments 11.8 Role-specific rules# 11.8.1 projects# projects entries SHOULD be interpreted with this section's parsing/resolution rules. If a projects entry is a plain string (not a wikilink or markdown link), implementations SHOULD treat it as a bare filename or path and attempt resolution. If unresolved: links.unresolved_default_severity=error: validation error otherwise: SHOULD emit unresolved_link_target warning 11.8.2 blocked_by.uid# blocked_by.uid values MUST use this section's parsing/resolution rules. For dependency semantics, unresolved uid handling follows §10.2.6. For unresolved-target severity, dependencies.unresolved_target_severity controls and takes precedence over links.unresolved_default_severity. The canonical write form for uid values is specified in §11.6. 11.8.3 attachments# Attachment references MUST resolve to files, not directories. Canonical attachment targets MUST be collection-relative, path-qualified, and retain an explicit file extension. This avoids ambiguous simple-name lookup, makes the frontmatter portable without a media-specific extension search policy, and preserves the actual filename. Readers MUST accept wikilinks, Markdown links, and bare paths. They MAY accept simple-name or extensionless values as non-canonical compatibility input, but canonical writes MUST resolve and replace them with an explicit path and extension. Aliases and anchors are not part of attachment identity and MUST be removed on canonical writes. The normalized resolved collection path defines attachment identity for duplicate detection. Implementations MUST preserve list order and MUST reject duplicates after path normalization. Unresolved attachment targets use the configured unresolved_link_target severity; offline-capable clients SHOULD distinguish a known-but-not-locally-cached file from a genuinely unresolved target. 11.9 Rename and reference updates# If an implementation supports reference updates on rename (i.e. claims the rename capability): It MUST update resolvable references in blocked_by.uid, projects, and attachments link fields. It SHOULD update links in body content. It SHOULD preserve the original link format when possible. It MUST preserve alias and anchor components where valid for the target field. For blocked_by.uid, alias and anchor are non-canonical and MUST be removed on write (§11.6). It MUST report unresolved or ambiguous rewrite cases. If reference updates are not supported, this limitation MUST be disclosed in conformance claims. 11.10 Validation# Link validation issues: Code Severity Trigger invalid_link_format error Link value cannot be parsed as any supported format ambiguous_link warning Simple-name resolution found multiple candidates after normalization unresolved_link_target warning Link target cannot be resolved to an existing file path_traversal error Resolved path escapes collection root unresolved_link_target severity may be promoted to error via links.unresolved_default_severity=error. For blocked_by.uid, use unresolved_dependency_target severity policy from §10.2.6 instead of unresolved_link_target. 11.11 Examples# Dependency with wikilink (default)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[[design-api]]\" reltype: FINISHTOSTART - uid: \"[[projects/infra/setup-server]]\" reltype: FINISHTOSTART gap: P1D projects: - \"[[projects/alpha]]\" dateCreated: 2026-02-20T10:00:00Z dateModified: 2026-02-20T10:00:00Z --- Dependency with markdown links (links.use_markdown_format=true)# --- title: Implement API status: open tags: [task] blockedBy: - uid: \"[design-api](TaskNotes/Tasks/design-api.md)\" reltype: FINISHTOSTART --- Relative links from nested task# # TaskNotes/Tasks/subtasks/task-002.md --- title: Sub-task status: open tags: [task] blockedBy: - uid: \"[[../task-001]]\" # resolves to TaskNotes/Tasks/task-001.md reltype: FINISHTOSTART projects: - \"[[projects/alpha]]\" # resolves from collection root ---"},{"title":"12. mdbase v0.3 Data-Contract Binding","url":"/developers/specification/12-mdbase-v0.3-binding/","description":"Status: Draft","product":"specification","text":"Status: Draft Record contract: tasknotes.task 0.3.0-rc.3 Event contract: tasknotes.task.completed 1.0.0 Target: mdbase 0.3.x 12.1 Purpose# This chapter defines how a TaskNotes task model is exposed through mdbase without coupling TaskNotes to one record type or one application's private extension. The binding has three deliberately separate parts: the tasknotes.task data contract defines the portable task view; an mdbase type's implements entry maps that view to its own frontmatter fields and supplies TaskNotes behavior; and the rest of the type file continues to define that type's storage, matching, defaults, lifecycle, links, and paths. The normative artifacts are: mdbase/tasknotes.task.md, the record contract; schemas/tasknotes-task.schema.json, the projected task-view schema; and schemas/tasknotes-task-binding.schema.json, the implementation binding schema. The optional event-interoperability artifacts are: mdbase/tasknotes.task.completed.md, the event contract; and schemas/tasknotes-task-completed.schema.json, its event-data schema. 12.2 The mental model# A contract is not another record type. It is a view that several record types can implement and several applications can consume. personal_task ─┐ work_task ─────┼─ implements tasknotes.task 0.3.0-rc.3 ── TaskNotes issue_task ────┘ ├─ automation └─ another task app Reading or listing through the contract uses the union of all implementing types. Creating a task is different: the caller MUST choose one exact target type because the contract does not choose storage, paths, or lifecycle policy. The contract version is an exact semantic version. For this draft it is also the tasknotes-spec version whose task semantics the contract exposes. There is no independent x-tasknotes.version or spec_version mirror. Record types use implements because they adapt persisted fields and semantic bindings to the tasknotes.task record contract. Event sources do not use a type file. A TaskNotes application instead registers an event-source declaration for tasknotes.task.completed with an active mdbase interoperability bridge. 12.3 Layering# An implementing type MUST keep these responsibilities in their canonical locations: Information mdbase v0.3 location Persisted frontmatter shape, required fields, enum values, formats schema Type identification match Display field, defaults, links, uniqueness, and path generation collection Managed create/update values lifecycle Contract identity and custom field names implements[].contract, version, and fields TaskNotes semantic behavior implements[].binding TaskNotes metadata MUST NOT be encoded as custom JSON Schema keywords. x-tasknotes MUST NOT be used for contract discovery, field mapping, conformance, or authorization. 12.4 Declaring an implementation# An mdbase TaskNotes type declares one implementation: implements: - contract: tasknotes.task version: 0.3.0-rc.3 fields: title: summary status: state priority: importance dateCreated: created_at binding: # TaskNotes behavior; abbreviated here profiles: [core-lite] capabilities: [] title: storage: frontmatter filename_format: title status: values: [todo, doing, done] default: todo completed_values: [done] definitions: [] priority: values: [normal] default: normal definitions: [] The contract file identified by the exact contract and version MUST exist in the collection contract registry. The binding MUST validate against that contract's binding_schema. Each type MUST declare at most one implementation of one exact contract identity. A type may implement several different contracts. 12.5 Portable fields# fields maps contract field paths to record field paths. Consumers access contract fields and MUST NOT assume that their names are also frontmatter property names. fields: title: summary status: state blockedBy: dependencies attachments: files Every unconditionally required contract field MUST be mapped. Every mapped contract field and record field MUST exist in its respective JSON Schema. The contract view contains only mapped fields. It does not expose unmapped frontmatter or the Markdown body. A consumer that requires either needs separate, explicit whole-record access. title is optional in the portable schema because TaskNotes permits filename title storage. When binding.title.storage is filename, consumers derive the effective title from the record identity/path rules in §9.13 instead of expecting a projected frontmatter value. The camel-case contract field names are stable portable identifiers. Their snake-case tasknotes-spec counterparts include: Contract field tasknotes-spec role timeEstimate time_estimate completedDate completed_date dateCreated date_created dateModified date_modified recurrenceAnchor recurrence_anchor completeInstances complete_instances skippedInstances skipped_instances recurrenceParent recurrence_parent occurrenceDate occurrence_date occurrenceMaterialization occurrence_materialization occurrenceNextTrigger occurrence_next_trigger occurrenceTemplate occurrence_template occurrencePastHorizon occurrence_past_horizon occurrenceFutureHorizon occurrence_future_horizon timeEntries time_entries blockedBy blocked_by attachments attachments 12.6 Semantic profiles and capabilities# binding.profiles and binding.capabilities describe semantics that records of this implementation may use: binding: profiles: [core-lite, recurrence, materialized-occurrences] capabilities: - dependencies - reminders - attachments - links - time-tracking - materialized-occurrences - archive These are properties of the implementation, not claims that every consuming application supports them. Before mutating a governed field, a consumer SHOULD verify its own corresponding capability. It may still perform unrelated operations when it preserves unsupported fields and invariants. 12.7 Status and priority semantics# The implementing type schema defines the legal persisted values of the mapped fields. The binding gives those values TaskNotes meaning: binding: status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] The following consistency rules apply: binding values MUST equal the mapped type-schema enum values; defaults MUST equal mapped collection.read_defaults values when present; completed and skipped values MUST be members of status.values; default_skipped MUST be a skipped value; completed and skipped values MUST NOT overlap for materialized occurrences; and definition semantics MUST agree with completed/skipped membership. Status and priority labels, colors, and icons are presentation hints. Status cycle, completion, skipping, auto-archive, and priority weight are semantic. 12.8 Title, recurrence, links, and operations# The remaining binding sections project the effective TaskNotes behavior defined elsewhere in this specification: title follows §9.13 and MUST agree with collection.display and collection.path; recurrence follows §4; occurrences follows §2.6.6, §4.18, §5.20, and §9.17; links follows §11; attachment membership is the portable attachments contract field; binary MIME type, digest, byte size, revision, and timestamps remain authoritative in mdbase file descriptors and are not projected into task frontmatter; archive follows §5.12; time_tracking follows §5.19 and §9.16; templating follows §5.3.5 and §9.14; and optional nlp triggers follow §9.18. Archive always operates on the portable tags contract field, so the binding does not repeat a record-specific tags_field. The implementation's fields map determines the actual frontmatter property. Application-local notification preferences and generator bookkeeping MUST NOT be placed in the binding. 12.9 Multiple implementations# A collection may contain any number of types implementing tasknotes.task 0.3.0-rc.3. TaskNotes-aware readers MUST: resolve the exact local contract; enumerate every implementation in canonical type-name order; read each matching record through that implementation's projected view; validate the projected view; and retain the concrete type identity for updates. Implementations MUST NOT merge type schemas into one synthetic schema. A record is validated by its concrete type and then by its projected contract view. When an approval, cache, or external protocol pins an implementation set, it MUST pin the exact contract digest and sorted implementation descriptors, including each implementation digest. A newly installed type is therefore not silently added to an existing approval. Creation MUST name one concrete implementing type. If no type is selected, creation fails as ambiguous. 12.10 Task-completed event# An event source that claims tasknotes.task.completed 1.0.0 MUST emit one CloudEvents structured event for each observed transition from a non-completed status to a completed status. Its data contains only: task_id, using the stable TaskNotes ID when present and otherwise the normalized path; task_path; the current title and completed status; and completed_at, the instant when TaskNotes observed the transition. The event source MUST use the mdbase event/action interoperability profile 0.1, pin the exact event-contract digest, and preserve any correlation and causation identifiers supplied by the mutation context. It MUST NOT include a complete task record merely because one is locally available. An authorized consumer can retrieve current state separately, avoiding stale snapshots and unnecessary disclosure. Contract compatibility and bridge authorization are independent. Installing TaskNotes or resolving this contract does not grant permission to publish or consume the event. 12.11 Precedence and consistency# The complete implementation is self-describing: the contract schema is authoritative for the portable projected view; the type schema is authoritative for persisted value shapes; collection is authoritative for generic mdbase behavior; lifecycle is authoritative for generic managed writes; and implements[].binding is authoritative for TaskNotes semantics. Where values intentionally mirror each other, producers MUST keep them equal. A TaskNotes-aware consumer MUST report a configuration error instead of silently choosing between contradictory values. 12.12 Safe writes# TaskNotes-aware consumers MUST preserve: unknown frontmatter properties unless explicit replacement or migration was requested; Markdown body content unless an operation explicitly replaces it; fields governed by unsupported capabilities; and unrelated type metadata and implementations. Generic mdbase operations are safe only when they preserve the same data. Completion, recurrence mutation, occurrence materialization, dependency updates, time tracking, archive, and other domain operations MUST follow the TaskNotes semantics referenced by the binding. 12.13 Complete custom-field example# --- kind: mdbase.type name: work_task version: 1 schema: dialect: json-schema-2020-12 value: type: object additionalProperties: true required: [summary, state, created_at] properties: summary: { type: string, minLength: 1 } state: { enum: [todo, doing, done, cancelled] } importance: { enum: [low, normal, high] } created_at: { type: string, format: date-time } tags: type: array items: { type: string } collection: display: name_field: summary read_defaults: state: todo importance: normal lifecycle: on_create: set: created_at: { now: true } implements: - contract: tasknotes.task version: 0.3.0-rc.3 fields: title: summary status: state priority: importance dateCreated: created_at tags: tags binding: profiles: [core-lite] capabilities: [archive] title: storage: frontmatter filename_format: title status: values: [todo, doing, done, cancelled] default: todo completed_values: [done] skipped_values: [cancelled] default_skipped: cancelled definitions: [] priority: values: [low, normal, high] default: normal definitions: [] recurrence: syntax: tasknotes maintain_due_date_offset: false reset_body_checkboxes: false occurrences: identity_roles: [recurrenceParent, occurrenceDate] default_materialization: manual default_next_trigger: completion links: accepted_formats: [wikilink, markdown] write_format: wikilink archive: archived_tag: archived move_on_archive: false time_tracking: auto_stop_on_complete: true templating: enabled: false occurrence_enabled: false ---"},{"title":"Changelog","url":"/developers/specification/CHANGELOG/","description":"Initial standalone draft of tasknotes-spec including:","product":"specification","text":"0.3.0-rc.3 - 2026-08-02# define manual ordering as an opaque string rank so clients can insert and reorder tasks without renumbering an entire view 0.3.0-rc.2 - 2026-08-02# add first-class attachments as an ordered frontmatter list of portable file links, with explicit membership, canonical-path, reference-safety, and materialized-occurrence semantics expose attachment references in the tasknotes.task mdbase contract while leaving binary metadata authoritative in the file store 0.3.0-rc.1 - 2026-07-28# adopt the discriminated first-class mdbase contract shape for tasknotes.task, including explicit contract_type: record add the tasknotes.task.completed 1.0.0 event contract and minimal privacy-preserving event-data schema for the mdbase interoperability profile separate type-file record implementation bindings from application-level event-source declarations 0.2.0-draft - 2026-05-31# add optional materialized-occurrences profile for recurrence occurrence notes, on-completion materialization, and occurrence-state reconciliation add optional NLP trigger configuration so TaskNotes clients can share capture suggestion vocabulary replace the private x-tasknotes discovery envelope with the first-class tasknotes.task 0.2.0 mdbase data contract, portable task-view schema, and implementation binding schema document the precedence and consistency rules between JSON Schema, collection, lifecycle, contract field mappings, and TaskNotes behavior 0.1.0-draft - 2026-02-20# Initial standalone draft of tasknotes-spec including: motivation, scope, and normative conventions terminology task model and field mapping temporal semantics recurrence semantics operation semantics validation model conformance profiles compatibility and migration policy collection configuration schema and provider model (tasknotes.yaml, TaskNotes data.json) full dependency (blocked_by) semantics full reminder (reminders) semantics explicit time-tracking management semantics (time_entries lifecycle, start/stop/edit/remove, and completion-triggered auto-stop configuration) explicit links chapter and link-resolution rules for projects/dependencies optional templating conformance profile with create-time template expansion/merge semantics"},{"title":"TaskNotes for Obsidian","url":"/obsidian/","description":"Install TaskNotes, create a first task, and open the default Obsidian Base views.","product":"obsidian","text":"This guide covers the TaskNotes plugin for Obsidian. It follows the \"one note per task\" principle: each task is a Markdown file with structured metadata in YAML frontmatter. Requirements# TaskNotes 4.12.3 requires Obsidian 1.12.2 or later and depends on the Bases core plugin. Before you begin, open Obsidian Settings and confirm Bases is enabled under Core Plugins. Getting Started# 1. Install and Enable# Install TaskNotes from Community Plugins in Obsidian settings, then enable it. If Bases is still disabled, enable it right away so TaskNotes views can open correctly. 2. Create Your First Task# Press Ctrl+P (or Cmd+P on macOS), run TaskNotes: Create new task, fill in the modal, and save. If you prefer inline workflows, start with a checkbox like - [ ] Buy groceries and convert it using the inline task command. 3. Open the Task List# Open your first view from the TaskNotes ribbon icon or by running TaskNotes: Open tasks view from the command palette. This opens the default Task List .base file inside TaskNotes/Views. 4. Explore# Use Core Concepts to understand the data model, Features for workflow capabilities, Views for interface behaviour, and Settings to tune TaskNotes for your vault. If you already have task-like notes, start with Adopt TaskNotes in an existing vault. Quick Links# GitHub Repository Source code, issues, releases, and contribution discussions Task Management Status, priority, dates, reminders, and recurring tasks Inline Tasks Widgets, natural language parsing, and checkbox conversion Calendar Integration Google Calendar, Outlook, and ICS subscriptions HTTP API REST API for automation and external integrations JavaScript API In-process API for companion plugins and in-vault scripts Companion Plugins Optional plugins such as Canvas Bases and TaskNotes Workflows that build on TaskNotes Migration Guide Upgrading from TaskNotes v3 to v4 Troubleshooting Common issues and how to resolve them Command Reference Every registered command, generated from the plugin source Backup & Recovery Protect task notes, Base files, settings, and integration data Specification The formal spec behind TaskNotes: data model, operations, recurrence, and conformance"},{"title":"Calendar Integration Setup","url":"/obsidian/calendar-setup/","description":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0.","product":"obsidian","text":"TaskNotes supports Google Calendar and Microsoft Calendar integration via OAuth 2.0. Setup (Your Own OAuth Credentials)# To connect calendars, create OAuth credentials with Google and/or Microsoft, then paste them into TaskNotes Integrations settings. The sections below walk through each provider. Google Calendar# Video by @antoneheyward In Google Cloud Console, create or select a project, enable the Google Calendar API, and create OAuth 2.0 credentials using the Desktop application type. Then copy the Client ID and Client Secret into TaskNotes (Settings -> TaskNotes -> Integrations) and click Connect Google Calendar. If your Google OAuth app is still in testing mode, add the Google account you will connect with under Google Auth Platform -> Audience -> Test users. Otherwise Google may block sign-in with a 403 access_denied error saying the app has not completed verification. Microsoft Calendar# In Azure Portal, create an App Registration for your Microsoft account type. TaskNotes currently uses Microsoft's common OAuth authority, so the app registration must allow the account type you plan to connect through that authority. Tenant-specific single-tenant authorities are not configurable yet. Under Authentication, add the Mobile and desktop applications platform and add this redirect URI: http://localhost Also turn on Allow public client flows. TaskNotes uses a local loopback callback with a dynamic port, which Microsoft matches against the registered loopback URI. If Azure does not accept the loopback redirect URI through the normal UI, configure loopback redirect support in the manifest by adding: { \"url\": \"http://127.0.0.1\", \"type\": \"Web\" } Next, add delegated Microsoft Graph API permissions (Calendars.Read, Calendars.ReadWrite, and offline_access) and grant consent when required by your organization. Copy the Application (client) ID into TaskNotes, then click Connect Microsoft Calendar. The client secret field can be left blank for public-client desktop setup. Security Notes# OAuth client IDs, client secrets, and account tokens are stored locally in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system. They are not written to TaskNotes' data.json. Tokens refresh automatically, calendar data syncs directly between your vault and provider, and you can disconnect at any time to revoke account access. Secret Storage is local to the Obsidian installation and vault. When setting up TaskNotes on another device, enter the OAuth app credentials and connect the calendar again. After disconnecting, use Forget saved credentials if you also want to remove the client ID and client secret. Troubleshooting# \"Failed to connect\" Verify credentials first, then confirm loopback redirect configuration. TaskNotes uses a local callback on 127.0.0.1 with a dynamically selected port. For Microsoft, ensure loopback redirect support is configured in the app registration. Also confirm required permissions/scopes are granted. For Google 403 access_denied errors during sign-in, confirm the account is listed as a test user in the Google Auth Platform audience settings while your OAuth app is in testing mode. \"Failed to fetch events\" Disconnect and reconnect to refresh OAuth tokens, then re-check provider-side calendar permissions. Connection lost after Obsidian restart Tokens should persist between sessions. If reconnection is required each restart, check whether Obsidian Secret Storage is available and retaining secrets for the vault."},{"title":"Companion Plugins","url":"/obsidian/companion-plugins/","description":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes...","product":"obsidian","text":"Companion plugins are optional Obsidian plugins that build on TaskNotes without adding every workflow to the core plugin. They run inside the same Obsidian app, use TaskNotes' runtime API for live task reads and writes, and keep task data in ordinary Markdown files. Use companion plugins when you want a deeper product surface than a script or webhook, but you still want TaskNotes itself to stay focused on task storage, editing, views, time tracking, and calendar behavior. Available Companion Plugins# Plugin Purpose Documentation Canvas Bases TaskNotes canvas companion for Obsidian Bases views, with canvas-style boards, JSON Canvas snapshots, optional TaskNotes badges, actions, and relationship edges. Canvas Bases TaskNotes Workflows Markdown-defined automation for TaskNotes tasks, schedules, events, and manual command-palette workflows. TaskNotes Workflows More companion plugins may be documented here over time. How Companion Plugins Relate to TaskNotes# TaskNotes remains the source of truth for task behavior. Companion plugins should use the TaskNotes JavaScript Runtime API for live vault operations instead of rewriting TaskNotes frontmatter directly. This keeps task updates consistent with TaskNotes settings, task cache, events, calendar behavior, time tracking, and future data-model changes. Companion plugins can also publish their own runtime surface through api.extensions. Other plugins and scripts can discover those extension APIs from TaskNotes: const tasknotes = app.plugins.getPlugin(\"tasknotes\"); const workflows = tasknotes?.api?.extensions.get(\"tasknotes-workflows\"); The extension registry is useful when companion plugins need to expose commands, validation helpers, catalogs, or run APIs to other in-vault tools. Choosing an Integration Surface# Use case Prefer A user-facing Obsidian UI that works with TaskNotes tasks Companion plugin In-vault scripting with Templater, QuickAdd, MetaBind, or another plugin JavaScript Runtime API Local tools outside Obsidian HTTP API or TaskNotes Obsidian CLI Notifications to external services when tasks change Webhooks Direct file analysis without Obsidian running mdbase-tasknotes CLI Compatibility Expectations# Companion plugins should: Check api.apiVersion and api.hasCapability(...) before using runtime features. Use api.catalog and canonical runtime query DTOs from api.query instead of reaching into TaskNotes filter/view internals. Include a source value when mutating tasks so TaskNotes events are debuggable. Avoid reacting to their own mutations unless the behavior is explicit. Keep user data in the vault where possible, using readable Markdown or JSON files. Treat TaskNotes task notes and Bases files as user-owned documents. TaskNotes does not need every companion plugin installed. If a companion plugin is disabled, TaskNotes task notes remain normal Markdown files and TaskNotes core views continue to work."},{"title":"Canvas Bases","url":"/obsidian/companion-plugins/canvas-bases/","description":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layo...","product":"obsidian","text":"Canvas Bases is the TaskNotes canvas companion plugin for Obsidian Bases and Canvas. It turns the current Bases result set into a canvas-style board, either as a live Bases layout named Canvas Bases or as a generated JSON Canvas snapshot. Canvas Bases works with normal notes and with TaskNotes task notes. Bases remains the source for which notes appear: filters, sorting, grouping, formulas, and visible properties all come from the .base file. Canvas Bases handles spatial layout, cards, edges, zones, pinned notes, text cards, and linked canvas updates. Requirements# Obsidian 1.10.1 or newer. The Obsidian Bases core plugin. The Obsidian Canvas core plugin when opening or editing generated .canvas files. TaskNotes is optional, but must be installed and enabled for TaskNotes-specific badges, task menus, dependency edges, subtasks, time tracking, Pomodoro actions, and recurring-task zone actions. If TaskNotes is disabled, Canvas Bases still works as a Bases and Canvas plugin. TaskNotes-specific actions are skipped when TaskNotes is absent or does not expose the required runtime API capability. When to Use Canvas Bases# Use Canvas Bases when a task view benefits from spatial arrangement instead of a list, table, calendar, or Kanban column set. Common uses include: Planning project tasks on a visual board. Seeing dependencies or related notes as edges between cards. Embedding a board in a daily note, project note, or meeting note. Turning a filtered Base view into a reusable .canvas snapshot. Grouping notes with Bases, then manually arranging the result. Dropping cards into assignment zones to update a note property or run a supported TaskNotes action. If the question is only \"which tasks should appear?\", keep that in Bases filters, formulas, sorting, and grouping. Canvas Bases is for visualizing and arranging the current Bases result set. Canvas Bases Layout# After Canvas Bases is installed, open or create a .base file and add a view using the Canvas Bases layout. In the live layout: Each Base result row becomes a file card. Displayed Base properties appear on each card in the same order as the Base properties menu. Base groups become group frames. Cards and group frames can be dragged and resized. Ungrouped views place cards directly on the board. The initial card order follows the Base sort order. Inline note-body editing is available when Show body editor is enabled. Board controls support panning, zooming, fit view, reset view, and opening cards. Manual notes, manual groups, and text cards can be added without changing the Base query. Canvas Bases stores layout and board state in Canvas Bases-owned keys in the .base view config. It does not need to rewrite the core query just to remember card positions, sizes, colors, pinned notes, text cards, zones, or the linked canvas path. Materialize a Canvas# Canvas Bases can also create or update a JSON Canvas file from any active Bases view, including native and third-party Bases layouts. Run these commands from the command palette: Canvas Bases: Create canvas from current bases view Canvas Bases: Update linked canvas Canvas Bases: Open linked canvas The create command asks for the canvas path, layout, edge options, node size, and update behavior. Canvas Bases-owned node and edge IDs are stable, so updating a linked canvas can preserve existing Canvas Bases node positions and keep unrelated manual Canvas nodes and edges. The generated .canvas file is a snapshot, not a live query. Re-run Canvas Bases: Update linked canvas after changing the Base result set or board layout. TaskNotes Integration# Canvas Bases reads TaskNotes through the TaskNotes JavaScript Runtime API. It feature-detects API capabilities before using them, so the board can degrade cleanly when TaskNotes is unavailable or a capability is missing. When TaskNotes integration is enabled, Canvas Bases can: Show TaskNotes status, priority, planning, recurrence, blocked, blocking, subtask, time estimate, tracked time, and active tracking badges on task cards. Add TaskNotes task actions to card context menus through the TaskNotes task menu API. Draw dependency edges between visible tasks. Draw dependency and parent-subtask edges when the TaskNotes relationship mode is set to all. Add or remove dependency and subtask relationships by dragging from one card's link handle to another. Update mapped TaskNotes task properties when a card is dropped into a property zone. Run supported zone actions such as complete, uncomplete, archive, unarchive, start or stop time tracking, start or assign a Pomodoro, complete an occurrence, or skip an occurrence. TaskNotes remains responsible for task semantics. Canvas Bases asks TaskNotes to read and mutate tasks instead of editing task frontmatter directly. Edges and Relationships# Canvas Bases can draw edges when both endpoint notes are present on the board. Supported edge sources include: Source What it uses wikilinks Links found in the note body. properties Links stored in configured note properties. all Wikilinks and configured property links. TaskNotes dependencies Blocking relationships from TaskNotes. TaskNotes subtasks Parent-child task relationships from TaskNotes when enabled. For property edges, configure a comma-separated list of property names, such as: depends_on, related Edges can be opened from their context menu. Removable TaskNotes and property relationships can also be removed from that menu. Assignment Zones# Assignment zones are board regions that do something when a card is dropped into them. The default zone action updates a note property. A grouped Canvas Bases view can turn Bases groups into zones, so dragging a card into another status, priority, or custom-property group writes that property value back to the note. Custom zones can update another note property or run supported TaskNotes actions. This lets a board mix automatic Bases-derived groups with manual workflow areas such as review queues, time-tracking lanes, or Pomodoro focus zones. Files and Data# Canvas Bases keeps user data in normal vault files: Data Where it lives Task and note content Markdown files. Query, visible properties, sorting, and grouping .base files. Live board geometry and Canvas Bases options Canvas Bases-owned keys in the .base view config. Generated board snapshots .canvas files. Options for non-Canvas Bases active views Canvas Bases plugin data. Manual non-Canvas Bases nodes in a generated .canvas file are preserved when Canvas Bases updates that canvas. First Board# A practical first Canvas Bases setup is: Create or duplicate a TaskNotes .base view. Filter it to the tasks or notes you want on the board. Add a Canvas Bases layout view to that .base file. Choose which properties to show on cards. Enable TaskNotes badges, actions, or relationships if the board is task-focused. Arrange the cards and groups. Use the toolbar to create a linked .canvas snapshot when you want a Canvas file. Canvas Bases can also create starter files under Canvas Bases/ with a demo Base, sample notes, and a linked Canvas path. Run Canvas Bases: Create starter files from the command palette if you want a small example board to inspect before adapting your own TaskNotes views."},{"title":"TaskNotes Workflows","url":"/obsidian/companion-plugins/tasknotes-workflows/","description":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and se...","product":"obsidian","text":"TaskNotes Workflows is a companion plugin for Markdown-defined automation. It lets you create workflow notes that respond to TaskNotes events, schedules, manual commands, and selected Obsidian events, then run typed actions against TaskNotes tasks. Install TaskNotes Workflows# Install from Obsidian Community Plugins Open the TaskNotes Workflows listing in the Obsidian plugin directory You can also install it from Obsidian: open Settings > Community plugins > Browse, then search for TaskNotes Workflows. The plugin is designed for workflows users often ask TaskNotes core to handle, such as: Start time tracking when a task becomes active. Stop time tracking when a task is completed. Move completed tasks into a review folder. Copy parent task context, tags, priority, dates, or dependencies to subtasks. Warn when a blocked task is moved to active. Run a daily review query. TaskNotes Workflows keeps this behavior outside TaskNotes core while still using the TaskNotes JavaScript Runtime API for safe task reads, writes, canonical queries, events, and relationship resolution. Requirements# TaskNotes must be installed and enabled. TaskNotes must expose the JavaScript runtime API. Obsidian must be open for workflows to run. Scheduled workflows run while Obsidian is running. They are not a background service when Obsidian is closed. The plugin runtime uses Obsidian APIs only. Node is used for development and build scripts, not for workflow execution, so Markdown workflow definitions can work on Obsidian mobile while the plugin is loaded. If TaskNotes is disabled or unavailable, the workflow Base can still validate and display workflow files, but TaskNotes read/write steps cannot run. Files Created by the Plugin# By default, TaskNotes Workflows uses: Path Purpose TaskNotes/Workflows/ Workflow Markdown files. TaskNotes/Views/workflows.base Generated Obsidian Base that renders workflow cards through the custom workflow view. Plugin config folder Run history and detail logs, unless a run-log folder is configured. Workflow notes are ordinary Markdown files. The YAML frontmatter is executable configuration, and the note body is for human explanation, testing notes, and maintenance guidance. First Run# On first load, the plugin can create a default workflow folder, a workflow Base, and a set of example workflow notes. The default workflow notes are disabled so they can be inspected, dry-run, edited, and enabled intentionally. The generated Base is the main workbench. It shows workflow cards with status, trigger and step summaries, recent run state, and buttons for editing, dry-running, running, and opening the source note. Workflow notes also show a compact workflow card in reading mode and live preview, so the note remains useful even when opened directly. Default Workflows# The plugin can write these starter workflows: Workflow What it demonstrates Auto-start time tracking Starts a timer when a task status changes to active. Stop time tracking on complete Stops the timer when a task is completed. Morning overdue review Runs a daily cron query and marks overdue open tasks high priority. Move completed tasks to review Moves completed task notes into a review folder. Inherit subtask contexts and tags Copies contexts and tags from the first parent task when a task becomes a subtask. Inherit subtask priority Copies priority from the first parent task when a task becomes a subtask. Inherit subtask planning dates Copies scheduled and due dates from the first parent task when a task becomes a subtask. Inherit subtask dependencies Adds the first parent task's blocking dependencies to new subtasks. Mirror parent priority to subtasks Updates existing subtasks when a parent task priority changes. Mirror parent planning dates to subtasks Updates existing subtasks when a parent scheduled or due date changes. Mirror parent dependencies to subtasks Replaces each subtask's dependencies with the parent task's current dependencies. Warn when starting a blocked task Shows a notice when a task becomes active while dependencies remain. Daily active task review Shows a daily count of tasks still marked active. Treat these as editable examples. Adjust folders, statuses, priorities, dates, and filters to match your vault before enabling mutating workflows. Workflow Shape# A workflow file looks like this: --- type: tasknotes-workflow schemaVersion: 1 id: auto-start-time-tracking name: Auto-start time tracking enabled: false description: Start a timer when a task status changes to active. triggers: - id: status-active type: tasknotes.event event: task.status.changed to: active conditions: - field: trigger.after.path operator: exists steps: - id: start-time type: time.start input: task: \"{{trigger.after.path}}\" options: description: \"Started by {{workflow.name}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop --- # Auto-start time tracking Enable this workflow to start time tracking when a TaskNotes task moves to `active`. Required frontmatter fields: Field Type Notes type string Must be tasknotes-workflow. schemaVersion number Must be 1. id string Stable lowercase identifier. Use letters, numbers, dots, underscores, and dashes. name string Human-readable name shown in workflow cards and command-palette commands. enabled boolean Disabled workflows can be edited and dry-run but do not run automatically or from manual commands. triggers array One or more trigger definitions. conditions array Optional workflow-level guards. steps array Linear typed step pipeline. run object Run policy and safety limits. Triggers# Triggers decide when a workflow should run. TaskNotes Events# Use tasknotes.event to react to TaskNotes runtime events: triggers: - id: status-active type: tasknotes.event event: task.status.changed from: open to: active Common event names include: task.created task.updated task.deleted task.moved task.status.changed task.completed task.uncompleted task.archived task.unarchived task.scheduled.changed task.due.changed task.priority.changed task.tags.changed task.contexts.changed task.projects.changed task.reminders.changed task.dependencies.changed task.recurrence.changed time.started time.stopped pomodoro.started pomodoro.completed pomodoro.interrupted recurring.instance.completed recurring.instance.skipped The workflow editor loads available TaskNotes events dynamically from api.events.list(), so event pickers can follow the runtime API instead of relying on a hardcoded list. TaskNotes event triggers can use these filters: Field Purpose event Runtime event name. from Previous status or value for status-change workflows. to New status or value for status-change workflows. path.glob Optional path glob limiting which task files can trigger the workflow. allowSelfTrigger Allows this workflow to react to writes caused by tasknotes-workflows. Leave off unless you have a clear reason. TaskNotes event output fields include values such as trigger.after.path, trigger.after.status, trigger.before.status, trigger.changes, trigger.source, and trigger.correlationId. Cron# Cron triggers run on matching minutes while Obsidian is open: triggers: - id: weekday-review type: cron schedule: \"0 17 * * 1-5\" timezone: local The schedule uses five fields: minute, hour, day of month, month, day of week. Keep cron workflows bounded with run.maxTasks, especially if they query many tasks. Interval# Interval triggers run repeatedly while Obsidian is open: triggers: - id: half-hour-check type: interval every: 30m The plugin enforces a minimum interval to avoid excessive background work. Manual# Manual triggers let a workflow run from a card button, another plugin, or the Obsidian command palette: triggers: - id: manual type: manual Enabled workflows with a manual trigger are registered as Obsidian commands named Run: . You can launch them from the command palette or assign hotkeys in Obsidian settings. The generated command id is based on the workflow id. Changing a workflow id creates a different command, so any hotkey assigned to the old command id will need to be reassigned. Obsidian Events# Advanced Obsidian triggers are opt-in from the plugin settings. They can listen to selected vault, metadata, and workspace events: triggers: - id: project-note-opened type: obsidian.workspace event: file-open path: glob: \"Projects/**/*.md\" - id: task-note-modified type: obsidian.vault event: modify path: glob: \"Tasks/**/*.md\" - id: metadata-changed type: obsidian.metadata event: changed path: glob: \"Projects/**/*.md\" Keep path filters narrow for Obsidian triggers. Vault and metadata events can be frequent. Conditions# Conditions can appear at workflow level or on individual steps. conditions: - field: trigger.after.path operator: exists - field: trigger.after.status operator: is value: active Supported operators: Operator Meaning is / isNot Exact comparison after scalar normalization. in / notIn Check a value against an array. exists / missing Check whether a field has a value. contains Check whether a string contains text or an array contains a value. startsWith String prefix check. before / after Date comparison. onOrBefore / onOrAfter Inclusive date comparison. Step-level conditions use the same shape: steps: - id: warn type: notice.show if: - field: steps.dependencies.tasks[0].path operator: exists input: message: \"This task still has dependencies.\" References# References use constrained template expressions. Arbitrary JavaScript is not evaluated. {{workflow.id}} {{workflow.name}} {{trigger.after.path}} {{trigger.changes.status.after}} {{steps.query.tasks}} {{steps.parents.tasks[0].path}} {{item.path}} {{today}} {{now}} If a string is exactly one reference, the underlying value is preserved. If a reference is embedded in other text, the value is stringified. Use forEach when a step should run once per item: steps: - id: overdue type: task.query input: query: where: all: - field: task.due op: lt value: fn: today - field: task.status op: notIn value: - done - cancelled sort: - field: task.due direction: asc limit: 50 scope: includeArchived: false - id: mark-high type: task.patch forEach: \"{{steps.overdue.tasks}}\" input: task: \"{{item.path}}\" patch: priority: high When a step uses forEach, {{item}} refers to the current item and the step output becomes an array of per-item outputs. task.query uses the canonical TaskNotes runtime query DTO. Its output includes tasks, count, total, matched, returned, groups, groupPaths, query, and warnings. Runtime query conditions use canonical field IDs and operators: query: where: all: - field: task.status op: ne value: done - any: - field: task.due op: lte value: fn: today - field: task.priority op: eq value: high sort: - field: task.due direction: asc group: - field: task.status limit: 25 scope: includeArchived: false Common fields include task.status, task.priority, task.due, task.scheduled, task.projects, task.contexts, task.tags, task.isBlocked, and file.path. Operators include eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Use api.catalog.filterProperties() and api.catalog.filterOperators() for the complete runtime catalog. Steps# Steps are typed actions. The editor reads a step catalog so it can show expected inputs, output fields, examples, and TaskNotes option pickers. Task read steps: Step Output task.get One task. task.query Tasks matching a canonical TaskNotes runtime query. task.parents Parent tasks linked from the task's projects. task.subtasks Tasks that reference the current task as a project. task.dependencies Dependencies stored in blockedBy, with resolved task data when available. task.blocking Tasks blocked by the current task. task.relationships The task plus parents, subtasks, dependencies, and blocking tasks. Task write steps: Step Purpose task.create Create a new TaskNotes task. task.patch Update one or more fields. task.set Set one field. task.move Move the task note to a target folder. task.archive / task.unarchive Archive or unarchive a task. task.complete / task.uncomplete Complete or reopen a task. task.reschedule Update planning dates. task.setDue / task.clearDue Set or clear due date. task.setScheduled / task.clearScheduled Set or clear scheduled date. task.addTag / task.removeTag Mutate tags. task.addProject / task.removeProject Mutate project links. task.addContext / task.removeContext Mutate contexts. task.addDependency / task.removeDependency Mutate blocking dependencies. Time and utility steps: Step Purpose time.start Start time tracking for a task. time.stop Stop active time tracking for a task. time.appendEntry Append a time entry. notice.show Show an Obsidian notice. workflow.stop Stop a workflow early. Companion plugins and scripts can inspect the same catalog through the TaskNotes runtime extension: const tasknotes = app.plugins.getPlugin(\"tasknotes\")?.api; const workflows = tasknotes?.extensions.get(\"tasknotes-workflows\"); const steps = workflows?.listStepDefinitions(); Run Policy# Every workflow has a run policy: run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop timeout: 30s Field Notes mode Currently sequential. Steps run in order. noOverlap Skips a new run if the same workflow is already running. source Mutation source passed to TaskNotes runtime API calls. maxTasks Safety limit for forEach batch steps. onError stop or continue. timeout Optional duration string. TaskNotes attaches source, correlation, and reason metadata to events caused by runtime API writes. Workflows use this to make runs debuggable and to avoid accidental self-trigger loops. Run Logs and Debugging# Workflow run logs are stored under the plugin's Obsidian config folder by default. You can configure a run-log folder and a log level in the plugin settings. Run records include: Workflow id, name, and source path. Trigger payload. Step statuses. Inputs and outputs, depending on the configured log level. Error text when a run fails. Use dry runs before enabling workflows that mutate tasks. Dry runs still execute the workflow path, but mutating steps should report what they would do instead of changing task files. Example: Manual Command Workflow# This workflow can be run from the command palette after it is enabled: --- type: tasknotes-workflow schemaVersion: 1 id: show-active-count name: Show active task count enabled: true description: Show a notice with the number of active tasks. triggers: - id: manual type: manual steps: - id: active type: task.query input: query: where: field: task.status op: eq value: active limit: 25 scope: includeArchived: false - id: notice type: notice.show input: message: \"Active tasks: {{steps.active.count}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 25 onError: stop --- # Show active task count Run this from the Obsidian command palette with `TaskNotes Workflows: Run: Show active task count`. Example: Inherit Parent Priority# This workflow copies priority from the first parent task when a task becomes a subtask: type: tasknotes-workflow schemaVersion: 1 id: inherit-subtask-priority name: Inherit subtask priority enabled: false triggers: - id: projects-changed type: tasknotes.event event: task.projects.changed - id: task-created type: tasknotes.event event: task.created conditions: - field: trigger.after.path operator: exists - field: trigger.after.projects operator: exists steps: - id: parents type: task.parents input: task: \"{{trigger.after.path}}\" - id: inherit-priority type: task.patch if: - field: steps.parents.tasks[0].priority operator: exists input: task: \"{{trigger.after.path}}\" patch: priority: \"{{steps.parents.tasks[0].priority}}\" run: mode: sequential noOverlap: true source: tasknotes-workflows maxTasks: 1 onError: stop This pattern uses task.parents rather than trying to parse project links manually. Authoring Guidelines# When writing workflow notes: Start with enabled: false fo"},{"title":"Core Concepts","url":"/obsidian/core-concepts/","description":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter.","product":"obsidian","text":"TaskNotes follows the \"one note per task\" principle, where each task lives as a separate Markdown note with structured metadata in YAML frontmatter. The Note-Per-Task Approach# Individual Markdown notes replace centralized databases or proprietary formats. Each task file can be read, edited, and backed up with any text editor or automation tool. Task Structure# A TaskNotes task is a standard Markdown file with YAML frontmatter: --- tags: - task title: Review quarterly report status: in-progress priority: high due: 2025-01-15 scheduled: 2025-01-14 contexts: - office projects: - \"[[Q1 Planning]]\" --- ## Notes Key points to review: - Revenue projections - Budget allocations ## Meeting Notes Discussion with finance team on 2025-01-10... The frontmatter contains structured, queryable properties. The note body holds freeform content—research findings, meeting notes, checklists, or links to related documents. Obsidian Integration# Since tasks are proper notes, they work with Obsidian's core features: Backlinks: See which notes reference a task Graph View: Visualize task relationships and project connections Tags: Use Obsidian's tag system for additional categorization Search: Find tasks using Obsidian's search Links: Reference tasks from daily notes, meeting notes, or project documents This approach creates many small files. TaskNotes stores tasks in a configurable folder (default: TaskNotes/Tasks/) to keep them organized. In practice, this lets TaskNotes fit into existing vault habits instead of replacing them. You keep using normal note workflows, and TaskNotes adds structure, filtering, and commands on top. YAML Frontmatter# Task properties are stored in YAML frontmatter, a standard format with broad tool support. Treat frontmatter as the machine-readable layer and the note body as the human-readable layer. TaskNotes automations and Bases filters rely on frontmatter; your project notes and context stay in the body. Property Types# TaskNotes uses several property types: Type Example Description Text title: Buy groceries Single text value List tags: [work, urgent] Multiple values Date due: 2025-01-15 ISO 8601 date format DateTime scheduled: 2025-01-15T09:00 Date with time Link projects: [\"[[Project A]]\"] Obsidian wikilinks Number timeEstimate: 60 Numeric values (minutes) Field Mapping# Property keys are configurable. If your vault uses deadline instead of due, you can map TaskNotes to use your existing field names without modifying your files. The exact rules for how fields map to semantic roles, how dates are interpreted, and how operations like completion and recurrence behave are defined in the TaskNotes Specification. The spec is the shared contract between the Obsidian plugin, the terminal UI, and any other tool that reads or writes TaskNotes data. Custom Fields# Add any frontmatter property to your tasks. User-defined fields work in filtering, sorting, and templates. Define custom fields in Settings -> TaskNotes -> Task Properties to include them in task modals and views. Bases Integration# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. Bases provides: Filtering: Query tasks using AND/OR conditions Sorting: Order tasks by any property Grouping: Organize tasks by status, priority, project, or custom fields Views: Task List, Kanban, Calendar, and Agenda are all Bases views Views are stored as .base files in TaskNotes/Views/. These files contain YAML configuration that defines the view's query and display settings. You can duplicate, modify, or create new views by editing these files. This makes view behavior inspectable and predictable. If a task appears in the wrong place, you can open the .base file and see exactly which filter or grouping rule produced that result. Enabling Bases# Bases is a core plugin included with Obsidian 1.10.1+: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes views will now function"},{"title":"Features","url":"/obsidian/features/","description":"TaskNotes includes task organization, time tracking, and calendar integration features.","product":"obsidian","text":"TaskNotes includes task organization, time tracking, and calendar integration features. Task Management# TaskNotes gives each task a structured set of properties, including status, priority, due and scheduled dates, tags, contexts, and optional estimates. Because these values live in frontmatter, they stay readable and portable while still powering advanced filtering and grouping in Bases. Reminders can be relative (for example, \"3 days before due\") or absolute, and completed tasks can be archived automatically to keep active work surfaces focused. Recurring tasks can stay virtual for lightweight checkoff workflows, or you can materialize individual occurrences into normal task notes when a specific instance needs its own checklist, comments, time tracking, or attachments. Occurrence notes inherit useful planning metadata from the parent while keeping their own completion state and time entries, and calendar views coalesce them with the matching virtual recurrence instance. See Task Management for details. For recurrence behavior, see Recurring Tasks. For reminder setup and data format, see Task Reminders. Filtering and Views# TaskNotes uses Obsidian's Bases engine for filtering, sorting, and grouping. Each view is a .base file, so you can inspect or edit its query logic directly instead of relying on hidden plugin state. This design also makes view customization practical: you can duplicate a default view, tweak grouping or formulas, and keep both versions side by side in your vault. For details on how Bases integration works, see Core Concepts. For Bases syntax documentation, see the official Obsidian Bases documentation. Inline Task Integration# Inline task features let you work from normal notes without context switching. Task links can display interactive cards, checkboxes can be converted into full task notes, and project notes can surface subtasks and dependency relationships in place. Natural language parsing supports date, priority, and context extraction across multiple languages, which helps keep fast capture while preserving structured data. See Inline Task Integration for details. Time Management# Time tracking records work sessions per task, and Pomodoro mode supports focused intervals with break handling. Over time, the statistics views help you compare estimated versus actual effort and spot trends in workload distribution. See Time Management for details. Calendar Integration# TaskNotes supports bidirectional OAuth sync with Google Calendar and Microsoft Outlook, plus read-only ICS subscriptions for external feeds. Calendar views include month, week, day, year, and list modes, and drag-and-drop scheduling can update tasks directly. For planning workflows, time-blocking and calendar-linked task updates connect backlog management with schedule execution in the same workspace. See Calendar Integration for details. User Fields# User fields let you extend the core model with vault-specific metadata like client, energy level, billing code, or review state. Once added, these fields become available in filters, sorting, templates, and formulas. See User Fields for details. Integrations# Beyond calendar sync, TaskNotes includes an HTTP API and webhook support for automation workflows, external dashboards, or custom tooling. See Integrations for details. Companion Plugins# TaskNotes can be extended by optional companion plugins that use the JavaScript runtime API while keeping task data in Markdown files. Canvas Bases is the TaskNotes canvas companion, adding canvas-style boards and JSON Canvas snapshots for Bases views, with optional TaskNotes badges, actions, and relationship edges. TaskNotes Workflows adds Markdown-defined automation for TaskNotes events, schedules, manual commands, and typed task actions. See Companion Plugins for details. REST API# External applications can interact with TaskNotes through its REST API for automation, reporting, and integration with other tools. See HTTP API for details."},{"title":"Calendar Integration","url":"/obsidian/features/calendar-integration/","description":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions.","product":"obsidian","text":"TaskNotes provides calendar integration through OAuth-connected calendar services, two Bases-powered calendar views, and read-only ICS calendar subscriptions. OAuth Calendar Integration# TaskNotes supports bidirectional synchronization with Google Calendar and Microsoft Outlook using OAuth authentication. This integration allows you to view external calendar events alongside your tasks and sync changes back to the calendar provider. Supported Providers# Google Calendar - OAuth 2.0 authentication with access to all calendars in your Google account Microsoft Outlook - OAuth 2.0 authentication with access to calendars in your Microsoft 365 or Outlook.com account Setup Requirements# OAuth calendar integration requires creating an OAuth application with your calendar provider. This process takes approximately 15 minutes per provider. You will need to: Create an OAuth application in Google Cloud Console or Microsoft Azure Portal Configure redirect URIs and scopes Obtain client ID and client secret Enter credentials in TaskNotes settings (Settings -> TaskNotes -> Integrations, OAuth calendar section) Synchronization Behavior# Events are fetched automatically every 15 minutes Events are also fetched when local changes occur (task creation, updates, rescheduling) Dragging calendar events to new dates/times updates the event in the calendar provider Per-calendar visibility toggles allow selective display of calendars Access tokens are automatically refreshed when expired Token Management# TaskNotes stores OAuth client credentials, access tokens, and refresh tokens in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system and kept separate from TaskNotes' data.json. Tokens are refreshed automatically before expiration. You can revoke account access or forget the saved OAuth app credentials through the integrations settings. Calendar Views# TaskNotes provides Calendar and Mini Calendar views that display tasks alongside OAuth calendar events and ICS subscriptions. Both views support drag-and-drop scheduling. For detailed view documentation, see Calendar Views. Notes linked from recurring external calendar events can be matched either across the loaded event series or only to the selected recurrence instance. Configure this in Integrations settings. Time Entry Editor# TaskNotes includes a time entry editor for tracking time spent on tasks. Time entries are created and managed through the Calendar View. Creating Time Entries# To create a time entry on the Calendar View: Click and drag on a time slot in the calendar to select a time range When the selection menu appears, choose Create time entry (timeblock appears only if the feature is enabled) Choose a task in the task selector modal A time entry is created for that task with the selected start/end range Time entries are always associated with a specific task and stored in that task's frontmatter. Multiple time entries can exist for one task. Managing Time Entries# The time entry editor modal provides functions to: View all time entries for a task Edit the start time, end time, and duration of time entries Delete time entries See the total time tracked across all entries for a task Access the time entry editor by clicking an existing time entry in the calendar. ICS Calendar Subscriptions# TaskNotes can subscribe to external calendar feeds using the iCalendar (ICS) format. This provides read-only access to events from calendar services. ICS subscriptions differ from OAuth calendar integration in that they are read-only—dragging ICS events to new dates does not update the source calendar. Add and manage ICS subscriptions from Settings -> TaskNotes -> Integrations (Calendar Subscriptions section). For details on creating notes and tasks from calendar events, see ICS Integration. Time Blocking# The Calendar View supports time blocking for scheduling dedicated work periods. To create a time block: Click and drag on a time slot in the calendar to select a time range A context menu will appear with available options Select \"Create timeblock\" from the menu (this option only appears if timeblocking is enabled in settings) Time blocks are stored in the frontmatter of daily notes and can be linked to specific tasks. This differs from time entries, which track actual time spent and are stored in task frontmatter rather than daily notes. Enable time blocking under Settings -> TaskNotes -> Features (Timeblocking section)."},{"title":"ICS Calendar Event Integration","url":"/obsidian/features/ics-integration/","description":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-...","product":"obsidian","text":"TaskNotes can use ICS calendar events to create notes and tasks directly from calendar entries. ICS integration creates linked notes and tasks from event data without manual re-entry. Overview# The ICS integration allows you to: View detailed information about calendar events Create notes from calendar events with customizable templates Generate tasks from events with proper scheduling and context Link existing vault content to calendar events Maintain relationships between events and created content Event context, notes, and follow-up tasks remain connected through frontmatter links. Event Information Modal# When you interact with a calendar event in TaskNotes, an information modal displays event details and available actions. The modal provides: Event Details# Event title and description Start and end times (formatted according to your locale) Location information Source calendar name Event URL (if available) Related Content# The modal shows a list of existing notes and tasks that are linked to the calendar event. Content is automatically categorized as: Task - Files containing the configured task tag Note - Files without the task tag The relationship is maintained through the ICS Event ID field in the content's frontmatter. Available Actions# Create Note - Opens a creation dialog for generating a new note from the event data. Create Task - Creates a task immediately using the event information with default settings. Link Note - Opens a file selection dialog to link an existing note to the calendar event. Refresh - Reloads the list of related content to reflect recent changes. Note Creation from Events# The note creation process allows customization of the generated content: Basic Settings# Title - Default combines event title and date, but can be modified Folder - Destination for the new note (uses default ICS note folder if configured) Template - Optional template file to structure the note content Template Usage# When a template is specified: The template file is processed with ICS-specific variables Standard TaskNotes template variables are also available Template content replaces the default event description format Frontmatter from templates is merged with required ICS fields Templates apply a consistent note structure across imported events. Default Content# Without a template, notes include: Event title as the main heading Formatted start and end times Location information Source calendar name Event description (if provided) Event URL (if available) Task Creation from Events# Tasks created from calendar events include relevant event data: Scheduled Date and Time# Tasks are scheduled using the event's start time as an ISO timestamp, preserving both date and time information. This allows for accurate scheduling that reflects the original event timing. Task Properties# Title - Uses the event title Status - Set to the default task status configured in settings Priority - Set to the default task priority Contexts - Event location is added as a context (if provided) Time Estimate - Calculated from event duration (if start and end times are available) Tags - Includes the ICS event tag and any default task tags After creation, priority, status, and schedule can be edited if event data does not match the final task plan. Content# Task content includes formatted event details similar to note creation, providing context about the original calendar event. Linking Existing Content# You can establish connections between existing vault content and calendar events: Link Process# Select an existing markdown file from your vault The file's frontmatter is updated to include the event ID The modification date is updated to reflect the change The connection appears in the related content list Bidirectional References# Calendar events can display all linked content Content files maintain references to their associated events Multiple pieces of content can be linked to a single event Content can be linked to multiple events (stored as an array) Field Mapping Integration# The ICS integration extends the field mapping system with two new fields: ICS Event ID Field# Stores the unique identifier connecting content to calendar events Default field name is icsEventId Values are stored as arrays to support multiple event associations Field name can be customized through field mapping settings ICS Event Tag Field# Tag automatically applied to content created from events Default tag is ics_event Used to identify ICS-related content throughout the system Can be customized through field mapping settings Template Variables# Templates used for ICS content creation have access to event-specific variables in addition to standard TaskNotes variables: Event Information# {{icsEventTitle}} - Event title {{icsEventStart}} - Start date and time (ISO format) {{icsEventEnd}} - End date and time (ISO format) {{icsEventLocation}} - Event location {{icsEventDescription}} - Event description {{icsEventUrl}} - Event URL {{icsEventSubscription}} - Calendar subscription name {{icsEventId}} - Unique event identifier Standard Variables# All standard TaskNotes template variables remain available: {{title}}, {{date}}, {{time}} {{priority}}, {{status}}, {{contexts}} And others as documented in the template system Configuration# ICS integration settings are located under Settings -> TaskNotes -> Integrations: Default Templates# Configure template files for consistent content creation from events. Templates are optional and the system provides sensible defaults when not specified. Default Folders# Set destination folders for content created from events. This helps organize ICS-generated content separately from other vault content if desired. Folder paths support template variables for dynamic organization: Date variables: {{year}}, {{month}}, {{day}}, {{monthName}}, etc. ICS event variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Other variables: See template variables section below Example folder paths: Daily/{{year}}/{{month}}/{{day}} creates date-based hierarchy Events/{{year}}/{{icsEventTitle}} organizes by year and event title Meetings/{{monthName}} groups by month name Filename Formats# The system uses the standard TaskNotes filename generation with event-specific context, ensuring unique and descriptive filenames for created content. Technical Implementation# Event Identification# Calendar events are identified by their unique ICS event ID, which is maintained in the frontmatter of created content. This allows the system to track relationships even if event details change. Content Type Detection# The system distinguishes between tasks and notes by checking for the presence of the configured task tag in the content's frontmatter tags array, rather than relying on file structure or naming conventions. Error Handling# The integration includes error boundaries for network issues, file operations, and template processing. Failed operations provide user feedback without interrupting the overall workflow."},{"title":"Inline Task Integration","url":"/obsidian/features/inline-tasks/","description":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes,...","product":"obsidian","text":"TaskNotes integrates with the Obsidian editor to allow task management directly within notes. This is achieved through interactive widgets, a conversion feature for checkboxes, and natural language processing. Inline features support capture and task updates without leaving the current note. Task Link Overlays# When a wikilink to a task note is created, TaskNotes can replace it with an interactive Task Link Overlay. Enable or disable overlays from Settings -> TaskNotes -> Features (Task link overlay). The widget displays information about the task, such as status, priority, and due date, and allows actions like status/priority changes or opening the edit modal. Task link overlays in Live Preview mode show interactive widgets with status, dates, and quick actions In Source mode, task links appear as standard wikilinks until rendered Widget Features# The task link overlay displays: Status Dot: Clickable circular indicator showing current task status. Click to cycle through available statuses. Priority Dot: Color-coded indicator for task priority (only shown when assigned). Task Title: Displays the task name (truncated to 80 characters). Click to open the task edit modal. Date Information: Shows due dates (calendar icon) and scheduled dates (clock icon) with clickable context menus. Recurrence Indicator: Rotating arrow icon for recurring tasks with modification options. Action Menu: Ellipsis icon (shown on hover) provides additional task actions. The widget exposes common task actions at the link location, so status and metadata can be updated in-place. Mode-Specific Behavior# Task link overlays work in both Live Preview and Reading modes: Live Preview Mode: Widgets hide when the cursor is within the wikilink range, allowing for easy editing. Reading Mode: Widgets display with full functionality and integrate with the reading mode typography. The overlays support drag-and-drop to calendar views and provide keyboard shortcuts for quick navigation (Ctrl/Cmd+Click to open the source file). Create New Inline Task Command# The Create new inline task command opens the task creation modal from the editor and inserts a link to the new task when it is saved. This command is available in the command palette. When the cursor is on an empty line, the link is inserted at the cursor. When the cursor is on a line with content, TaskNotes inserts a new line below it and places the task link there. The command does not use the current line as the task title. To turn the current line into a TaskNote, use Convert to TaskNote or the instant conversion button next to a supported line. That flow uses the current line as the task title and replaces the original line with a link to the new task file. Instant Task Conversion# The Instant Task Conversion feature transforms lines in your notes into TaskNotes files. This works with both checkbox tasks and regular lines of text. Turn the feature on or off from Settings -> TaskNotes -> Features (Show convert button next to checkboxes). When enabled, a \"convert\" button appears next to content in edit mode. Clicking this button creates a new task note using the line text as the title and replaces the original line with a link to the new task file. This supports progressive conversion from draft notes to dedicated task files. Folder Configuration# By default, converted tasks are placed in the same folder as the current note ({{currentNotePath}}). You can change this behavior in Settings -> TaskNotes -> General (Folder for converted tasks): Leave empty: Uses your default tasks folder (configured in the same section) {{currentNotePath}}: Places tasks in the same folder as the note you're editing (default) {{currentNoteTitle}}: Creates a subfolder named after the current note Custom path: Specify any folder path (e.g., TaskNotes/Converted) Supported Line Types# The conversion feature works with: Checkbox tasks: - [ ] Task description becomes a TaskNote with task metadata Bullet points: - Some task idea becomes a TaskNote with the text as title Numbered lists: 1. Important item becomes a TaskNote Blockquoted content: > Task in callout becomes a TaskNote (preserves blockquote formatting) Plain text lines: Important thing to do becomes a TaskNote Mixed formats: > - [ ] Task in blockquote handles both blockquote and checkbox formatting Content Processing# When converting lines: Special characters like >, #, - are automatically removed from the task title Original formatting is preserved in the note (e.g., > [[Task Title]] for blockquoted content) Task metadata is extracted from checkbox tasks (due dates, priorities, etc.) Natural language processing can extract dates and metadata from plain text (if enabled) Conversion preserves surrounding formatting, including callouts, outlines, and nested lists. The feature handles edge cases like nested blockquotes and maintains proper indentation in the final link replacement. Bulk Task Conversion# The Bulk Task Conversion command converts all checkbox tasks in the current note to TaskNotes in a single operation. This command is available in the command palette as \"Convert all tasks in note to TaskNotes\". How It Works# The command: Scans the entire current note for checkbox tasks (- [ ], * [ ], 1. [ ], etc.) Includes tasks inside blockquotes (e.g., > - [ ] task in callout) Applies the same enhanced conversion logic as instant task conversion Creates individual TaskNote files for each task Replaces the original checkboxes with links to the new task files Preserves original indentation and formatting (including blockquote markers) The bulk conversion uses the same content processing as instant conversion, automatically removing special characters from task titles while preserving original formatting in the note. Usage# To use bulk conversion: Open a note containing checkbox tasks Access the command palette (Ctrl+P / Cmd+P) Search for \"Convert all tasks in note to TaskNotes\" Execute the command The command displays progress and shows a summary when complete (for example, \"Successfully converted 5 tasks to TaskNotes.\"). Important Considerations **This command modifies note content permanently.** Before using: - **Create a backup** of your note if it contains important data - **Review the tasks** to ensure they should become individual TaskNotes - **Expect processing time** - notes with many tasks may take several seconds to process - **Avoid interruption** - do not edit the note while conversion is running Performance Processing time depends on the number of tasks: - Small notes (1-10 tasks): Near-instant - Medium notes (10-50 tasks): 2-5 seconds - Large notes (50+ tasks): 10+ seconds The operation creates multiple files and updates the note content, which requires disk I/O and editor updates. Error Handling# If some tasks fail to convert, the command will: Complete successfully converted tasks Display a summary showing both successes and failures Log detailed error information to the console for troubleshooting Failed conversions typically occur due to: Tasks with titles containing invalid filename characters Insufficient disk permissions Very long task titles (over 200 characters) For large notes, converting a small section first helps validate folder and filename settings. Relationships Widget# New in v4: The Relationships Widget consolidates what were previously three separate widgets (project subtasks, task dependencies, and blocking tasks) into a single dynamic interface. The widget appears in task notes and automatically displays up to five tabs based on available relationship data: Subtasks Tab (Kanban): Shows tasks that reference the current note as a project. Uses Kanban layout for visual task management. Occurrences Tab (List): Shows materialized occurrence notes that reference the current recurring task as their parent. Uses list layout sorted by occurrence date. Projects Tab (List): Shows projects that the current task belongs to. Uses list layout. Blocked By Tab (List): Shows tasks that are blocking the current task. Uses list layout. Blocking Tab (Kanban): Shows tasks that the current task is blocking. Uses Kanban layout. Automatic Tab Management# Tabs automatically show or hide based on the presence of relationship data. If a task has no subtasks, the Subtasks tab does not appear. If a recurring task has no materialized occurrence notes, the Occurrences tab does not appear. If there are no blocking relationships, those tabs remain hidden. This keeps the interface focused on relevant information. The widget layout changes with available data, so simple tasks show fewer sections. Features# The widget embeds the TaskNotes/Views/relationships.base view directly in the editor. Every filter, grouping rule, or property shown in that .base file is exactly what appears inside the widget, so you can customize the experience by editing the file just like any other Bases view. Additional behavior: Collapsible Interface: Click the widget title to expand or collapse. The state is remembered between sessions. Persistent Grouping: Any grouping defined in the .base file is honoured, and collapsed groups retain their state per note. Task Details: Each task shows its status, priority, due date, and other configured properties. Real-time Updates: The widget updates automatically when tasks are added, modified, or deleted via Bases views. Configuration# Enable or disable the widget in Settings -> TaskNotes -> Appearance (Show relationships widget). Position the widget at the top (after frontmatter) or bottom of the note using the Relationships Position setting. Expandable Subtasks Chevron# Tasks with subtasks can display an expand/collapse chevron that toggles subtask visibility. The chevron can be positioned on the Right (default, hover to show) or on the Left (always visible, matches group chevrons). Configure this in Settings -> TaskNotes -> Appearance (Subtask chevron position). Migration from v3# In v3, TaskNotes provided three separate widgets controlled by individual settings: showProjectSubtasks and projectSubtasksPosition showTaskDependencies and taskDependenciesPosition showBlockingTasks and blockingTasksPosition These settings are replaced in v4 by: showRelationships and relationshipsPosition If you had project subtasks enabled in v3, the relationships widget is enabled automatically after upgrading to v4. The underlying Bases file changed from TaskNotes/Views/project-subtasks.base to TaskNotes/Views/relationships.base. Run the Create files action in Settings -> TaskNotes -> General -> Views & base files if relationships.base is missing. Natural Language Processing# TaskNotes includes a Natural Language Processor (NLP) that parses task descriptions to extract structured data. This allows for task creation from conversational language, such as \"Prepare quarterly report due Friday #work high priority,\" which would automatically set the due date, tag, and priority. The NLP engine supports multiple languages, including English, Spanish, French, German, Italian, Japanese, Dutch, Portuguese, Russian, Swedish, Chinese, and Ukrainian. Supported Syntax# The NLP engine recognizes: Tags and Contexts: #tag and @context syntax (triggers are customizable). Projects: +project for simple projects or +[[Project Name]] for projects with spaces. Priority Levels: Keywords like \"high,\" \"normal,\" and \"low\". Also supports a trigger character (default: !). Status Assignment: Keywords like \"open,\" \"in-progress,\" and \"done\". Also supports a trigger character (default: *). Dates and Times: Phrases like \"tomorrow,\" \"next Friday,\" and \"January 15th at 3pm\". Time Estimates: Formats like \"2h,\" \"30min,\" and \"1h30m\". Recurrence Patterns: Phrases like \"daily,\" \"weekly,\" and \"every Monday\". User-Defined Fields: Custom fields can be assigned using configured triggers (e.g., effort: high). Supports quoted values for multi-word entries. NLP parses common patterns during capture; fields can be refined in the modal afterward. Rich Markdown Editor# New in v4: The task creation modal uses a rich CodeMirror markdown editor instead of a plain textarea. Features include: Live Preview: Rendered markdown preview as you type. Syntax Highlighting: Code blocks, links, and formatting are highlighted. Wikilink Support: Create links to other notes using [[Note Name]] syntax. Keyboard Shortcuts: Ctrl/Cmd+Enter saves the task Esc or Tab to navigate out of the editor Placeholder Text: Shows an example task (e.g., \"Buy groceries tomorrow at 3pm @home #errands\") when the editor is empty. Customizable Triggers# New in v4: Triggers for NLP properties can be customized in Settings -> TaskNotes -> Features (NLP Triggers). You can configure trigger characters or strings for: Tags (default: #) - When set to #, Obsidian's native tag suggester is used Contexts (default: @) Projects (default: +) Status (default: *) Priority (default: !, disabled by default) User-Defined Fields (default: fieldname:) - Each custom field can have its own trigger Triggers support up to 10 characters and can include trailing spaces (e.g., \"def: \" for a custom field). Autocomplete# New in v4: When typing a trigger in the NLP editor, an autocomplete menu appears with available values. Navigate suggestions with arrow keys Select with Enter or Tab Autocomplete works for tags, contexts, projects, status, priority, and user-defined fields Tag autocomplete uses Obsidian's native tag suggester when using the # trigger For user fields with multi-word values, wrap the value in quotes (e.g., effort: \"very high\") The NLP engine is integrated with the task creation modal and bulk conversion features. Typing a natural language description populates the corresponding task fields automatically."},{"title":"Integrations","url":"/obsidian/features/integrations/","description":"TaskNotes integrates with external services and Obsidian's core plugins.","product":"obsidian","text":"TaskNotes integrates with external services and Obsidian's core plugins. Bases Core Plugin# TaskNotes v4 uses Obsidian's Bases core plugin for its main views (Task List, Kanban, Calendar, Agenda). Bases must be enabled in Settings -> Core Plugins. For details on Bases integration, see Core Concepts. External Calendars# TaskNotes supports bidirectional sync with Google Calendar and Microsoft Outlook via OAuth, plus read-only access to any calendar via ICS subscriptions. For setup instructions, see Calendar Integration. HTTP API# A REST API enables external applications to create, update, and query tasks. Use it for automation, browser extensions, or custom integrations. For API documentation, see HTTP API. Webhooks# Webhooks send task event payloads to external services when subscribed events occur. Optional payload transformations support service-specific formats. For configuration, see Webhooks. Companion Plugins# Companion plugins run inside Obsidian alongside TaskNotes and use the JavaScript runtime API for live task operations. They are useful when an integration needs a real Obsidian UI, command-palette commands, or vault-local configuration files. For the companion-plugin model and guides for Canvas Bases and TaskNotes Workflows, see Companion Plugins."},{"title":"Recurring Tasks","url":"/obsidian/features/recurring-tasks/","description":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned i...","product":"obsidian","text":"TaskNotes recurring tasks use RFC 5545 RRule strings with DTSTART support and dynamic next-occurrence scheduling. The model separates recurrence patterns from the next planned instance, and can also create normal task notes for individual occurrences when an instance needs its own content. If you are new to recurring tasks in TaskNotes, think of the recurrence rule as the long-term plan and the scheduled field as the next concrete commitment. Most day-to-day editing affects scheduled, while recurrence editing changes the plan itself. Core Concepts# Recurring tasks operate on two independent levels: Recurring Pattern: Defines when pattern instances appear (controlled by DTSTART in the recurrence rule) Next Occurrence: The specific date/time when you plan to work on the next instance (controlled by the scheduled field) Materialized Occurrence Notes: Optional child task notes for specific occurrence dates, used when an occurrence needs its own checklist, status, time tracking, or body content This separation lets you reschedule the next occurrence without changing the pattern. Setting Up Recurring Tasks# In practice, setup is usually a two-step flow: choose a pattern, then check whether the next scheduled occurrence matches how you actually want to execute the next instance. Creating Recurrence Patterns# You can create recurring tasks through: Recurrence Context Menu in task modals for presets or custom options Preset Options such as daily, weekly, or monthly Custom Recurrence Modal with date/time pickers and RRule configuration Required Components# Recurring tasks require: Recurrence Rule: RRule string with DTSTART Scheduled Date: Next occurrence date (independent from the pattern) Materialized occurrence notes add two system fields to the occurrence note: recurrence_parent: link/path back to the recurring parent task occurrence_date: the occurrence date represented by the note DTSTART Integration# DTSTART is the anchor for pattern generation. It controls where the rule begins and, when time is included, the default time for future pattern instances. Date-only: DTSTART:20250804;FREQ=DAILY Date and time: DTSTART:20250804T090000Z;FREQ=DAILY Recurring Task Due Date# When a recurring task is completed, scheduled advances to the next occurrence. By default, due does not change. Enable Maintain due date offset in recurring tasks in Settings → TaskNotes → Features → Recurring Tasks to preserve due/scheduled spacing. Example: Scheduled: 2025-01-01 Due: 2025-01-03 Recurrence: weekly If the task advances to scheduled: 2025-01-08, the due date becomes 2025-01-10 when this setting is enabled. This setting is most useful when due dates represent a fixed lead/lag relative to scheduled work (for example, \"due two days after execution\"). If due dates are independent deadlines, leaving the setting off is usually clearer. Recurrence Pattern Examples# DTSTART:20250804T090000Z;FREQ=DAILY → Daily at 9:00 AM, starting August 4, 2025 DTSTART:20250804T140000Z;FREQ=WEEKLY;BYDAY=MO,WE,FR → Monday, Wednesday, Friday at 2:00 PM, starting August 4, 2025 DTSTART:20250815;FREQ=MONTHLY;BYMONTHDAY=15 → 15th of each month (all-day), starting August 15, 2025 DTSTART:20250831;FREQ=MONTHLY;BYMONTHDAY=-1 → Last day of each month (all-day), starting August 31, 2025 DTSTART:20250801T100000Z;FREQ=MONTHLY;BYDAY=-1FR → Last Friday of each month at 10:00 AM, starting August 1, 2025 Dynamic Scheduled Dates# The scheduled field automatically tracks the next uncompleted occurrence: Initially set to the DTSTART date Advances when occurrences are completed Recalculates when the rule changes Can be manually rescheduled independently This behavior keeps recurring tasks practical in real planning: you can preserve a stable weekly/monthly pattern while still adapting the immediate next occurrence to calendar realities. Materialized Occurrence Notes# Most recurring tasks can remain virtual: the parent task stores complete_instances and skipped_instances, and TaskNotes renders each calendar/list instance from that parent. Materialized occurrence notes are for heavier instances where the date-specific work needs its own note. Good uses include: A weekly review where each week needs a separate agenda and notes A maintenance task where each visit needs photos, links, or a checklist A recurring meeting where every occurrence should have its own time entries and completion state To create one manually, right-click a recurring task card or calendar occurrence and choose Open or create occurrence note. The Task Action Palette also exposes Open or create occurrence note for recurring tasks. If a matching note already exists for the same parent and date, TaskNotes opens it instead of creating a duplicate. An occurrence note is an ordinary TaskNotes task. It appears in views, can be edited like any other task, and shows an occurrence pill that links back to the recurring parent. On the calendar, a materialized occurrence replaces the matching virtual parent occurrence for the same parent/date pair, so you do not see both the generated instance and the note-backed instance at the same time. Its frontmatter includes: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date: \"2026-06-01\" scheduled: \"2026-06-01T09:30\" timeEstimate: 45 When TaskNotes creates an occurrence note, it copies the parent fields that describe how that instance should be planned: title, priority, scheduled time, due offset, contexts, projects, tags, reminders, dependencies, details, custom properties, and time estimate. Date-like fields are rebased onto the occurrence date, so a parent scheduled at 09:30 creates an occurrence scheduled at 09:30 on the selected date, and a due date one day after the parent scheduled date stays one day after the occurrence scheduled date. Occurrence notes can use a separate template from regular new tasks. Set occurrence_template on the recurring parent to point at a template note, or configure Settings → Features → Body template → Occurrence note template file as a global fallback. Parent-level occurrence_template wins over the global fallback. If neither occurrence-specific template is configured, occurrence note creation keeps the normal body template behavior. The parent task remains the source of the recurrence rule and series history. Occurrence notes do not copy the parent's recurrence, complete_instances, skipped_instances, completedDate, calendar provider IDs, or timeEntries. New time entries belong to the occurrence note once you track time there. Occurrence Filenames# By default, materialized occurrence notes use the existing filename behavior: the parent title followed by a numeric suffix. To opt in to custom filenames, set Occurrence filename template under Settings → Task Properties → Title. For example, {{title}} — {{occurrenceDate}} produces Weekly review — 2026-08-01.md. Occurrence filename templates support all regular filename variables plus these occurrence-specific variables: {{occurrenceDate}} - occurrence date, such as 2026-08-01 {{occurrenceWeek}} - ISO week, such as 2026-W31 {{occurrenceMonth}} - month, such as 2026-08 {{occurrenceYear}} - year, such as 2026 {{occurrenceMonthName}} - full month name, such as August Choose the date granularity explicitly in the template; TaskNotes does not infer it from the recurrence rule. A recurring parent can override the global template with the frontmatter property configured by Occurrence template override property (by default, occurrenceFilenameTemplate): occurrenceFilenameTemplate: \"{{title}} ({{occurrenceWeek}})\" Leaving the global template empty preserves the existing filename behavior. TaskNotes never renames existing occurrence notes, and filename collisions continue to receive a numeric suffix. Occurrence Note Policies# Each recurring parent has an Occurrence notes submenu under its recurrence menu: Create manually: occurrence notes are only created by explicit action. Create next after completion: after you complete a materialized occurrence note, TaskNotes creates the next occurrence note. Rolling window: defined by the TaskNotes spec, but not automated in the plugin yet. When Create next after completion is enabled, creating the first occurrence is still a deliberate action. After that, completing the occurrence note advances the parent recurrence state and materializes the next scheduled occurrence. HTTP API and MCP clients can create occurrence notes without using the desktop context menu. Use POST /api/tasks/:id/materialize-occurrence or the MCP tasknotes_materialize_occurrence tool with a parent task path and occurrence date. Completing a recurring instance through the API or MCP also respects existing occurrence notes and the Create next after completion policy. The same submenu also controls the next-note trigger: Completion only: create the next occurrence note only when the current occurrence is completed. Completion or skip: create the next occurrence note when the current occurrence is completed or skipped. Skip/unskip controls appear on materialized occurrence notes when a skipped status is configured. Skipping an occurrence preserves the note, updates its status, and reconciles the parent skipped_instances list. Completion Reconciliation# When a materialized occurrence note is completed, TaskNotes updates both sides of the relationship: The occurrence note is completed like a normal task. The parent adds the occurrence date to complete_instances. The parent removes that date from skipped_instances if needed. The parent recalculates scheduled to the next uncompleted occurrence. If the parent policy is Create next after completion, TaskNotes creates the next occurrence note idempotently. Uncompleting an occurrence note removes the date from the parent's complete_instances list, but it does not delete later occurrence notes that were already created. Example Behavior# # Initial state recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-04T09:00\" complete_instances: [] # After completing Aug 4 recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T09:00\" complete_instances: [\"2025-08-04\"] # After manually rescheduling next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=DAILY\" scheduled: \"2025-08-05T14:30\" complete_instances: [\"2025-08-04\"] Calendar Drag and Drop# Calendar interactions follow the same model distinction: drag the concrete next item to reschedule execution, or drag a pattern instance to redefine the recurrence anchor. Recurring tasks can show: Next occurrence (solid border): dragging updates only scheduled Pattern instances (dashed border): dragging updates DTSTART and future pattern instances Materialized occurrence notes: dragging updates the occurrence note's own scheduled or due date like a normal task, without changing the parent's recurrence rule Materialized occurrence notes keep occurrence_date as their identity. If you drag the note for the June 1 occurrence to June 2, it is still the June 1 recurrence instance, now scheduled for June 2. TaskNotes suppresses the June 1 virtual parent event and leaves the June 2 virtual occurrence alone unless that date also has its own materialized note. Completion Tracking# Each occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar). Completed instances are stored in: complete_instances: [\"2025-08-04\", \"2025-08-06\", \"2025-08-08\"] Skipped instances are stored in: skipped_instances: [\"2025-08-05\"] When completion changes, scheduled updates to the next uncompleted instance. If a materialized occurrence note exists for a date, that note's own status takes precedence for that occurrence, and TaskNotes reconciles the parent compatibility lists during completion, uncompletion, skip, and unskip actions. This means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks. Flexible Scheduling# TaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule. The next occurrence can be: Before DTSTART Outside the pattern day At a different time than pattern instances Far ahead while pattern continues unchanged Examples# # Early start before DTSTART recurrence: \"DTSTART:20250810T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-07T14:00\" # Off-pattern next occurrence recurrence: \"DTSTART:20250804T090000Z;FREQ=WEEKLY;BYDAY=MO\" scheduled: \"2025-08-06T15:30\" Timezone Handling# Recurring task logic uses a UTC anchor approach: Pattern generation uses UTC dates DTSTART dates are interpreted as UTC anchors Display adapts to local timezone Prevents common off-by-one date issues In other words, calculations stay stable internally while display remains local, which avoids drift when traveling or sharing vaults across timezones. Backward Compatibility# Recurring behavior remains compatible with older task data, so upgrades do not require manual note rewrites. Legacy RRule strings without DTSTART continue to work using scheduled as anchor Legacy recurrence objects are converted to RRule format Existing tasks continue to function without migration steps Mixed formats are handled transparently"},{"title":"Task Reminders","url":"/obsidian/features/reminders/","description":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types.","product":"obsidian","text":"TaskNotes reminders use iCalendar VALARM semantics and support both relative and absolute reminder types. The reminders system is designed to support both habit-like workflows (\"always remind me 15 minutes before\") and one-off commitments (\"alert me exactly at this date and time\"). Most users mix both styles depending on the task. Reminder Types# Relative Reminders# Relative reminders trigger from due or scheduled dates. Use relative reminders when you want reminder behavior to stay consistent even when task dates change. Examples: 15 minutes before due date 1 hour before scheduled date 2 days before due date 30 minutes after scheduled date Absolute Reminders# Absolute reminders trigger at a fixed date/time. Use absolute reminders when the reminder itself is tied to a specific moment, independent of task rescheduling. Examples: October 26, 2025 at 9:00 AM Tomorrow at 2:30 PM Next Monday at 10:00 AM Adding Reminders# You can add reminders from: Task Creation Modal Task Edit Modal Task Cards (bell icon) Reminder field context menu From a workflow perspective, task cards and context menus are fastest for quick reminders, while task modals are better for reviewing multiple reminders on the same task. Quick Reminder Options# Common shortcuts are available for both due and scheduled anchors, such as: 5 minutes before 15 minutes before 1 hour before 1 day before Quick options appear only when the anchor date exists. This prevents invalid reminder states and keeps the quick menu focused on options that can be applied immediately. Reminder Data Format# Reminders are stored in YAML frontmatter arrays. Because reminders are stored in frontmatter, they remain portable and scriptable. You can inspect or transform reminder data with any tooling that reads Markdown + YAML. Relative Structure# reminders: - id: \"rem_1678886400000_abc123xyz\" type: \"relative\" relatedTo: \"due\" offset: \"-PT15M\" description: \"Review task details\" Absolute Structure# reminders: - id: \"rem_1678886400001_def456uvw\" type: \"absolute\" absoluteTime: \"2025-10-26T09:00:00\" description: \"Follow up with client\" Field meanings: id: unique identifier type: relative or absolute relatedTo: due or scheduled (relative only) offset: ISO 8601 duration, negative before and positive after (relative only) absoluteTime: ISO 8601 timestamp (absolute only) description: optional message You typically do not need to edit these fields manually, but understanding the structure helps when debugging automation or importing task data. Visual Indicators# Tasks with reminders show a bell icon on task cards. Solid bell indicates active reminders Clicking opens quick reminder actions Reminder UI shows task context (due/scheduled dates and reminder count) These indicators are intended to make reminders discoverable in list-heavy views without opening every task. Default Reminders# Default reminders can be configured in: Settings -> TaskNotes -> Task Properties -> Reminders Defaults are applied to: Manual task creation Instant conversion Natural language task creation Default reminders are useful for recurring habits, such as pre-deadline checks or day-before planning prompts. Technical Notes# Reminders follow iCalendar VALARM concepts with ISO 8601 offsets The reminder property name can be customized through field mapping For settings-level behavior (notification channels, enable/disable state), see Features Settings."},{"title":"Task Management","url":"/obsidian/features/task-management/","description":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts.","product":"obsidian","text":"This page covers task creation, properties, projects, dependencies, recurring tasks, and reminders. For the underlying architecture, see Core Concepts. Use this page as the operational overview: how tasks are captured, how they are structured, and how relationships/automation behave. Detailed reference content for recurrence and reminders is split into dedicated pages linked near the end. Creating and Editing Tasks# You can create and edit tasks in a variety of ways. The primary method is through the Task Creation Modal, which can be accessed via the \"Create new task\" command or by clicking on dates or time slots in the calendar views. This modal provides an interface for setting all available task properties, including title, status, priority, and due dates. TaskNotes keeps a storage title and a filename-safe title separate. When Store title in filename is enabled, forbidden filename characters are removed from the filename while the task title is preserved whenever it cannot be represented exactly by that filename. With another filename format, such as timestamp or UUID, the full title is stored in frontmatter. For existing tasks, the Quick actions for current task command opens a keyboard-searchable action palette. It includes status, priority, time-tracking, archive, edit, and date actions, including built-in due and scheduled date presets such as today, tomorrow, this weekend, next week, and next month. TaskNotes also supports Natural Language Creation, which allows you to create tasks by typing descriptions in plain English. The built-in parser can extract structured data from phrases like \"Buy groceries tomorrow at 3pm @home #errands high priority.\" In most workflows, users combine both approaches: fast capture with natural language, then occasional structured edits in the modal when more precision is needed. Auto-Suggestions in Natural Language Input# The natural language input field includes auto-suggestion functionality that activates when typing specific trigger characters: @ - Shows available contexts from existing tasks # - Shows available tags from existing tasks + - Shows files from your vault as project suggestions * - Shows available status options (configurable trigger in Settings → Features) In task creation and edit fields, focusing the tags or contexts input also opens the available suggestions immediately, so you can pick from the current vocabulary without typing a first character. Project Suggestions# When typing + in the natural language input, you'll see up to 20 suggestions from your vault's markdown files. The suggestions display additional information to help identify files: project-alpha [title: Alpha Project Development | aliases: alpha, proj-alpha] meeting-notes [title: Weekly Team Meeting Notes] simple-project work-file [aliases: work, office-tasks] Project suggestions search across: File names (basename without extension) Frontmatter titles (using your configured field mapping) Frontmatter aliases Optional filtering by required tags, folders, and a specific frontmatter property/value defined in Settings → Appearance & UI → Project Autosuggest Selecting a project suggestion inserts it as +[[filename]], creating a wikilink to the file while maintaining the + project marker that the natural language parser recognizes. Enhanced Project Auto‑suggester (configurable cards)# Project suggestions can display configurable multi‑row cards and support smarter search. Configure up to 3 rows using a simple token syntax in Settings → Appearance & UI → Project Autosuggest. Properties: file.basename, file.name, file.path, file.parent, title, aliases, and any frontmatter key Flags: n or n(Label) → show the field name/label before the value s → include this field in + search (in addition to defaults) Literals: you can mix in fixed text or emojis between tokens Examples \"{title|n(Title)}\" → Title: Alpha Project \"🔖 {aliases|n(Aliases)}\" → 🔖 Aliases: alpha, proj-alpha \"{file.path|n(Path)|s}\" → include path in + search as well as display it Search behavior Defaults: + search always includes file basename, title (via your field mapping), and aliases |s flag: add more searchable fields on top of the defaults (e.g., file.path or a custom frontmatter key like customer) Fuzzy: optional fuzzy matching can be enabled in settings for broader, multi‑word matches Performance tips Keep rows to three or fewer for clarity and performance (the UI supports up to 3) Prefer specific searchable fields with |s on large vaults Demo Status Suggestions# When typing the status trigger character (default *) in the natural language input, you'll see suggestions for all configured status options: Status suggestions allow quick selection of statuses when creating tasks. For example, typing *in shows \"In Progress\" as a suggestion if that's one of your configured statuses. Clicking a task card's status indicator cycles through statuses in the order configured under Settings → Task Properties → Status. A status can optionally define a specific Next status for forward cycling; otherwise TaskNotes uses the configured order. Statuses marked Skip when cycling are left out of the ordered click cycle, but remain available through menus, suggestions, direct edits, and explicit next-status jumps. Additionally, you can convert any line type in your notes to TaskNotes using the Instant Conversion feature. This works with checkboxes, bullet points, numbered lists, blockquotes, headers, and plain text lines. Task Properties# Tasks store their data in YAML frontmatter with properties for status, priority, dates, contexts, projects, tags, time estimates, recurrence, and reminders. Custom fields can extend this structure. This frontmatter-first design keeps task data editable and portable while supporting consistent behavior across views and widgets. For property types and examples, see Core Concepts. For configuration options, see Task Properties Settings. Projects# TaskNotes supports organizing tasks into projects using note-based linking. Projects are represented as links to actual notes in your vault, allowing you to leverage Obsidian's linking and backlinking features for project management. This model avoids creating a separate project database. Any note can become a project anchor, and task/project relationships remain visible through normal Obsidian link tooling. Project Assignment# Tasks can be assigned to one or more projects through the task creation or editing interface. When creating or editing a task, click the \"Add Project\" button to open the project selection modal. This modal provides fuzzy search functionality to quickly find and select project notes from your vault. Project Links# Projects are stored as wikilinks in the task's frontmatter (e.g., projects: [\"[[Project A]]\", \"[[Project B]]\"]). These links are clickable in the task interface and will navigate directly to the project notes when clicked. Any note in your vault can serve as a project note simply by being linked from a task's projects field. Organization and Filtering# Tasks can be filtered and grouped by their associated projects in all Bases-driven task views. Use the Bases filter editor to add note.projects conditions, and configure the grouping menu to organize Task List or Kanban boards by project. Tasks assigned to multiple projects will appear in each relevant project group, providing flexibility in project-based organization. Project Indicators# TaskCards display visual indicators when tasks are used as projects. These indicators help identify which tasks have other tasks linked to them as subtasks, making project hierarchy visible at a glance. Subtask Creation# Tasks can have subtasks created directly from their context menu. When viewing a task that serves as a project, you can select \"Create subtask\" to create a new task automatically linked to the current project. Dependencies# Task dependencies capture prerequisite work using RFC 9253 terminology. Dependencies are stored in frontmatter as structured objects: blockedBy: - uid: \"[[Operations/Order hardware]]\" reltype: FINISHTOSTART gap: P1D uid references the blocking task, typically through an Obsidian wikilink. reltype is stored with each dependency and defaults to FINISHTOSTART for dependencies created in the UI. gap is optional and uses ISO 8601 duration syntax (for example PT4H or P2D). Whenever a dependency is added, TaskNotes updates the upstream note’s blocking list so the reverse relationship stays synchronized. Removing a dependency automatically clears both sides. Selecting dependencies in the UI# The task creation and edit modals expose “Blocked by” and “Blocking” buttons that launch a fuzzy task selector. The picker only offers valid tasks, excludes the current note, and prevents duplicate entries. The task context menu provides the same selector, enabling dependency management directly from the Task List, Kanban, and calendar views. Task cards show a fork icon whenever a task blocks other work. Clicking it expands an inline list of downstream tasks without triggering the parent card’s modal, so you can inspect dependents in place. These controls currently create and manage finish-to-start style blockers. Advanced reltype values and gap data are preserved in frontmatter, but blocking evaluation is currently based on whether unresolved dependencies exist rather than relationship-type-specific scheduling rules. Automation# Auto-Archiving# TaskNotes can automatically archive tasks when they transition into a status that has auto-archiving enabled. This keeps completed work out of your active lists without requiring manual cleanup. Configure auto-archiving per status from Settings → Task Properties → Task Statuses. Each status card includes an Auto-archive toggle and a Delay (minutes) input (1–1440). When you turn the toggle on for a status, any task moved into that status is queued for archiving once the delay elapses. Moving the task to a different status before the timer expires cancels the pending archive automatically. The auto-archive queue runs in the background and persists across plugin restarts. If TaskNotes was closed while an archive was pending, the task will be archived shortly after the plugin loads again as long as it still matches the configured status. This automation is intended to keep active views focused without manual cleanup, while still preserving archived task history in your vault. File Management and Templates# TaskNotes supports configurable task folder locations, filename generation patterns, archive behavior, and body templates for newly created tasks. These settings let you align task files with existing vault conventions (for example, date-based folders, project-based routing, or template-driven task note scaffolds). For configuration details, see Task Defaults.For template variables, see Template Variables Reference. Recurring Tasks# TaskNotes recurring tasks use RFC 5545 RRule syntax with DTSTART, separate pattern definition from next occurrence scheduling, and support independent instance completion. When an individual recurrence needs its own checklist, time entries, or notes, you can create a materialized occurrence note from the task or calendar context menu. For full behavior, examples, and edge cases, see Recurring Tasks. Task Reminders# Task reminders support relative offsets from due/scheduled dates and absolute date-time reminders. You can add reminders from task modals, task cards, and context menus. For full setup, data format, defaults, and UI behavior, see Task Reminders."},{"title":"Template Variables Reference","url":"/obsidian/features/template-variables/","description":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced w...","product":"obsidian","text":"TaskNotes supports template variables for dynamic content generation in body templates, folder paths, and filenames. Variables use the {{variableName}} syntax and are replaced with actual values when content is created. Overview# Template variables are available in three contexts: Body templates - Content templates for task and note files Folder templates - Dynamic folder paths for file organization Filename templates - Dynamic filename generation Not all variables are available in every context. The tables below indicate where each variable can be used. Task Properties# Variables for task-specific data. Variable Description Body Folder Example {{title}} Task title Yes Yes My Task {{titleLower}} Title in lowercase Yes Yes my task {{titleUpper}} Title in uppercase Yes Yes MY TASK {{titleSnake}} Title in snake_case Yes Yes my_task {{titleKebab}} Title in kebab-case Yes Yes my-task {{titleCamel}} Title in camelCase Yes Yes myTask {{titlePascal}} Title in PascalCase Yes Yes MyTask {{priority}} Task priority value Yes Yes high {{priorityShort}} First character of priority (uppercase) Yes Yes H {{status}} Task status value Yes Yes active {{statusShort}} First character of status (uppercase) Yes Yes A {{context}} First context from contexts array No Yes work {{contexts}} All contexts (comma-separated in body, / in folder) Yes Yes work, home or work/home {{project}} First project from projects array No Yes ProjectA {{projects}} All projects joined by / No Yes ProjectA/ProjectB {{projectFilePath}} Full path of the first project, without .md No Yes Work/Projects/ProjectA {{projectFilePaths}} Full paths of all projects, joined by / No Yes Work/Alpha/Personal/Beta {{projectFolder}} Folder containing the first project note (its file path without the note's own name) No Yes Work/Projects {{projectFolders}} Folders of all projects, joined by / No Yes Work/Personal {{dueDate}} Task due date Yes Yes 2025-01-15 {{scheduledDate}} Task scheduled date Yes Yes 2025-01-10 Body Template Only# Variables available only in body templates (not folder templates). Variable Description Example {{details}} User-provided details/description Task description text {{parentNote}} Parent note name/path where task was created Projects/MyNote {{tags}} Task tags (comma-separated) urgent, review {{hashtags}} Task tags as space-separated hashtags #urgent #review {{timeEstimate}} Time estimate in minutes 30 Date and Time# Variables for current date and time values. Variable Description Format Example {{date}} Full current date YYYY-MM-DD 2025-01-07 {{year}} Current year YYYY 2025 {{shortYear}} Short year YY 25 {{month}} Current month MM 01 {{day}} Current day DD 07 {{monthName}} Full month name - January {{monthNameShort}} Abbreviated month name - Jan {{dayName}} Full day name - Tuesday {{dayNameShort}} Abbreviated day name - Tue {{week}} Week number of year WW 02 {{quarter}} Quarter of year Q 1 {{shortDate}} Compact date YYMMDD 250107 Time Variables# Variable Description Format Example {{time}} Current time (compact) HHmmss 143052 {{time24}} 24-hour time HH:mm 14:30 {{time12}} 12-hour time with AM/PM hh:mm a 02:30 PM {{hour}} Current hour (24-hour) HH 14 {{hourPadded}} Hour with leading zero HH 14 {{hour12}} Hour in 12-hour format hh 02 {{minute}} Current minute mm 30 {{second}} Current second ss 52 {{ampm}} AM/PM indicator a PM Timestamps# Variable Description Format Example {{timestamp}} Date and time combined YYYY-MM-DD-HHmmss 2025-01-07-143052 {{dateTime}} Date and time (no seconds) YYYY-MM-DD-HHmm 2025-01-07-1430 {{unix}} Unix timestamp (seconds) - 1736264852 {{unixMs}} Unix timestamp (milliseconds) - 1736264852000 {{milliseconds}} Current milliseconds SSS 123 {{ms}} Milliseconds (alias) SSS 123 Timezone# Variable Description Example {{timezone}} Timezone offset +01:00 {{timezoneShort}} Short timezone offset +0100 {{utcOffset}} UTC offset +01:00 {{utcOffsetShort}} Short UTC offset +0100 {{utcZ}} UTC Z indicator Z Unique Identifiers# Variable Description Example {{zettel}} Zettelkasten-style ID (date + seconds since midnight in base36) 250107abc {{nano}} Unique nano ID (timestamp + random string) 1736264852000x7k2m ICS Calendar Event Variables# Variables for content created from ICS calendar events. Available when creating notes or tasks from calendar events. Event Information# Variable Description Body Folder {{icsEventTitle}} Event title Yes Yes {{icsEventTitleLower}} Event title lowercase No Yes {{icsEventTitleUpper}} Event title uppercase No Yes {{icsEventTitleSnake}} Event title in snake_case No Yes {{icsEventTitleKebab}} Event title in kebab-case No Yes {{icsEventTitleCamel}} Event title in camelCase No Yes {{icsEventTitlePascal}} Event title in PascalCase No Yes {{icsEventStart}} Event start time (ISO format) Yes No {{icsEventEnd}} Event end time (ISO format) Yes No {{icsEventLocation}} Event location Yes Yes {{icsEventDescription}} Event description Yes Yes {{icsEventUrl}} Event URL Yes No {{icsEventSubscription}} Calendar subscription name Yes No {{icsEventId}} Unique event identifier (UUID) Yes No Current Note Folder Variables# Variables available for inline-created tasks and the default tasks folder. Variable Description Example {{currentNotePath}} Path to the current note's folder Projects/Notes {{currentNoteTitle}} Title/name of the current note Meeting Notes Examples# Body Template# --- created: {{date}} priority: {{priority}} status: {{status}} --- # {{title}} {{details}} Created from: {{parentNote}} Tags: {{hashtags}} Folder Template# Organize tasks by project and status: Tasks/{{project}}/{{status}} Result: Tasks/MyProject/active Organize by date hierarchy: Daily/{{year}}/{{month}}/{{day}} Result: Daily/2025/01/07 Organize ICS events by year and title: Events/{{year}}/{{icsEventTitleKebab}} Result: Events/2025/team-meeting Filename Template# Using Zettelkasten ID: {{zettel}}-{{titleKebab}} Result: 250107abc-my-task.md Using timestamp: {{shortDate}}-{{title}} Result: 250107-My Task.md Notes# YAML Safety# When used in YAML frontmatter, values containing special characters (colons, brackets, quotes) are automatically quoted to prevent parsing errors. Folder Path Sanitization# In folder templates, title values have filesystem-unsafe characters (<>:\"/\\|?*) replaced with underscores to ensure valid paths. Project file path variables preserve folder separators and sanitize unsafe characters within each path segment. Empty Values# If a variable references data that isn't available (e.g., {{project}} when no project is set), it resolves to an empty string. Case Transformations# The case transformation variables work as follows: Transform Input Output titleLower My Task Name my task name titleUpper My Task Name MY TASK NAME titleSnake My Task Name my_task_name titleKebab My Task Name my-task-name titleCamel My Task Name myTaskName titlePascal My Task Name MyTaskName"},{"title":"Time Management","url":"/obsidian/features/time-management/","description":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer.","product":"obsidian","text":"TaskNotes includes features for time tracking and productivity, such as a time tracker and a Pomodoro timer. Time Tracking# TaskNotes has a time tracker to record the time spent on each task. Time tracking information is stored in the timeEntries array within each task's YAML frontmatter. Each time entry includes a start time and an end time. The time tracking interface includes controls to start and stop tracking in task views and task cards. TaskNotes prevents duplicate active sessions on the same task. Active sessions on different tasks can exist at the same time, and total time spent on each task is calculated from completed sessions. Auto-Stop Time Tracking# TaskNotes can automatically stop time tracking when a task is marked as completed. This feature ensures that time tracking data accurately reflects work completion without requiring manual timer management. The auto-stop feature works by monitoring task status changes across all views and interfaces. When a task's status changes from any non-completed state to a completed state (as defined by the custom status configuration), any active time tracking session for that task is automatically terminated. Configuration Options: Configure these under Settings -> TaskNotes -> Features (Time Tracking section). Auto-stop tracking - Enable or disable the automatic stopping behavior (enabled by default) Completion notification - Show a notice when auto-stop occurs (disabled by default) Behavior: Monitors all task status changes in real-time Stops only the specific task that was completed (other active timers continue) Preserves the recorded time data in the task's time entries Works with both standard and recurring task completions Functions across all task views (list, kanban, calendar, etc.) The feature integrates with the custom status system, so completion detection respects your configured workflow statuses rather than relying on hardcoded completion states. Pomodoro Timer# TaskNotes also includes a Pomodoro timer, which is a tool for time management that uses a timer to break down work into intervals, separated by short breaks. The Pomodoro timer in TaskNotes has a dedicated view with controls to start, stop, and reset the timer. When a task is associated with a Pomodoro session, the time is automatically recorded in the task's time tracking data upon completion of the session. Productivity Analytics# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks. The data can be visualized to show productivity patterns over time."},{"title":"User Fields","url":"/obsidian/features/user-fields/","description":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User f...","product":"obsidian","text":"TaskNotes allows you to define your own custom fields for tasks. This feature allows you to add custom data to your tasks and use it for filtering, sorting, and grouping. User fields can store workflow-specific metadata such as owner, effort class, client, or review stage. Creating User Fields# User fields are created in the TaskNotes settings, under the \"Task Properties\" tab. To create a new user field, click the \"Add new user field\" button. Fields that are not used in filters or grouping still add frontmatter overhead, so this section focuses on fields used in views. Each user field has the following properties: Display Name: The name of the field as it will be displayed in the UI. Property Name: The name of the field as it will be stored in the frontmatter of the task note. Type: The data type of the field. The following types are supported: Text: A single line of text. Number: A numeric value (supports ranges in filters and sorting). Boolean: A true/false value stored as a checkbox in the task modal. Date: A date. List: A list of values. Default Value (optional): A default value to pre-fill when creating new tasks. The input format depends on the field type: Text: Enter the default text value. Number: Enter the default number. Boolean: Toggle to set the default state (checked/unchecked). Date: Select from presets: None, Today, Tomorrow, or Next Week. List: Enter comma-separated default values. Link Values# Use a Text field for one related link, such as a pull request or specification, and a List field for multiple related links. Task cards render wikilinks, markdown links, angle-bracket autolinks, and bare https:// URLs as clickable links. For internal note links, type [[ in a text or list field to use the same file suggestions as other TaskNotes link fields. Autosuggestion filters can narrow those note suggestions without changing how the stored field value is filtered, sorted, or grouped. File Suggestion Filtering (Advanced)# When using text or list type custom fields, you can configure autosuggestion filters to control which files appear in the autocomplete dropdown when you type [[ in the field. This is useful when you want to limit suggestions to specific types of notes. For example: An \"Assignee\" field that only suggests notes tagged with #person A \"Project\" field that only shows notes in the Projects/ folder A \"Related Document\" field filtered by a specific frontmatter property Filtering narrows wikilink suggestions in large vaults. Configuring Filters# To configure filters for a custom field: Go to Settings → Task Properties → Custom User Fields Expand the custom field card you want to configure Expand the \"Autosuggestion filters (Advanced)\" section Configure one or more of the following filters: Filter Options# Required tags: Only show files that have ANY of these tags (comma-separated) Example: person, team - shows files with either #person OR #team tag Supports hierarchical tags: project/active matches #project/active Include folders: Only show files in these folders (comma-separated) Example: People/, Teams/ - shows files in either folder Supports nested folders: Projects/Active/ matches files in that specific folder Required property key: Only show files that have this frontmatter property Example: role - shows files with a role: property in frontmatter Required property value: Expected value for the property (optional) Example: developer - when combined with property key role, shows files with role: developer Leave empty to match any value (just checks property exists) Filter Indicator# When filters are configured, a \"Filters On\" badge with a funnel icon appears next to the section title. This prevents you from forgetting that filters are active. Filter Behavior# All filters are combined with AND logic: Files must match ALL configured filters to appear Empty filters are ignored: If you don't configure a filter, it won't restrict results No filters = all files: If no filters are configured, all markdown files in your vault will appear Filters only affect autocomplete: They don't affect the actual field value or validation Autocomplete filtering and stored field values are handled independently. Example Configurations# Assignee Field (People Only)# Display Name: Assignee Property Key: assignee Type: List Autosuggestion filters: Required tags: person Include folders: People/ Project Field (Active Projects)# Display Name: Project Property Key: project Type: Text Autosuggestion filters: Required tags: project Required property key: status Required property value: active Related Note (Specific Folder)# Display Name: Related Note Property Key: related-note Type: Text Autosuggestion filters: Include folders: Documentation/, Guides/ Using User Fields# Once you have created a user field, it will be available in the following places: Task Modals: The user field will be displayed in the task creation and edit modals. Bases Filters: Add the field to Bases filter expressions (for example note.effort == \"high\") to narrow task lists and Kanban boards. Sorting: Use the Bases sort menu to order tasks by the user field. Grouping: Use the Bases group menu to create swimlanes or list groupings based on the user field. To verify a new field is active in workflow, add it to at least one saved view. Frontmatter# User field data is stored in the frontmatter of the task note. The property name you define for the user field is used as the key in the frontmatter. For example, if you create a user field with the property name \"my_field\", the data for that field will be stored in the frontmatter as follows: --- my_field: value ---"},{"title":"Adopt TaskNotes in an existing vault","url":"/obsidian/getting-started/existing-vault/","description":"Adopt TaskNotes in a vault that already contains tasks, tags, and custom frontmatter without rewriting everything first.","product":"obsidian","text":"TaskNotes can use your current folders and property names. Configure identification and field mapping before creating or converting tasks so the first write follows your vault conventions. 1. Back up the vault# Make a complete vault backup, including the hidden .obsidian directory. The task notes themselves are Markdown, while TaskNotes settings live in .obsidian/plugins/tasknotes/data.json. 2. Inspect a representative note# Choose one existing task and record: The property or tag that distinguishes tasks from ordinary notes The property names used for title, status, priority, due date, and scheduled date Whether contexts and tags are stored with or without display prefixes The folder patterns that should be included or excluded Canonical frontmatter values do not include natural-language trigger characters. Store office, not @office, and review, not #review. --- type: task status: open contexts: - office tags: - review --- 3. Choose task identification# Open Settings → TaskNotes → General. Choose Tag if every task contains one identifying tag, such as task. Choose Property if a property/value pair identifies tasks, such as type: task. Add archive, template, attachment, or other non-task locations to Excluded folders. Task identification controls indexing and every generated Base filter. Confirm it before regenerating Base files. 4. Map properties# Open Settings → TaskNotes → Task properties and map TaskNotes fields to the names already used in your notes. Avoid creating two properties for one concept, such as both due and deadline. Start with title, status, priority, due, scheduled, projects, contexts, and recurrence. Use the property types reference to check value shapes. 5. Test one note# Open one existing note and confirm that TaskNotes recognizes it. Use TaskNotes: Quick actions for current task and make a reversible edit, such as changing priority. Inspect the frontmatter before testing a larger set. If the note is not recognized, use the troubleshooting decision tree. 6. Generate views from the final mapping# Open Settings → TaskNotes → General → Views & base files and create or update the default Base files. Generated filters and columns use the current task identifier and field mapping. The update action replaces configured default Base files. Copy any customized Base to a new filename before updating it. 7. Convert incrementally# Convert or edit a small group first. Keep normal version-control or backup checkpoints between batches. Existing notes do not need to move into the default TaskNotes/Tasks folder if your storage and exclusion settings already cover their location."},{"title":"Obsidian mobile guide","url":"/obsidian/getting-started/mobile/","description":"What is shared between TaskNotes desktop and mobile, and which integrations differ on mobile.","product":"obsidian","text":"TaskNotes task files, Base files, settings, and most commands work on Obsidian mobile. Sync the complete vault, including .base files and .obsidian/plugins/tasknotes/data.json, when you want the same configuration on every device. Before opening TaskNotes# Install an Obsidian mobile version compatible with the current TaskNotes requirement. Enable the Bases core plugin. Confirm the TaskNotes plugin and its data.json have finished syncing before changing settings. Open a small default Base first and allow the initial index to finish. Mobile differences# Area Mobile behavior HTTP API and MCP server Desktop only. The HTTP API settings section is hidden on mobile. Calendar integrations Available, with an option to disable calendar integration on mobile when startup time or provider behavior is a problem. Settings layout Uses the same six tabs. Desktop-only controls are omitted where they cannot run. Keyboard commands Commands remain available in the command palette; desktop key bindings may not have a mobile equivalent. Wide views Calendar, Kanban, and large tables may require horizontal scrolling or a narrower Base configuration. A practical mobile setup# Keep task cards compact under Settings → Appearance and UI. Limit visible Base columns and calendar event layers. Increase remote calendar refresh intervals when mobile networking or battery use matters. Use the task creation modal or command palette for predictable capture. Keep HTTP automation on a desktop Obsidian instance. If mobile stops loading tasks# Wait for vault sync to finish, confirm Bases is enabled, and run TaskNotes: Refresh cache. Then reopen the affected Base. If the problem is isolated to calendar data, enable Disable calendar integration on mobile and restart Obsidian before investigating the provider connection on desktop."},{"title":"Backup, restore, and removal","url":"/obsidian/guides/backup-recovery/","description":"Back up, restore, reset, and uninstall TaskNotes while protecting task notes, views, settings, and integration data.","product":"obsidian","text":"TaskNotes keeps task content in your vault and configuration in the plugin data file. A complete backup includes both. What to back up# Data Typical location Why it matters Task notes Your configured task folders Titles, properties, details, recurrence, and time entries Base views TaskNotes/Views/ or custom paths Filters, formulas, layout, and custom views Plugin settings .obsidian/plugins/tasknotes/data.json Field mapping, statuses, defaults, integrations, and view command paths Daily notes Your daily-note folder Pomodoro history when daily-note storage is enabled mdbase configuration tasknotes.yaml, mdbase.yaml, or .mdbase/ when configured Shared collection and schema configuration Treat data.json as sensitive because integration configuration can include credentials or tokens. Store backups accordingly. Create a restorable backup# Close Obsidian or disable TaskNotes so settings are not being written. Copy the entire vault, including hidden files. Verify the backup contains .obsidian/plugins/tasknotes/data.json. Keep at least one version from before a migration or bulk edit. File-history sync is useful, but it is not a substitute for a separate tested backup. Restore# Close Obsidian. Restore task notes and Base files first. Restore .obsidian/plugins/tasknotes/data.json if you also need the previous settings. Reopen Obsidian and confirm Bases is enabled. Run TaskNotes: Refresh cache and open one default Base. If provider credentials have expired or were intentionally excluded from the backup, reconnect those integrations instead of restoring stale tokens. Reset configuration safely# Do not delete data.json as a first troubleshooting step. Close Obsidian. Rename data.json to data.json.backup-YYYY-MM-DD. Reopen Obsidian and test with fresh defaults. Restore the backup while Obsidian is closed if the reset does not help. A reset affects settings, configured statuses and priorities, integration state, saved views, and plugin-stored Pomodoro history. It does not delete task Markdown files. Uninstall# Disabling or uninstalling TaskNotes leaves task notes and .base files in the vault. After uninstalling, remove generated folders only if you have inspected them and confirmed they contain no content you want to keep. To remove plugin settings as well, close Obsidian and remove .obsidian/plugins/tasknotes/ after making a backup. Task metadata remains readable YAML, but TaskNotes-specific Base view types and interactive widgets will no longer render. Recovery checklist# Missing tasks: restore the note files, then verify task identification and excluded folders. Missing settings: restore data.json with Obsidian closed. Broken default views: regenerate them from General → Views & base files. Broken custom views: restore the individual .base files from history. Lost Pomodoro history: restore the configured storage source, which may be plugin data or daily-note frontmatter."},{"title":"Build a custom Base","url":"/obsidian/guides/custom-bases/","description":"Create a custom Obsidian Base for TaskNotes while keeping generated defaults safe and upgradeable.","product":"obsidian","text":"TaskNotes views are ordinary Obsidian .base files. The safest workflow is to copy a generated Base, give it a new path, and customize the copy. Start from a copy# Open TaskNotes/Views/ in the file explorer. Duplicate the closest default, such as tasks-default.base. Rename the copy, for example work-tasks.base. Open the copy and make changes with the Bases interface or source editor. Avoid editing the only copy of a generated default. Update default base files replaces the files configured as defaults. Preserve task identification# Every task view needs a filter that matches the identification method in Settings → TaskNotes → General. For tag identification: filters: and: - file.hasTag(\"task\") For property identification: filters: and: - note[\"type\"] == \"task\" Also preserve any excluded-folder conditions generated from your settings. Add a focused view# This example starts with recognized tasks, then limits the view to the work context: filters: and: - file.hasTag(\"task\") - list(contexts).contains(\"work\") views: - type: tasknotesTaskList name: Work order: - status - priority - due - file.name sort: - column: due direction: ASC Use canonical stored values in filters. Natural-language prefixes such as @ and # are input syntax, not part of stored context and tag values. Point a command at the custom Base# Open Settings → TaskNotes → General → View commands and change the relevant command path. Resetting that mapping returns it to the generated default path. Upgrade safely# When TaskNotes ships improved templates: Keep your custom file at its own path. Run Update default base files. Compare the regenerated default with your copy. Bring across only the formulas, filters, or view options you want. The generated template reference always reflects the current source and default field mapping. Recovery# If a custom Base no longer opens, validate its YAML indentation and remove the most recent filter or formula change. You can create a fresh default from settings at any time, then copy your custom view into it one section at a time."},{"title":"TaskNotes HTTP API","url":"/obsidian/HTTP_API/","description":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing.","product":"obsidian","text":"The TaskNotes HTTP API provides local HTTP access to tasks, time tracking, pomodoro, calendars, webhooks, and NLP parsing. Availability# Desktop only Disabled by default Started when Obsidian starts and TaskNotes API is enabled Bound to loopback (127.0.0.1) only, not the local network Browser CORS requests are allowed only from loopback origins such as localhost, 127.0.0.1, and [::1] Not available on mobile Enable it in Settings -> TaskNotes -> Integrations -> HTTP API. Base URL# http://localhost:{PORT} Default port is 8080. Authentication# Authentication is optional. If apiAuthToken is empty, all API requests are accepted. If apiAuthToken is set, send Authorization: Bearer . Set a token for any workflow where local browser pages, scripts, or other desktop apps are not fully trusted. Example: curl -H \"Authorization: Bearer YOUR_TOKEN\" http://localhost:8080/api/health Response Format# Success: { \"success\": true, \"data\": {} } Error: { \"success\": false, \"error\": \"Error message\" } Endpoint Index# System# GET /api/health GET /api/docs GET /api/docs/ui POST /api/nlp/parse POST /api/nlp/create Tasks# GET /api/tasks POST /api/tasks GET /api/tasks/:id PUT /api/tasks/:id DELETE /api/tasks/:id POST /api/tasks/:id/toggle-status POST /api/tasks/:id/archive POST /api/tasks/:id/complete-instance POST /api/tasks/:id/materialize-occurrence POST /api/tasks/query GET /api/filter-options GET /api/stats Bases# POST /api/bases/default-files/update Time Tracking# POST /api/tasks/:id/time/start POST /api/tasks/:id/time/start-with-description POST /api/tasks/:id/time/stop GET /api/tasks/:id/time GET /api/time/active GET /api/time/summary Pomodoro# POST /api/pomodoro/start POST /api/pomodoro/stop POST /api/pomodoro/pause POST /api/pomodoro/resume GET /api/pomodoro/status GET /api/pomodoro/sessions GET /api/pomodoro/stats Calendars# GET /api/calendars GET /api/calendars/google GET /api/calendars/microsoft GET /api/calendars/subscriptions GET /api/calendars/events Webhooks# POST /api/webhooks GET /api/webhooks DELETE /api/webhooks/:id GET /api/webhooks/deliveries See docs/webhooks.md for event and transform details. Route Details# Health# GET /api/health# Returns service state plus vault metadata. curl http://localhost:8080/api/health Tasks# GET /api/tasks# Basic task listing with pagination only. Query params: limit (default 50, max 200) offset (default 0) Important: Filtering params such as status, priority, tag, project, context, due_before, due_after, overdue, completed, archived, and sort are rejected on this endpoint with HTTP 400. Use POST /api/tasks/query for filtering. Example: curl \"http://localhost:8080/api/tasks?limit=25&offset=0\" Response fields: data.tasks data.pagination with total, offset, limit, hasMore data.vault data.note Task objects include configured TaskNotes user fields in customProperties, keyed by their frontmatter property key. POST /api/tasks# Create one task. Required: title Common optional fields: details, status, priority, due, scheduled tags, contexts, projects recurrence, recurrence_anchor, timeEstimate, reminders blockedBy blockedBy accepts an array of dependency objects: uid: link or identifier for the blocking task, such as [[Project setup]] reltype: one of FINISHTOSTART, FINISHTOFINISH, STARTTOSTART, or STARTTOFINISH gap: optional ISO 8601 duration, such as P1D blocking is a read-only reverse relationship in API responses. To make a task block existing tasks, update those existing tasks' blockedBy fields. curl -X POST http://localhost:8080/api/tasks \\ -H \"Content-Type: application/json\" \\ -d '{\"title\":\"Review docs\",\"priority\":\"high\",\"blockedBy\":[{\"uid\":\"[[Draft docs]]\",\"reltype\":\"FINISHTOSTART\"}]}' Returns HTTP 201 with created task data. GET /api/tasks/:id# Get one task by path id. :id must be URL-encoded task path. Single-task reads include the task body in details. Configured TaskNotes user fields are returned in customProperties, keyed by their frontmatter property key. curl \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" PUT /api/tasks/:id# Update task with partial payload. Configured TaskNotes user fields can be updated either by their frontmatter property key or via customProperties. curl -X PUT \"http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md\" \\ -H \"Content-Type: application/json\" \\ -d '{\"status\":\"in-progress\"}' DELETE /api/tasks/:id# Delete task file. POST /api/tasks/:id/toggle-status# Toggle task status via configured workflow. POST /api/tasks/:id/archive# Toggle archive state. POST /api/tasks/:id/complete-instance# Complete recurring instance. Request body: Optional date (ISO string). If omitted, uses current date context. When the recurring parent uses materialized occurrence notes, this endpoint completes the matching occurrence note if one exists. If the parent is set to Create next after completion and no matching occurrence note exists yet, TaskNotes creates and completes that occurrence note instead of only recording a virtual complete_instances entry. POST /api/tasks/:id/materialize-occurrence# Create or return a materialized occurrence note for a recurring task date. This endpoint is idempotent for the same parent and date. Request body: Required date (ISO date string, for example 2026-06-01) POST /api/tasks/query# Advanced filtering. Request body is a FilterQuery object. FilterQuery is still the supported advanced query shape for the HTTP API. The root object is a group with: type: \"group\" id conjunction: \"and\" | \"or\" children (conditions or groups) Optional top-level query options: sortKey, sortDirection groupKey, subgroupKey Example: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"c1\", \"property\": \"status\", \"operator\": \"is\", \"value\": \"open\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter tasks by context: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"context\", \"property\": \"contexts\", \"operator\": \"contains\", \"value\": \"@office\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\" } Filter active, unarchived tasks, similar to the default available-task view: { \"type\": \"group\", \"id\": \"root\", \"conjunction\": \"and\", \"children\": [ { \"type\": \"condition\", \"id\": \"not-archived\", \"property\": \"archived\", \"operator\": \"is-not-checked\" }, { \"type\": \"condition\", \"id\": \"not-completed\", \"property\": \"status.isCompleted\", \"operator\": \"is-not-checked\" } ], \"sortKey\": \"due\", \"sortDirection\": \"asc\", \"groupKey\": \"none\" } Condition fields: type: \"condition\" id: any stable string for your client property: a task property, such as title, status, priority, tags, contexts, projects, blockedBy, blocking, due, scheduled, completedDate, dateCreated, dateModified, archived, hasSubtasks, dependencies.isBlocked, dependencies.isBlocking, timeEstimate, recurrence, or status.isCompleted operator: one of is, is-not, contains, does-not-contain, is-before, is-after, is-on-or-before, is-on-or-after, is-empty, is-not-empty, is-checked, is-not-checked, is-greater-than, is-less-than, is-greater-than-or-equal, or is-less-than-or-equal value: required for comparison operators, omitted for empty/checked operators For user-defined fields, use property: \"user:\". Response: data.tasks data.total data.filtered data.vault GET /api/filter-options# Returns filter options for UI builders. GET /api/stats# Returns summary counts: total, completed, active, overdue, archived, withTimeTracking Bases# POST /api/bases/default-files/update# Overwrite the configured default TaskNotes .base files with templates generated from the current TaskNotes settings. This is the same write operation as Settings -> TaskNotes -> Views & base files -> Update files and replaces manual edits in those configured default files. curl -X POST http://localhost:8080/api/bases/default-files/update Response fields: data.created: default files created because they were missing data.updated: existing default files overwritten with current templates data.skipped: configured default files skipped Time Tracking# POST /api/tasks/:id/time/start# Starts a new active time entry for that task. POST /api/tasks/:id/time/start-with-description# Starts time tracking and writes description on the new active entry. Request body: { \"description\": \"Implementation\" } POST /api/tasks/:id/time/stop# Stops active time entry for that task. GET /api/tasks/:id/time# Returns per-task time summary and entries. GET /api/time/active# Returns currently active sessions across tasks. Important: Multiple active sessions can exist across different tasks. GET /api/time/summary# Returns aggregate time summary. Query params: period (for example today, week, month, all) from (ISO date) to (ISO date) Example: curl \"http://localhost:8080/api/time/summary?period=week\" Pomodoro# POST /api/pomodoro/start# Starts a session. Optional request fields: taskId (URL path of task) duration (number) POST /api/pomodoro/stop# Stops and resets current session. POST /api/pomodoro/pause# Pauses running session. POST /api/pomodoro/resume# Resumes paused session. GET /api/pomodoro/status# Returns current state plus computed totals (totalPomodoros, currentStreak, totalMinutesToday). GET /api/pomodoro/sessions# Returns history. Query params: limit date (YYYY-MM-DD) GET /api/pomodoro/stats# Returns stats for today or provided date. Query params: date (YYYY-MM-DD) Calendars# GET /api/calendars# Returns provider connectivity overview and subscription counts. GET /api/calendars/google# Returns Google provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/microsoft# Returns Microsoft provider details. If disconnected, returns { \"connected\": false }. GET /api/calendars/subscriptions# Returns ICS subscriptions with runtime fields such as lastFetched and lastError. GET /api/calendars/events# Returns merged event list from connected providers and ICS subscriptions. Query params: start (ISO date/datetime) end (ISO date/datetime) Response includes: events total sources (counts by provider) Webhooks# POST /api/webhooks# Registers webhook. Required fields: url events (non-empty array) Optional fields: id secret active transformFile corsHeaders GET /api/webhooks# Lists registered webhooks. Stored secrets are not returned. DELETE /api/webhooks/:id# Deletes webhook. GET /api/webhooks/deliveries# Returns last 100 delivery records. OpenAPI Docs# GET /api/docs# Returns OpenAPI JSON generated from registered controllers. GET /api/docs/ui# Returns Swagger UI. Errors# Common status codes: 400 invalid request or invalid state 401 missing/invalid bearer token (when auth token is configured) 404 missing task/webhook/resource 500 internal error Security Notes# Current behavior: CORS allows all origins (*). Transport is HTTP only (no TLS). Node server is started with server.listen(port) and does not explicitly bind to 127.0.0.1. Practical guidance: Set an auth token. Treat API port as sensitive and keep it firewalled. If you expose this port outside localhost, route through a trusted reverse proxy and TLS. Troubleshooting# API unavailable# Confirm API is enabled in settings. Confirm Obsidian is running. Confirm selected port is free. Reload plugin or restart Obsidian after changing API enable/port. 401 Authentication required# Check token value. Check Bearer prefix. Remove whitespace around token. Unexpected task list behavior# If you pass filters to GET /api/tasks, the endpoint returns 400 by design. Use POST /api/tasks/query."},{"title":"TaskNotes JavaScript Runtime API","url":"/obsidian/javascript-api/","description":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance:","product":"obsidian","text":"TaskNotes exposes an in-process runtime API on the loaded Obsidian plugin instance: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; This API is for Obsidian companion plugins and in-vault scripting tools such as Templater, QuickAdd, and MetaBind. It runs inside Obsidian and uses the same TaskNotes services, settings, cache, and vault permissions as the plugin UI. This is separate from the HTTP API. The runtime API does not start a server, does not use bearer-token authentication, and is only available inside the running Obsidian app. For user-facing extensions built on this API, see Companion Plugins. For a concrete automation companion plugin, see TaskNotes Workflows. The TypeScript contract lives in src/api/runtime-api.ts. It is intentionally small and type-focused so it can later become a standalone @tasknotes/runtime-api package for companion plugins. Version and Capabilities# Check the API version and capabilities before using methods that may not exist in older TaskNotes versions: const tasknotes = app.plugins.plugins.tasknotes; const api = tasknotes?.api; if (!api || api.apiVersion !== 1 || !api.hasCapability(\"tasks.write\")) { throw new Error(\"This workflow requires TaskNotes runtime API v1 task writes\"); } Current capabilities: model.read model.validate catalog.read extensions.read extensions.register tasks.read tasks.write tasks.delete tasks.move tasks.events relationships.read events.list time.read time.write time.summary pomodoro.read pomodoro.write pomodoro.events recurring.write recurring.materialize recurring.events settings.snapshot bases.write nlp.parse ui.task-menu query.tasks query.validate query.explain query.filter-options stats.tasks system.health lifecycle.events errors.typed Namespaces# Prefer the namespaced API for new code: await api.tasks.update(\"Tasks/example.md\", { status: \"active\" }); const subtasks = await api.relationships.subtasks(\"Tasks/example.md\"); await api.time.start(\"Tasks/example.md\", { description: \"Deep work\" }); await api.pomodoro.start({ taskPath: \"Tasks/example.md\", duration: 25 }); The older flat methods, such as api.getTask(path) and api.parseNaturalLanguage(text), remain available as compatibility aliases. Extension Registry# Companion plugins can publish their own runtime API namespace through api.extensions. This is the preferred way to extend TaskNotes without adding arbitrary properties to the core API object. const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"extensions.register\")) { return; } const handle = api.extensions.register({ id: this.manifest.id, namespace: \"tasknotes-workflows\", displayName: \"TaskNotes Workflows\", version: this.manifest.version, capabilities: [\"tasknotes-workflows.run\", \"tasknotes-workflows.events\"], api: { runWorkflow: async (workflowId, input) => { // companion plugin implementation }, }, }); this.register(() => handle.unregister()); Other plugins can discover and consume extension namespaces: const workflows = api.extensions.get(\"tasknotes-workflows\"); if (api.hasCapability(\"tasknotes-workflows.run\")) { await workflows.runWorkflow(\"start-timer-on-active\", { taskPath: \"Tasks/example.md\" }); } Extension namespaces are normalized to lowercase and may use letters, numbers, dots, underscores, or dashes. Capability names are also normalized to lowercase. Prefix extension capabilities with the extension namespace to avoid collisions. Companion Plugin Access# Companion plugins can read the TaskNotes plugin instance from Obsidian's plugin registry: const tasknotes = this.app.plugins.getPlugin(\"tasknotes\"); const api = tasknotes?.api; if (!api?.hasCapability(\"tasks.events\")) { return; } this.registerEvent( api.events.on(\"task.status.changed\", (event) => { console.log(event.taskPath, event.changes.status); }) ); If TaskNotes is disabled or has not loaded yet, api will be unavailable. Companion plugins should handle that case and retry after plugin load if needed. TypeScript# Use the exported runtime contract for type safety: import type { TaskNotesRuntimeApiV1 } from \"tasknotes/src/api/runtime-api\"; type TaskNotesPluginInstance = { api?: TaskNotesRuntimeApiV1; }; const tasknotes = app.plugins.getPlugin(\"tasknotes\") as TaskNotesPluginInstance | null; const api = tasknotes?.api; if (api?.apiVersion === 1 && api.hasCapability(\"tasks.write\")) { await api.tasks.setStatus(\"Tasks/example.md\", \"active\"); } TaskNotes is still loaded by Obsidian at runtime. The TypeScript contract only gives companion plugins compile-time checking and autocomplete. Model# The runtime API exposes a small model namespace backed by @tasknotes/model: const info = api.model.info(); const config = api.model.config(); const validation = api.model.validateTask(task); Method Description api.model.info() Returns the model package name, TaskNotes spec version, and runtime API version. api.model.config() Returns a resolved, Obsidian-free model configuration snapshot derived from TaskNotes settings. api.model.validateTask(task) Validates a partial or complete task against the shared model schema and TaskNotes status rules. api.model.validatePatch(patch) Validates a task patch before passing it to a runtime task mutation. Catalog# Use api.catalog to build companion-plugin editors without hardcoding TaskNotes values: const statuses = api.catalog.statuses(); const writableFields = api.catalog.writableFields(); const operators = api.catalog.filterOperators(); Method Description api.catalog.statuses() Returns configured TaskNotes status definitions. api.catalog.priorities() Returns configured TaskNotes priority definitions. api.catalog.userFields() Returns configured user-defined field mappings. api.catalog.fields() Returns core, computed, and user field metadata with value type, writability, and frontmatter key when available. api.catalog.writableFields() Returns only fields that runtime task mutations may write. api.catalog.filterProperties() Returns canonical query fields, aliases, value types, and supported operators. api.catalog.filterOperators() Returns canonical query operators, labels, value requirements, and accepted aliases. api.catalog.relationships() Returns relationship categories supported by api.relationships. api.catalog.dependencyRelTypes() Returns dependency relationship types accepted by api.tasks.addDependency. api.catalog.events() Returns the same runtime event catalogue as api.events.list(). Tasks# All paths are vault-relative Markdown file paths. Method Description api.tasks.get(path) Returns a task by path, or null when no task is cached at that path. api.tasks.list(query?) Returns all tasks, or tasks matching a runtime task query. Prefer api.query.tasks() when count and grouping metadata matters. api.tasks.create(taskData, context?) Creates a task using the normal TaskNotes creation service. api.tasks.update(path, patch, context?) Updates one or more task fields using the normal TaskNotes update service. api.tasks.delete(path, context?) Deletes the task file through TaskNotes' delete service. api.tasks.complete(path, options?, context?) Marks a task complete. api.tasks.uncomplete(path, options?, context?) Moves a completed task back to a non-completed status. api.tasks.setStatus(path, status, context?) Sets task status. api.tasks.setPriority(path, priority, context?) Sets task priority. api.tasks.setDue(path, date, context?) / clearDue(path, context?) Sets or clears due date. api.tasks.setScheduled(path, date, context?) / clearScheduled(path, context?) Sets or clears scheduled date. api.tasks.archive(path, archived, context?) Archives or unarchives a task, including archive-folder movement when configured. api.tasks.move(path, targetFolder, context?) Moves the task note and refuses to overwrite an existing file. api.tasks.addTag/removeTag Mutates task tags. api.tasks.addProject/removeProject Mutates project links. api.tasks.addContext/removeContext Mutates contexts. api.tasks.setReminders/addReminder/removeReminder Mutates reminders. api.tasks.addDependency/removeDependency Mutates blocking dependencies stored in blockedBy. Example: const task = await api.tasks.create( { title: \"Review automation design\", status: \"open\", priority: \"normal\", scheduled: \"2026-06-01\", tags: [\"tasknotes\"], }, { source: \"my-companion-plugin\", correlationId: crypto.randomUUID(), reason: \"manual workflow command\", } ); await api.tasks.complete(task.path); Relationships# Relationship methods resolve TaskNotes' project-as-parent links and blockedBy dependencies into task records where possible. Method Description api.relationships.parents(path) Returns parent tasks referenced from the task's projects. api.relationships.subtasks(path) Returns tasks that reference this task as a project. api.relationships.dependencies(path) Returns blockedBy dependencies with resolved task data when available. api.relationships.blocking(path) Returns tasks that are blocked by this task. api.relationships.all(path) Returns the task plus parents, subtasks, dependencies, and blocking tasks. Example: const relationships = await api.relationships.all(\"Tasks/example.md\"); for (const subtask of relationships.subtasks) { await api.tasks.setPriority(subtask.path, relationships.task.priority); } Time Tracking# Method Description api.time.start(path, options?, context?) Starts time tracking and returns the updated task. api.time.stop(path, context?) Stops the active time entry and returns the updated task. api.time.active() Returns active time entries with task, path, entry, and entry index. api.time.summary(options?) Returns aggregate time totals, top tasks, projects, and tags. api.time.task(path) Returns one task's time summary and normalized time entries. api.time.append(path, entry, context?) Appends a time entry. api.time.deleteEntry(path, entryIndex, context?) Deletes a time entry through TaskNotes' service. Query, Stats, And System# The query, stats, and system namespaces expose HTTP/MCP-style support data without requiring companion plugins to reach into TaskNotes internals. Runtime queries use a stable DTO rather than TaskNotes' internal view state. const result = await api.query.tasks({ where: { all: [ { field: \"task.status\", op: \"eq\", value: \"active\" }, { field: \"task.due\", op: \"lte\", value: { fn: \"today\" } }, ], }, sort: [{ field: \"task.due\", direction: \"asc\" }], group: [{ field: \"task.status\" }], limit: 25, scope: { includeArchived: false, folders: [\"Tasks\"], }, }); Runtime query fields are canonical IDs such as task.status, task.priority, task.due, task.projects, task.isBlocked, file.path, and user.. api.catalog.filterProperties() returns the complete queryable field catalog, including aliases such as status and user:. Canonical operators are eq, ne, contains, notContains, in, notIn, exists, missing, lt, lte, gt, gte, isTrue, and isFalse. Legacy operator aliases such as is, is-not, is-on-or-before, and is-not-empty are accepted and normalized. api.query.tasks() returns explicit count semantics: total: tasks in scope before filtering matched: tasks matching where before offset and limit returned: tasks returned after offset and limit tasks: returned task records groups: optional group details with task paths query: the normalized canonical query warnings: non-fatal normalization notes Method Description api.query.tasks(query?) Validates, normalizes, and executes a runtime task query. api.query.validate(query) Validates a query without executing it. api.query.normalize(query) Returns the canonical normalized query, or throws a typed invalid_input API error. api.query.explain(query) Returns validation, normalized query, count, grouping, and applied sort/limit details for dry run. api.query.filterOptions() Returns available statuses, priorities, contexts, projects, tags, folders, and user properties. api.stats.tasks(query?) Returns task counts, status/priority counts, archive/completion counts, and time-tracking totals. api.system.health() Returns runtime status, API version, capabilities, vault identity, and task count. TaskNotes compiles this DTO into its internal filter engine. Companion plugins should treat the runtime DTO and the catalog metadata as the public query contract. Task Menu UI# Companion plugins can reuse the standard TaskNotes task context menu through api.ui.taskMenu. This keeps task actions, relationship actions, recurrence controls, and future menu changes behind the runtime API boundary instead of requiring companion plugins to import TaskNotes internals. This surface is only available inside Obsidian. It is not exposed through the HTTP API. Method Description api.ui.taskMenu.show({ taskPath, event, targetDate?, onUpdate?, promoteOccurrenceControls? }) Shows the standard TaskNotes task context menu at a mouse event. api.ui.taskMenu.showAtElement({ taskPath, element, targetDate?, onUpdate?, ... }) Shows the standard TaskNotes task context menu anchored to an element. api.ui.taskMenu.populate(menu, { taskPath, targetDate?, onUpdate?, ... }) Adds the standard TaskNotes task context menu items to an existing Obsidian Menu so plugins can extend it. All methods resolve taskPath through the TaskNotes task cache and throw a typed task_not_found error when the path does not point to a cached task. targetDate defaults to today and is used by date-sensitive recurring-task menu items. onUpdate is called after menu actions mutate the task; when omitted, TaskNotes refreshes its own task views. promoteOccurrenceControls moves recurring-instance controls to the top of the menu. Example context menu: nodeEl.addEventListener(\"contextmenu\", async (event) => { event.preventDefault(); await api.ui.taskMenu.show({ taskPath: task.path, event, onUpdate: () => refreshGraph(), }); }); Example composed menu: const menu = new Menu(); await api.ui.taskMenu.populate(menu, { taskPath: task.path, onUpdate: () => refreshGraph(), }); menu.addSeparator(); menu.addItem((item) => item .setTitle(\"Focus in graph\") .setIcon(\"network\") .onClick(() => selectGraphNode(task.path)) ); menu.showAtMouseEvent(event); Pomodoro# Method Description api.pomodoro.status() Returns current Pomodoro state. api.pomodoro.start(options?, context?) Starts a Pomodoro session. api.pomodoro.stop(context?) Stops and resets the active Pomodoro session. api.pomodoro.pause(context?) Pauses the current session. api.pomodoro.resume(context?) Resumes a paused session. api.pomodoro.assignTask(pathOrNull, context?) Assigns or clears the current session task. api.pomodoro.sessions(options?) Returns Pomodoro session history. api.pomodoro.stats(date?) Returns Pomodoro stats for a date or today. Recurring Tasks# Method Description api.recurring.toggleCompleteInstance(path, date?, context?) Toggles completion for a recurring task instance. api.recurring.toggleSkippedInstance(path, date?, context?) Toggles skipped state for a recurring task instance. api.recurring.materializeOccurrence(path, date, context?) Creates or returns an occurrence note for a recurring task date. Natural Language Parser# const parsed = api.nlp.parse(\"Write draft friday 2pm #writing @desk\"); api.parseNaturalLanguage(text) remains as a compatibility alias. Parsing does not create or modify task files. See NLP API for HTTP endpoint details and parser behavior. Settings Snapshot# const settings = api.settings.snapshot(); console.log(settings.defaultTaskStatus); The returned object is a snapshot. Mutating it does not change TaskNotes settings. api.getSettingsSnapshot() remains available as a compatibility alias. Bases# api.bases.updateDefaultFiles() regenerates the configured default TaskNotes .base files from the current TaskNotes settings and returns the created, updated, and skipped file paths. const result = await api.bases.updateDefaultFiles(); console.log(result.updated); Mutation Context# Mutating methods accept an optional context object: { source: \"tasknotes-workflows\", correlationId: \"run-2026-06-01T09-00-00\", reason: \"status chang"},{"title":"mdbase-tasknotes CLI","url":"/obsidian/mdbase-tasknotes-cli/","description":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-c...","product":"obsidian","text":"mdbase-tasknotes (mtn) is a standalone command-line tool for managing TaskNotes tasks directly on markdown files. It uses mdbase to read and write task files and tasknotes-nlp-core for natural language parsing. When to use this vs TaskNotes Obsidian CLI# If you are looking for the built-in obsidian tasknotes:* commands exposed by the plugin itself, see TaskNotes Obsidian CLI. TaskNotes ships with tasknotes-cli (tn), which communicates with the Obsidian plugin over its HTTP API. mdbase-tasknotes operates directly on the markdown files instead. tn (tasknotes-cli) mtn (mdbase-tasknotes) Requires Obsidian Yes — plugin must be running with API enabled No Operates on HTTP API Markdown files directly via mdbase Use when Obsidian is open and you want live sync Obsidian is closed, on a server, or in scripts Time tracking Via plugin API Via frontmatter timeEntries Task creation NLP via API NLP via bundled tasknotes-nlp-core Install npm install -g tasknotes-cli npm install -g mdbase-tasknotes Use mtn when: Obsidian isn't running or isn't available (headless servers, SSH sessions, CI pipelines) You want to manage tasks from the terminal without any background process You're scripting task creation or querying in shell workflows You're on a machine where Obsidian isn't installed Both tools read and write the same task files, so they can be used interchangeably on the same vault. Install# npm install -g mdbase-tasknotes Setup# Using an existing TaskNotes vault# If you already use TaskNotes with mdbase spec generation enabled (Settings → Integrations → Enable mdbase spec), point mtn at your vault root: mtn config --set collectionPath=/path/to/your/vault The plugin generates mdbase.yaml and _types/task.md automatically — mtn reads these to understand your task schema, including your custom statuses and priorities. Creating a standalone collection# To create a new collection without Obsidian: mtn init ~/tasks mtn config --set collectionPath=~/tasks This generates mdbase.yaml, _types/task.md, and a tasks/ folder with sensible defaults (statuses: open, in-progress, done, cancelled; priorities: low, normal, high, urgent). Creating tasks# Create tasks using natural language. Tags, contexts, projects, dates, priorities, and recurrence are extracted automatically: mtn create \"Buy groceries tomorrow #shopping @errands\" mtn create \"Write quarterly report due friday #work +quarterly-review\" mtn create \"Call dentist high priority @phone\" mtn create \"Water plants every monday #home\" Supported patterns# Pattern Example Extracted as #tag #shopping Tag @context @errands Context +project +quarterly-review Project (stored as wikilink) Date words tomorrow, friday, next week Due date Priority words high priority, urgent Priority Recurrence every day, weekly, every monday Recurrence rule Estimate ~30m, ~2h Time estimate The NLP parser reads your collection's status and priority enum values from _types/task.md, so any custom values you define there are automatically recognized. Querying tasks# List tasks# # Default: open tasks ordered by due date mtn list # Filter by status, priority, or tag mtn list --status in-progress mtn list --priority high mtn list --tag work # Show overdue tasks mtn list --overdue # Raw mdbase where expression mtn list --where 'due < \"2026-03-01\" && priority == \"urgent\"' # JSON output for scripting mtn list --json Show task detail# mtn show \"Buy groceries\" mtn show tasks/Buy\\ groceries.md Tasks can be referenced by title or file path. Title matching tries exact match first, then substring. Search# Full-text search across titles, body content, tags, contexts, and projects: mtn search quarterly Updating tasks# Complete a task# mtn complete \"Buy groceries\" Sets status to done and records the completion date. Update fields# mtn update \"Write report\" --status in-progress mtn update \"Write report\" --priority urgent --due 2026-03-01 mtn update \"Write report\" --add-tag important --remove-tag draft mtn update \"Write report\" --add-context office Archive and delete# mtn archive \"Write report\" # Adds \"archive\" tag mtn delete \"Old task\" # Checks for backlinks first mtn delete \"Old task\" --force # Skip backlink check Time tracking# Track time spent on tasks via the timeEntries frontmatter field — the same format TaskNotes uses. # Start a timer mtn timer start \"Write report\" mtn timer start \"Write report\" -d \"Drafting introduction\" # Check active timers mtn timer status # Stop the running timer mtn timer stop # View time log mtn timer log mtn timer log --period today mtn timer log --period week mtn timer log --from 2026-02-01 --to 2026-02-28 Projects and statistics# Projects# # List all projects mtn projects list mtn projects list --stats # With completion percentages # Show tasks for a project mtn projects show quarterly-review Statistics# mtn stats Shows total tasks, completion rate, overdue count, breakdown by status and priority, and total time tracked. Interactive mode# Launch a REPL with live NLP preview that updates as you type: mtn interactive # or mtn i Type a task description and the preview line shows how it will be parsed (title, tags, dates, priority). Press Enter to create the task. Configuration# Configuration is stored at ~/.config/mdbase-tasknotes/config.json. mtn config --list # Show all settings mtn config --set collectionPath=/path/to/vault # Set collection path mtn config --get collectionPath # Get a setting Collection path resolution# The collection path is resolved in order: --path / -p flag on any command MDBASE_TASKNOTES_PATH environment variable collectionPath in config file Current working directory Command reference# Command Alias Description mtn init [path] Initialize a new collection mtn create Create a task from natural language mtn list [options] ls List tasks with filters mtn show Show full task detail mtn complete done Mark task as completed mtn update [options] Update task fields mtn delete rm Delete a task mtn archive Add archive tag mtn search Full-text search mtn timer start Start time tracking mtn timer stop Stop running timer mtn timer status Show active timers mtn timer log Show time entry log mtn projects list List projects mtn projects show Show project tasks mtn stats Show task statistics mtn interactive i Interactive REPL mtn config [options] Manage configuration"},{"title":"Migrating from v3 to v4","url":"/obsidian/migration-v3-to-v4/","description":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup.","product":"obsidian","text":"TaskNotes v4 migrates all views to the Bases system. This guide covers what changed and how to update your setup. Back up before migratingBack up the complete vault, including the hidden .obsidian directory, before changing views or plugin data. Requirements# Obsidian 1.10.1 or later for early TaskNotes v4 releases Obsidian 1.12.2 or later for the current TaskNotes 4.12.3 release Bases core plugin enabled (Settings → Core Plugins → Bases) What Changed# Views are Now Bases Files# All task views (Task List, Kanban, Calendar, Agenda) are now .base files stored in TaskNotes/Views/. This replaces the custom view system in v3. v3 v4 Views stored in plugin settings Views stored as .base files Custom filter UI Bases filter syntax Saved views in settings Default views are separate files; exported v3 saved views share one multi-view file Automatic Migration on First Launch# When you first open TaskNotes v4: Default .base files are created in TaskNotes/Views/ Ribbon icons and commands now open these .base files Your existing task files are unchanged Converting Saved Filter Views# If you had saved filter views in v3, you can export them to one .base file: Go to Settings → TaskNotes → General → Views & base files. Find Export v3 saved views to Bases. Run the export. TaskNotes creates TaskNotes/Views/all-saved-views.base with one Base view for each saved v3 view. This is a one-way conversion. The original saved views remain in settings until you delete them. Breaking Changes# View Configuration# v3 saved views with custom filters need manual conversion to Bases filter syntax. Simple filters (status, priority, due date) convert automatically. Complex filters may need adjustment. v3 Filter Example: status: in-progress priority: high v4 Bases Syntax: filters: and: - status == \"in-progress\" - priority == \"high\" See the Obsidian Bases documentation for filter syntax details. Minimum Obsidian Version# Early v4 releases required Obsidian 1.10.1. The current release requirement is generated on the version compatibility page. Use the manifest requirement for the exact TaskNotes version you install. New Features in v4# OAuth Calendar Integration# v4 adds Google Calendar and Microsoft Outlook integration: View external calendar events alongside tasks Drag events to reschedule (syncs back to calendar provider) Events sync every 15 minutes See Calendar Setup for configuration. Kanban Swimlanes# The Kanban view now supports horizontal swimlane grouping: views: - type: tasknotesKanban groupBy: property: status config: swimLane: priority Time Entry Editor# A dedicated modal for managing time entries: Alt-drag on calendar to create time entries View total tracked time per task Edit and delete time entries Troubleshooting# Views Not Loading# Verify Bases core plugin is enabled (Settings → Core Plugins) Check that .base files exist in TaskNotes/Views/ Restart Obsidian Missing Saved Views After Upgrade# Saved views from v3 are preserved in settings. Use Export v3 saved views to Bases in Settings → TaskNotes → General → Views & base files to create the multi-view .base file. Filter Syntax Errors# Bases uses different filter syntax than v3. Common issues: Problem Solution status: done Use status == \"done\" Multiple conditions Wrap in and: or or: block Date comparisons Use date(due) < today() Downgrading to v3# Migration is one-way. If you need to downgrade: Uninstall TaskNotes v4 Install TaskNotes v3 from releases Reconfigure your saved views manually Your task files are unaffected—only view configurations change. View Templates# For complete .base file examples, see Default Base Templates."},{"title":"TaskNotes NLP API","url":"/obsidian/nlp-api/","description":"The NLP API parses natural-language task text and optionally creates a task.","product":"obsidian","text":"The NLP API parses natural-language task text and optionally creates a task. In-vault scripts can also call the parser directly from the loaded plugin: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Review PR tomorrow #code @work\"); For the full in-process API exposed at tasknotes.api, including task updates, time tracking, settings snapshots, and events, see TaskNotes JavaScript API. Endpoints# POST /api/nlp/parse POST /api/nlp/create Both endpoints require a JSON body with text. Request Format# { \"text\": \"Review PR #123 tomorrow high priority @work\" } Notes: text is required and must be a string. Per-request locale is not currently supported. Parser language comes from TaskNotes settings (nlpLanguage). POST /api/nlp/parse# Parses text and returns two objects: parsed: direct parser output taskData: normalized task payload that would be used for creation Example response (shape): { \"success\": true, \"data\": { \"parsed\": { \"title\": \"Review PR\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"projects\": [], \"priority\": \"high\", \"status\": null, \"dueDate\": \"2026-02-22\", \"scheduledDate\": null, \"dueTime\": null, \"scheduledTime\": null, \"recurrence\": null, \"estimate\": null, \"isCompleted\": false }, \"taskData\": { \"title\": \"Review PR\", \"priority\": \"high\", \"status\": \"open\", \"tags\": [\"123\"], \"contexts\": [\"work\"], \"due\": \"2026-02-22\", \"dateCreated\": \"2026-02-22T09:00:00.000Z\", \"dateModified\": \"2026-02-22T09:00:00.000Z\" } } } If parser does not detect status, taskData.status falls back to your configured default task status. Parsed due and scheduled date-times in taskData use the same YYYY-MM-DDTHH:mm format as created tasks, and NLP trigger values for user-defined fields are returned under customFrontmatter. POST /api/nlp/create# Parses text and creates a task in one call. Returns HTTP 201 on success. Example: curl -X POST http://localhost:8080/api/nlp/create \\ -H \"Content-Type: application/json\" \\ -d '{\"text\":\"Call mom due friday 2pm #personal\"}' Response fields: data.task (created task) data.parsed (parser output) What the Parser Extracts# The parser can extract: Dates and times (tomorrow, friday 2pm, ISO dates) Priority terms (high priority, urgent, symbol patterns) Status terms (mapped to your configured statuses) Tags (#tag) Contexts (@context) Projects (+project) Time estimates (2h, 30min, estimate 45m) Recurrence (daily, weekly, every monday) Exact parsing behavior depends on your TaskNotes NLP settings and trigger configuration. In-Vault Parser Method# Templater, QuickAdd, MetaBind, and other in-vault scripts can use the loaded plugin instance directly: const tasknotes = app.plugins.plugins.tasknotes; const parsed = tasknotes.api.parseNaturalLanguage(\"Write draft friday 2pm #writing @desk\"); parseNaturalLanguage(text) returns the same parser output shape as data.parsed from POST /api/nlp/parse. It uses your current TaskNotes settings, including custom status values, priority values, NLP language, NLP trigger configuration, user fields, and calendar locale. This method only parses text. It does not create or modify task files. For task creation and updates from in-vault scripts or companion plugins, use the broader TaskNotes JavaScript API. Example Templater use: <%* const tasknotes = app.plugins.plugins.tasknotes; const text = await tp.system.prompt(\"Task\"); const parsed = tasknotes.api.parseNaturalLanguage(text); tR += `title: ${parsed.title}`; %> Error Responses# Common errors: 400: missing/invalid text 401: auth required (if API token is enabled) 500: parse/processing error Error shape: { \"success\": false, \"error\": \"Text field is required and must be a string\" } Client Examples# JavaScript# async function parseTask(text) { const response = await fetch(\"http://localhost:8080/api/nlp/parse\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } async function createTaskFromText(text) { const response = await fetch(\"http://localhost:8080/api/nlp/create\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ text }) }); return response.json(); } Python# import requests def parse_task(text): response = requests.post( \"http://localhost:8080/api/nlp/parse\", json={\"text\": text}, ) return response.json() def create_task_from_text(text): response = requests.post( \"http://localhost:8080/api/nlp/create\", json={\"text\": text}, ) return response.json() Authentication# If API auth token is enabled, include bearer token: Authorization: Bearer YOUR_TOKEN"},{"title":"TaskNotes Obsidian CLI","url":"/obsidian/obsidian-cli/","description":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking...","product":"obsidian","text":"TaskNotes can register commands directly with the Obsidian desktop CLI. This is useful when Obsidian is already running and you want shell access to task creation, time tracking, or Pomodoro control without going through the HTTP API. Use this page for the built-in obsidian ... commands exposed by the plugin itself. If you want a standalone terminal tool that works directly on Markdown files without Obsidian running, see mdbase-tasknotes CLI. Requirements# Obsidian desktop 1.12.2 or newer TaskNotes installed and enabled in the target vault Obsidian running when you invoke the CLI The Obsidian CLI resolves commands against a vault context. In practice, it is safer to pass vault= explicitly instead of relying on the default vault. Discovering commands# List available TaskNotes commands: obsidian help | rg 'tasknotes:' You should see: tasknotes:capture tasknotes:start-time tasknotes:stop-time tasknotes:time-status tasknotes:pomodoro tasknotes:capture# Create a task from free text, explicit flags, or both. obsidian tasknotes:capture vault=test text=\"Review PR tomorrow #work @desk\" By default, text= is parsed with TaskNotes NLP. Explicit flags override parsed values. Literal title mode# Use literal when you want the text treated as an exact title instead of being parsed. obsidian tasknotes:capture vault=test text=\"Fix parser edge case\" literal Explicit fields# Supported override flags: title details status priority due scheduled tags contexts projects recurrence recurrence-anchor reminders estimate Example: obsidian tasknotes:capture vault=test \\ text=\"Write release notes tomorrow #docs\" \\ priority=high \\ status=in-progress \\ reminders='due:-PT1H' Reminder format# reminders= accepts either: a semicolon-separated shorthand such as due:-PT1H;scheduled:-PT30M;at:2026-04-02T09:00 a JSON array in the same shape TaskNotes stores internally Recurrence anchor# Use recurrence-anchor=scheduled or recurrence-anchor=completion to control how recurring tasks advance. tasknotes:start-time# Start time tracking for a task. You can target a task by: path exact title fuzzy query Examples: obsidian tasknotes:start-time vault=test title=\"Write release notes\" obsidian tasknotes:start-time vault=test query=\"release notes\" description=\"Drafting first pass\" obsidian tasknotes:start-time vault=test path=\"TaskNotes/Write release notes.md\" tasknotes:stop-time# Stop time tracking for a task. Examples: obsidian tasknotes:stop-time vault=test title=\"Write release notes\" obsidian tasknotes:stop-time vault=test path=\"TaskNotes/Write release notes.md\" If you omit task lookup flags, TaskNotes will stop the only active session when that is unambiguous. tasknotes:time-status# Show time-tracking status for either: all active sessions one resolved task Examples: obsidian tasknotes:time-status vault=test obsidian tasknotes:time-status vault=test title=\"Write release notes\" obsidian tasknotes:time-status vault=test path=\"TaskNotes/Write release notes.md\" When a task is targeted, the command returns that task's summary, active session, and time entries. With no lookup flags, it returns the currently active sessions across the vault. tasknotes:pomodoro# Control Pomodoro state from the CLI. Supported actions: status start pause resume stop short-break long-break Inspect state# obsidian tasknotes:pomodoro vault=test action=status Start a work session# You can start a Pomodoro with or without a linked task. obsidian tasknotes:pomodoro vault=test action=start duration=25 obsidian tasknotes:pomodoro vault=test action=start title=\"Write release notes\" duration=25 Task lookup for action=start supports the same selectors as time tracking: path exact title fuzzy query Pause, resume, and stop# obsidian tasknotes:pomodoro vault=test action=pause obsidian tasknotes:pomodoro vault=test action=resume obsidian tasknotes:pomodoro vault=test action=stop Breaks# obsidian tasknotes:pomodoro vault=test action=short-break obsidian tasknotes:pomodoro vault=test action=long-break Choosing between CLI surfaces# Use the built-in Obsidian CLI when: Obsidian is already open you want plugin-aware behavior, including current cache, defaults, templates, time tracking, and Pomodoro state you are scripting on the same machine as the running vault Use mdbase-tasknotes CLI when: Obsidian is not running you need headless/server workflows you want direct file-level automation over a task collection Notes# path is the most reliable task selector for automation. Immediately after creating a task, exact title lookup can lag briefly until the in-memory cache catches up. These commands are desktop-only because they depend on the Obsidian desktop CLI."},{"title":"Command reference","url":"/obsidian/reference/commands/","description":"Every TaskNotes command registered with Obsidian, generated from the plugin command definitions.","product":"obsidian","text":"This page is generated from the commands registered by TaskNotes. Command IDs are stable integration identifiers; names are the English labels shown in Obsidian. Command ID Available in Open mini calendar view open-calendar-view Global Open calendar view open-advanced-calendar-view Global Open tasks view open-tasks-view Global Open agenda view open-agenda-view Global Open Pomodoro timer open-pomodoro-view Global Open Kanban board open-kanban-view Global Update default base files update-default-base-files Global Open Pomodoro statistics open-pomodoro-stats Global Open task & project statistics open-statistics Global Create new task create-new-task Global Convert current note to task convert-current-note-to-task Global Convert checkbox task to TaskNote convert-to-tasknote Editor Convert all tasks in note batch-convert-all-tasks Editor Insert tasknote link insert-tasknote-link Editor Create new inline task create-inline-task Editor Quick actions for current task quick-actions-current-task Global Quick actions for task under cursor quick-actions-task-under-cursor Editor Edit current task edit-current-task Global Cycle current task status cycle-current-task-status Global Cycle current task priority cycle-current-task-priority Global Add project to current task add-project-to-current-task Global Add subtask to current note add-subtask-to-current-note Global Go to today's note go-to-today Global Start Pomodoro timer start-pomodoro Global Stop Pomodoro timer stop-pomodoro Global Pause/resume Pomodoro timer pause-pomodoro Global Refresh cache refresh-cache Global Export all tasks as ICS file export-all-tasks-ics Global Sync all tasks to Google Calendar sync-all-tasks-google-calendar Global Sync current task to Google Calendar sync-current-task-google-calendar Global View release notes view-release-notes Global Start time tracking (select task) start-time-tracking-with-selector Global Edit time entries (select task) edit-time-entries Global Create or open task create-or-open-task Global Create or open task and start time tracking create-or-open-task-with-time-tracking Global Postpone overdue scheduled tasks to today rollover-overdue-scheduled-tasks Global Generated from 36 registered commands."},{"title":"Version compatibility","url":"/obsidian/reference/compatibility/","description":"Current TaskNotes and Obsidian compatibility requirements, generated from the plugin manifest.","product":"obsidian","text":"Current release# Item Value TaskNotes 4.12.3 Minimum Obsidian version 1.12.2 Desktop only No Bases core plugin Required The minimum version above applies to the current TaskNotes release. Older releases had different requirements; consult versions.json or the relevant release note when maintaining an older installation."},{"title":"Generated default Base templates","url":"/obsidian/reference/default-base-templates/","description":"Exact default Obsidian Base files generated by the current TaskNotes source and default settings.","product":"obsidian","text":"These are the exact templates TaskNotes 4.12.3 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ. Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it. mini-calendar-default.base# Command/template ID: open-calendar-view # Mini Calendar # Generated with your TaskNotes settings filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\")), \"Tomorrow\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")), \"This week\", \"Later\")))))' nextDateMonth: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-MM\"), date(scheduled).format(\"YYYY-MM\")), if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"No date\")))' nextDateWeek: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), date(due).format(\"YYYY-[W]WW\"), date(scheduled).format(\"YYYY-[W]WW\")), if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"No date\")))' urgencyScore: 'if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight, formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext, formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) - number(date(date(formula.nextDate).format(\"YYYY-MM-DD\")))) / 86400000)))' timeTrackedFormatted: 'if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + \"h \" + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + \"m\", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + \"m\"), \"0m\")' dueDateDisplay: 'if(due.isEmpty(), \"\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") == (today() - \"1 day\").format(\"YYYY-MM-DD\"), \"Yesterday\", if(date(due) < today(), formula.daysUntilDue * -1 + \"d ago\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), date(due).format(\"ddd\"), date(due).format(\"MMM D\")))))))' views: - type: tasknotesMiniCalendar name: \"Due\" order: - status - priority - due - scheduled - projects - contexts - file.tags - blockedBy - file.name - recurrence - complete_instances - file.tasks sort: - property: due direction: ASC dateProperty: due - type: tasknotesMiniCalendar name: \"Scheduled\" order: [] dateProperty: scheduled - type: tasknotesMiniCalendar name: \"Created\" dateProperty: file.ctime - type: tasknotesMiniCalendar name: \"Modified\" dateProperty: file.mtime kanban-default.base# Command/template ID: open-kanban-view # Kanban Board filters: and: - file.hasTag(\"task\") formulas: priorityWeight: 'if(priority==\"none\",0,if(priority==\"low\",1,if(priority==\"normal\",2,if(priority==\"high\",3,999))))' daysUntilDue: 'if((due.isEmpty() == false), ((number(date(due)) - number(today())) / 86400000).floor(), null)' dueIn: 'if(due.isEmpty(), \"\", if(formula.daysUntilDue == 0, \"Today\", if(formula.daysUntilDue == 1, \"1 day\", if(formula.daysUntilDue > 1, formula.daysUntilDue + \" days\", if(formula.daysUntilDue == -1, \"1 day overdue\", formula.daysUntilDue * -1 + \" days overdue\")))))' daysUntilScheduled: 'if((scheduled.isEmpty() == false), ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)' daysSinceCreated: '((number(now()) - number(file.ctime)) / 86400000).floor()' daysSinceModified: '((number(now()) - number(file.mtime)) / 86400000).floor()' isOverdue: '(due.isEmpty() == false) && date(due) < today() && status != \"done\"' isDueToday: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isDueThisWeek: '(due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")' isScheduledToday: '(scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")' isRecurring: 'recurrence && !recurrence.isEmpty()' hasTimeEstimate: 'timeEstimate && timeEstimate > 0' timeRemaining: 'if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)' efficiencyRatio: 'if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)' timeTrackedThisWeek: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - \"7d\").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' timeTrackedToday: 'if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)' dueMonth: 'if((due.isEmpty() == false), date(due).format(\"YYYY-MM\"), \"No due date\")' dueWeek: 'if((due.isEmpty() == false), date(due).format(\"YYYY-[W]WW\"), \"No due date\")' scheduledMonth: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-MM\"), \"Not scheduled\")' scheduledWeek: 'if((scheduled.isEmpty() == false), date(scheduled).format(\"YYYY-[W]WW\"), \"Not scheduled\")' dueDateCategory: 'if(due.isEmpty(), \"No due date\", if(date(due) < today(), \"Overdue\", if(date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"), \"Today\", if(date(due).format(\"YYYY-MM-DD\") == (today() + \"1 day\").format(\"YYYY-MM-DD\"), \"Tomorrow\", if(date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"), \"This week\", \"Later\")))))' timeEstimateCategory: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(timeEstimate < 30, \"Quick (<30m)\", if(timeEstimate <= 120, \"Medium (30m-2h)\", \"Long (>2h)\")))' ageCategory: 'if(((number(now()) - number(file.ctime)) / 86400000) < 1, \"Today\", if(((number(now()) - number(file.ctime)) / 86400000) < 7, \"This week\", if(((number(now()) - number(file.ctime)) / 86400000) < 30, \"This month\", \"Older\")))' createdMonth: 'file.ctime.format(\"YYYY-MM\")' modifiedMonth: 'file.mtime.format(\"YYYY-MM\")' priorityCategory: 'if(priority==\"none\",\"None\",if(priority==\"low\",\"Low\",if(priority==\"normal\",\"Normal\",if(priority==\"high\",\"High\",\"No priority\"))))' projectCount: 'if(!projects || list(projects).length == 0, \"No projects\", if(list(projects).length == 1, \"Single project\", \"Multiple projects\"))' contextCount: 'if(!contexts || list(contexts).length == 0, \"No contexts\", if(list(contexts).length == 1, \"Single context\", \"Multiple contexts\"))' trackingStatus: 'if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, \"No estimate\", if(!timeEntries || list(timeEntries).length == 0, \"Not started\", if(formula.efficiencyRatio < 100, \"Under estimate\", \"Over estimate\")))' nextDate: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due) < date(scheduled), due, scheduled), if((due.isEmpty() == false), due, scheduled))' daysUntilNext: 'if((due.isEmpty() == false) && (scheduled.isEmpty() == false), min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() == false), formula.daysUntilDue, formula.daysUntilScheduled))' hasDate: '(due.isEmpty() == false) || (scheduled.isEmpty() == false)' isToday: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\"))' isThisWeek: '((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(due).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") >= today().format(\"YYYY-MM-DD\") && date(scheduled).format(\"YYYY-MM-DD\") <= (today() + \"7 days\").format(\"YYYY-MM-DD\"))' nextDateCategory: 'if(due.isEmpty() && scheduled.isEmpty(), \"No date\", if(((due.isEmpty() == false) && date(due) < today()) || ((scheduled.isEmpty() == false) && date(scheduled) < today()), \"Overdue/Past\", if(((due.isEmpty() == false) && date(due).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")) || ((scheduled.isEmpty() == false) && date(scheduled).format(\"YYYY-MM-DD\") == today().format(\"YYYY-MM-DD\")), \"Today\", if(((due.isEmpty() == false) && date(due).fo"},{"title":"HTTP route index","url":"/obsidian/reference/http-routes/","description":"Implemented TaskNotes HTTP API routes generated from controller decorators.","product":"obsidian","text":"This index is generated from controller route decorators. The build fails if an implemented route is absent from the narrative HTTP API guide or NLP API guide. Method Path Controller POST /api/bases/default-files/update BasesController GET /api/calendars CalendarsController GET /api/calendars/events CalendarsController GET /api/calendars/google CalendarsController GET /api/calendars/microsoft CalendarsController GET /api/calendars/subscriptions CalendarsController GET /api/docs SystemController GET /api/docs/ui SystemController GET /api/filter-options TasksController GET /api/health SystemController POST /api/nlp/create SystemController POST /api/nlp/parse SystemController POST /api/pomodoro/pause PomodoroController POST /api/pomodoro/resume PomodoroController GET /api/pomodoro/sessions PomodoroController POST /api/pomodoro/start PomodoroController GET /api/pomodoro/stats PomodoroController GET /api/pomodoro/status PomodoroController POST /api/pomodoro/stop PomodoroController GET /api/stats TasksController GET /api/tasks TasksController POST /api/tasks TasksController DELETE /api/tasks/:id TasksController GET /api/tasks/:id TasksController PUT /api/tasks/:id TasksController POST /api/tasks/:id/archive TasksController POST /api/tasks/:id/complete-instance TasksController POST /api/tasks/:id/materialize-occurrence TasksController GET /api/tasks/:id/time TimeTrackingController POST /api/tasks/:id/time/start TimeTrackingController POST /api/tasks/:id/time/start-with-description TimeTrackingController POST /api/tasks/:id/time/stop TimeTrackingController POST /api/tasks/:id/toggle-status TasksController POST /api/tasks/query TasksController GET /api/time/active TimeTrackingController GET /api/time/summary TimeTrackingController GET /api/webhooks WebhookController POST /api/webhooks WebhookController DELETE /api/webhooks/:id WebhookController GET /api/webhooks/deliveries WebhookController Generated from 40 implemented routes."},{"title":"Settings source reference","url":"/obsidian/reference/settings-source/","description":"The six TaskNotes settings tabs, their controls, and the complete default settings snapshot generated from source.","product":"obsidian","text":"TaskNotes currently exposes 6 settings tabs. This inventory is generated from the tab renderer and English translation source so additions cannot silently disappear from the documentation. General# Source: src/settings/tabs/generalTab.ts Setting Purpose Default tasks folder Default location for new tasks. Supports folder template variables like {{currentNotePath}}, {{currentNoteTitle}}, and {{projectFilePath}}, plus Daily Notes-style date tokens like YYYY/MM/DD. Folder for inline-created tasks Folder where tasks created from inline commands or checkbox conversion will be created. Leave empty to use the default tasks folder. Use {{currentNotePath}} for the current note's folder, or {{currentNoteTitle}} for a subfolder named after the current note. Move archived tasks to folder Automatically move archived tasks to an archive folder Archive folder Folder to move tasks to when archived. Supports template variables like {{year}}, {{month}}, {{priority}}, etc. Identify tasks by Choose whether to identify tasks by tag or by a frontmatter property Task tag Tag that identifies notes as tasks (without #). Existing .base view filters keep their old tag when this changes; update default Base files or edit those filters. Hide identification tags in task cards When enabled, tags matching the task identification tag (including hierarchical matches like 'task/project') will be hidden from task card displays Hidden tag scope Choose whether hiding identification tags also hides nested tags. Task property name The frontmatter property name (e.g., \"category\") Task property value The value that identifies a note as a task (e.g., \"task\") Auto-create default files Automatically create missing default base view files on startup. Disable to prevent deleted sample files from being recreated. Create default files Create the default .base files in TaskNotes/Views/ directory. Existing files will not be overwritten. Update default files Overwrite the configured default .base files with templates generated from your current TaskNotes settings. Export v3 saved views to Bases Convert all your saved views from TaskNotes v3 into a single .base file with multiple views. This helps migrate your v3 filter configurations to the new Bases system. Excluded folders Comma-separated list of folders to exclude from task indexing and project suggestions UI language Select the language used for TaskNotes interface text Use Markdown links in frontmatter Generate markdown links ([text](path)) instead of wikilinks ([[link]]) in frontmatter properties. ⚠️ Requires the 'obsidian-frontmatter-markdown-links' plugin to work correctly. Show release notes after update Automatically open release notes when TaskNotes is updated to a new version Check for new releases on startup Check GitHub once when TaskNotes starts and show a notice when a newer compatible release is available View release notes See what's new in the latest version of TaskNotes Task properties# Source: src/settings/tabs/taskPropertiesTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Modal fields# Source: src/settings/tabs/modalFieldsTab.ts Setting Purpose No static controls detected This tab is assembled dynamically. Appearance & UI# Source: src/settings/tabs/appearanceTab.ts Setting Purpose Default visible properties Choose which properties appear on task cards by default. Time format Display time in 12-hour or 24-hour format throughout the plugin Default view The calendar view shown when opening the calendar tab Custom view day count Number of days to show in custom multi-day view First day of week Which day should be the first column in week views Show weekends Display weekends in calendar views Show week numbers Display week numbers in calendar views Show today highlight Highlight the current day in calendar views Show current time indicator Display a line showing the current time in timeline views Selection mirror Show a visual preview while dragging to select time ranges Calendar locale Calendar locale for date formatting and calendar system (e.g., \"en\", \"fa\" for Farsi/Persian, \"de\" for German). Leave empty to auto-detect from browser. Show scheduled tasks Display tasks with scheduled dates by default Show due dates Display task due dates by default Show due dates when scheduled Display due dates even for tasks that already have scheduled dates Show time entries Display completed time tracking entries by default Show recurring tasks Display recurring task instances by default Show ICS events Display events from ICS subscriptions by default Time slot duration Duration of each time slot in timeline views Start time Earliest time shown in timeline views (HH:MM format) End time Latest time shown in timeline views (HH:MM format). Use values above 24:00 to show early next-day hours, such as 26:00 for 2 AM. Initial scroll time Time to scroll to when opening timeline views (HH:MM format) Event minimum height Minimum height for events in timeline views (pixels) Show tracked tasks in status bar Display currently tracked tasks in Obsidian's status bar Show relationships widget Display a widget showing all relationships for the current note (subtasks, projects, dependencies) Relationships position Where to position the relationships widget Show task card in note Display a task card widget at the top of task notes showing the task details and actions Strike through completed task titles Draw a line through completed task card titles. Turn off to keep completed tasks easier to read Show expandable subtasks Allow expanding/collapsing subtask sections in task cards Expand subtasks by default Show project subtasks expanded when task cards are rendered Subtask chevron position Position of expand/collapse chevrons in task cards Views button alignment Alignment of the views/filters button in the task interface Single-click action Action performed when single-clicking a task card Double-click action Action performed when double-clicking a task card Features# Source: src/settings/tabs/featuresTab.ts Setting Purpose Task link overlay Show interactive overlays when hovering over task links Disable overlay for aliased links Do not show the task widget if the link contains an alias (e.g. [[Task|Alias]]). Show convert button next to checkboxes Display an inline button next to Markdown checkboxes that converts them to TaskNotes Keep checkbox when converting Leave the original Markdown checkbox marker in place when converting a checkbox to a TaskNote link Enable natural language task input Parse due dates, priorities, and contexts from natural language when creating tasks Default to scheduled When NLP detects a date without context, treat it as scheduled rather than due NLP language Language for natural language processing patterns and date parsing Open task after creation Choose whether the task creation modal opens the new task note after saving. Use body template Use a template file for task body content Body template file Path to template file for task body content. Supports template variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, etc. Use occurrence note template Use a separate fallback template for materialized occurrence notes when the recurring task has no occurrence_template Occurrence note template file Path to template file for materialized occurrence notes. A recurring task's occurrence_template field takes priority over this fallback. Template variables: See the setting in Obsidian for contextual details. Use task defaults on instant convert Apply default task settings when converting text to tasks instantly Work duration Duration of work intervals in minutes Short break duration Duration of short breaks in minutes Long break duration Duration of long breaks in minutes Long break interval Number of work sessions before a long break Auto-start breaks Automatically start break timers after work sessions Auto-start work Automatically start work sessions after breaks Pomodoro notifications Show notifications when Pomodoro sessions end Show Pomodoro in status bar Display the active Pomodoro countdown in Obsidian's status bar Sound enabled Play sound when Pomodoro sessions end Sound volume Volume for Pomodoro sounds (0-100) Pomodoro data storage Configure where Pomodoro session data is stored and how it's managed. Mobile sidebar Where to open the Pomodoro timer on mobile devices Enable notifications Enable task reminder notifications Notification type Type of notifications to show Send test reminder Send a test reminder using the current notification type and sound settings. Notification sound Play a sound when task reminders trigger Sound volume Volume for task reminder sounds (0-100) Preview notification sound Play the configured task reminder sound Hide completed tasks from overdue Exclude completed tasks from overdue task calculations Disable note indexing Disable automatic indexing of note content for better performance Suggestion debounce Delay in milliseconds before showing suggestions Auto-stop time tracking Automatically stop time tracking when a task is marked complete Time tracking stop notification Show notification when time tracking is automatically stopped Maintain due date offset in recurring tasks Keep the offset between due date and scheduled date when recurring tasks are completed Reset checkboxes on recurrence Reset all Markdown checkboxes in the task body when a recurring task is completed and rescheduled Enable timeblocking Enable timeblocking feature for lightweight scheduling in daily notes. When enabled, 'Timeblock' option appears in the calendar drag context menu. Show timeblocks Display timeblocks from daily notes by default Default timeblock color The default color used when creating new timeblocks Enable debug logging Log detailed drag-and-drop and view diagnostics to the developer console. Useful for troubleshooting. Integrations# Source: src/settings/tabs/integrationsTab.ts Setting Purpose Generate mdbase type definitions See the setting in Obsidian for contextual details. Disable calendar integrations on mobile Skip Google, Microsoft, and ICS calendar loading on Obsidian mobile. Desktop calendar integrations are unchanged. Calendar integrations are disabled on this mobile device See the setting in Obsidian for contextual details. Enable task export When enabled, tasks with dates will be automatically synced to Google Calendar as events. Target calendar See the setting in Obsidian for contextual details. Sync trigger Which task date should trigger calendar event creation. Create as all-day events When enabled, tasks are created as all-day events. When disabled, uses time estimate for duration. Default event duration Duration in minutes for timed events (used when task has no time estimate). Event title template Template for event titles. Available variables: {{title}}, {{status}}, {{priority}} Include task details in description Add task metadata (priority, status, tags, etc.) to the event description. Include Obsidian link Add a link back to the task in Obsidian in the event description. Default reminder Add popup reminders to timed Google Calendar events. Enter minutes before the event, separated by commas. Leave empty to use calendar defaults. Common values: 15, 30, 60, 1440. Automatic sync behavior See the setting in Obsidian for contextual details. Sync on task create Automatically create calendar event when a new task is created. Sync on task update Automatically update calendar event when a task is modified. Sync on task complete Update calendar event when a task is completed (adds checkmark to title). Delete event on task delete Remove calendar event when the corresponding task is deleted. Manual sync actions See the setting in Obsidian for contextual details. Sync all tasks Sync all existing tasks to Google Calendar. This will create events for tasks that haven't been synced yet. Unlink all tasks Remove all task-event links without deleting calendar events. Default note template Path to template file for notes created from ICS events Default note folder Folder for notes created from ICS events ICS note filename format How filenames are generated for notes created from ICS events Custom ICS filename template Template for custom ICS event filenames Use ICS event end time as task due date When enabled, tasks created from calendar events will have their due date set to the event's end time. For all-day events, the due date will be set to the event date. For timed events, the due date will include the end time. Recurring event related notes Choose whether notes linked to one recurrence of an external calendar event appear across the loaded series or only on the selected instance. Add calendar subscription Add a new calendar subscription from ICS/iCal URL or local file New calendar See the setting in Obsidian for contextual details. Refresh all subscriptions Manually refresh all enabled calendar subscriptions Enable automatic export Automatically keep an ICS file updated with all your tasks Export file path Path where the ICS file will be saved (relative to vault root) Update interval (between 5 and 1440 minutes) How often to update the export file Use task duration for event length When enabled, uses the task's time estimate (duration) instead of due date for the calendar event end time. This is useful for GTD workflows where scheduled + duration represents work planning, while due date represents deadlines. Exclude completed tasks When enabled, completed tasks are omitted from ICS exports. Completed statuses are taken from your task statuses settings. Exclude archived tasks When enabled, archived tasks are omitted from ICS exports. Require due date When enabled, only tasks with a due date are included in ICS exports. Require scheduled date When enabled, only tasks with a scheduled date are included in ICS exports. Export now Manually trigger an immediate export Export status: See the setting in Obsidian for contextual details. Enable HTTP API Start local HTTP server for API access API port Port number for the HTTP API server API authentication token Token required for API authentication (leave empty for no auth) Enable MCP server Expose TaskNotes tools via Model Context Protocol at /mcp endpoint. Requires HTTP API to be enabled. Add webhook Register a new webhook endpoint Complete default settings snapshot# The following JSON is generated from DEFAULT_SETTINGS. Empty strings and disabled flags are intentional defaults. { \"tasksFolder\": \"TaskNotes/Tasks\", \"moveArchivedTasks\": false, \"archiveFolder\": \"TaskNotes/Archive\", \"taskTag\": \"task\", \"taskIdentificationMethod\": \"tag\", \"hideIdentifyingTagsInCards\": false, \"hideIdentifyingTagsMode\": \"all\", \"taskPropertyName\": \"\", \"taskPropertyValue\": \"\", \"excludedFolders\": \"\", \"defaultTaskPriority\": \"normal\", \"defaultTaskStatus\": \"open\", \"taskOrgFiltersCollapsed\": false, \"taskFilenameFormat\": \"zettel\", \"storeTitleInFilename\": true, \"customFilenameTemplate\": \"{{title}}\", \"occurrenceFilenameTemplate\": \"\", \"occurrenceFilenameTemplateProperty\": \"occurrenceFilenameTemplate\", \"taskCreationDefaults\": { \"defaultContexts\": \"\", \"defaultTags\": \"\", \"defaultProjects\": \"\", \"useParentNoteForTaskCreation\": false, \"useParentNoteAsProject\": false, \"useParentHeaderAsProject\": false, \"inheritParentTaskProperties\": false, \"defaultTimeEstimate\": 0, \"defaultRecurrence\": \"none\", \"defaultDueDate\": \"none\", \"defaultDueTime\": \"none\", \"defaultScheduledDate\": \"today\", \"defaultScheduledTime\": \"none\", \"bodyTemplate\": \"\", \"useBodyTemplate\": false, \"occurrenceBodyTemplate\": \"\", \"useOccurrenceBodyTemplate\": false, \"defaultReminders\": [] }, \"openTaskAfterCreation\": \"none\", \"calendarViewSettings\": { \"defaultView\": \"dayGridMonth\", \"customDayCount\": 3, \"slotDuration\": \"00:30:00\", \"slotMinTime\": \"00:00:00\", \"slotMaxTime\": \"24:00:00\", \"scrollTime\": \"08:00:00\", \"firstDay\": 1, \"timeFormat\": \"24\", \"showWeekends\": true, \"locale\": \"\", \"defaultShowSchedu"},{"title":"Release Notes","url":"/obsidian/releases/","description":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements.","product":"obsidian","text":"Welcome to the TaskNotes release notes. Here you can find detailed information about each version, including new features, bug fixes, and improvements. Latest Releases# Version 4.x (Current)# 4.12.3 4.12.2 4.12.1 4.12.0 4.11.1 4.11.0 4.10.2 4.10.1 4.10.0 4.9.2 4.9.1 4.9.0 4.8.1 4.8.0 4.7.2 4.7.1 4.7.0 4.6.0 4.5.3 4.5.2 4.5.1 4.5.0 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.1 4.2.0 4.1.3 4.1.2 4.1.1 4.1.0 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0-beta.3 4.0.0-beta.2 4.0.0-beta.1 4.0.0-beta.0 Version 3.x# 3.25.6 3.25.4 3.25.3 3.25.2 3.25.1 3.25.0 3.24.6 3.24.5 3.24.4 3.24.3 3.24.2 3.24.1 3.24.0 3.23.4 3.23.3 3.23.2 3.23.1 3.23.0 3.22.1 3.22.0 3.21.0 3.20.1 3.20.0 3.19.1 3.19.0 3.18.2 3.18.1 3.18.0 3.17.1 3.17.0 3.16.4 3.16.3 3.16.2 3.16.1 3.16.0 3.15.1 3.15.0 3.14.0 3.13.4 3.13.3 3.13.2 3.13.1 3.13.0 3.12.2 3.12.1 3.12.0 3.11.2 3.11.1 3.11.0 3.10.0 3.9.1 3.9.0 3.8.7 3.8.6 3.8.5 3.8.1 3.7.1 3.7.0 3.6.0 3.5.1 3.4.2 3.4.1 3.4.0 3.3.0 3.1.1 3.1.0 3.0.1 3.0.0 Version 2.x# 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 Version 1.x# 1.2.0 1.1.0 1.0.0 Early Versions (0.x)# 0.8.0 0.7.0 0.6.3 0.6.2 0.6.1 0.6.0 0.4.2 0.4.1 0.4.0 0.3.0 0.2.4 0.2.3 0.2.2 Getting Updates# To update TaskNotes: Open Obsidian Go to Settings → Community Plugins Find TaskNotes and click \"Update\" Restart Obsidian if prompted Feedback# Found a bug or have a feature request? Please: Check existing GitHub Issues Create a new issue with details"},{"title":"Untitled","url":"/obsidian/releases/0.2.2/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.1...0.2.2"},{"title":"Untitled","url":"/obsidian/releases/0.2.3/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.2...0.2.3"},{"title":"Untitled","url":"/obsidian/releases/0.2.4/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.3...0.2.4"},{"title":"Untitled","url":"/obsidian/releases/0.3.0/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.2.4...0.3.0"},{"title":"Untitled","url":"/obsidian/releases/0.4.0/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.3.0...0.4.0"},{"title":"Untitled","url":"/obsidian/releases/0.4.1/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.1"},{"title":"Untitled","url":"/obsidian/releases/0.4.2/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.4.0...0.4.2"},{"title":"Untitled","url":"/obsidian/releases/0.6.0/","description":"TaskNotes documentation.","product":"obsidian","text":""},{"title":"Untitled","url":"/obsidian/releases/0.6.1/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.0...0.6.1"},{"title":"Untitled","url":"/obsidian/releases/0.6.2/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.1...0.6.2"},{"title":"Untitled","url":"/obsidian/releases/0.6.3/","description":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/chronosync/compare/0.6.2...0.6.3"},{"title":"Untitled","url":"/obsidian/releases/0.7.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.7.0"},{"title":"Untitled","url":"/obsidian/releases/0.8.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.6.3...0.8.0"},{"title":"Untitled","url":"/obsidian/releases/1.0.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/0.8.0...1.0.0"},{"title":"Untitled","url":"/obsidian/releases/1.1.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.0.0...1.1.0"},{"title":"Untitled","url":"/obsidian/releases/1.2.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/1.1.0...1.2.0"},{"title":"Untitled","url":"/obsidian/releases/2.0.0/","description":"TaskNotes 2.0.0 - Major Feature Release","product":"obsidian","text":"TaskNotes 2.0.0 - Major Feature Release Major New Features: Kanban Board View Visual task management with drag-and-drop functionality Dynamic grouping by status, priority, or context Search filtering across all columns Real-time updates and collapsible columns Enhanced Pomodoro System SVG progress circle with refined visual timer Persistent session history and statistics tracking Dedicated Pomodoro Statistics view with completion metrics Enhanced UI with improved controls and display Advanced Task Filtering & Grouping Unified filtering system with search, status, context, priority filters Date range filtering with overdue task support Flexible grouping options (status, priority, context, due date) Performance-optimized filtering using cache indexes Enhanced Recurring Tasks Visual distinction with special styling and indicators Per-date completion tracking with smart UI controls Context menus filtered to prevent status conflicts Clear completion status display for selected dates UI/UX Improvements: Task Management Enhanced task edit modal with improved form layout Context menu (right-click) for quick property changes Autocomplete for contexts and tags in task forms Optimistic UI updates for better responsiveness View Enhancements Agenda view with improved layout and timeline organization Enhanced note cards with consistent styling across views Improved calendar integration with better visual indicators Unified card styling system across all views Performance & Reliability Migrated to unified CacheManager from legacy FileIndexer DOM reconciliation system for efficient UI updates Enhanced async handling and error management Improved cache update handling and race condition prevention Additional Improvements: Enhanced due date modal with better styling Improved time tracking UX with visual feedback Better task archival feedback and UI consistency Refined keyboard navigation and accessibility Updated README with comprehensive feature documentation Bug Fixes: Fixed 'No due date' group positioning in task list Resolved various UI spacing and alignment issues Improved handling of edge cases in recurring task logic Enhanced stability of cache operations and file handling This major release significantly expands TaskNotes capabilities with new views, enhanced filtering, and improved user experience while maintaining data compatibility with previous versions."},{"title":"Untitled","url":"/obsidian/releases/2.0.1/","description":"Bug Fixes and Enhancements:","product":"obsidian","text":"TaskNotes 2.0.1 - Recurring Tasks and Filtering Improvements# Bug Fixes and Enhancements: Recurring Task Improvements: Fixed recurring tasks not appearing in correct due date groups (Today, Tomorrow, etc.) Recurring tasks now properly appear in 'Today' group when selected date matches recurrence pattern Enhanced recurring task visual styling with distinctive indicators and backgrounds Smart context menus for recurring tasks that prevent conflicting status changes Fixed recurrence values not loading properly in task edit modal Task Filtering and Grouping: Improved 'No due date' group positioning to appear at bottom of task list Enhanced FilterService with target date awareness for intelligent recurring task grouping Fixed cache integration issues where recurrence changes didn't trigger proper view updates All views now properly refresh and regroup tasks when recurrence properties change UI and Data Consistency: Fixed data format mismatch between stored abbreviations and UI display for day names Improved task edit modal to properly convert between storage format and UI format Enhanced cache workflow integration for seamless task property updates Better synchronization between task edits and view refreshes Technical Improvements: Added conversion helper methods for consistent day name handling Enhanced cache manager with proper recurring task support Improved event emission and handling for task updates Better error handling and data validation in task modals This release focuses on making recurring tasks work seamlessly with the filtering and grouping system while maintaining data consistency and improving the overall user experience."},{"title":"Untitled","url":"/obsidian/releases/2.0.2/","description":"Bug Fixes:","product":"obsidian","text":"TaskNotes v2.0.2# Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Settings Improvements: Enhanced Priorities settings tab with comprehensive usability improvements Added detailed descriptions, help sections, and column headers Added input validation and better visual organization Matches the improved usability of the Statuses settings tab Technical Details: Modified FilterService date range filtering to properly handle recurring tasks without due dates Added logic to check if recurring tasks should appear on any date within the specified range Uses existing isRecurringTaskDueOn helper for accurate recurrence calculations Maintains full backward compatibility for all existing functionality"},{"title":"Untitled","url":"/obsidian/releases/2.0.3/","description":"Bug Fixes:","product":"obsidian","text":"Bug Fixes: Fixed recurring tasks without due dates not appearing in agenda view Recurring tasks now properly show on their scheduled days in agenda view Command Improvements: Removed layout-specific commands (open-linked-views, open-grid-layout, open-tabs-layout) Removed popout window commands for cleaner command palette Added 'Refresh TaskNotes cache' command for troubleshooting Simplified ribbon icons to focus on core functionality Technical Details: Enhanced FilterService initial task set logic to include recurring tasks without due dates Modified getTaskPathsInDateRange() to check all recurring tasks for date range inclusion Added async processing with batched performance optimizations Maintained backward compatibility and existing performance characteristics Root cause: CacheManager only indexed tasks by actual due dates, excluding recurring tasks without due dates from date-based queries The agenda view now correctly displays recurring tasks without due dates on their appropriate scheduled days."},{"title":"TaskNotes v2.0.4","url":"/obsidian/releases/2.0.4/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.0.3...2.0.4 Allow multiple statuses to be filtered for at the same time, bringing status filtering in line with context and priority filtering Fix flickering during kanban drag and drop"},{"title":"TaskNotes v2.1.0 - Major Feature Release","url":"/obsidian/releases/2.1.0/","description":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience.","product":"obsidian","text":"This release introduces significant workflow enhancements and editor integration features that streamline task management directly within the Obsidian editing experience. NEW FEATURES:# Instant Task Conversion One-click conversion of checkbox tasks to dedicated TaskNotes with inline convert buttons Streamlined workflow for transforming simple tasks into structured task files Configurable via settings to enable/disable the feature Interactive Task Link Overlays Live task previews displayed on wikilinks in live preview mode Hover and click interactions for editing tasks without leaving the current note Context menus and inline task information display Smart detection of task-related wikilinks with automatic enhancement Enhanced Date Handling Improved overdue task detection that considers both due and scheduled dates Better date consistency across all views and components Expanded field mapping support for time tracking and completion data IMPROVEMENTS:# Performance & Reliability Comprehensive resource cleanup to prevent memory leaks Enhanced error handling with better user feedback Performance optimizations in calendar view and task rendering Improved DOM reconciliation and widget management Accessibility & UX Enhanced accessibility with ARIA attributes and keyboard navigation Consistent BEM CSS naming across all components Better input validation and security measures Improved visual consistency throughout the interface Technical Enhancements Fixed deprecated Obsidian API usage for better compatibility Standardized date handling using date-fns library Configurable pomodoro field mapping Better separation of concerns in component architecture This release maintains full backward compatibility while adding new features that enhance the daily task management workflow."},{"title":"TaskNotes v2.2.0","url":"/obsidian/releases/2.2.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Major Features# Task Deletion: Added task deletion functionality with confirmation modal and proper event handling Pomodoro Data Migration: Implemented migration utility for backward compatibility with existing Pomodoro session data Enhanced Calendar Navigation: Improved CalendarView date navigation and refresh logic Core Improvements# Timezone-Safe Date Handling: Complete overhaul of date utilities to ensure consistent timezone handling across the codebase Centralized Task Management: Refactored task creation and editing to use centralized TaskService architecture Improved Date Filtering: Enhanced FilterService with better date comparison logic for due and scheduled tasks Pomodoro Session Tracking: Refactored session tracking and duration calculations for better accuracy UI/UX Enhancements# Visual Consistency: Updated font sizes and UI element widths for better readability Pomodoro Button Styling: Enhanced button styles with consistent visual feedback Inline Widget Cleanup: Improved task update handling and cleaned up inline widget styles Technical Improvements# Safer Date Parsing: Replaced parseISO with parseDate utilities for more robust date handling ISO Timestamp Support: Updated timestamp generation to return ISO format with local timezone offset Performance Optimizations: Various refactoring improvements for better code maintainability and performance"},{"title":"Untitled","url":"/obsidian/releases/2.2.1/","description":"Fix #22 and #24","product":"obsidian","text":"Fix #22 and #24"},{"title":"Untitled","url":"/obsidian/releases/2.2.2/","description":"TaskNotes documentation.","product":"obsidian","text":""},{"title":"Untitled","url":"/obsidian/releases/2.2.3/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.2.2...2.2.3"},{"title":"Untitled","url":"/obsidian/releases/3.0.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/2.3.0...3.0.0"},{"title":"Untitled","url":"/obsidian/releases/3.0.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.0...3.0.1"},{"title":"Untitled","url":"/obsidian/releases/3.1.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.0.1...3.1.0"},{"title":"Untitled","url":"/obsidian/releases/3.1.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.0...3.1.1"},{"title":"Release Notes: 3.10.0","url":"/obsidian/releases/3.10.0/","description":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements.","product":"obsidian","text":"This version introduces a new data storage option for tasks, adds a status bar component for time tracking, and includes several bug fixes and internal improvements. New Features# Option to Store Task Title in Filename# A new setting, storeTitleInFilename, is available under \"Task Filenames\" in the settings tab. This feature changes how task titles are stored. Implementation Details: When this setting is enabled, creating a new task will use its title to generate the filename (e.g., My New Task.md). The title field will be omitted from the task's frontmatter. For reading tasks, the application will first look for a title field in the frontmatter. If it is not found, the system will use the filename as the task's title. This ensures backward compatibility with existing tasks. When a task's title is updated, and this setting is active, the file itself is automatically renamed to match the new title. The file's frontmatter is updated before the rename operation occurs to ensure data integrity. Enabling this setting disables and hides the other filename format options (Zettelkasten, timestamp, custom). This setting is disabled by default. Status Bar Component for Tracked Tasks# A new UI component has been added to the app's status bar to display tasks with active time-tracking sessions. Functionality: When a single task is being tracked, its title (truncated if necessary) is displayed in the status bar. The full title is visible in a tooltip. When multiple tasks are being tracked, a count of these tasks is displayed. The tooltip lists the titles of the tracked tasks. The status bar item is hidden when no tasks are being tracked. This feature is controlled by the \"Show tracked tasks in status bar\" setting and is disabled by default. Customizable First Day of Week for Mini Calendar# The mini calendar view now respects the \"First day of the week\" setting in Obsidian's general settings. The calendar grid will adjust to start the week on the day you have configured (e.g., Sunday or Monday). Bug Fixes# Search Functionality: Resolved a type error in the search filter that occurred when a task's title or context field was null. The code now handles null values gracefully during search operations. File Renaming: Corrected the order of operations when storeTitleInFilename is enabled. The previous implementation could rename the file before its frontmatter was updated, which has now been fixed. Internal Improvements & Documentation# Service Refactoring: The TaskService, FieldMapper, and MinimalNativeCache have been updated to handle the new logic for storing and retrieving task titles from filenames. StatusBarService: A new StatusBarService was implemented to encapsulate the logic for the new status bar component, including its creation, updates, and event handling. Issue Templates: The GitHub issue templates for bug reports and questions have been updated to be more structured and improve the quality of submitted reports. Documentation: Added a new section to the documentation explaining the storeTitleInFilename feature in detail."},{"title":"Release Notes: 3.11.0","url":"/obsidian/releases/3.11.0/","description":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes.","product":"obsidian","text":"This release introduces a new project management system, significant enhancements to the Pomodoro timer and workflows, and a number of quality-of-life improvements and bug fixes. New Features# Project Management# A new project management system has been integrated, allowing for better organization and tracking of tasks within projects. Note-Based Projects: Projects are now properly integrated into TaskNotes. You can link tasks to any note in your vault, effectively turning that note into a project. This leverages Obsidian's core linking capabilities, allowing you to see all tasks related to a project in the backlinks of the project note. Project Selection UI: A new project selection modal has been added to the task creation and editing modals. It features fuzzy search to quickly find and assign tasks to project notes. Filtering and Grouping by Project: The Filter Bar in all views now includes a \"Project\" filter, allowing you to see tasks for one or more specific projects. The \"Group By\" option now includes \"Project\", which organizes the Task List and Kanban views by project. Clickable Project Links: In task cards and other views, project names are now clickable links that take you directly to the project note. Workflow and UI Enhancements# Redesigned Pomodoro Timer: The Pomodoro timer has been completely redesigned for a more modern and user-friendly experience. New Interface: A more compact and visually appealing interface. Time Adjustment: You can now add or subtract time from the current session or the prepared timer. Skip Break: A \"Skip break\" button is now available after a work session. Enhanced Pomodoro Stats: The Pomodoro statistics view has been improved to provide more insights. Overview Section: A new overview section shows today's completed Pomodoros, total focus time, and a comparison with yesterday's performance. Instant Task Conversion: The \"Convert task to TaskNote\" command has been streamlined. It now instantly converts a checkbox task into a TaskNote without opening the creation modal, reducing friction. Quick Actions for Current Task: A new command, \"Quick actions for current task,\" allows you to open the action palette for the currently active TaskNote, providing quick access to common operations. Improved Sorting Logic: The task sorting algorithm has been enhanced. When the primary sorting criterion (e.g., due date) is the same for multiple tasks, a fallback sorting order is applied: scheduled date -> due date -> priority -> title. This ensures a more predictable and logical ordering of tasks. Archive Button in Edit Modal: An \"Archive\" button has been added to the task edit modal, allowing for quick archiving and unarchiving of tasks. Week Start Day Setting: All calendar views now respect the \"Start week on\" setting from Obsidian's calendar preferences. Bug Fixes and Minor Improvements# Recurring Task Date Consistency: A critical bug has been fixed where recurring task dates could appear on the wrong day in different timezones (especially CST). The handling of dates and timezones for recurring tasks is now more robust, ensuring consistency across all views. Pomodoro Daily Note Integration: The Pomodoro service now correctly handles adding session history to daily notes, preventing the creation of duplicate entries. Template Processing: The {{parentNote}} template variable now correctly resolves to a properly formatted markdown link. YAML frontmatter in templates is now processed more safely to avoid parsing errors. Date Validation: The complete_instances field for recurring tasks now has stricter validation to filter out invalid entries, improving data integrity. Natural Language Processing: The natural language parser now correctly applies scheduled times (e.g., \"do something at 5pm\") to created tasks. Agenda View Quick Select: A bug that prevented the date quick-select menus in the Agenda View from working after the first use has been fixed. Styling and CSS: Numerous styling improvements have been made across the plugin for a more polished and consistent look and feel, including to the Pomodoro views, task cards, and modals. Documentation: The documentation has been updated to reflect the new project management features. New workflow guides for \"Habit Tracking\" and \"Project Management\" have been added."},{"title":"Release Notes 3.11.1","url":"/obsidian/releases/3.11.1/","description":"This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management.","product":"obsidian","text":"API Modernization & Performance Improvements# This release focuses on adopting Obsidian's official APIs and improving plugin stability through better resource management. Improved autocomplete# Replaced custom autocomplete implementation with Obsidian's native AbstractInputSuggest API Better keyboard navigation and visual consistency More responsive type-ahead support for contexts and tags in task modals API modernization# Atomic Frontmatter Updates: Now uses FileManager.processFrontMatter for safer file modifications Eliminates risk of data corruption during migration processes More reliable handling of YAML frontmatter updates Native Link Parsing: Switched to Obsidian's built-in parseLinktext API More robust wikilink parsing with better edge case handling Improved consistency with Obsidian's internal link processing Vault-Specific Storage: View preferences now use App.loadLocalStorage/saveLocalStorage Fixes issue where settings were shared across different vaults Each vault now maintains its own view state and preferences Bug fixes & stability# Memory Leak Prevention: Properly register and cleanup event listeners Event listeners are now tracked with EventRef objects for proper cleanup Prevents memory leaks when plugin is disabled or reloaded Debounce Optimization: Uses Obsidian's built-in debounce function More efficient calendar refresh operations Better performance consistency UI Polish: Fixed sentence case issues throughout the interface Security & reliability# Resource Cleanup: Enhanced plugin lifecycle management Better cleanup of event listeners and cached data Improved plugin disable/enable reliability"},{"title":"Release Notes - 3.11.2","url":"/obsidian/releases/3.11.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Internal Improvements# API Standardization# Replaced custom wikilink parsing with Obsidian's native parseLinktext API Migrated from custom debounce function to Obsidian's built-in debounce utility Files Updated# TaskLinkOverlay.ts: Updated wikilink parsing FilterService.ts: Improved project link resolution TaskLinkDetectionService.ts: Simplified link detection MinimalNativeCache.ts: Standardized project link handling KanbanView.ts: Replaced custom debounce implementation Test files: Updated mocks accordingly"},{"title":"Release Notes - 3.12.0","url":"/obsidian/releases/3.12.0/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Project Subtasks Widget# Add a collapsible widget that displays tasks linked to the current project note Widget appears automatically in project notes and shows all tasks that reference the rpoject Includes collapsible interface with persistent state across sessions Updates automatically when tasks are modified or deleted Can be enabled or disabled in plugin settings under \"Show project subtasks widget\" Bug Fixes# FilterBar Improvements# Fixed FilterBar not updating dynamically when tasks get new contexts or projects (#138) Fixed archived tasks' contexts and projects still appearing in filter bar (#139) Resolved FilterBar showing projects with [[]] brackets Fixed empty status list display on initial load Improved initialization reliability with better event handling Task Display# Fixed wikilink alias handling in TaskCard and inline displays (#145, #147) Fixed projects not loading correctly in task edit modal (#141) Improved cursor positioning in live preview mode Documentation# Added documentation for project subtasks widget feature Updated inline task integration documentation Added configuration settings documentation"},{"title":"Release Notes - 3.12.1","url":"/obsidian/releases/3.12.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Project Subtasks Widget Enhancements# New button for task creation - Added \"New\" button to widget header for quick task creation Auto-populated project field - New tasks automatically reference the current note as their project Improved positioning - Widget now appears at the end of documents for better user experience Improve visual design - Added dashed border to indicate virtual/generated content and improved styling Bug Fixes# Timezone and Date Handling# Fixed timezone boundary issues in Agenda view date filtering (#153) Resolved missing tasks that were scheduled 7 days ago or yesterday due to timezone drift Enhanced date normalization in AgendaView for consistent behavior across timezones Improved task filtering with better date handling in getTasksForDate() UI and Display Improvements# Fixed cursor positioning to prevent cursor appearing after project subtasks widget Resolved pre-populated projects not displaying correctly in task creation modal Improved widget rendering with CSS-only styling approach for better performance Settings Reorganization# New Misc Tab# Renamed \"Performance\" tab to \"Misc\" and moved to end of settings tab list Consolidated miscellaneous features into a single organized location Improved settings navigation by grouping related toggles together Settings Moved to Misc Tab# Status bar toggle - Show tracked tasks in status bar Project subtasks widget toggle - Show project subtasks widget in notes Notes indexing toggle - Disable note indexing for performance optimization Documentation Updates# Settings Documentation# Updated all documentation to reflect new settings organization Created comprehensive Misc Settings documentation with detailed explanations Removed outdated references from Advanced Settings documentation Updated troubleshooting guides with correct setting locations Reference Updates# Updated inline task feature documentation to reference new Misc tab location Fixed all setting location references throughout documentation Maintained backward compatibility information for users upgrading"},{"title":"Release Notes - 3.12.2","url":"/obsidian/releases/3.12.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Bug Fixes# Calendar & Date Handling# Fixed off-by-one date bugs in completion calendar (#160) Resolved timezone inconsistency where calendar showed one date but completion was recorded for another Calendar rendering now uses UTC dates consistently across all components Fixed \"Friday tasks appearing on Saturday\" issue in completion tracking Task Management# Fixed project filters not working in agenda view (#161) Project filtering now works consistently across all views Fixed edit modal crash when tasks have empty project properties Added null checks to prevent \"Cannot read properties of null\" errors Handles null, undefined, and empty string project values gracefully Fixed autofill suggestions not updating internal state (#159) Context and tag suggestions now properly sync with modal internal state Clicking suggestions now correctly updates the task data UI & Styling# Fixed consistent styling for priorities and statuses settings tabs (#130) Added missing BEM classes for proper grid alignment Priority inputs now use same styling as status inputs Fixed table column misalignment issues Documentation# Improved README and documentation Enhanced overview section with better flow and natural language Added time-tracking and pomodoro feature descriptions Fixed broken documentation links Updated Core Features section with more accurate descriptions Testing# Added comprehensive tests for date handling issues Increased test coverage for calendar and completion functionality Added tests reproducing and verifying fixes for off-by-one date bugs"},{"title":"Release Notes - 3.13.0","url":"/obsidian/releases/3.13.0/","description":"##Technical Changes","product":"obsidian","text":"Major Changes# Filtering System Overhaul# Hierarchical Query Builder: Complete redesign of the filtering system with a query builder interface Saved Views: Users can save, manage, and switch between custom filter configurations FilterBar Redesign: Updated to use Obsidian components with improved styling UI Updates# FilterBar Integration: Added to all task views (Kanban, List, Calendar, Agenda) with state management Dropdown Improvements: Status and priority filters now use display labels Dropdown Positioning: Fixed positioning and CSS styling issues New Features# Natural Language Processing# Nested Tag Support: Tags with forward slashes are now supported (e.g., project/subtask) Interface# Project Note Decorations: Updated styling and visual elements Task Modal Styling: Refined task creation and editing interfaces Bug Fixes# Filter System# Fixed handling of empty arrays in \"Projects is not empty\" conditions Fixed incomplete filter conditions handling Fixed saved views dropdown persistence when filters change Fixed view options disappearing on refresh Fixed view selector dropdown behavior Testing# Fixed multiple unit and integration test failures Fixed migration workflow test for YAML parsing errors Expanded test coverage for task service completion Code Quality# Removed debug console.log statements Improved async handling and import organization Better search functionality implementation ##Technical Changes Refactoring# Refactored FilterBar with Obsidian components Updated filter rule definitions and UI components Improved state management across views Updated ViewStateManager Development# Updated Typescript configuration Added new Filter Utils.ts utility module Improved code organization"},{"title":"Release Notes - 3.13.1","url":"/obsidian/releases/3.13.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Saved Filter Views Storage# Saved filter views now sync across devices with your vault Views are stored in plugin data instead of browser localStorage Automatic migration from previous storage system on first load FilterBar Behavior# Filter panel now stays open when clicking elsewhere in the interface Panel only closes when the filter button is clicked again Eliminates accidental filter panel closures during normal use Performance Improvements# Filter Operations# Adding and removing filters is now significantly faster Reduced lag when building complex filter queries Search input state preserved during filter modifications Migration System# Early migration detection prevents DOM errors on first use Better error handling during plugin initialization Cleaner migration process for new users Bug Fixes# First-Time User Experience# Fixed \"removeChild\" DOM errors when using filters for the first time Resolved race conditions between migration and UI initialization Added fallback UI states for improved reliability FilterBar Stability# Added DOM connection checks before manipulation Improved error boundaries in filter rendering Better cleanup of event listeners on component destruction Technical Changes# View State Management# Saved views migrate from localStorage to plugin data system ViewStateManager now uses plugin settings for persistence Enhanced migration detection and completion tracking Error Handling# Added safety checks for DOM element manipulation Graceful degradation when filter operations fail Improved logging for troubleshooting migration issues"},{"title":"Release Notes - 3.13.2","url":"/obsidian/releases/3.13.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Performance Improvements# FilterBar and Saved Views# Fixed performance issue where adding new filter conditions would unnecessarily re-evaluate all existing filters Added \"Select...\" placeholder option for new filter conditions to prevent premature filtering Eliminated unnecessary cache re-indexing when saving or deleting saved views Made settings system smarter to only trigger cache updates when indexing-related settings actually change Filter Processing# Implemented index-backed filtering that processes significantly fewer tasks for filtered views Added intelligent query result caching with automatic expiration to eliminate redundant operations Improved candidate selection using existing status, date, and overdue task indexes Enhanced set intersection logic for multiple AND conditions to further reduce processing Bug Fixes# Filter Logic# Fixed critical bug where index optimization incorrectly excluded valid results for OR queries containing indexed conditions Added detection logic to prevent unsafe optimizations when indexed conditions are part of OR groups Improved query structure analysis to ensure filter correctness Saved Views# Fixed issue where modifying one saved view could affect others due to shared object references Added proper deep cloning of FilterQuery objects throughout the ViewStateManager Ensured saved views remain independent when modified Technical Details# Index Optimization Safety# Index optimizations now only apply when provably safe (AND relationships between indexed conditions) Added recursive query analysis to detect OR groups containing indexed conditions Maintains filter correctness while providing performance benefits where safe Cache Management# Cache-related settings tracking: taskTag, excludedFolders, disableNoteIndexing, storeTitleInFilename, fieldMapping Query result caching with 30-second auto-expiration and immediate invalidation on data changes Debug logging available for performance monitoring Performance Impact# Filter building is now responsive with no lag when adding conditions Saved view operations are instant with no unnecessary re-indexing Repeated filter operations are nearly instant due to intelligent caching Significant memory usage reduction for large vaults"},{"title":"Release Notes - 3.13.3","url":"/obsidian/releases/3.13.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Bug Fixes# Fixed recurring task completion date recording# Resolved issue where \"mark completed for this date\" context menu option recorded completion for the wrong date Fixed timezone inconsistency between completion date storage and checking logic Recurring tasks now properly track completion status per calendar date Improved recurring task filtering# Fixed \"Is completed\" filter condition to respect per-date completion status for recurring tasks Filter results now accurately reflect whether recurring tasks are completed for specific dates Enhancements# AgendaView improvements# Restored Today button with improved header layout Reorganized header into three sections: navigation controls, period title, and actions Fixed recurring task display to show tasks on their actual recurrence dates rather than just scheduled dates Removed keyboard navigation shortcuts (left/right arrows) Interface updates# Enhanced AgendaView header styling with better spacing and visual hierarchy Added responsive design for mobile layouts Improved button styling with proper hover and focus states Technical Changes# Updated TaskService to use consistent local timezone formatting for completion dates Enhanced FilterService to properly evaluate recurring task completion status Improved AgendaView task fetching to use FilterService.getTasksForDate() for better recurrence handling Testing# Added comprehensive test coverage for timezone handling and date formatting consistency Added tests to verify recurring task completion behavior across different scenarios"},{"title":"Release Notes - 3.13.4","url":"/obsidian/releases/3.13.4/","description":"Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues.","product":"obsidian","text":"Bug Fixes# FilterBar Migration Issues# Fixed critical TypeError crashes when upgrading from versions prior to 3.13.0 Resolved Cannot read properties of undefined (reading 'forEach') and Cannot read properties of undefined (reading 'find') errors in FilterBar rendering Added detection for old FilterQuery format and automatic replacement with fresh defaults Users upgrading from older versions now get clean filter states instead of broken data structures Preserved valid sort and grouping settings when replacing incompatible filter data Added error boundaries with console warnings for better debugging Thanks to @cathywu, @Crunchnuggetz, @Poly-0000, @jpmoo and finally @bcohen44 for reporting the FilterBar crashes that led to identifying these migration issues. Features# Calendar View Improvements# Added ICS refresh button directly in the Advanced Calendar view toolbar ICS calendar subscriptions can now be refreshed without opening settings Button integrates with existing ICS subscription service and triggers immediate calendar re-render Improved ICS settings layout with horizontal button arrangement Enhanced calendar styling with proper hover states and removed unnecessary CSS overrides Extended today highlight disable to timegrid columns for visual consistency Notes# This release focuses on stability improvements for users upgrading from older versions. The FilterBar migration fixes ensure that users moving from pre-3.13.0 versions will have a smooth experience with the new filtering system introduced in 3.13.0. The ICS refresh button provides better user experience by allowing calendar data to be updated directly from the calendar view without navigating to settings."},{"title":"Release 3.14.0","url":"/obsidian/releases/3.14.0/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Project Management Enhancements# Project Indicator Icons: TaskCard now displays visual indicators when tasks are used as projects [#191] - Thanks to @Poly-0000 for the suggestion Project Filtering: Added comprehensive project filtering functionality to the main plugin [#191] Create Subtask Option: Added \"Create subtask\" option to task card context menu for improved project workflow [#192] - Thanks to @Poly-0000 for the feature request Project Detection: Enhanced ProjectSubtasksService with isTaskUsedAsProject method for better project identification [#191] User Interface Improvements# Drag-and-Drop Saved Views: Implemented drag-and-drop reordering for saved views to improve workflow customization [#203] - Thanks to @jpmoo for the suggestion Project Styling: Added CSS styling for project indicator icons to improve visual hierarchy [#191] Created Date Sorting: Added 'Created Date' as a sort key option for better task organization [#188] - Thanks to @bl4z3ng41n for the PR Bug Fixes# Calendar and Recurring Tasks# Calendar Resize Support: Fixed duration updates for recurring tasks via calendar resize operations All-Day Handling: Improved recurring task all-day handling in calendar view [#201] - Thanks to @anomatomato and @bespokecomp for reporting Settings and State Management# Pomodoro Session Persistence: Fixed issue where pomodoro sessions were being cleared when changing settings [#196] - Thanks to @anomatomato for the bug report Technical Changes# Performance and Stability# Enhanced cache management and event handling for project-related functionality Improved error handling in project subtask operations Optimized project detection algorithms for better performance Code Organization# Refactored project-related services for better modularity Enhanced TypeScript type definitions for project functionality Improved service initialization and cleanup processes Documentation# Updated README with new project assets and feature documentation"},{"title":"Release 3.15.0","url":"/obsidian/releases/3.15.0/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# NLP Input Enhancements# Auto-suggestions: Added autocomplete functionality for tags and contexts in NLP input [#131] - Thanks to @Poly-0000 for the suggestion Project Auto-suggestions: Enhanced project auto-suggestions with rich display and field mapper integration Context and Tag Suggestions: Implemented auto-suggestion system to prevent typos and improve consistency [#131] Calendar Integration# ICS Event Integration: Added comprehensive ICS calendar event support with content creation capabilities [#122, #220] - Thanks to @donjjones and @Crunchnuggetz for the feature requests ICS Event Creation: Integrated ICS events into field mapping and type system for note creation [#122, #220] ICS Settings: Added ICS integration settings to calendar tab Calendar Hover Previews: Implemented hover preview functionality for advanced calendar - Thanks @nightroman for noticing this Time Entry Interaction: Added time entry interaction functionality to advanced calendar Time Management# Auto-stop Tracking: Added automatic time tracking termination when tasks are completed - Thanks to @cathywu for the suggestion [#184] Total Tracked Time: Enhanced edit modal to display total tracked time information [#181] - Thanks to @bcohen44 for the feature request Pomodoro View: Added task card display and improved controls to pomodoro view [#184] Timeblock Management: Enhanced TimeblockInfoModal with editing and deletion capabilities [#74] - Thanks to @bepolymathe for the suggestion User Interface Improvements# Fuzzy Note Pickers: Enhanced note pickers with title and alias support [#192] - Thanks to @Poly-0000 for the feedback Persistent Column Ordering: Added persistent column ordering to kanban board [#61] - Thanks to @slepsl for the suggestion Click-outside Support: Added click-outside and keyboard support to filter bar [#227] - Thanks to @cstelmach for the UX improvement request UI Polish: Removed unnecessary borders, shadows and transitions from various UI elements Bug Fixes# Task Management# Nested Tags: Fixed support for nested tags in FilterBar TypeError Resolution: Resolved TypeError when calling includes on non-array values Calendar Integration# Default Time Estimate: Fixed calendar click-to-add operations to respect default time estimate setting [#233] - Thanks to @nightroman for the bug report Time Slot Duration: Improved click detection in calendar to use time slot duration setting [#233] Documentation# Auto-suggestion Documentation: Added comprehensive documentation for auto-suggestion functionality ICS Integration Guide: Created detailed ICS calendar integration documentation Release Notes: Added comprehensive release notes documentation with links to all versions Inline Task Widget: Added screenshots and documentation for inline task widgets Technical Changes# Code Organization# Enhanced service architecture for ICS integration Improved field mapping system for calendar events Optimized auto-suggestion algorithms Enhanced type definitions for new functionality Performance# Improved rendering performance for pomodoro view Optimized calendar event handling Enhanced note picker search capabilities"},{"title":"Release 3.15.1","url":"/obsidian/releases/3.15.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Kanban Board Enhancements# Show Empty Status Columns: Kanban board now displays empty columns for all configured statuses, providing better visual structure and workflow clarity Enhanced Task Grouping: Introduced GetGroupedTasksOptions interface for improved task grouping functionality with target date support and group pre-population [#236] - Thanks to @srcnDev for the implementation Calendar Improvements# All-Day Event Styling: Added line-through styling for completed all-day events in the Advanced Calendar view [#252, #254] - Thanks to @anomatomato for reporting the issue and submitting the PR Task Event Customization: Task events in the Advanced Calendar now include CSS classes based on their tags (e.g., fc-tag-meeting, fc-tag-work), enabling custom styling per tag [#243, #244] - Thanks to @jradam for the feature request and implementation Bug Fixes# Kanban Board# Duplicate Column Prevention: Fixed issue where renaming existing statuses in Kanban configuration could result in duplicate columns appearing in the board [#258] - Thanks to @mat2022a for the bug report Subtask Widget Issues# Split Pane Display: Resolved issue where subtask widgets would inappropriately appear on notes in split panes when focusing on different notes [#234] Table Cell Interference: Fixed subtask widgets appearing inside table cells when editing tables in project notes [#207] Technical Changes# Documentation# Fixed line break formatting issues in documentation files Code Organization# Improved task grouping architecture with new options interface Enhanced calendar event rendering system for better tag-based customization Refined subtask widget positioning logic for better editor integration"},{"title":"TaskNotes 3.16.0","url":"/obsidian/releases/3.16.0/","description":"Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes","product":"obsidian","text":"New Features# Task Management# Bulk Task Conversion: Added command to convert all checkbox tasks in a note to TaskNotes at once (#28) - Thanks to @TheSnakePolyglot for the feature request Instant Task Conversion Enhancement: Enable instant task conversion for any line type, not just existing tasks (#259, #262) - Thanks to @ghelton and @cathywu for the suggestions Default Project Setting: Added option to set a default project for new tasks in task creation settings (#250) - Thanks to @davidszerman for the request Advanced Tag and Project Parsing: Implement intelligent parsing of tags and projects during instant task conversion (#260) - Thanks to @mdbraber for reporting this bug Enhanced Filter Bar Integration: Added FilterBar integration to subtask widget for better task organization (#267) - Thanks to @mdbraber for the suggestion Calendar and Views# Custom Multi-Day Calendar View: Added configurable custom multi-day calendar view with support for 3-day, work week, and full week layouts (#282) - Thanks to @girisumit for the feature request Responsive Calendar UI: Hide calendar title in narrow containers for better responsive design (#285) - Thanks to @girisumit for the improvement suggestion Locale-Aware Date Formatting: Added locale-aware date formatting to advanced calendar view (#210) - Thanks to @emes81 for highlighting this usability issue Saved Views Enhancement: Added view options support to saved views with active view name display in filter condition builder (#245) - Thanks to @kmaustral and @digitaldoctors for the feedback Task Organization# Drag and Drop Status Reordering: Added drag and drop reordering for status configurations with hamburger menu icon (#291) - Thanks to @23426356587 for the suggestion Overdue Tasks Filter: Added setting to hide completed tasks from overdue status display (#300) - Thanks to @Lankly and @violetbp for reporting the issue Project Group Enhancements: Made project group labels clickable in Task List View with ctrl+hover preview support (#198) - Thanks to @jpmoo for the suggestion Pomodoro Timer# Background Timer Continuity: Pomodoro timer now continues running when app is minimized or loses focus (#136) - Thanks to @Poly_0000 for reporting and @Totobal5 for the fix System Notifications: Convert Pomodoro notices to system notifications for better visibility (#136) Manual Duration Adjustment: Fixed manually adjusted Pomodoro duration being ignored on start (#293) - Thanks to @Totobal5 for identifying and fixing Task Completion Sorting: Sort completed tasks to end of Pomodoro task selector for better organization Bug Fixes# UI and Interaction# Tooltip Standardization: Standardized tooltips to use Obsidian's native setTooltip function to eliminate duplicate tooltips (#257) - Thanks to @digitaldoctors for the bug report Open Note Button Stability: Stabilized Open note button hover behavior and made font size consistent with other modal buttons Date Context Menu Clarity: Added titles to date context menus for better user clarity (#253) - Thanks to @digitaldoctors for the suggestion Project Removal: Fixed project removal in edit modal not saving changes properly (#213) Advanced Calendar Resizing: Fixed Advanced Calendar view not resizing correctly in detached windows (#137) - Thanks to @macbikegeek for reporting and very much to @Totobal5 for the fix Calendar and Recurring Tasks# Timezone Bug Fixes: Resolved multiple timezone-related off-by-one bugs in recurring task completion and agenda view display - A big thanks to @jpmoo and @kmaustral for reporting and describing in detail this bug Custom Calendar Display: Fixed undefined days display in custom calendar view Calendar Recurrence: Resolved timezone-based off-by-one bugs in calendar recurrence calculations - Thanks to @jpmoo and @kmaustral for reporting this bug Task Management# Pomodoro Task Tracking: Handle task filename changes in pomodoro view to prevent tracking issues (#289) - Thanks to @cathywu for the report Plugin Conflict Protection: Made suggestion objects defensive against potential plugin conflicts (#304) - Thanks to @zeltak for reporting the plugin conflict Instant Conversion Improvements: Use cleaned title for NLP parsing in instant task conversion with fallback to default tasks folder (#128) - Thanks to @bepolymathe for reporting the folder issues Improvements# User Interface# Minimalist Design System: Implemented consistent borderless button design system across all components UI Polish: Applied minimalist styling with cleaned up borders and shadows throughout the interface Settings Enhancement: Enhanced settings explanatory sections with improved minimalist styling Advanced Calendar Title: Made advanced calendar title smaller for better proportions Search and Filtering# Enhanced Search: Improved search functionality to preserve existing filters when performing new searches Filter Preservation: Better handling of filter states across different search operations Development and Code Quality# Code Documentation: Improved code comments and documentation throughout the codebase Linting Cleanup: Resolved various linting errors and improved code consistency Test Infrastructure: Updated timezone-related tests to work reliably in CI environment GitHub Actions: Added timeouts and offline preferences to improve CI reliability Technical Improvements# Reduced excessive console logging from filter components Updated Jest coverage thresholds to realistic levels Improved error handling in various components Improved defensive programming practices throughout the codebase Contributors# Extra thanks to @Totobal5 for multiple code contributions including (tricky!) Pomodoro timer fixes and advanced calendar resizing fixes"},{"title":"TaskNotes 3.16.1","url":"/obsidian/releases/3.16.1/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Task Management# Visual Filter State Indicators: Added visual state indicators for active saved views in FilterBar to provide better feedback when a saved view is currently active Bug Fixes# Link Generation and Consistency# Obsidian Link Format Compliance: Fixed \"Insert tasknote link\" and \"Convert task to TaskNote\" commands to use Obsidian's native generateMarkdownLink method, respecting user's link format preferences in Files & Links settings [#312] - Thanks to @nightroman for reporting the inconsistency and requesting proper format support Consistent Link Formatting: Both commands now generate links in the same format and are compatible with external tools when markdown links are preferred Timezone and Date Handling# Recurring Task Completion Fix: Resolved critical timezone bug where recurring task completion dates were stored incorrectly in non-UTC timezones [#314] - Thanks to @kmaustral for detailed reporting and testing across multiple views UTC Date Consistency: Updated all date utilities to use UTC methods consistently across calendar components, fixing off-by-one date issues in task completion tracking Calendar Date Normalization: Added createSafeUTCDate utility function and converted MiniCalendarView navigation to UTC methods for reliable date handling User Interface# Sort Arrow Visibility: Enhanced sort direction arrow visibility and positioning in filter condition builder with increased font size, bold weight, and accent color [#307] - Thanks to @kmaustral for noting the arrow was difficult to see in dark mode Duplicate Tooltip Prevention: Removed duplicate tooltips on recurring task indicators by using Obsidian's native setTooltip function instead of HTML title attributes Pointer Cursor Consistency: Added pointer cursor styling to all buttons in Pomodoro view for better usability [#308] - Thanks to @anomatomato for the contribution Error Handling and Stability# Daily Note Creation Protection: Added proper error handling for createDailyNote failures across TimeblockCreationModal, PomodoroService, and helper utilities, preventing \"Cannot read properties of undefined\" errors Security Compliance: Replaced unsafe innerHTML assignment with textContent in drag handle creation to resolve ESLint security violations Improvements# User Interface# Calendar Styling Enhancements: Improved advanced calendar view with better borders, header text readability, and removed custom scrollbar styling for system consistency Enhanced Visual Definition: Added border and border radius to calendar container, plus consistent borders on column headers and toolbar for cleaner appearance Development and Code Quality# Test Infrastructure: Added missing setTooltip mock to resolve 39 failing TaskCard tests Documentation Updates: Improved documentation formatting and appearance Technical Improvements# Enhanced date handling throughout the codebase with UTC method standardization Improved defensive programming practices for timezone-sensitive operations Better error messaging for daily note creation failures Code security improvements with ESLint compliance"},{"title":"TaskNotes 3.16.2","url":"/obsidian/releases/3.16.2/","description":"TaskNotes documentation.","product":"obsidian","text":"New Features# Task Link Integration# Markdown Link Support for Inline Task Widgets: Extended task link detection and rendering to support both wikilinks and markdown links. The plugin now properly renders [text](path) markdown links as interactive inline task widgets in both live preview and reading modes [#312] - Thanks to @nightroman for noting the missing link overlays on markdown links Improvements# Link Processing# Link Detection: Improved TaskLinkDetectionService to detect both [[wikilinks]] and [markdown](links) with proper URL decoding for paths containing spaces Link Rendering: Updated both TaskLinkOverlay (live preview) and ReadingModeTaskLinkProcessor (reading mode) to handle both link types consistently API Integration: Uses proper Obsidian API functions (parseLinktext() and getFirstLinkpathDest()) for reliable link resolution"},{"title":"TaskNotes 3.16.3","url":"/obsidian/releases/3.16.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Bug Fixes# User Interface# Create Task Modal Accessibility: Fixed UI issues when creating tasks with natural language input disabled. The modal now opens in an expanded state with immediate access to all input fields, eliminating the need to click or tab before entering task details [#324] - Thanks to @nightroman for reporting this usability issue Timezone Handling# Recurring Task Calendar Display: Fixed timezone-related display bug where recurring tasks appeared on the wrong day for users in negative UTC timezones. Tuesday tasks no longer incorrectly appear on Monday in the calendar view Task Completion Calendar: Improved timezone consistency in the TaskEditModal completion calendar to ensure dates display correctly across all timezones Task Conversion# Context Detection in Instant Tasks: Fixed instant task conversion to properly detect and preserve contexts specified with \"@context\" syntax when converting inline tasks to TaskNotes [#320] - Thanks to @nslee123 for reporting this issue Time Preservation: Fixed instant task conversion to preserve time information when converting tasks with scheduled or due times. Time components are now correctly carried over during the conversion process Improvements# Code Quality# Test Coverage: Added comprehensive unit tests for InstantTaskConvertService context detection to ensure reliable context parsing in future releases"},{"title":"TaskNotes 3.16.4","url":"/obsidian/releases/3.16.4/","description":"This ensures users can always edit task titles regardless of the modal type or natural language input settings.","product":"obsidian","text":"Bug Fixes# User Interface# Task Modal Title Field: Fixed regression from version 3.16.3 where the title field was inadvertently removed from all task modals. The title field is now properly displayed with correct visibility logic: Edit modals: Title field always visible in the details section Create modals with natural language input enabled: Title field visible in details section (as the main input becomes the NLP textarea) Create modals with natural language input disabled: Title field only appears at the top of the modal This ensures users can always edit task titles regardless of the modal type or natural language input settings."},{"title":"TaskNotes 3.17.0","url":"/obsidian/releases/3.17.0/","description":"This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management...","product":"obsidian","text":"Major Features# Enhanced Recurring Tasks with DTSTART Support# This release introduces improvements to recurring task handling with full DTSTART (start date/time) integration, addressing long-standing challenges in recurring task management and filtering. Background and Motivation: The previous recurring task system created difficulties for users in filtering and managing task schedules. Users experienced unintuitive behavior where recurring tasks couldn't be treated consistently with regular tasks, making it challenging to see when the next occurrence would appear or to dynamically update task schedules upon completion. This implementation follows RFC 5545 standards to provide a more robust foundation for recurring task behavior. Key Improvements: DTSTART Integration: All recurring tasks now include proper start dates and times in their recurrence rules, ensuring consistent behavior across timezones and providing a clear anchor point for the recurring pattern Dynamic Date Updates: The task.scheduled field now always shows the next uncompleted occurrence, automatically updating when tasks are completed rather than showing static pattern dates Flexible Next Occurrence Scheduling: The next scheduled occurrence can now be placed anywhere - before the pattern start date, outside the recurring pattern, or at any custom time, giving users complete control over scheduling Visual Hierarchy: Pattern instances display with dashed borders while the next scheduled occurrence shows with solid borders, providing clear visual distinction between the recurring pattern and the active next task Independent Time Control: Pattern instances and next occurrences can have different times (e.g., daily pattern at 9 AM, next occurrence at 2:30 PM), allowing for exceptions without breaking the recurring pattern Dual Drag Behavior: Dragging pattern instances updates the recurring pattern timing globally, while dragging the next occurrence reschedules only that specific instance Automatic DTSTART Addition: The system automatically adds DTSTART when completing recurring tasks, editing recurrence rules, or converting tasks to recurring, ensuring backward compatibility while upgrading task definitions Manual Rescheduling Support: Clear flags indicate when tasks have been manually rescheduled, maintaining transparency about schedule modifications Expandable Project Subtasks# A new feature allows users to expand project task cards to view subtasks inline with proper visual hierarchy. Features: Chevron Controls: Click chevron icons on project task cards to expand/collapse subtask display Configurable: New \"Show expandable subtasks\" setting allows users to enable/disable the feature Responsive Pomodoro View# The Pomodoro view now adapts seamlessly to different container sizes with comprehensive responsive design. Thanks to @oliverlalan for requesting this improvement (#339). Enhanced Filename Templates# Significant expansion of available template variables for task creation, providing much greater flexibility in filename patterns. New Template Variables: Date/Time Variations: shortDate, monthName, dayName, week, quarter, time12, time24 Unix Timestamps: unix (seconds), unixMs (milliseconds) Title Case Variations: titleLower, titleUpper, titleSnake, titleKebab, titleCamel, titlePascal Short Forms: priorityShort, statusShort for single-letter representations Unique Identifiers: zettel (Zettelkasten ID), nano (high-precision unique ID) The settings UI now documents all 40+ available template variables for easy reference. Thanks to @fastrick for the original unix timestamp request. Bug Fixes# Critical Timezone Handling Fixes# This release resolves multiple timezone-related bugs that affected users worldwide, particularly those in non-UTC timezones. These fixes implement the \"UTC Anchor\" principle for consistent date handling. Major Timezone Bugs Fixed: Recurring Task Completion: Fixed critical issue where marking recurring tasks complete would affect the wrong day for users in certain timezones, addressing reports from multiple users including issues #327, #322, and #314 Calendar Date Misalignment: Resolved off-by-one day errors in calendar rendering and task indicators, addressing inconsistencies across different views (originally reported by @Crunchnuggetz in issue #129, with additional reports from @donjjones and @robmikulec) Weekly Task Display: Fixed issue where weekly recurring tasks set for specific days (e.g., Tuesdays) were showing completion dates on the wrong day (Monday) - reported by @jpmoo in issue #322 Task Completion Date Bug: Resolved bug where complete_instances was being set to the previous day, causing tasks to remain visible in Agenda view until manually corrected - reported in issue #314 Date Parsing Inconsistencies: Eliminated mixing of UTC and local date parsing that caused timezone-dependent behavior across the application Filter Date Handling: Fixed date filtering to work consistently across all timezones Agenda View \"Today\" Detection: Corrected timezone-sensitive today detection that affected agenda headers ICS Import Timezone Issues: Resolved timezone problems with both recurring and single events from ICS imports Technical Implementation: Introduced parseDateToUTC() function for consistent UTC anchoring of date-only strings Updated date comparison functions to use UTC anchors throughout Replaced timezone-sensitive date operations with consistent UTC-based alternatives Comprehensive audit and fix of all date handling patterns in the codebase Project Filtering Improvements# Resolved critical bugs in project filtering that prevented proper task display and project selection. Fixes: Wikilink Resolution: Fixed handling of relative vs absolute project wikilinks (e.g., [[../Projects/My Project]] vs [[My Project]]) - thanks to @xorander00 for the detailed bug report Filter Grouping Logic: Corrected AND/OR grouping in project filters to prevent showing too many tasks Missing Projects: Fixed issue where not all projects appeared in filter dropdown selection Cache Management: Improved cache invalidation and project name extraction with better validation Subtask Widget Improvements# Fixed several issues with the project subtasks widget affecting user experience and reliability. Widget Fixes: View State Persistence: Fixed issue where subtask widget views would reset when switching between notes or modifying subtasks (reported by @Poly-0000 in issue #329) Filter State Isolation: Prevented filter settings from bleeding between different notes' subtask widgets Configurable Positioning: Added setting to control widget placement at top or bottom of notes (requested by @michelebugio in issue #164) Event Listener Management: Improved cleanup to prevent memory leaks and event accumulation Event Bubbling: Fixed issue where clicking subtasks would trigger both subtask and parent task modals Styling Isolation: Prevented completion styles from affecting nested subtasks incorrectly ICS Calendar Integration# Timezone Processing: Fixed timezone handling bug in ICS calendar subscriptions where VTIMEZONE components weren't being registered before parsing events, causing incorrect display times for timezone-specific calendar events. Performance and Reliability# Cache Optimization: Restored FilterService cache TTL to 30 seconds after temporary reduction, balancing performance with data freshness. Type Safety: Added proper type assertions for ICAL.TimezoneService calls to resolve TypeScript compilation issues. Error Handling: Enhanced error handling and null safety checks throughout project filtering and service initialization. Technical Improvements# UTC Anchor Implementation# Comprehensive implementation of the UTC Anchor principle for robust timezone handling: All date-only strings now consistently parsed as UTC anchors Date comparison operations standardized using UTC methods Eliminated timezone-dependent date creation patterns Added comprehensive timezone test coverage Service Architecture# Expanded Projects Service: Enhanced state management and tracking for expandable project subtasks with proper cleanup and memory management. View State Manager: Improved view state persistence across different contexts and note switches. Documentation Updates# Updated recurring tasks documentation to reflect new behavior Added timezone handling guides for developers Enhanced calendar views documentation with drag behavior explanations Comprehensive template variable documentation Breaking Changes# Date Handling: While maintaining backward compatibility for user data, the internal date handling now consistently uses the UTC Anchor principle. Migration Notes# Existing recurring tasks will continue to work without modification. The system automatically adds DTSTART components when users interact with recurring tasks (completing, editing, or rescheduling)."},{"title":"TaskNotes 3.17.1","url":"/obsidian/releases/3.17.1/","description":"This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These...","product":"obsidian","text":"Bug Fixes# Critical Timezone Handling Fixes# This patch release resolves three critical timezone-related bugs that affected users in specific timezones, particularly those west of UTC (such as users in the Americas). These fixes ensure consistent calendar rendering and task interaction behavior across all timezones. Completions Calendar Rendering (#322)# Fixed three critical timezone bugs in the completions calendar that caused visual misalignment for users in timezones west of UTC: Day Number Display: Corrected day numbers in the calendar grid to display accurately regardless of user timezone by replacing timezone-sensitive formatting with UTC-anchored date extraction Month Comparison Logic: Fixed current month highlighting logic that was mixing local and UTC date values, causing incorrect month boundary detection Calendar Navigation: Updated previous/next month navigation to use consistent UTC methods, preventing timezone drift when navigating between months These fixes ensure the completions calendar visual representation aligns with the underlying UTC-anchored recurrence data for all users. Advanced Calendar Drag-and-Drop Operations (#344)# Resolved a critical bug where all-day tasks would shift back by one day after dragging and dropping them in the Advanced Calendar view. This issue particularly affected users in timezones ahead of UTC. Thanks to @trang-ngn for reporting this issue with clear reproduction steps. Root Cause: The drag-and-drop system was using formatDateForStorage() which applies UTC methods to Date objects provided by FullCalendar. For users in positive UTC offset timezones, this would cause the stored date to be one day earlier than the date shown in the UI. Fixed Operations: All-day and timed event drag-and-drop (handleEventDrop) External task drag-and-drop from outside the calendar (handleExternalDrop) Modal-based task scheduling (scheduleTask) Date selection task creation (handleDateSelect) Timeblock creation and event resizing operations Event context menu date handling The fix ensures that the date displayed in the calendar UI exactly matches the date that gets stored in the task data. Task Completion Status Checks (#322)# Fixed incorrect completion status checks in recurring tasks caused by timezone-sensitive date formatting in getEffectiveTaskStatus(). Root Cause: The function was using timezone-sensitive date-fns format() for completion date comparisons, causing completion status to be checked against the wrong date for users west of UTC (e.g., checking October 26 instead of October 27 for EDT users). Solution: Replaced timezone-sensitive formatting with formatDateForStorage() to ensure consistent UTC-anchored date strings that match the format used in complete_instances. This fix ensures recurring task completions are correctly identified regardless of user timezone, preventing tasks from incorrectly appearing as incomplete. Technical Implementation# All fixes implement the established \"UTC Anchor\" principle for consistent timezone handling: Consistent use of UTC-anchored date operations for date-only comparisons Replacement of timezone-sensitive date formatting with UTC-based alternatives Proper separation of display dates (which can be timezone-sensitive) from storage dates (which must be timezone-neutral)"},{"title":"TaskNotes 3.18.0","url":"/obsidian/releases/3.18.0/","description":"A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality.","product":"obsidian","text":"New Features# Task Reminders System# A complete reminder system has been added to TaskNotes, providing iCalendar VALARM-compliant reminder functionality. Core Features: Support for both relative reminders (e.g., \"15 minutes before due date\") and absolute reminders (specific date/time) Visual reminder indicators on task cards with clickable bell icons Integration with task creation and editing workflows User Interface: Reminder Modal: Modal for managing task reminders with form validation and real-time preview Reminder Context Menu: Quick access to common reminder options (5min, 15min, 1hr, 1day before due/scheduled dates) Reminder management accessible from task creation modal, edit modal, and task cards Default Reminders: Configure default reminders that automatically apply to new tasks Support for multiple default reminders per task type Applies to both manual task creation and instant conversion workflows Property-Based Task Identification# Tasks can now be identified using frontmatter properties instead of requiring tags. Configure property name and value for task identification (e.g., categories: [[Tasks]]) Full backward compatibility with existing tag-based workflows Addresses modern Obsidian property-based vault organization patterns Thanks to @mdbraber for the feature request (#340) Enhanced Saved Views# Clicking an active saved view now clears all filters, providing quick access to unfiltered task list Preserves sort and group settings while resetting filters Thanks to @oldjove for the suggestion (#351) Parent Note as Project Option# New setting to automatically use parent note as project during instant task conversion Useful for users who organize tasks within project-specific notes Merges with existing default projects to avoid duplicates Thanks to @FindingJohnny for the feature request (#348) Bug Fixes# ICS Calendar Integration# Fixed recurring event exceptions: Properly handle EXDATE properties and RECURRENCE-ID for modified instances Eliminated duplicate events: Resolved issue where deleted or rescheduled recurring events from external calendars still appeared Thanks to @robmikulec for reporting the recurring events issue (#342) Settings Persistence# Fixed settings reset during updates: Prevent user configuration loss when plugin updates introduce new default settings Apply deep merge strategy to preserve customizations in nested configuration objects Improvements# User Interface# Reminder modal uses consistent design patterns with task creation/edit modals Fixed task card icon overlap issues with proper spacing for multiple indicators Code Quality# Added unit test coverage for new reminder functionality Improved type safety with proper TypeScript interfaces for reminder data structures Improved error handling and user feedback across reminder operations Technical Details# Data Model Changes# Added optional reminders array field to TaskInfo interface Extended field mapping support for custom reminder property names Enhanced cache system to include reminder data in task extraction"},{"title":"TaskNotes 3.18.1","url":"/obsidian/releases/3.18.1/","description":"Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This...","product":"obsidian","text":"Bug Fixes# Cache Synchronization Race Conditions (#358)# Fixed critical race conditions in cache synchronization that occurred when task operations completed before Obsidian's metadata cache had fully processed file changes. This resulted in stale or missing task data across all calendar views and task operations. Thanks to @willgraham345 for reporting the calendar auto-refresh issue Code Quality Improvements# Event Listener Management# Simplified event listener cleanup in AdvancedCalendarView by removing manual listener tracking array. Technical Details# Cache Synchronization Strategy: The implementation follows a \"wait-then-update\" pattern where all cache modifications are preceded by verification that Obsidian's metadata cache contains the expected changes. This prevents race conditions while maintaining performance through minimal wait times."},{"title":"TaskNotes 3.18.2","url":"/obsidian/releases/3.18.2/","description":"Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic...","product":"obsidian","text":"Bug Fixes# Timeblock Date Shift Issue (#368)# Fixed timeblocks appearing one day earlier than expected by implementing the UTC Anchor pattern throughout the timeblocking feature. The previous implementation used problematic millisecond-based date iteration that caused timezone-dependent date shift bugs. Timeblocks now appear on the correct calendar day regardless of user timezone or DST transitions. Thanks to @zolotyh-dk for reporting this issue with detailed screenshots and system information. Performance Issues with Task Views# Eliminated typing lag that occurred when Task, Agenda, and Kanban views were open in large vaults. The plugin was triggering unnecessary view updates during text editing. New Features# Enhanced Filename Template Variables (#370)# Added new timestamp variables for filename templates to support ISO 8601 formats and Google Keep compatibility: {milliseconds}, {ms} - 3-digit milliseconds (000-999) {timezone}, {utcOffset} - UTC offset in ±HH:MM format {timezoneShort}, {utcOffsetShort} - UTC offset in ±HHMM format Thanks to @mnipritom for requesting these variables. Boolean Property Identification# Enhanced property-based task identification to handle boolean values correctly. Tasks can now be identified using boolean properties in frontmatter. A big thanks to @renatomen for contributing the boolean property identification implementation, documentation, and test coverage Boolean Status Field Support (#108)# Added automatic boolean conversion for status values to support Obsidian's checkbox property format. The status field now handles boolean true/false values: String \"true\" → boolean true (in frontmatter) String \"false\" → boolean false (in frontmatter) Boolean true → string \"true\" (when read back) Boolean false → string \"false\" (when read back) Other status values remain unchanged as strings Thanks to @arminta7 for reporting the checkbox property compatibility issue and @imed-ghomari for contributing to the discussion on status field handling. And thanks again to @renatomen--the boolean property identification fix inspired this change!"},{"title":"TaskNotes 3.19.0","url":"/obsidian/releases/3.19.0/","description":"TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natu...","product":"obsidian","text":"New Features# HTTP REST API with Natural Language Processing# TaskNotes now includes a HTTP REST API that enables external integrations and powers companion projects. The API provides full task management capabilities with intelligent natural language processing. Key API Features: Complete CRUD operations for tasks Time tracking endpoints Task statistics and filtering Bearer token authentication CORS support for browser extensions Desktop-only implementation with mobile-safe architecture Natural Language Processing Endpoints: /api/nlp/parse - Parse natural language into structured task data /api/nlp/create - Create tasks directly from natural language input Supports extraction of dates, times, priorities, tags, contexts, projects, and recurrence Intelligent parsing of expressions like \"Review PR #123 tomorrow high priority @work\" Companion Project Integration: The HTTP API enables two new companion projects: tasknotes-cli - Command-line interface for TaskNotes task management tasknotes-browser-extension - Browser extension for quick task creation Configuration: Enable via Settings → HTTP API tab (desktop only) Configurable port (default 8080) and optional authentication token Documentation at /docs/HTTP_API.md and /docs/nlp-api.md Enhanced Calendar Integration# Calendar Export and Context Menu System# Task Calendar Export: Add tasks to external calendars (Google, Outlook, Yahoo) Download ICS files Right-click context menu support for quick calendar actions Agenda View Calendar Improvements# ICS Integration in Agenda: Calendar event cards now display in Agenda view Toggle calendar subscriptions visibility via FilterBar Always-available \"Refresh calendars\" button Normalized scheduled date handling for all-day and timed events Thanks @scottaltham-payroc for the feature request! Bug Fixes# Task Styling Enhancement (#355)# Added CSS class task-card--has-projects to task cards that contain projects. Thanks @mdbraber for the suggestion Calendar Event Scheduling# Fixed scheduled date normalization when creating tasks from ICS events: All-day events: Use YYYY-MM-DD format Timed events: Use YYYY-MM-DDTHH:mm format Consistent behavior across all calendar interfaces File Copy Script Improvements# Enhanced copy-files script with better error handling: Improved default path handling Destination directory creation Better ENOENT error handling API Documentation# New Documentation Files# HTTP_API.md - Complete API reference with examples nlp-api.md - Natural language processing capabilities and usage Technical Enhancements# Core Infrastructure# API Service Architecture: Mobile-compatible implementation using Node.js http module Platform detection prevents mobile loading Express.js alternative for lightweight operation Full error handling and validation Calendar Service Integration: Extracted reusable CalendarExportService Unified TaskContextMenu component Enhanced event listener management Development Improvements# Code Organization: Modular component extraction for better reusability Consistent API response formats Comprehensive test coverage for new features TypeScript improvements for icon handling Migration Notes# HTTP API Setup# For users wanting to enable the new HTTP API: Navigate to Settings → HTTP API tab (desktop only) Configure desired port (default 8080) Optionally set authentication token for security Restart Obsidian to start the API server Test with: curl http://localhost:8080/api/health"},{"title":"TaskNotes 3.19.1","url":"/obsidian/releases/3.19.1/","description":"Added webhook system enabling integrations with external services and automation workflows.","product":"obsidian","text":"New Features# Webhook Support# Added webhook system enabling integrations with external services and automation workflows. Webhook Management: CRUD operations for webhook configuration HTTP API endpoints for webhook management (POST /api/webhooks, GET /api/webhooks, DELETE /api/webhooks/{id}) Delivery history tracking (GET /api/webhooks/deliveries) Settings UI integration with event subscription controls Event Types: Task events: created, updated, deleted, completed, archived, unarchived Time tracking: started, stopped Pomodoro: started, completed, interrupted Recurring tasks: instance completed Reminders: triggered Security and Reliability: HMAC-SHA256 signature verification for payload authentication Automatic retries with exponential backoff (3 attempts) 10-second delivery timeout with failure monitoring Auto-disable webhooks after repeated failures Non-blocking async delivery maintains TaskNotes responsiveness Documentation and testing utilities included in docs/webhooks.md and test-webhook.js. Bug Fixes# Boolean Property Identification Regression (#367)# Fixed regression from version 3.18.2 where boolean checkbox properties stopped working for property-based task identification. During code refactoring, the comparePropertyValues function was accidentally removed, breaking boolean-to-string coercion needed for Obsidian checkbox properties. The fix restores this function with proper type-aware comparison logic, allowing boolean true/false frontmatter values to correctly match \"true\"/\"false\" setting values. Thanks to @renatomen for reporting this regression"},{"title":"TaskNotes 3.20.0","url":"/obsidian/releases/3.20.0/","description":"Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for conta...","product":"obsidian","text":"New Features# Task Organization and Filtering# Folder-Based Task Filtering - Added task filtering by folder location with dropdown selection of vault folder paths, special handling for root-level tasks, and support for contains/empty operators. Addresses issue #369 reported by kmaustral Dynamic Task Folder Organization - Added template variable support for default task folder setting with task variables ({{context}}, {{project}}, {{priority}}, {{status}}, {{title}}) and date variables ({{year}}, {{month}}, {{day}}, {{date}}). Supports automatic folder creation and title sanitization. Addresses feature request #376 by Mara-Li Archive Task Organization - Added optional bidirectional task movement between archive folder and default tasks folder. Disabled by default with settings in Task defaults → Task organization (moveArchivedTasks, archiveFolder). Addresses feature request #402 by anareaty Enhanced UI and Controls# Enhanced Filter Bar - Improved filter bar with instant badge updates, right-click clear functionality, \"Clear All Filters\" button, and better UI synchronization across main and subtask views. Contributed by renatomen Collapsible Groups - Added collapsible groups with persisted state, chevron indicators, and keyboard navigation. Works with all grouping options while preserving wikilink functionality. Extended to subtask widget with consistent behavior. Contributed by renatomen Expand/Collapse All Controls - Added \"Expand All\" and \"Collapse All\" buttons to task list toolbar that appear when grouping is active. Contributed by renatomen Configurable UI Elements - Added settings for subtask chevron position (right/left) and saved views button positioning in task view toolbar. Contributed by renatomen Advanced API Architecture and Webhook System# Refactored HTTP API from monolithic design to controller/service pattern, reducing HTTPAPIService from 1,061 to 231 lines (78% reduction). Added dedicated controllers for tasks, time tracking, Pomodoro, system, and webhooks with 100% backward compatibility. Webhook System - Added complete webhook infrastructure with signature verification, automatic retries with exponential backoff, 10-second delivery timeout, and auto-disable after repeated failures. Supports all task lifecycle events (created, updated, deleted, completed, archived, unarchived), time tracking events, Pomodoro sessions, recurring task instances, and reminders. Webhook Testing and Development - Included standalone webhook testing server (test-webhook.js) with real-time payload inspection, signature verification testing, and comprehensive event logging for development and debugging. Improvements# UI and Visual Enhancements# TaskNotes Icons - Added TaskNotes icons throughout interface and edit task modal headers with new SVG assets. Task Card Polish - Improved status and priority dot alignment and reordered context menu (\"Copy task title\" moved to top). Addresses alignment issue #410 reported by kmaustral Button Styling - Fixed agenda view and filter popup button backgrounds with improved styling consistency. Technical Improvements# Settings Architecture - Decomposed monolithic settings.ts into focused modules: defaults, settings management, type definitions, and utilities for better maintainability. Documentation - Added extensive webhook documentation in docs/examples/webhook-transforms/ with ready-to-use transform examples for Discord (rich embeds with colors), Slack (compatible attachments), Microsoft Teams (MessageCard format), and generic JSON templates. Expanded API documentation with complete endpoint reference, examples, error handling, authentication, and OpenAPI specification. Webhook Integration Services - Enhanced core services (TaskService, PomodoroService) with webhook notifications integrated into task lifecycle events, ensuring all user actions trigger appropriate webhook deliveries for external automation and monitoring. Bug Fixes# Mobile Modal Close Button - Fixed close button (X) touch event handling in task edit modals on mobile devices, particularly Android. Addresses issue #404 reported by anareaty Test Suite Stabilization - Resolved test failures and linting errors HTTP API Field Consistency - Updated API examples to use correct 'details' field instead of deprecated 'notes' field. Addresses issue #393 reported by @nightroman Missing Webhook Trigger - Added webhook trigger for recurring task completion events. Documentation Updates# Task defaults documentation with template variables Miscellaneous settings documentation Webhook transform documentation and examples Demo GIFs for new features Thanks @renatomen! Contributors# Special thanks to the following contributors: @Mara-Li - Feature request for template variables in task folders @kmaustral - Feature requests for folder filtering and UI alignment improvements @anareaty - Bug report for mobile modal close button issue @nightroman - Reported mislead API documentation A really big thanks to @renatomen whose very polished contributions form the bulk of this update!"},{"title":"TaskNotes 3.20.1","url":"/obsidian/releases/3.20.1/","description":"Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and...","product":"obsidian","text":"New Features# Enhanced View Organization and Visual Feedback# Saved View Headings with Completion Counts - Added visible filter headings across all views (Task List, Subtask Widget, and Agenda) that display the current saved view name and completion statistics in \"completed / total\" format. Shows \"All\" when no saved view is active. Headings update immediately on filter changes and persist correctly when switching tabs or reloading. Contributed by @renatomen Consistent Group Count Badges - Standardized completion count display across all group headers in Task List, Subtask Widget, and Agenda views using unified \"completed / total\" format. Removed redundant bracketed counts for cleaner presentation. Contributed by @renatomen Collapsible Agenda Date Groups - Added collapsible date headers to Agenda view with persistent state management. Date sections can be collapsed individually or controlled via \"Expand All\" / \"Collapse All\" buttons that are always visible in the FilterBar. Collapsed state is preserved between sessions using ViewStateManager. Contributed by @renatomen Improved User Interface# Reorganized Task Context Menu - Enhanced context menu organization by replacing individual buttons with logical submenus for status, priority, dates, recurrence, and reminders. Applied user-configured colors to main menu icons while maintaining all existing functionality. Bug Fixes# Calendar Integration Fixes# Outlook Calendar 500 Errors - Fixed Microsoft Outlook ICS endpoint failures by updating User-Agent header from 'TaskNotes-Plugin/1.0' to browser-compatible string and adding Accept-Language header. Improved error handling with specific guidance for Outlook 500 errors. Fixes issue #458 reported by @girisumit and @heinzochsner Recurring Tasks Date Display - Fixed timezone-dependent bug where recurring tasks appeared one day ahead or behind their actual due date in Agenda View. Replaced manual UTC date construction with parseDateToUTC() following UTC Anchor principle from development guidelines. Added regression test for consistent date handling. Fixes issue #439 reported by @brianarn and @jpmoo Task Management Fixes# Project Suggestions Crash Prevention - Fixed crash in Task Creation modal when typing \"+\" to add projects inline, caused by non-string title values in frontmatter. Added title normalization (arrays join with \", \", numbers/booleans stringify, objects become empty strings) and defensive guards in suggestion filtering. Particularly important for large vaults with heterogeneous frontmatter. Contributed by @renatomen Documentation Updates# Added screenshots demonstrating saved view headings and completion counts for Task List and Subtask Widget Created demo GIF showing Agenda view collapsible groups with Expand/Collapse All functionality Updated view documentation with new visual features Enhanced inline task documentation for Subtask Widget improvements Contributed by @renatomen Contributors# Special recognition goes to @renatomen for the substantial contributions that form the core of this release, including the saved view headings system, consistent count badges, and collapsible Agenda functionality. Thanks to the following community members for their bug reports and feedback: @girisumit and @heinzochsner - Reported Outlook calendar integration issues @brianarn and @jpmoo - Identified recurring tasks date display bug with detailed reproduction steps"},{"title":"TaskNotes 3.21.0","url":"/obsidian/releases/3.21.0/","description":"Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Ad...","product":"obsidian","text":"New Features# Custom User Fields System# Custom User Fields Mapping - Added ability to define custom frontmatter properties for task filtering, grouping, and sorting. Users can configure field mappings in Settings → Advanced → User Fields with support for text, number, date, boolean, and list field types. List fields preserve wikilinks and quoted tokens, while numeric fields intelligently parse mixed text-number values like \"2-Medium\" as numeric 2. Contributed by @renatomen Group and Sort by Custom User Fields - Extended grouping and sorting functionality to work with user-defined custom fields. Includes type-aware comparators for each field type and proper group header ordering when grouping and sorting by the same field. Contributed by @renatomen User Fields in Task Modals - Added custom user field support to task creation and edit modals with autocomplete suggestions from existing field values. Fields are stored as frontmatter properties and include change detection for edit scenarios. Contributed by @callumalpass Enhanced Task Interaction# Configurable Click Behavior - Added option to configure single-click and double-click behavior for task cards and inline task widgets. Users can choose between opening the edit modal or the source note file for each click type. Includes shared click handler utility with 250ms detection delay. Contributed by @fastrick Calendar Integration Enhancements# Calendar Event Filename Templates - Added separate filename template configuration for notes created from calendar events. Supports ICS-specific template variables including {icsEventTitle}, {icsEventLocation}, {icsEventDescription}, and {icsEventTitleWithDate}. The {title} variable now uses clean event titles without date suffixes. Fixes issue #362 reported by @bepolymathe Chronological ICS Event Sorting - Fixed ICS calendar events to display in chronological order by start time within each day in the agenda view. Applied to both grouped and flat agenda view modes. Fixes issue #472 reported by @Crunchnuggetz Bug Fixes# API Endpoint Improvements# Custom Status Configuration Support - Fixed API endpoints (/api/nlp/parse and /api/nlp/create) not respecting custom status configurations. API now uses proper default status logic matching the UI instead of hardcoded 'todo' values, with proper handling of boolean status values. Fixes issue #487 reported by @23maverick23 Task Creation Defaults - Fixed REST API endpoint (POST /api/tasks) missing default properties like scheduled dates, tags, and reminders. API-created tasks now receive the same defaults as UI-created tasks. Fixes issue reported by @nightroman Project Management Fixes# Project Consolidation and Display - Fixed project grouping to consolidate different formats pointing to the same file (e.g., [[project]] and [[project|alias]] now group together). Improved display formatting with clickable headers showing absolute paths without .md extensions and proper wikilink alias parsing. Task cards preserve original formats while grouping logic ignores display aliases. Fixes issues #448 reported by @minchinweb and #469 reported by @anareaty User Experience Improvements# Tag Input Sanitization - Added automatic sanitization to remove # prefixes from tag input, preventing duplicate tags like #tag1 and ##tag1. Applied to task creation, editing, and real-time input handling. Fixes issue #331 reported by @AndreMonthy Contributors# Special recognition goes to @renatomen for the extensive custom user fields system that forms the core of this release, including field mapping, filtering, grouping, and sorting capabilities. Thanks to @fastrick for implementing the configurable click behavior feature. Thanks to the following community members for their bug reports and feature requests: @23maverick23 - Reported API custom status configuration issues with detailed technical analysis @Crunchnuggetz - Identified ICS calendar event sorting problem in agenda view @minchinweb - Reported project consolidation issues with wikilink variations @anareaty - Identified project display formatting problems in kanban view @bepolymathe - Requested calendar event filename template functionality @AndreMonthy - Reported tag input sanitization issues with clear examples @nightroman - Reported API issues where defaults were not being applied"},{"title":"TaskNotes 3.22.0","url":"/obsidian/releases/3.22.0/","description":"Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total t...","product":"obsidian","text":"Major Features# Modular Properties System# Added modular properties system allowing users to control visibility of task properties (due date, scheduled date, priority, projects, contexts, tags, custom fields, and total tracked time) both globally and per saved view. Properties can be configured through a new Properties dropdown in the filter bar, with settings automatically saved per view. Includes performance optimizations to render properties only when visible. Thanks to @renatomen for the initial implementation of this feature Task cards now dynamically render properties based on visibility settings with improved error handling and type safety. System supports both core properties and user-defined custom fields with proper fallback to default configurations for new users. Added total tracked time as a configurable property in the modular system, calculated from time entries and displayed consistently across all views when enabled. Bases-style Filter Bar Redesign# Complete filter bar redesign matching Obsidian's bases plugin styling with improved layout, spacing, and button appearance. Added text labels and chevron icons to all filter buttons (Sort, Filters, Properties, New) for better discoverability. Replaced dropdown menus with native Obsidian context menus featuring section headers and improved reliability. Sort/Group functionality now uses unified context menu system with better organization. Implemented intelligent filter popup positioning using boundary detection to prevent popups from hiding under adjacent panes. Increased default popup width from 300px to 500px for better usability. Moved expand/collapse controls from separate containers directly into filter headings across all views (TaskListView, AgendaView, subtask widget) for cleaner interface and consistent user experience. Added dedicated \"+ New\" task creation button to filter bar with neutral styling and proper view context awareness. Statistics view# Implement a new view to track statistics about projects and time tracking. UX# Task Interaction Improvements# Changed \"This Week\" grouping label to \"Next seven days\" for clearer, more specific language about the 7-day time period while maintaining identical underlying functionality. Fixes issue #516 reported by @anareaty External Contributions# Type-aware input fields in task modals now provide appropriate UI components based on field type (text/list with autosuggest, date with picker icon, boolean with toggle). Project autosuggest during task creation now supports multi-word project names without interrupting suggestions on spaces. Contributed by @renatomen Fixed subtask right-click context menus that were incorrectly showing parent task options instead of subtask-specific options. Enhanced inline task overlay cursor behavior with configurable timing settings (0-500ms) for predictable overlay hiding when cursor approaches link boundaries. Contributed by @renatomen Fixed project names containing commas (e.g., [[Money, Org & Adm]]) being incorrectly split, breaking selection and display across task modals, settings, and instant conversion. Now uses proper wikilink parsing to preserve comma-containing project names as single entities. Contributed by @renatomen Fixed date parsing errors caused by hardcoded field mapping not respecting user's custom field configurations. Plugin now properly uses field mapper for note date extraction with fallback to hardcoded fields for backward compatibility. Contributed by @renatomen Fixed User Fields column order in settings to match Field mapping configuration for consistency. Contributed by @renatomen Bug Fixes# Timezone and Date Handling# Fixed timezone-dependent \"Today\" identification issues across multiple views including MiniCalendarView tooltips, PomodoroService session categorization, PomodoroStatsView statistics, and StatsView date calculations. All date-sensitive components now use UTC-anchored dates for timezone-independent behavior. Fixes issue #452 reported by @MinchinWeb User Interface Fixes# Redesigned group counters with clean appearance (removed background, border, padding), positioned to far right of headers using muted text color for subtle display while maintaining left-aligned headings. Improved contrast for INTERRUPTED status badge in pomodoro statistics for better readability. Fixes issue #529 reported by @motusira Removed title length limits that were causing text truncation, allowing full title display. Fixes issue #378 reported by @nsstrickland Added all-day slot toggle to calendar view for better event organization. Fixes issue #242 requested by @Crunchnuggetz Added calendar locale configuration for international calendar support with proper localization. Contributed by @pixeler Fixed task states not refreshing when date changes at midnight, ensuring accurate daily task status updates. Fixes issue #527 reported by @jordandrako Fixed inline task overlay title wrapping using white-space: break-spaces for proper text display. Fixes issue #517 reported by @cathywu New Capabilities# Added weekday display and increment options to date picker with integration into task context menus for improved date selection experience. Fixes issue #238 requested by @girisumit Added tags to available sorting and grouping options for more flexible task organization. Fixes issue #169 requested by @bce283c Added create inline task command for quick task creation within notes with NLP project support for automatic project assignment based on context. Fixes issue #299 requested by @0dfa1bc Added filename template variables to folder templates including support for additional customization options. Fixes issue #473 requested by @oliverlalan Implemented status auto-suggestion with NLP integration for intelligent status recommendations during task creation and editing. Infrastructure Improvements# Development and Testing# Updated multiple npm dependencies including ical.js (1.5.0 → 2.2.1) and Jest (29.7.0 → 30.1.1) with compatibility fixes. Resolved all npm security vulnerabilities and updated ICS subscription service for ical.js v2.x compatibility. Fixed all test suite failures and infrastructure issues including Jest 30 compatibility, RRule mocking, TypeScript configuration, and CI environment setup. Removed coverage thresholds that were causing CI failures while maintaining test quality. Improved code quality throughout modular properties system with proper TypeScript compliance, error handling, performance optimizations, and memory cleanup functions. Replaced 'any' types with proper type guards and added comprehensive interface definitions. Contributors# Special recognition goes to @renatomen for multiple substantial contributions including type-aware custom field inputs, enhanced task interaction fixes, project name handling improvements, date parsing fixes, and settings alignment. Thanks to the following community members for their bug reports and feature requests: @anareaty - Reported grouping label confusion with clear examples @MinchinWeb - Identified timezone handling inconsistencies across multiple views @motusira - Reported contrast issues with INTERRUPTED status badge @nsstrickland - Identified title truncation problems @Crunchnuggetz - Requested all-day slot toggle for calendar views @jordandrako - Reported task state refresh issues at midnight @cathywu - Identified text wrapping problems in overlays @girisumit - Requested enhanced date picker functionality @oliverlalan - Requested template variable enhancements"},{"title":"TaskNotes 3.22.1","url":"/obsidian/releases/3.22.1/","description":"Thanks to @jhedlund for implementing the configurable recurring task due date feature.","product":"obsidian","text":"New Features# Configurable Recurring Task Due Date Behavior# Added optional due date advancement for recurring tasks. When enabled, maintains the time separation between scheduled and due dates when tasks are completed. The new \"Maintain due date offset in recurring tasks\" setting in Misc preferences controls this behavior and defaults to disabled to preserve existing behavior. Contributed by @jhedlund, fixes issue #470 Bug Fixes# Calendar and Task Display# Fixed calendar view issues where tasks were not displaying correctly due to empty status values causing infinite loops and TypeErrors. Resolved timeEntries.filter is not a function errors when loading calendar events and prevented Obsidian freezing during task creation with empty status text. Fixes issue #520 reported by @cathywu Saved Views and Property Management# Fixed property visibility settings not being preserved when saving filter views. View configurations now properly store and restore property display preferences. Fixes issue #545 reported by @anareaty Fixed saved view selection to prefer newly created views over older matching views, ensuring the correct view is activated after saving. Added proper null safety checks for FilterBar interactions to prevent errors during view save operations. User Interface Improvements# Added responsive behavior to filter bar buttons that automatically hide button text when pane width falls below 500px to prevent overflow in narrow sidebars. Uses container queries with media query fallback for broader browser support. Fixes issue #549 reported by @TonyAtlas Development Improvements# Reduced excessive console logging in TaskListView by removing 37+ debug statements while preserving essential error logging for troubleshooting. Contributors# Thanks to @jhedlund for implementing the configurable recurring task due date feature. Thanks to the following community members for their bug reports: @cathywu - Reported calendar view task display issues with detailed technical information @anareaty - Identified property visibility persistence problems in saved views @TonyAtlas - Reported filter bar overflow issues in narrow sidebars with helpful screenshots"},{"title":"TaskNotes 3.23.0","url":"/obsidian/releases/3.23.0/","description":"We extend special thanks to @renatomen for his exceptional contributions to this release:","product":"obsidian","text":"New Features# ICS Export and Calendar Integration# Added full ICS export functionality with proper RFC 5545 compliance for improved calendar application compatibility Implemented automatic ICS export with configurable interval updates (5-1440 minutes) for calendar subscription workflows Added manual \"Export all tasks as ICS file\" command for bulk export operations Thanks to @mdbraber for requesting this feature (#422) Status-Based Auto-Archive# Introduced configurable auto-archive system with per-status timeout settings (1-1440 minutes) Added persistent queue that survives plugin restarts for reliable task archiving Implemented settings UI for fine-grained control over auto-archive behavior Thanks to @TonyAtlas for requesting this feature (#547) and to @renatomen for design suggestions Multi-Language Natural Language Processing# Added NLP support for 12 languages: English, Spanish, French, German, Russian, Chinese, Japanese, Italian, Dutch, Portuguese, Swedish, Ukrainian Implemented locale-specific date parsing using chrono-node language support Enhanced pattern matching with proper handling for Latin, Cyrillic, Chinese, and Japanese scripts Thanks to @pschoenbach for requesting German language support (#563) Enhanced Project Autosuggest# Implemented configurable multi-row project cards with customizable display fields Added selective search functionality across chosen fields with simple flag system Introduced fuzzy search option for broader, multi-word matching capabilities Enhanced project selection with clear metadata display (title, aliases, path) Thanks to @renatomen for implementing this feature (#555) Bases Plugin Integration# Added experimental integration with the Bases plugin for enhanced task management workflows Implemented direct formula computation and custom property support Added clickable tags and contexts with accessibility support Created simplified kanban view integration with proper lifecycle management Thanks to @renatomen for his incredible work developing the proof-of-concept for this feature Settings UI Modernization# Complete redesign of settings interface with card-based design system Added collapsible functionality and live API documentation Enhanced calendar subscription interface with local file support Bug Fixes# Task Creation and File Handling# Fixed startup crash when templates contain empty reminders property (reported by @glpayson, #583) Implemented automatic sanitization of forbidden characters in task titles instead of blocking creation (reported by @glpayson, #590) Added support for platform-specific filename characters (hash, square brackets) Resolved inconsistent behavior between instant convert and manual task creation Project and Link Functionality# Added clickable project links in task edit modal for better navigation (requested by @anareaty, #432) Fixed completion date timezone handling to ensure consistent local time recording Corrected frontmatter property naming in Bases kanban drag-and-drop operations Property Display and Performance# Fixed custom property duplication when configured in both settings and filter bar Resolved unwanted total tracked time display showing zero values Standardized custom property identifiers with consistent prefix format Plugin Integration and Stability# Resolved Bases plugin integration issues and view switching problems Fixed kanban view loading with proper static imports and interface consistency Improved error handling and cleanup patterns for better stability Fixed API endpoints to respect custom status configurations (reported by @23maverick23, #487) Acknowledgments# Special Recognition# We extend special thanks to @renatomen for his exceptional contributions to this release: Created the enhanced project autosuggest system with configurable cards and selective search functionality (PR #555) Developed a proof-of-concept integration with the Bases plugin that demonstrated full compatibility and provided the technical foundation for our experimental Bases integration His innovative work on the Bases POC revealed that everything that I was hoping might be possible in a future integration with Bases was actually possible! Community Contributors# We're grateful to the community members whose issues were resolved in this release: @glpayson for providing detailed bug reports with reproduction steps that led to fixes for the startup crash with empty reminders (#583) and character handling improvements (#590) @mdbraber for requesting ICS export functionality that became a major feature in this release (#422) @TonyAtlas for the auto-archive feature request that resulted in the new status-based auto-archive system (#547) @anareaty for requesting clickable project links (#432) and reporting the \"This Week\" grouping label issue (#516) @pschoenbach for requesting multi-language NLP support, specifically German language support (#563) @23maverick23 for reporting API status configuration issues that improved custom status handling (#487) @Burrish for the documentation correction (#597) Full Changelog: 3.22.1...3.23.0"},{"title":"TaskNotes 3.23.1","url":"/obsidian/releases/3.23.1/","description":"Full Changelog: 3.23.0...3.23.1","product":"obsidian","text":"Bug Fixes# Bases Plugin Integration# Fixed Bases views not recognizing custom field mappings when using non-default property names. Status dots, priority colors, and dates now display correctly in Bases views when using custom field names, including Cyrillic and other localized property names. Thanks to @anareaty for reporting this issue (#607) Full Changelog: 3.23.0...3.23.1"},{"title":"TaskNotes v3.23.2 Release Notes","url":"/obsidian/releases/3.23.2/","description":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks.","product":"obsidian","text":"This release focusses on performance improvements. These improvements should be especially noticeable in vaults with a large number of tasks. New Features# Added agenda/list view to Advanced Calendar New {{contexts}} template variable for joining multiple context values New {{projects}} template variable for joining multiple project values Thanks to @Mara-Li for these additions Time Format Consistency# Plugin-wide 12hr/24hr time format preference support Consistent time display across all calendar views and components Thanks to @anareaty and @Astrusia for this suggestion #431 Performance Architecture# Centralized ViewPerformanceService for all TaskNotes views Global task version cache with change detection Debounced updates with configurable batching View-specific update handlers with selective refresh logic Memory management and automatic cache cleanup Bug Fixes# Fixed cursor positioning issues when creating subtask widgets Thanks to @jhedlund for this fix! Contributors# Special thanks to contributors: @jhedlund for fixing cursor positioning with subtasks @Mara-Li for implementing context/project template variables and bracket fixes @anareaty for reporting time format inconsistencies"},{"title":"TaskNotes v3.23.3 Release Notes","url":"/obsidian/releases/3.23.3/","description":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities.","product":"obsidian","text":"This release addresses critical bugs with project and subtask functionality, ensuring proper field mapping support and expanding project filtering capabilities. New Features# Project Property Filter Support# Added property-based filtering for project picker dropdown Configure projects to appear in picker based on frontmatter properties (e.g., type: project) Complements existing folder and tag filtering options Thanks to @aubreyz for requesting this feature enhancement (#660) Bug Fixes# Project/Subtask Field Mapping# Fixed project and subtask functionality not working when users customize project field names ProjectSubtasksService and MinimalNativeCache now properly respect user field mapping configuration Resolves issue where hardcoded 'projects' field lookup ignored custom field mappings Thanks to @JD2026 (#674), @anareaty, (#674) and @Volker-brdb (#672) and for reporting these subtask display issues Test Infrastructure# Added missing test mocks for isTaskUsedAsProjectSync and formatDateForStorage functions Ensures test suite stability for project-related functionality"},{"title":"TaskNotes 3.23.4","url":"/obsidian/releases/3.23.4/","description":"Special thanks to contributors:","product":"obsidian","text":"Bug Fixes# Task Scheduling & Natural Language Processing# Fixed Russian weekday scheduling conflict where single weekdays (e.g., \"воскресенье\") were incorrectly interpreted as recurring tasks instead of single-day scheduling (#665, thanks to @anareaty for the report) Fixed issue where natural language processing failed to save parsed time estimates in task creation modal (#682, thanks to @RumiaKitinari for the detailed report) Fixed scheduled task grouping UTC anchor regression that caused today's tasks to appear under \"Past Scheduled\" instead of \"Today\" (#384, thanks to @jcromwell for the report) Settings & Configuration# Fixed plugin failure when excluded folders setting contains trailing commas - the parsing logic now properly filters empty strings (#664, thanks to @Yoav6 for identifying this issue) Calendar & Time Management# Fixed calendar not refreshing when task duration or time tracking changes (#382, thanks to @mdbraber) Fixed calendar not refreshing after task archive or move operations Fixed timeblock editing using stored date instead of current date for past day modifications (#647, thanks to @RumiaKitinari) Fixed Pomodoro timer not preserving task context when auto-starting sessions (#641, thanks to @RumiaKitinari) Fixed all-day tasks not rendering properly across multiple days in calendar view (thanks to Danny Talks Tech for reporting this in his video review) User Interface# Fixed mini calendar header overflow issue in sidebar view (#459, with CSS improvements suggested by @jsonshanks, thanks to @girisumit for the report) New Features & Enhancements# Visual Improvements# Added file-text icon to note cards in agenda view for better visual distinction from headers and consistency with task and calendar event icons (#662, thanks to @ras0q for the suggestion) Improved mini calendar styling, interactions, and legend display Enhanced task dot visualization to reflect accurate matching dates Settings Organization# Moved timeblocking settings to Features tab with improved usage instructions for better discoverability Documentation# Updated documentation to fix auto-archiving settings reference (#673, thanks to @antonio for pointing out the inconsistency) Contributors# Special thanks to contributors: @anareaty for reporting the Russian weekday scheduling conflict @RumiaKitinari for detailed reports on natural language processing, timeblock editing, and Pomodoro timer issues @jcromwell for reporting the scheduled task grouping UTC regression @Yoav6 for identifying the excluded folders trailing comma issue @mdbraber for reporting calendar refresh issues with time tracking changes @girisumit for reporting the mini calendar header overflow issue @jsonshanks for providing CSS improvement suggestions for the mini calendar @ras0q for suggesting the file-text icon addition to agenda view @antonio for pointing out the auto-archiving documentation inconsistency Danny Talks Tech for reporting the all-day task rendering issue in his video review This release focuses primarily on bug fixes and stability improvements, particularly around calendar functionality, natural language processing, and user interface polish."},{"title":"TaskNotes 3.24.0","url":"/obsidian/releases/3.24.0/","description":"Special thanks to all this release's contributors:","product":"obsidian","text":"New Features# Agenda View Overdue Section# Added separate \"Overdue\" section in Agenda view instead of mixing overdue tasks with today's tasks (#557, thanks to @backyardbiomech for the detailed report) Collapsible section with task completion statistics and proper internationalization support Includes overdue recurring tasks based on their scheduled dates Task Dependencies and Blocking Relationships# Implemented blocking/blocked task dependencies with persistent relationships (#701, thanks to @prayidae for the detailed feature request) Tasks can be marked as blocking other tasks or blocked by other tasks Dependency relationships persist in frontmatter as structural links Dynamic blocked state computed based on blocking task completion status Task Card Widget in Notes# Added configurable task card widget displaying at the top of task notes (#576, thanks to @jhedlund for the request) Provides immediate access to task actions and context menus without requiring command palette Uses CodeMirror widget system for integration Appears above project subtasks widget when both enabled Can be disabled via settings Hierarchical Subgrouping# Implemented hierarchical subgrouping functionality for TaskListView and AgendaView (thanks to @renatomen for this major feature contribution) Allows two-level task organization (e.g., Group by Status, Subgroup by Priority) Cross-view support with consistent behavior State persistence for expand/collapse preferences Custom user fields supported as subgroup options Internationalization Support# Added i18n framework with multi-language support Support for German, Spanish, French, Russian, Chinese, and Japanese Translation coverage for command palette entries and UI strings Localized agenda and filter interface elements Template Variables# Added {{hashtags}} template variable for space-separated hashtag rendering (#612, thanks to @strazto for the suggestion) Added {{currentNoteTitle}} template variable for note-specific folder organization (#637, thanks to @Mara-Li for the request) Added template variable support for archive folder paths (#677, thanks to @dsebastien for the request) Fixed {{project}} variables to properly extract basenames from wikilinks (#490, thanks to @nsstrickland for the detailed bug report) Project and Subtask Management# Enhanced task modals with project and subtask management capabilities Added \"Add to project\" and \"Add subtasks\" sections in task creation/edit modals Context menu options for assigning tasks to projects and adding subtasks Collapsible lists with visual separators between form sections View and Grouping Enhancements# Added \"Completed Date\" as grouping option for analyzing productivity (#430, thanks to @anareaty for the suggestion) Added \"Status\" as sorting option in Kanban and Task List views (#633, thanks to @mdbraber for the report) Implemented per-grouping column persistence for Kanban views Smart default ordering respecting StatusManager and PriorityManager configurations Bug Fixes# Calendar and Advanced Calendar# Fixed calendar not refreshing when task duration or time tracking changes Fixed calendar not refreshing after task archive or move operations Fixed agenda duplication for all-day ICS events (#695, thanks to @realJohnDoe for the report) Added configurable eventMinHeight for Advanced Calendar to make short duration tasks readable (#718, thanks to @Ruboks-Cube for the detailed report) Fixed multi-day task creation in month/year view to properly calculate time estimates (#564, thanks to @same774 for the report) Kanban View# Fixed kanban view losing columns after upgrades (#689, thanks to @mikesale for the report) Fixed clearing filters defaulting to \"none\" instead of \"status\" grouping (#679, thanks to @camara-tech-pro for the question) Fixed column order changes when switching between views (#710, thanks to @phortx for the report) Fixed kanban drag-and-drop for custom field grouping (#494, thanks to @anareaty for the report) Enhanced save view modal functionality with improved styling and accessibility Task Management# Fixed HTTP API task creation to return sanitized title matching stored content (#635, thanks to @nightroman for the detailed report) Fixed #task tag being incorrectly added when using property-based task identification (#570, thanks to @RobbK17 for the report) Fixed recurring task completion styling in Bases views (#669, thanks to @jordandrako for the report) Hierarchical Tag Support# Added hierarchical tag support with exclusion patterns for Obsidian nested tags (#584, thanks to @renatomen for the detailed feature request) Hierarchical matching allows searching for parent tags to match child tags (e.g., t/ef matches t/ef/project, t/ef/task) Exclusion patterns support using - prefix to exclude specific tags and their children Maintains backward compatibility with existing substring matching Natural Language Processing and Tags# Fixed nested tags losing slashes in agenda view rendering (#712, thanks to @antonio for the report and fix) Added support for hyphens in NLP tag parsing (#568, thanks to @jordandrako for the report) Settings and Configuration# Fixed property value truncation in project autosuggest settings by adding input debouncing (#705, thanks to @aubreyz for the report) Improved webhook transform error handling with detailed logging (#719, thanks to @stephen-netu for the detailed report) Added save button disable logic to prevent duplicate task creation (thanks to @hamlim for the report and implementation) Code Quality and Development# Configured Prettier formatter for consistent code formatting (#717, thanks to @ras0q for the request) Applied ESLint fixes reducing problems from 209 to 97 Added format and format:check scripts for development workflow Fixed browser extension repository URL in README (thanks to @elijahmanor for the correction) Enhancements# Performance and Reliability# Added debouncing to project autosuggest property inputs Improved error handling for webhook transform failures User Interface# Added time display based on timeEstimate property in task statistics (thanks to Sergen Aras for the implementation) Enhanced language selection display with native scripts Settings Organization# Reorganized settings with improved categorization Added collapsible functionality to various UI sections Enhanced accessibility with proper button labeling Documentation# Added documentation for task dependencies feature Updated comprehensive subgrouping feature documentation Enhanced template variable documentation Updated various view documentation for new features Contributors# Special thanks to all this release's contributors: Feature Contributors# @renatomen for implementing the major hierarchical subgrouping feature and hierarchical tag support feature request (#584) @antonio for implementing nested tag slash preservation and providing the fix @elijahmanor for fixing the browser extension repository URL @sergenaras for implementing time display based on timeEstimate property in task statistics @hamlim for implementing save button disable logic to prevent duplicate task creation Issue Reporters and Feature Requesters# @backyardbiomech for the detailed overdue recurring tasks report (#557) @prayidae for the detailed task dependencies feature request (#701) @jhedlund for requesting task context menu in notes (#576) @anareaty for requesting completed date grouping (#430) and reporting kanban custom field drag issues (#494) @mdbraber for reporting missing status sorting option (#633) @strazto for requesting hashtags template variable (#612) @Mara-Li for requesting currentNoteTitle template variable (#637) @dsebastien for requesting archive folder template support (#677) @nsstrickland for the detailed project variable bug report (#490) @realJohnDoe for reporting ICS all-day event duplication (#695) @Ruboks-Cube for reporting short duration task rendering issues (#718) @same774 for reporting multi-day task creation issues (#564) @mikesale for reporting kanban column loss (#689) @camara-tech-pro for the kanban grouping question (#679) @phortx for reporting column order changes (#710) @nightroman for the detailed HTTP API title sanitization report (#635) @RobbK17 for reporting property identification tag issue (#570) @jordandrako for reporting recurring task styling in Bases (#669) and NLP tag parsing with hyphens (#568) @aubreyz for reporting project autosuggest truncation issue (#705) @ras0q for requesting code formatting improvements (#717) @stephen-netu for the detailed webhook transform script loading report (#719)"},{"title":"TaskNotes 3.24.1","url":"/obsidian/releases/3.24.1/","description":"This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes.","product":"obsidian","text":"Bug Fixes# Task Card Widget# Fixed task card widget appearing on all notes instead of only task notes Widget now properly respects task identification settings (tag or property-based) This patch release fixes the task card widget introduced in 3.24.0 to only display on actual task notes."},{"title":"TaskNotes 3.24.2","url":"/obsidian/releases/3.24.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#766) Fixed tag parsing incorrectly identifying notes with tags containing \"task\" (like \"pkm-task\") as task notes Added exact hierarchical tag matching for task identification to prevent false positives Preserved substring matching behavior for filter bar searches where it's desired Only exact matches or hierarchical children (like \"task/work\") now identify notes as tasks Thanks to @anareaty and @fastrick for reporting this issue (#767) Fixed subgroups not rendering under the \"Overdue\" agenda group Thanks to @renatomen for reporting this issue (#768) Fixed calendar view appearing empty in week and day views due to invalid time configuration values Added time validation in settings UI with proper error messages and debouncing Added runtime sanitization in calendar with safe defaults (00:00:00, 24:00:00, 08:00:00) Prevents \"Cannot read properties of null (reading 'years')\" error from FullCalendar Thanks to @kmaustral for reporting (#769) Fixed NLP processor incorrectly assigning hardcoded \"waiting\" status when \"blocked\" appears in task titles NLP now only uses user-defined status configurations when available, ignoring hardcoded fallback patterns Prevents unexpected status assignments for users with custom status workflows Fallback patterns still work when no custom status configurations are defined Thanks to @renatomen for reporting this issue"},{"title":"TaskNotes 3.24.3","url":"/obsidian/releases/3.24.3/","description":"TaskNotes documentation.","product":"obsidian","text":"(#776) Fixed screens failing to load with \"toLowerCase is not a function\" error Issue occurred when frontmatter tags array contained non-string values (numbers, booleans, etc.) Added type validation to filter out non-string values before processing tags Valid string tags continue to work normally while invalid types are safely skipped Thanks to @kmf and @Andre-Ioda for help debugging this issue"},{"title":"TaskNotes 3.24.4","url":"/obsidian/releases/3.24.4/","description":"(#768) Fixed calendar view crashes when tasks contain null values in grouping fields","product":"obsidian","text":"Fixed# (#768) Fixed calendar view crashes when tasks contain null values in grouping fields Added null/undefined checks in sort comparisons to prevent localeCompare errors Calendar now handles null values in tags, contexts, and custom fields gracefully Thanks to @kmaustral for reporting (#601) Fixed Unicode characters not displaying in tags and contexts Unicode characters (Š, Ė, Ž, Ą, etc.) are now properly preserved in tags and contexts Affects Agenda View, Task List View, and all other views displaying tags Thanks to @Kapinekas for reporting (#778) Fixed cursor artifacts in CodeMirror widgets Thanks to @jhedlund for the fix Fixed task card widgets in note editor not updating for archive and time tracking changes Task card widgets now properly detect when tasks are archived/unarchived Task card widgets now properly detect when time tracking starts/stops Blue \"tracking\" border now appears/disappears correctly in live preview Archive styling now updates correctly in live preview Changed# (#751) Status bar tracked task click behavior now opens task notes directly Single tracked task: opens the task note immediately Multiple tracked tasks: shows selector modal to choose which task note to open Provides faster access to tracked tasks compared to previous task list view (#727) \"Create New Inline Task\" command now respects the \"Include Current Note in Project\" setting When enabled, the current note is automatically added as a project to inline tasks Provides consistency with instant convert functionality Thanks to @chrisfeagles for the suggestion Improved link handling throughout the plugin using Obsidian's native APIs Replaced manual wikilink generation with FileManager.generateMarkdownLink() Now respects user's link format settings (wikilink vs markdown, relative paths) Replaced manual link parsing with parseLinktext() for proper alias handling Better compatibility with future Obsidian updates Added centralized link utilities in linkUtils.ts Refactored widget cursor styles into reusable utility class Consolidated shared CSS into .cm-widget-cursor-fix utility Improved maintainability across widget components"},{"title":"TaskNotes 3.24.5","url":"/obsidian/releases/3.24.5/","description":"(#806) Fixed Bases views crashing on Obsidian 1.10.0 startup","product":"obsidian","text":"Fixed# (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#792, #800) Fixed markdown-style project and dependency links not being recognized in frontmatter Added support for markdown link format [text](path) in projects and blockedBy fields Handles URL-encoded paths like [Car Maintenance](../../projects/Car%20Maintenance.md) Markdown links now render as clickable links showing display text instead of raw [text](path) format Links are properly resolved for grouping, filtering, and project-task associations Previously only wikilink format [[path]] was supported Prevents automatic removal of project assignments when editing tasks Thanks to @minchinweb for reporting (#780) Fixed \"Cannot Create Timeblocks\" error when daily notes folder doesn't exist Added proper error handling when createDailyNote fails due to missing folder Improved error messages to guide users to check Daily Notes plugin configuration Prevents uncaught errors from obsidian-daily-notes-interface package Thanks to @uberunix for reporting"},{"title":"TaskNotes 3.24.6","url":"/obsidian/releases/3.24.6/","description":"(#440) Fixed inline task replacement not working for links with relative paths","product":"obsidian","text":"Added# Added release notes viewer New view displays release notes in a dedicated tab when plugin updates Automatically opens after updating to a new version Access anytime via command palette \"TaskNotes: View release notes\" or Settings > General Release notes are rendered using native Obsidian markdown rendering Includes link to view all releases on GitHub Fully internationalized with i18n support Auto-generation system ensures correct version is loaded without manual updates Fixed# (#440) Fixed inline task replacement not working for links with relative paths Markdown links with relative paths like [task](../../../GTD/tasks/task.md) now display inline previews Wikilinks with relative paths now work correctly Removed overly aggressive path sanitization that was stripping .. from all link paths Works in both Live Preview and Reading Mode Thanks to @minchinweb for reporting (#814) Fixed markdown links in projects field not being recognized on Project notes Tasks with markdown-style project links [text](path) now appear in project's Subtasks section Updated project link detection to use parseLinkToPath utility which handles both wikilinks and markdown links Handles URL-encoded paths like [z Test Project](z%20Test%20Project.md) Thanks to @minchinweb for reporting (#827) Fixed project links being generated as markdown links for users with markdown links enabled in Obsidian settings Project links in frontmatter are now always generated as wikilinks [[link]] by default for Obsidian compatibility Obsidian does not support markdown links in frontmatter properties without third-party plugins Added optional setting to enable markdown links in frontmatter for users with obsidian-frontmatter-markdown-links plugin Setting only appears when user has markdown links enabled globally in Obsidian Thanks to @nightroman for reporting"},{"title":"TaskNotes 3.25.0","url":"/obsidian/releases/3.25.0/","description":"Added Calendar view for Bases plugin integration (requires Bases 1.10.0+)","product":"obsidian","text":"Added# Added Calendar view for Bases plugin integration (requires Bases 1.10.0+) Supports month, week, day, year, and list views Property-based events from note date properties (configurable start date, end date, and title properties) Custom card rendering in list view for tasks, timeblocks, ICS events, and property-based events Layout options: time format, weekend visibility, all-day slot, today highlight, scroll time, event height Visibility toggles for event types (scheduled, due, recurring, time entries, timeblocks, property-based) Date validation to handle invalid property values Drag-and-drop to update property-based event dates in frontmatter Full internationalization support for calendar features in 7 languages (English, French, Spanish, German, Japanese, Russian, Chinese) Added grouped rendering support for Bases integration list and kanban views List view displays collapsible groups with toggle controls Kanban view renders grouped columns with drag-drop support Automatically detects ungrouped views and renders as flat list (#842) Added keyboard navigation support for task forms Action bar icons now focusable with proper tab order and ARIA attributes Enter and Space keys trigger actions on focused elements Added submenu support for reminders button for better keyboard accessibility Improved focus indicators for better visual feedback Thanks to @maybetm for this excellent contribution! Changed# Migrated Bases integration to use public API (Bases 1.10.0+) with graceful fallback to internal API for older versions Fixed# (#789) Fixed folder path truncation in settings causing tasks to be created in wrong paths Changed debounce to trailing mode to ensure final value is saved instead of partial input Fixes issue where rapid typing, paste, or autocomplete would save incomplete folder paths Thanks to @sascha224 for reporting (#806) Fixed Bases views crashing on Obsidian 1.10.0 startup TaskNotes Bases views (Task List and Kanban) now restore correctly when already open at startup Added defensive checks in setEphemeralState to handle early lifecycle calls Added focus() method to view objects for proper restoration Made root elements focusable to support Obsidian 1.10.0 view lifecycle (#825) Fixed single/double click settings not applying to calendar views Shared click handling now works consistently across Advanced Calendar and Bases Calendar Ctrl/Cmd+click opens tasks in new tab as expected Single and double-click actions respect user settings (#699) Fixed Obsidian freezing when moving calendar tab to new window Skip calendar resize during window transfer to prevent freeze Calendar may display incorrectly after move but can be fixed by switching views Prevents complete UI lockup during tab transfer (#816) Fixed template variables not processing in ICS subscription note folder paths Template variables like {{year}}, {{month}}, {{date}} now work in ICS note folder settings Extracted folder template processing into shared utility for consistency Added support for ICS-specific variables: {{icsEventTitle}}, {{icsEventLocation}}, {{icsEventDescription}} Users can now organize ICS notes in date-based hierarchies (e.g., Daily/{{year}}/{{month}}/) Thanks to @j-peeters for reporting (#813) Fixed subscribed ICS calendars irregularly disappearing from calendar views Added 5-minute grace period after cache expiration to keep events visible during refresh Trigger automatic background refresh when cache is stale or missing Initialize ICS service instances early so views can register event listeners before data loads Prevents disappearance during network errors or when calendar opens at Obsidian startup Thanks to @j-peeters for reporting (#829) Fixed time estimates and recurrence patterns being lost during instant task conversion Added timeEstimate field to ParsedTaskData interface Time estimates from natural language parsing now properly transferred to task frontmatter Parsed values now take priority over default settings RRule strings passed directly without conversion (preferred format) Thanks to @Justin-Burg for reporting (#826) Fixed task card widget not appearing when Obsidian starts with task note open Deferred dispatch calls to avoid \"EditorView.update not allowed during update\" error Widget now renders correctly on startup without requiring workarounds Thanks to @nightroman for reporting (#781), (#841) Fixed ICS calendar events displaying incorrect times due to timezone conversion issues Events with non-IANA timezone identifiers (e.g., TZID=Zurich without VTIMEZONE) now display at correct local times Fixed Outlook/Exchange calendar events showing original timezone instead of user's local timezone Replaced unreliable toJSDate() conversion with toUnixTime() for accurate UTC timestamp handling Affects all ICS subscriptions including Infomaniak, Outlook, and other providers with non-standard timezone formats Thanks to @chrlaney for reporting and @wilf80 for detailed analysis (#810) Fixed recurring tasks with overdue due dates disappearing from agenda view Recurring tasks now check both due and scheduled dates for overdue status Previously only scheduled was checked for recurring tasks, causing tasks with overdue due dates to be hidden Ensures consistent overdue detection logic between recurring and non-recurring tasks Thanks to @skyrunner15 for reporting (#822) Fixed mini calendar showing incorrect dates in negative UTC offset timezones Calendar tooltips and month displays now show correct dates for users in Americas/Pacific timezones UTC-anchored dates are now converted to local calendar dates before formatting Fixes off-by-one day error that affected date selection and display Thanks to @kenhsmith for reporting"},{"title":"TaskNotes 3.25.1","url":"/obsidian/releases/3.25.1/","description":"(#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice","product":"obsidian","text":"Fixed# (#854) (#695) Fixed all-day ICS calendar events displaying on wrong day and appearing twice All-day events now stored as date-only strings (YYYY-MM-DD) instead of UTC timestamps Events display on correct calendar date regardless of user timezone (fixes issue in PST, EST, and other negative UTC offset timezones) All-day events no longer appear twice in Agenda view Updated all date parsing throughout the codebase to handle date-only format correctly Maintains compatibility with FullCalendar and preserves iCalendar RFC 5545 semantics for VALUE=DATE events Thanks to @needo37 for reporting #854 and @realJohnDoe for reporting #695 (#859) Fixed multi-day task creation in Bases calendar view Extracted shared task creation logic to calendar-core.ts for consistency between calendar views Multi-day all-day selections now correctly set time estimate based on number of days dragged Timed task selections (week view) now correctly calculate duration in minutes Single-day clicks no longer override default time estimate settings Both Bases calendar and AdvancedCalendarView now use same logic for consistent behavior Fixed all-day task rendering to use 24-hour days (1440 minutes = 1 day on calendar) Follows UTC Anchor principle for date-only strings Thanks to @anareaty for reporting"},{"title":"TaskNotes 3.25.2","url":"/obsidian/releases/3.25.2/","description":"(#857) Fixed Mini Calendar opening previous day's daily note when clicked","product":"obsidian","text":"Fixed# (#857) Fixed Mini Calendar opening previous day's daily note when clicked Affects users in negative UTC offset timezones (Americas, Pacific) Thanks to @tsweezy for reporting (#871) Fixed Bases Kanban drag-and-drop updating wrong property when grouped by custom fields Added support for both Bases 1.10.0+ format ({property: string, direction: string}) and legacy string format Note: GroupBy is not exposed in the Bases public API (config.get('groupBy') returns undefined) Known limitation: When grouping by projects, Bases groups by literal wikilink strings, not resolved file paths Tasks with different wikilink formats pointing to the same project file will appear in separate columns Example: [[Project]], [[path/to/Project]], and [[Project|Alias]] create separate columns This differs from native TaskNotes Kanban which resolves all wikilinks to absolute paths Thanks to @kmaustral for reporting Added# Added date navigation configuration for Bases calendar views Hardcoded date option: Set a specific date (YYYY-MM-DD format) for the calendar to display on load Property-based navigation: Automatically navigate to dates from filtered note properties Three navigation strategies: First result, Earliest date, or Latest date Changed# Release notes now bundle all versions from current and previous minor series with collapsible sections Added setting to disable automatic release notes display after updates"},{"title":"TaskNotes 3.25.3","url":"/obsidian/releases/3.25.3/","description":"(#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled","product":"obsidian","text":"Added# (#877) Added standard Obsidian CSS classes to settings tab buttons for improved theme compatibility Fixes issue where themes like Retroma couldn't distinguish active tabs Thanks to @Bregor for the contribution Fixed# (#899) Fixed \"Folder for converted tasks\" setting being hidden when convert button is disabled Setting now always visible since it affects command palette task conversion Resolves confusion for users who convert tasks via command palette Thanks to @nnnell for the fix (#905), (#907) Fixed project filter incorrectly affecting custom field suggestions Custom field wikilink suggestions ([[) now show all vault files instead of only filtered projects Task Edit modal now uses consistent hierarchical tag matching with Task Creation modal Thanks to @renatomen for the thorough fix and tests"},{"title":"TaskNotes 3.25.4","url":"/obsidian/releases/3.25.4/","description":"(#937), (#956) Added optional setting to hide identification tags in task cards","product":"obsidian","text":"Added# (#937), (#956) Added optional setting to hide identification tags in task cards New \"Hide identification tags in task cards\" setting (only visible when using tag-based identification) Hides exact matches (e.g., #task) and hierarchical children (e.g., #task/project, #task/work/urgent) Reduces visual clutter while keeping tags in frontmatter for organizational purposes Backward compatible - disabled by default Thanks to @renatomen for implementing this feature and @edakimling for reporting (#911) Added custom field suggestion filtering New autosuggestFilter field to UserMappedField interface allows filtering suggestions by current filter context Added collapsible filter section in settings with visual indicator Comprehensive test coverage for custom field filtering feature Thanks to @renatomen for this enhancement Fixed# (#903) Fixed Edit Task modal not adding completedDate when marking tasks as done Edit Task modal now correctly adds completedDate when changing status to completed Fixed Edit Task modal adding empty contexts and projects arrays to frontmatter Behavior now consistent with other completion methods (Agenda view, widget context menu, quick actions) Thanks to @nightroman for reporting (#969), (#967) Fixed Bases Kanban layout not displaying correctly when no groupBy is configured All tasks were appearing in a single \"None\" column Columns now appear in the order defined in TaskNotes settings (not alphabetical) Detects invalid Bases grouping and falls back to status-based grouping Tasks are properly distributed across status columns Thanks to @mweichert for the fix and @PacoTaco2, @abuhammer for reporting"},{"title":"Tasknotes 3.25.6","url":"/obsidian/releases/3.25.6/","description":"(#1013) Fixed inability to subscribe to Apple iCloud calendars","product":"obsidian","text":"Fixed# (#1013) Fixed inability to subscribe to Apple iCloud calendars Calendar URLs copied from Apple Calendar (starting with webcal://) can now be pasted directly Previously required manually changing the URL format before it would be accepted Works with both standard and secure calendar URLs (webcal:// and webcals://) Thanks to @nickbirch51 for reporting (#1022) Fixed tasks randomly disappearing from views and not being recognized Tasks would appear initially but disappear after a few seconds, especially during long sessions Restarting Obsidian or using \"Refresh Cache\" would only temporarily fix the issue Thanks to @seepage87 for reporting and @alejandrospoz for help debugging (#968) Fixed timeEntries being duplicated when mapped to custom property name When timeEntries was configured to use a custom property name in Metadata settings (e.g., time_entries), saving tasks would create duplicate entries in both the custom property and the default timeEntries property FieldMapper now correctly uses only the configured property name for time tracking data Thanks to @minchinweb for reporting this issue (#953) Fixed non-task notes incorrectly appearing as subtasks in views Notes with Parent or project properties but no task tag/property no longer show up as tasks Views now update correctly when task tags are removed from files Improved performance for large vaults by optimizing cache invalidation Thanks to @renatomen for reporting and submitting PR #955"},{"title":"Untitled","url":"/obsidian/releases/3.3.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.1.1...3.3.0"},{"title":"Untitled","url":"/obsidian/releases/3.4.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.3.0...3.4.0"},{"title":"Untitled","url":"/obsidian/releases/3.4.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.4.1"},{"title":"Untitled","url":"/obsidian/releases/3.4.2/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.1...3.4.2"},{"title":"Untitled","url":"/obsidian/releases/3.5.1/","description":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache.","product":"obsidian","text":"This release focusses on significant performance improvements by migrating away from the baroque plugin caching system to Obsidian's native cache. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.4.0...3.5.1"},{"title":"Untitled","url":"/obsidian/releases/3.6.0/","description":"Fix task tag check. Add optional timeblocking.","product":"obsidian","text":"Fix task tag check. Add optional timeblocking."},{"title":"TaskNotes v3.7.0 Release Notes","url":"/obsidian/releases/3.7.0/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0","product":"obsidian","text":"Reading Mode Task Previews (thank you @amithkk)# Task link previews now work in Reading Mode in addition to Live Preview Consistent interactive experience across all Obsidian view modes Same functionality: click to edit, right-click for context menu, hover for file preview New ReadingModeTaskLinkProcessor.ts with dedicated CSS styling Task Action Palette# New quick-action command palette for rapid task management Access via command palette: \"TaskNotes: Open Task Action Palette\" Change status/priority with fuzzy search, set dates, start/stop timers, archive/delete tasks Handles recurring task instances vs. series intelligently Fully keyboard navigable with categorized actions Natural Language Task Input# Parse natural language when creating tasks: \"Buy groceries tomorrow 3pm high priority @home #errands\" Powered by chrono-node for robust date/time parsing Extracts dates, priorities, status, contexts (@), tags (#), recurrence, and time estimates Multi-line support: first line parsed, additional lines become task details Toggle in Settings → Basic Defaults UI/UX Improvements# Enhanced Task Creation Modal# Smart input mode with simplified interface when natural language is enabled Progressive disclosure to detailed form when needed Better conversion flow with pre-populated forms Live filename preview as you type Settings & Modal Improvements# Moved Natural Language Input to Basic Defaults section Updated task link overlay description to mention both view modes Reusable confirmation modal for consistent dialogs Better error handling and accessibility improvements Bug Fixes# Fixed: Inline Tasks Not Respecting Default Status & Priority (Issue #58)# Problem: Inline task conversion applied \"none\" instead of configured defaults Solution: Changed useDefaultsOnInstantConvert default from false to true Timer Function Standardization# Fixed browser compatibility by replacing Node.js timer types with browser-native timers Resolved timing issues across different environments Enhanced Task Link Overlays# Better path resolution with security enhancements Graceful fallbacks for invalid or missing task files Improved handling of rapid view changes Technical Improvements# Enhanced Date Support# Full due date and scheduled date support in task creation and filename generation New filename template variables: {dueDate} and {scheduledDate} (YYYY-MM-DD format) Support for ISO dates, relative dates, named dates, and natural language Performance & Code Quality# Improved event handling with better refresh logic Layout change listeners for immediate overlay updates Enhanced error handling with user-friendly messages Better TypeScript types and modular design New Files & Dependencies# New Files# src/editor/ReadingModeTaskLinkProcessor.ts src/modals/TaskActionPaletteModal.ts src/services/NaturalLanguageParser.ts src/modals/ConfirmationModal.ts styles/task-action-palette-modal.css New Dependency# chrono-node: Natural language date parsing library What's Changed# Feat/task previews in reading mode by @amithkk in https://github.com/callumalpass/tasknotes/pull/57 New Contributors# @amithkk made their first contribution in https://github.com/callumalpass/tasknotes/pull/57 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.6.0...3.7.0"},{"title":"Version 3.7.1","url":"/obsidian/releases/3.7.1/","description":"Files with Major Changes:","product":"obsidian","text":"Major UI/UX Enhancements# Interactive Inline Task Previews# Clickable Status Dots: Status indicators in inline task previews are now interactive - click to cycle through task statuses directly from the preview Clickable Date Fields: Due and scheduled dates are now clickable and open dedicated modals for quick editing Enhanced Visual Design: Redesigned with minimal styling Improved spacing and vertical alignment between status dots, priority indicators, and task titles Better hover effects with brightness and subtle animations Status dots now use bordered design for better visibility Modernized Task Card Design# Interactive Status Cycling: Click status dots on task cards to quickly change task status Improved Mobile Support: Better touch targets and responsive behavior Enhanced Animations: Smooth hover effects, scaling, and transition animations Cleaner Layout: Streamlined design with better visual hierarchy Enhanced Natural Language Processing# Advanced Date Parsing# Explicit Trigger Recognition: Now recognizes specific phrases: Due dates: \"due on\", \"deadline\", \"must be done by\", \"needs to be completed\" Scheduled dates: \"scheduled for\", \"start on\", \"work on\", \"planned for\" Configurable Defaults: New setting to choose whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Recurrence Patterns: \"every [weekday]\" patterns (every monday, every friday) Plural day patterns (mondays, tuesdays, etc.) \"Every other\" interval patterns (every other week, every 2 days) Multiple days (\"every tuesday and thursday\") Improved Date/Time Handling# Better Time Component Support: Enhanced parsing of specific times with dates Robust Validation: Improved handling of edge cases and malformed input Smart Cleanup: Automatic removal of duplicate tags and contexts Performance & Developer Experience# Instant Task Conversion Improvements# Real-time Updates: Task link overlays refresh immediately after task conversion Smart Caching: Improved metadata cache management for newly created tasks Better Error Handling: Enhanced validation with user-friendly error messages Multi-line Support: Enhanced conversion of tasks with details from multiple selected lines Technical Improvements# Improved Event Handling: Fixed n.dispatch is not a function error with proper validation BEM CSS Methodology: Migrated to Block Element Modifier naming for better CSS organization Performance Optimizations: Reduced unnecessary re-renders and improved widget caching Enhanced State Management: Better synchronization between UI updates and task data Modal & Interface Enhancements# Enhanced Date/Time Modals# Better Keyboard Navigation: Enter to save, Escape to cancel Separate Time Inputs: Dedicated date and time fields for precision Quick Date Buttons: Common date selections for faster input Improved Accessibility: Proper ARIA labels and screen reader support Better User Experience# One-Click Status Changes: Direct status cycling from any task preview Direct Date Editing: Click any date to immediately edit it Enhanced Visual Feedback: Better hover states, transitions, and loading animations Accessibility Improvements: Enhanced keyboard navigation and screen reader support Bug Fixes & Stability# Fixed: Inline task widget dispatch errors that caused console warnings Fixed: Vertical alignment issues with different-sized status and priority indicators Fixed: Layout conflicts between flexbox and inline display properties Fixed: Spacing issues in inline task previews causing cramped appearance Fixed: Missing task link overlay refreshes after instant task conversion Configuration & Settings# New User Settings# Natural Language Default: Configure whether ambiguous dates default to \"due\" or \"scheduled\" Enhanced Task Creation: Improved default value application for instant task conversion Technical Details# Files with Major Changes: Enhanced inline task previews (TaskLinkWidget.ts, TaskLinkOverlay.ts) Modernized task card design (TaskCard.ts) Advanced natural language processing (NaturalLanguageParser.ts) Improved modal interfaces (DueDateModal.ts, ScheduledDateModal.ts) Comprehensive CSS overhaul with BEM methodology"},{"title":"Untitled","url":"/obsidian/releases/3.8.1/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.8.1"},{"title":"TaskNotes 3.8.5 Release Notes","url":"/obsidian/releases/3.8.5/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5","product":"obsidian","text":"UI/UX Improvements# Compact Filter Bar (Special thanks to @amithkk :tada: )# Complete redesign of FilterBar component with compact, modern interface Native Obsidian dropdowns replace basic HTML select elements for better consistency Collapsible controls - settings are hidden by default with expandable controls via settings button Visual indicators showing active filter count on settings button Integrated search bar with search icon and improved visual hierarchy Right-aligned control buttons for better layout organization Advanced Calendar View Integration# Unified view options - calendar view toggles now integrated into FilterBar dropdown Streamlined interface - removed separate toggle controls in favor of FilterBar integration Consistent UX across different view types with shared filter/view controls Dynamic option management with real-time updates and state synchronization Enhanced Natural Language Processing# Improved Text Processing# Better whitespace handling with new cleanupWhitespace() function for consistent text normalization Enhanced priority detection with improved pattern matching and conflict resolution Completion status support - added isCompleted field to parsed task data More robust text extraction across tags, contexts, priorities, and dates Date and Time Handling Improvements# Enhanced date parsing with better timezone handling for date-only strings Improved date normalization with direct Date constructor to avoid timezone issues Better error handling for invalid date strings and edge cases More robust timestamp formatting with validation checks Testing Infrastructure# Comprehensive Test Suite# Complete testing infrastructure with Jest configuration for both unit and integration tests Enhanced mocking system with improved Obsidian API mocks and better type safety Integration test helpers with utilities for end-to-end workflow testing Improved test coverage across core components and services Mock Improvements# Updated mock factories with better type consistency and realistic data generation Enhanced DOM simulation for better UI component testing Improved date-fns mocking with support for \"MMM d, yyyy h:mm a\" format Better Obsidian API compatibility in test mocks Developer Experience# Type Safety Enhancements# Refactored type definitions for improved consistency across the codebase Better TypeScript integration with enhanced type checking and inference Improved callback types for better development experience Build and Deployment# Updated GitHub Actions with artifact uploader v4 for improved CI/CD Enhanced development workflow with better testing and build processes User Interface Polish# Task Creation Modal# Improved placeholder text with more natural language examples Better user guidance for natural language task input format Clearer instruction formatting for enhanced user experience Visual Consistency# Native Obsidian styling throughout filter and control components Consistent iconography using Obsidian's icon system Improved responsive design with better mobile and small screen support Bug Fixes and Stability# Error Handling# Improved error handling in date parsing and normalization functions Better validation for user input and edge cases Enhanced robustness in text processing and natural language parsing Code Quality# Refactored components for better maintainability and performance Simplified scheduled date logic with cleaner default handling Enhanced code organization with better separation of concerns What's Changed# Add compact filter bar by @amithkk in https://github.com/callumalpass/tasknotes/pull/73 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.1...3.8.5"},{"title":"Untitled","url":"/obsidian/releases/3.8.6/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.5...3.8.6"},{"title":"Untitled","url":"/obsidian/releases/3.8.7/","description":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7","product":"obsidian","text":"Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.8.6...3.8.7"},{"title":"Release Notes v3.9.0","url":"/obsidian/releases/3.9.0/","description":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful...","product":"obsidian","text":"This release introduces a host of new features, bug fixes, and significant enhancements to improve your task and time management experience. Key updates include a more powerful and standards-compliant recurrence system, a streamlined user interface, and improved performance. A special thank you to amithkk (https://github.com/amithkk) for their contributions to this release! New Features# RRule-Based Recurrence: Task recurrence is now powered by the iCalendar standard (RFC 5545), allowing for more complex and flexible recurring task schedules. A migration assistant will help you update your existing tasks to the new format. Interactive Recurring Task Calendar: An interactive calendar has been added to the task edit modal, allowing you to visualize and manage individual completions of recurring tasks. \"Show\" Dropdown in Filter Bar: A unified \"Show\" dropdown has been added to the filter bar, providing enhanced filtering options for your tasks. Insert Tasknote Link Command: A new command has been added to insert a link to a tasknote, streamlining your workflow. Dedicated Inline Task Folder Setting: You can now specify a dedicated folder for inline tasks, with support for {{currentNotePath}} to save tasks in the same folder as the current note. \"Show Due Dates When Scheduled\" Setting: A new setting allows you to display due dates for scheduled tasks in the calendar view. Compact Filter Bar: A more compact filter bar option is now available for a cleaner interface. (Thanks, amithkk!) Multiple New Ribbon Icons: New ribbon icons have been added for extended views and actions, providing quicker access to features. \"Highlight Today\" in Calendar View: The calendar view now highlights the current day for better visibility. New Documentation Site: A new documentation site, built with MkDocs, is now available with improved structure and searchability. CI/CD and Testing: A comprehensive testing suite using Jest has been added to improve code quality and prevent regressions. GitHub Actions workflows have been implemented for automated testing, documentation deployment, and releases. Enhancements# UI/UX Improvements: The task edit and creation modals have been redesigned for a more minimalist and intuitive experience. Task-related icons have been updated for better clarity. Context menus have been added to task cards for quick actions. The agenda view sorting options have been fixed. The recurring calendar widget is now centered and on a separate line from its label. Dropdown menus now handle clicks on text labels more reliably. Performance and Reliability: The task link overlay has been refactored to use a ViewPlugin for better performance. The Advanced Calendar view now handles resizing and being moved to a new window more gracefully. The natural language processing for task creation has been improved with a fallback mechanism. Date parsing and handling have been made more robust, especially for UTC and different date formats. Development Workflow: ESLint configuration has been updated with new rules and plugins for better code consistency. The build process for CSS has been improved. The development guidelines have been updated to reflect the new architecture. Bug Fixes# Fixed an issue where agenda view sorting options were not working correctly. Fixed a bug that caused a forced reflow when moving the Advanced Calendar to a new window. Resolved a TypeError in the task modal's suggestion filtering. Fixed an issue where the Pomodoro task selector did not show all un-archived tasks. Corrected the filtering of daily notes in the getNotesForDate function. Fixed a bug where the underlying markdown of a task link was not revealed on hover. Removed misleading placeholder symbols from the settings. Addressed various linting issues and improved code quality. Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.7.1...3.9.0"},{"title":"Release Notes: 3.9.1","url":"/obsidian/releases/3.9.1/","description":"New Features","product":"obsidian","text":"New Features GitHub Issue Templates: Added templates for bug reports and feature requests to streamline issue submission and ensure all necessary information is provided. Bug Fixes Pomodoro Timer: Fixed an issue where a long break would incorrectly start after the first work session. The timer now correctly schedules a short break as intended. Task Creation: The \"Magic Wand\" (Natural Language Processing) now properly fills the context and tag fields in the task creation modal. Default contexts and tags are preserved if none are found in the natural language input. What's Changed# Add github issue templates by @amithkk in https://github.com/callumalpass/tasknotes/pull/101 Full Changelog: https://github.com/callumalpass/tasknotes/compare/3.9.0...3.9.1"},{"title":"TaskNotes 4.0.0-beta.0","url":"/obsidian/releases/4.0.0-beta.0/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. What's New in v4# TaskNotes v4 migrates all views to the Bases system. Breaking Changes# Minimum Obsidian version: 1.10.1 View commands now use Bases files - Ribbon icons and command palette commands (Calendar, Kanban, Tasks, Agenda, Project Subtasks) now open .base files created automatically in your vault Saved filter views - Custom saved views can be converted to .base files using a conversion button in settings Added# OAuth Calendar Integration# Google Calendar and Microsoft Outlook integration via OAuth 2.0 View and sync calendar events in Bases calendar Drag events in the TaskNotes bases calendar to change the event's time online Events sync every 15 minutes or upon local change Requires creating your own OAuth application (approximately 15 minutes) See Calendar Setup Guide Time Entry Editor Modal# Dedicated interface for managing time entries Alt-drag on Bases calendar to create time entries View total tracked time per task Edit and delete time entries Access via Task Action Palette (Alt/Opt + Enter) Kanban Swimlane Layout# Horizontal swimlane grouping option for Bases Kanban Group tasks by status, priority, or other fields Hide empty columns Configurable column widths Improved drag-and-drop in swimlane mode Saved View Converter# Conversion button in settings to convert saved filter views to .base files Original settings preserved Converted views created in TaskNotes/Views/ Changed# View System Architecture# All views now use Bases architecture Calendar, Kanban, Tasks, Agenda, and Project Subtasks are .base files Views stored in TaskNotes/Views/ Keyboard shortcuts and ribbon icons map to .base files Configure file paths in Settings → Integrations → Bases Integration Calendar# Control which calendar sources display Toggle Google Calendar, Microsoft Calendar, and ICS events independently Configurable list view with custom day count (2-10 days) Improved timezone handling for recurring events Settings# Reorganized settings tabs OAuth calendar settings in Integrations tab Updated help text Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" TaskCreationModal, TaskEditModal, and InstantTaskConvertService now respect taskIdentificationMethod setting Thanks to @jack2game Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events Migration Guide# First Launch# Default view files are created automatically in TaskNotes/Views/ Ribbon and command palette commands now open .base files Review Settings → General to customize view file paths Converting Saved Filter Views# Go to Settings → General Click the conversion button to convert saved filter views to .base files Converted views appear in a file in TaskNotes/Views/ Calendar Integration (Optional)# Go to Settings → Integrations → OAuth Calendar Integration Follow the Calendar Setup Guide Create OAuth applications with Google and/or Microsoft (approximately 15 minutes) Enter Client ID and Secret in calendar cards Click Connect Known Limitations# Quick OAuth setup is disabled - only advanced setup (your own credentials) is available Saved filter views require manual conversion using the button in settings Migration is one-way - downgrading to v3 may require manual reconfiguration OAuth setup requires creating applications with Google/Microsoft Feedback# Report issues on GitHub. Include: Obsidian version Steps to reproduce Console errors (Ctrl/Cmd + Shift + I) Whether issue occurs after migration or fresh install"},{"title":"TaskNotes 4.0.0-beta.1","url":"/obsidian/releases/4.0.0-beta.1/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Added context menus for time entries and ICS events in calendar Time entries: Right-click shows task context menu, left-click opens time entry editor modal ICS/Google/Microsoft Calendar events: Right-click shows ICS event context menu with options to show details, create task/note, link note, and copy info Added calendar icon to ICS event titles for better visual distinction Added hover tooltips for timeblocks in calendar views Added MiniCalendar view for Bases integration Monthly calendar grid with dot indicators on days with notes Configurable date property (file.ctime, note.dateCreated, etc.) Fuzzy selector modal for selecting notes on clicked days Ctrl+click (or Cmd+click on Mac) on any day opens/creates daily note Added virtual scrolling and lazy rendering to Bases views for high-performance handling of large datasets TaskListView: Virtual scrolling for 100+ tasks in flat and grouped views with collapsible groups KanbanView: Virtual scrolling for regular columns (30+ tasks) and swimlane cells (30+ tasks per cell) Tested with up to 30,000 notes with no performance degradation Thanks to @aubreyz and @turingexmachina for their reports of performance issues and diagnosis help Changed# Refactored Bases integration to use public API and trust pre-sorted data Migrated all three views (Task List, Kanban, Calendar) to clean class-based architecture Removed legacy view files and ~500 lines of redundant sorting/grouping logic Introduced BasesDataAdapter, PropertyMappingService, and BasesViewBase abstractions Trusts Bases plugin to provide pre-sorted and pre-grouped data via public API Reduced code duplication by 40% while maintaining full feature parity Refactored calendar modules to use ES6 imports instead of lazy require() calls Removed all dynamic require() calls from calendar-core.ts and calendar-view.ts Consolidated all imports at module top level Improves code maintainability, makes dependencies explicit, and follows modern TypeScript best practices Time entry events now show task context menu on right-click (previously had no context menu) Replaced MinimalNativeCache with just-in-time TaskManager for improved reliability Removed complex index synchronization in favor of direct MetadataCache queries Eliminated 7 internal indexes (tasksByDate, tasksByStatus, overdueTasks, etc.) Added minimal DependencyCache for task dependencies and project references only Zero startup time (no index building required) Always provides fresh, accurate task data from Obsidian's MetadataCache Completed internationalization with 100% translation coverage across all supported languages Added 90 missing translation keys to English base Completed 829 translations across 6 languages (German, Spanish, French, Japanese, Russian, Chinese) All locales now have complete coverage (1745/1745 keys) Improved translation quality for migration system, calendar settings, statistics, ICS events, and filter components Migrated to i18n-state-manager CLI tool for translation management Replaced custom scripts with more robust i18n-state-manager package Added i18n-state.config.json for project-specific patterns New features: find-unused, check-duplicates, improved stale detection Hash-based state tracking and ripgrep-based scanning for performance Bases view templates now generate dynamically based on user settings Task filters adapt to user's task identification method (tag or property) Property ordering reflects defaultVisibleProperties setting Uses correct YAML object notation for Bases filters Maintains backward compatibility with legacy static templates Updated Bases CalendarView to show TaskNotes in property-based events Tasks can now be visualized on calendar via any date property (dateCreated, scheduled, due, etc.) Previously all TaskNotes were filtered out from property-based events Fixed# (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled Eliminated race condition caused by index synchronization delays TaskManager now reads directly from Obsidian's MetadataCache instead of maintaining separate indexes No more timing-sensitive code that could conflict with other plugins' metadata processing Tasks will always be visible regardless of other plugins' processing times Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, camara-tech for reporting and help debugging. (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar Removed unnecessary dynamic imports that were causing module resolution failures Consolidated imports at top of calendar-core.ts module Thanks to @jalooc for reporting this issue Fixed task dependencies not displaying on task cards TaskManager now properly calculates isBlocked and isBlocking flags from dependency data Added missing property extractors and renderers in TaskCard for all dependency-related fields Dependency information now shows correctly in Bases views, task note widgets, and other views Shows \"Blocked (n)\" and \"Blocking (n)\" pills, plus detailed task links Fixed Bases property mapping for user-configured field names PropertyMappingService now correctly strips prefixes and applies FieldMapper transformations Example: User configures \"state\" → \"status\", Bases provides \"note.state\", now correctly maps to \"status\" Ensures TaskCard properly recognizes and renders user-configured properties Fixed Bases views not respecting user-configured visible properties Now prioritizes Bases 1.10.0+ public API config.getOrder() method Removed reliance on internal API paths that no longer work Filters out blocked/blocking properties when using defaults (only shown when explicitly requested via blockedBy) Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter DateValue objects have {date: Date, time: boolean} structure Now properly checks for value.date instanceof Date before legacy conversion methods Fixes property-based events in CalendarView"},{"title":"TaskNotes 4.0.0-beta.2","url":"/obsidian/releases/4.0.0-beta.2/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# (#1090) Portuguese (Brazil) translation Full Portuguese (pt-BR) localization support A big thanks to @andysteel for the contribution Configurable task modal fields New \"Modal Fields\" settings tab for complete control over task creation and edit modals Configure which fields appear in creation vs edit modals independently Drag-and-drop reordering of fields within groups (metadata, organization, dependencies, custom) Enable/disable individual fields (including core fields like contexts, tags, time estimate) Organize fields into groups Automatic migration of existing user-defined fields Title and details fields support visibility toggling (ordering fixed for consistency) Rich markdown editor for NLP task creation Replaced plain textarea with full CodeMirror markdown editor Live preview, syntax highlighting, and wikilink support Ctrl/Cmd+Enter keyboard shortcut to save task Esc/Tab keyboard shortcuts for modal control Customizable NLP triggers with autocomplete Configure custom trigger characters/strings for each property type (tags, contexts, projects, status, priority) Supports user-defined field triggers CodeMirror-based autocomplete with keyboard navigation (arrow keys, Enter, Tab) Quote support for multi-word values in user fields Native tag suggester integration when using # trigger Inline task link overlay enhancements Configurable visible properties for inline task cards PropertySelectorModal for selecting which properties to display Improved layout: title prioritized, horizontal scrolling for metadata Real-time updates when task data changes New utility services TriggerConfigService - manages NLP trigger configurations PropertySelectorModal - reusable multi-select property picker Property helpers for consistent property handling across views Kanban column reordering via drag and drop Drag column headers to reorder columns Column order is saved per grouping property Visual feedback during drag operations Mini calendar enhancements (in progress) Week numbers column Heat map intensity visualization Note preview tooltips on hover Keyboard navigation Unified Relationships widget Consolidated project subtasks, task dependencies, and blocking relationships into a single dynamic widget Four automatic tabs: Subtasks (Kanban), Projects (List), Blocked By (List), Blocking (Kanban) Tabs automatically show/hide based on available relationship data Bases views handle all data updates reactively - no manual refresh needed Single configuration setting: show/hide and position (top/bottom) Significantly reduced code complexity (430 fewer lines) Fixed# (#1084) Fixed word wrapping in NLP preview items Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space Embedded bases now scroll internally instead of expanding to show all tasks Consistent behavior between task list and kanban embedded views Thanks to @same774 for reporting with screenshot Bases Calendar view options now working correctly Fixed \"Highlight today\" toggle not applying - now properly adds/removes CSS class when toggled Fixed calendar view type (month/week/day/etc) not being saved when changed via calendar buttons View type is now persisted when users click month/week/day buttons in the calendar UI (#1050) Task modal no longer adds unwanted empty contexts and projects arrays FieldMapper now checks if arrays are empty before writing to frontmatter Thanks to @nightroman for reporting this issue Inline task link overlay fixes Fixed layout prioritization: title now prioritized over metadata Added horizontal scrolling for metadata to prevent overflow Fixed real-time update listeners for task data changes Fixed group collapse/expand functionality in TaskListView Re-registered click event listener for group headers using Component API Groups can now be properly collapsed and expanded Fixed config loading race condition in KanbanView and CalendarView Config is now properly loaded in onload() lifecycle method Views wait for config before rendering options Fixed MiniCalendarView to use direct Bases API like other views Consistent use of Component lifecycle methods Proper cleanup in onunload() Changed# NLP system overhaul Replaced StatusSuggestionService wrapper with direct NaturalLanguageParser usage Consolidated trigger configuration into unified TriggerConfigService Enhanced NaturalLanguageParser with full trigger and user field support Removed custom # tag autocomplete in favor of Obsidian's native tag suggester (when using # trigger) Task card and editor improvements Simplified TaskCard interface - removed unused options (showCheckbox, showArchiveButton, groupByDate) Refactored TaskLinkWidget to use unified TaskCard component for consistency Added support for inline vs. block layout modes in task cards Improved task card BEM CSS with better styling for inline mode Settings UI enhancements NLP triggers now configurable through Settings > Features tab Added settings for inline task card visible properties Improved appearance tab with property selector integration Better organization of NLP-related settings Refactored Bases views to use Component lifecycle properly Views now extend Component and use onload()/onunload() Automatic cleanup of event listeners via Component.registerDomEvent() Improved state management and ephemeral state handling Improved development experience Converted ESLint errors to warnings for non-blocking development Fixed various linting issues and unused imports Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Breaking Changes# Relationships widget settings consolidated (automatic migration) Old settings removed: showProjectSubtasks, projectSubtasksPosition, showTaskDependencies, taskDependenciesPosition New unified settings: showRelationships, relationshipsPosition Widget now appears on ALL notes (tasks, projects, regular notes) - Bases filtering controls which tabs are visible Migration: Existing users will see the new unified widget automatically. If you had project subtasks enabled, relationships widget will be enabled by default Bases file change: The command mapping changed from 'project-subtasks': 'TaskNotes/Views/project-subtasks.base' to 'relationships': 'TaskNotes/Views/relationships.base' Run \"Create Default Files\" in Settings > General to create the new relationships.base file"},{"title":"TaskNotes 4.0.0-beta.3","url":"/obsidian/releases/4.0.0-beta.3/","description":"Beta Release","product":"obsidian","text":"Beta Release You may encounter issues. Report problems on GitHub Issues. Added# Updated task card styling Increased status dot size from 16px to 18px Added subtle shadows and transitions to card hover states Updated hover effects on status and priority dots with scaling and removed glow Modified metadata pills with backdrop blur and adjusted spacing Added box shadows to interactive elements (dates, projects, tags) on hover Updated animations to use cubic-bezier easing Added gradient accents to subtask and blocking task borders Fixed subtasks appearing behind parent card hover backgrounds Fixed subtask click and context menu events bubbling to parent cards Fixed subtasks inheriting parent priority and status colors (#361) Added completion-based recurrence support with recurrence_anchor field Tasks can now recur based on completion date instead of scheduled date Set recurrence_anchor: completion in task frontmatter to enable this behavior When completing a recurring task, the next occurrence will be scheduled relative to the completion date The DTSTART in the RRULE automatically updates to the completion date, ensuring calendar views show future occurrences at the correct dates Defaults to scheduled (original behavior) if not specified Useful for tasks like \"Exercise weekly\" where you want the next occurrence 7 days after you actually complete it, not 7 days after it was scheduled Example: Complete a weekly task 2 days late, and the next occurrence will be 7 days from the completion date (not the original scheduled date) Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Added support for skipped recurrence instances with skipped_instances field Recurring tasks can now have individual instances marked as \"skipped\" without completing them Skipped instances are stored in the skipped_instances frontmatter array (e.g., [\"2025-11-15\", \"2025-11-22\"]) Right-click on a recurring task instance in calendar views to skip/unskip it Visual styling differentiates skipped instances: Calendar views: Gray background with muted appearance Task cards: Strike-through text with gray styling Skipped instances don't affect the recurrence pattern - future instances continue as scheduled Useful for holidays, vacations, or other planned exceptions to recurring tasks Thanks to @mdbraber for the suggestion to use an array similar to complete_instances, and @jerzy-dudzic for reporting the issue Fixed# (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed Increased look-ahead period for yearly recurrence from 365 days to 800 days (~2.2 years) Also optimized look-ahead periods for other frequencies: daily (30 days), weekly (90 days), monthly (400 days) Ensures the next occurrence is always found when completing recurring task instances Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views Extended the look-ahead period for yearly recurring tasks when generating calendar instances Calendar views now look ahead ~2.2 years for yearly tasks to ensure occurrences appear even in short date ranges Only displays instances that fall within the actual visible calendar range Weekly recurring tasks were unaffected and continued to work correctly Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata Calendar subscription lastFetched and lastError fields are now stored in memory instead of being saved to disk Prevents git conflicts when syncing vaults across multiple computers that independently fetch calendar subscriptions The \"last synced\" timestamp in settings will reset on plugin reload, but subscriptions will re-fetch automatically Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules The custom recurrence modal now correctly parses and displays the start date and time fields Fixed parser that was splitting on = instead of : for DTSTART values (#1097) Fixed custom properties and formulas not displaying in Bases views Updated TaskCard to use Bases API's getValue() method for formulas and custom note properties Formulas now work correctly using formula.NAME syntax Custom note properties now work correctly using note.PROPERTY syntax Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation Fixed double-prefix bug in relationships template that generated invalid filter expressions like note.note.projects Fixed race condition where files created during plugin load wouldn't appear in file explorer Default Bases files now generate with correct property paths and appear reliably in the file explorer Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view Removed stale selectedDate property that was never updated in v4 Tasks view now uses fresh UTC-anchored \"today\" for correct recurring task completion status Fixes issue where tasks completed yesterday would appear crossed out today for users in positive UTC offset timezones Also fixed KanbanView to use UTC-anchored dates for consistency Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion User-defined fields like >customfield value now properly convert to frontmatter when using the \"TaskNote: Convert task to TaskNote\" command Fixed fields appearing with internal IDs (e.g., field_1761435101864) instead of configured frontmatter key names Array values are now properly joined with commas Added userFields property to ParsedTaskData interface to support custom fields throughout the conversion flow Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings Updated CSS min-width from 280px to 200px and max-width from 350px to 500px to match slider range Column width slider now works correctly across the full 200-500px range Kanban view now shows empty columns for all user-defined statuses when grouping by status Empty columns appear for custom statuses defined in settings, even when no tasks have that status Allows users to drag tasks into empty status columns Works in both flat kanban view and swimlane mode Respects the existing \"Hide empty columns\" setting Thanks to @williamcheuk03 for reporting this issue"},{"title":"TaskNotes 4","url":"/obsidian/releases/4.0.1/","description":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda...","product":"obsidian","text":"TaskNotes 4.0.1 is a stability-focused major release that finishes the migration to Obsidian's Bases core plugin. Every task-facing view (Task List, Kanban, Calendar, Agenda, Mini Calendar, and the embedded Relationships widget) now runs on .base files. This refactor simplifies the plugin codebase, removes bespoke UI logic, and lets workflows feel native to Obsidian—views are just files in your vault. Highlights# New features and improvements: Performance improvements Virtual scrolling in Task List and Kanban views handles 30,000+ tasks without performance degradation OAuth calendar integration Google Calendar and Microsoft Outlook bi-directional sync Drag calendar events in the TaskNotes calendar to update them online Configurable modals and NLP New Modal Fields settings tab for moving, hiding, or requiring fields in create/edit modals Rich markdown editor and customizable NLP triggers, including autocomplete for user fields Time management features Time Entry Editor Modal Improved Timeblock creation and management Completion-based recurrence with recurrence_anchor field Skippable recurrence instances Bases architecture changes: Bases-first architecture Task views ship as .base files inside TaskNotes/Views/ Commands and ribbon buttons now open files you control Filtering/grouping/sorting uses Bases YAML instead of TaskNotes-specific UI Agenda is a dedicated list-mode calendar .base file for fast daily/weekly reviews Inline workflows stay in sync Unified Relationships widget embeds a Bases view so project subtasks, dependencies, and blocking tasks stay in one place Task cards inside notes honor the same Bases filtering/grouping rules as standalone views Why Bases?# Moving everything to Bases allowed us to delete thousands of lines of bespoke filtering logic, state management, and widget code. The plugin now leans on Obsidian's supported API, which: Reduces maintenance overhead and improves reliability Lets advanced users version-control and audit their view definitions Makes saved views portable between vaults Keeps TaskNotes behavior consistent with other Obsidian-native workflows Upgrade Notes# Obsidian 1.10.1 or later is required (Bases public API with group-by support) Enable the Bases core plugin before opening TaskNotes views Run Settings → TaskNotes → General → Create Default Files if you need fresh .base files Use Export All Saved Views to Bases to convert any legacy FilterBar saved views into .base files The Relationships widget uses TaskNotes/Views/relationships.base; adjust that file to change what appears inside notes Breaking Changes# The old FilterBar UI has been removed—all filtering and saved views live in .base files Legacy widget settings (showProjectSubtasks, showTaskDependencies, etc.) were replaced with showRelationships and relationshipsPosition Task view commands now fail if their mapped .base file is missing; configure paths under Settings → TaskNotes → General → View Commands Priority sorting now uses alphabetical order instead of custom weights In v3, TaskNotes used priority \"weights\" to determine sort order (higher weight = higher priority) In v4, Obsidian's Bases plugin sorts priorities alphabetically by their value The weight field has been removed from the settings UI Workaround: Name your priority values to sort alphabetically in your desired order Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Agenda view has been replaced by the list view in Calendar Grouping is not supported in this view, so the \"Overdue\" group is no longer provided A separate \"Overdue\" view is available in the \"Task List\" base file Known Issues# Users upgrading from versions prior to 3.x should export saved views to Bases before deleting old plugin data Embedded Bases views still require the Bases plugin to remain enabled; disabling Bases will hide TaskNotes task views Details# Added# Virtual scrolling and lazy rendering to Bases views for handling thousands of notes without performance degradation - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis Google Calendar and Microsoft Outlook integration via OAuth 2.0 with automatic syncing Time Entry Editor Modal for managing time entries (Alt-drag on calendar to create) Kanban Swimlane Layout with horizontal grouping and configurable column widths Saved View Converter button in settings to convert v3 saved filter views to .base files Context menus for time entries and ICS events in calendar views Calendar icon to ICS event titles for better visual distinction Hover tooltips for timeblocks in calendar views MiniCalendar view for Bases integration with monthly grid and dot indicators - Thanks to @aubreyz and @turingexmachina for reporting performance issues and help with diagnosis (#1090) Portuguese (Brazil) translation - Thanks to @andysteel for the contribution Configurable task modal fields with drag-and-drop reordering in new \"Modal Fields\" settings tab Rich markdown editor for NLP task creation with syntax highlighting and wikilink support Customizable NLP triggers with autocomplete and keyboard navigation Inline task link overlay enhancements with configurable visible properties Kanban column reordering via drag and drop with saved order per grouping property Mini calendar enhancements including week numbers, heat map visualization, note preview tooltips, and keyboard navigation Unified Relationships widget consolidating project subtasks, dependencies, and blocking relationships with automatic tabs Updated task card styling with improved hover effects, shadows, and gradient accents (#361) Completion-based recurrence support with recurrence_anchor field for tasks that recur based on completion date - Thanks to @luciolebrillante for the original feature request, and @jhedlund, @nschenone, @BryanWall, @realJohnDoe, and @kazerniel for additional input and interest (#416) Support for skipped recurrence instances with skipped_instances field and right-click skip/unskip in calendar - Thanks to @mdbraber for suggesting the array approach and @jerzy-dudzic for reporting the issue Sub-grouping support to Bases Task List view with nested grouping by any property and collapsible groups Documentation for default Bases templates showing all default .base file templates with examples Changed# All views (Calendar, MiniCalendar, Kanban, Tasks, Agenda, Project Subtasks) now use Bases architecture with .base files Calendar sources (Google, Microsoft, ICS events) can be toggled independently with improved timezone handling Reorganized settings tabs with OAuth calendar settings in Integrations tab Refactored Bases integration to use public API and trust pre-sorted data Refactored calendar modules to use ES6 imports instead of lazy require() calls Time entry events now show task context menu on right-click Replaced MinimalNativeCache with just-in-time TaskManager for zero startup time and always-fresh task data Completed internationalization with 100% translation coverage across all 6 supported languages Migrated to i18n-state-manager CLI tool for improved translation management Bases view templates now generate dynamically based on user settings with adaptive task filters Updated Bases CalendarView to show TaskNotes in property-based events NLP system overhaul with consolidated trigger configuration and direct NaturalLanguageParser usage Simplified TaskCard interface and refactored TaskLinkWidget for consistency Settings UI enhancements with NLP triggers configurable through Features tab Refactored Bases views to use Component lifecycle properly with automatic cleanup Improved development experience by converting ESLint errors to warnings Renamed \"Advanced Calendar\" to \"Calendar\" throughout the UI Improved timeblock visual styling in calendar views with reduced border width and softer shadows Updated \"Export All Views\" button to \"Export V3 Views\" to clarify it migrates v3 saved views Improved internationalization (i18n) support in General settings tab with all Bases integration settings using translation keys Changed default Tasks List template view order with \"All Tasks\" first and added \"Unscheduled\" view Fixed# (#843) Fixed task tag being added when \"Identify tasks by\" is set to \"Property\" - Thanks to @jack2game for reporting Fixed dark mode calendar borders Fixed Bases Kanban column ordering - Thanks to @mweichert for reporting Fixed state management bug in FilterSettingsComponent Fixed timezone handling for recurring events (#1022, #684) Fixed tasks randomly disappearing when Smart Connections plugin is enabled by eliminating race condition - Thanks to @alejandrospoz, @seepage87, @amarjt, @luckb0x, and camara-tech for reporting and help debugging (#992) Fixed \"Failed to resolve module specifier 'obsidian'\" error when moving recurring task instances in calendar - Thanks to @jalooc for reporting Fixed task dependencies not displaying on task cards with proper isBlocked and isBlocking flags Fixed Bases property mapping for user-configured field names Fixed Bases views not respecting user-configured visible properties Fixed MiniCalendar UTC anchoring for consistent timezone-independent date handling Fixed DateValue conversion in BasesDataAdapter for property-based events in CalendarView (#1084) Fixed word wrapping in NLP preview items - Thanks to @maybetm for the fix (#975) Fixed advanced calendar list headers not respecting theme colors - Thanks to @hugohil for the fix (#1089) Fixed embedded task list bases growing unbounded and leaving large empty space - Thanks to @same774 for reporting with screenshot Fixed \"Highlight today\" toggle and calendar view type persistence in Bases Calendar view options (#1050) Fixed task modal adding unwanted empty contexts and projects arrays - Thanks to @nightroman for reporting Fixed inline task link overlay layout prioritization and horizontal scrolling for metadata Fixed group collapse/expand functionality in TaskListView Fixed config loading race condition in KanbanView and CalendarView Fixed MiniCalendarView to use direct Bases API like other views (#893) Fixed yearly recurring tasks not always updating scheduled date to next occurrence when completed - Thanks to @VenturaNotes for reporting (#951) Fixed yearly recurring tasks not showing up in calendar's weekly, 3-day, or day views - Thanks to @bespokecomp for reporting (#889) Fixed git merge conflicts in calendar subscription metadata by storing in memory instead of disk - Thanks to @karlfrohlich for reporting Fixed recurrence modal not loading DTSTART date/time when editing existing recurrence rules (#1097) Fixed custom properties and formulas not displaying in Bases views using getValue() method - Thanks to @cathywu for reporting (#1099) Fixed issues with default Bases file creation including double-prefix bug and race condition - Thanks to @kmaustral for reporting (#1110) Fixed open recurring tasks appearing crossed out in Tasks view by using UTC-anchored dates - Thanks to @kmaustral for reporting (#1118) Fixed user-defined fields not working in inline task conversion to TaskNote - Thanks to @guncav for reporting Fixed kanban column width CSS constraints not matching settings slider range Fixed Kanban view showing empty columns for all user-defined statuses when grouping by status - Thanks to @williamcheuk03 for reporting (#1103) Fixed TaskNotes/Views folder being created unnecessarily on startup - Thanks to @Wayment9504 for reporting (#1133) Fixed empty priority columns not showing in Kanban view when \"Hide empty columns\" is disabled - Thanks to @luckb0x for reporting Fixed OAuth calendar cards showing \"Unknown account\" by removing non-functional Account field - Thanks to @Oblique for reporting Fixed incorrect Bases syntax in default template files with correct parameter naming Fixed incorrect Bases syntax in \"Export V3 Views\" feature with correct YAML structure (#1127) Fixed custom priority colors not being respected in Task List and Subtasks sections - Thanks to @HPmattsloper for reporting (#1043) Fixed inability to set \"at time of event\" (0 offset) as default reminder in settings - Thanks to @dblinnikov for reporting (#1055) Fixed break sessions being logged as type: work when started via command/hotkey - Thanks to @0-BSCode for reporting and debugging (#1024) Fixed date/time picker immediately closing when selecting time on iPhone by refactoring to native Modal components - Thanks to @3zra47 for reporting (#1122) Fixed inline task titles being truncated too aggressively with increased max-width - Thanks to @jacorvillo for reporting Fixed Obsidian crashes when invalid time values entered in Bases calendar view configuration (#1120) Fixed custom field mappings not being respected throughout the application - Thanks to @kmaustral for reporting (#1121) Fixed custom user fields being saved with auto-generated IDs instead of user-defined property keys - Thanks to @guncav for reporting (#1123) Fixed relationships widget only displaying on task notes, now appears on both task and project notes - Thanks to @dblinnikov for reporting Fixed time entries not showing in calendar view for tasks without scheduled or due dates (#1091) Fixed task card and relationships widgets appearing inside footnote editors - Thanks to @3zra47 for reporting (#1086) Fixed calendar \"+more\" popover showing white text on white background in dark mode - Thanks to @same774 for reporting (#1076) Fixed inability to create timeblocks ending at midnight (00:00) - Thanks to @skoove for reporting (#958) Fixed cursor jumping and layout shifts when typing near task card or relationships widgets in live preview - Thanks to @thesmithmode for detailed debugging information (#513) Fixed task card and relationships widgets not appearing in reading mode and fixed critical memory leak - Thanks to @berzernberg for reporting Removed# Removed StatusSuggestionService (functionality consolidated into NaturalLanguageParser) Removed legacy FilterBar UI - all filtering now lives in .base files Removed legacy views"},{"title":"TaskNotes 4.0.2","url":"/obsidian/releases/4.0.2/","description":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have repor...","product":"obsidian","text":"This release fixes some of the more urgent (and easy-to-fix) bugs that were introduced in the v4 major release. Thanks to everyone for your patience, and to those who have reported issues, for taking the time to do so. There will be more releases over the coming weeks to iron out some of v4's kinks. Added# Added \"Not Blocked\" view to default task list template Shows incomplete tasks that are ready to work on (not blocked by incomplete dependencies) Uses Bases list.filter() to check completion status of each blocking task This new view can be accessed by regenerating the Task List view, or by copying the filters from the default base templates documentation Fixed# (#1145, #1156) Fixed default Kanban view requiring manual 'Group by' configuration Default Kanban template now automatically includes groupBy property set to status Resolves \"Kanban requires a 'Group by' property to be configured\" error on first use Users no longer need to manually configure grouping through the Sort menu Thanks to @randomness42 and @seepage87 for reporting Fixed user-defined custom fields appearing as user:field_xxx in generated base templates Custom fields now use their actual property names (e.g., effort instead of user:field_1761435303709) Ensures Bases can properly query user-defined properties Also fixed totalTrackedTime to correctly map to the configured timeEntries property name (#1145) Improved Kanban error message when no 'Group by' property is configured Now includes instructions: \"Click the 'Sort' button and select a property under 'Group by'\" Thanks to @randomness42 for the suggestion (#1139, #1141) Fixed relationships widget not appearing in project notes Project references are now resolved to full file paths when indexing Uses Obsidian's link resolution API to handle wikilinks, markdown links, and relative paths Restores v3.x behavior where subtasks appear in parent project notes Thanks to @jhedlund, @n1njaznutz, and @luckb0x for reporting and testing Fixed dependency blocking status to be status-aware \"Blocked (x)\" pill now only appears when tasks have incomplete blocking dependencies Tasks with all completed blocking dependencies no longer show as blocked Fixed cache invalidation bug causing blocking/blocked pills to disappear when editing tasks When a task is modified, only forward dependencies are cleared (stored in its frontmatter) Reverse dependencies are preserved (stored in other tasks' frontmatter) Changed# Removed custom TaskNotes icon from task modals Task creation and edit modals now use Obsidian's standard title styling Thanks to @kepano for the suggestion Moved default base templates documentation to docs/views/ Location: docs/views/default-base-templates.md Added cross-references to official Obsidian Bases documentation Updated code comments to reference new documentation path Fixed incorrect quote escaping in default base templates documentation YAML examples now use proper single quotes for strings containing double quotes"},{"title":"TaskNotes 4.0.3","url":"/obsidian/releases/4.0.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1157) Fixed task embeds appearing on new line instead of inline with bullets in lists Changed inline task cards to use span elements instead of divs for proper inline flow Added max-width constraint to prevent wrapping when tasks are wider than editor Task embeds now display correctly inline with bullet points during live preview Thanks to @3zra47 for reporting (#1168) Fixed mini calendar stealing focus every few seconds when pinned to sidebar Thanks to @DearHaruHaru for reporting (#1161, #1162) Fixed \"unexpected scalar\" YAML parsing error in generated tasks-default.base template Changed nested quotes in \"Not Blocked\" filter from double to single quotes Thanks to @benschifman and @InterstellarRaccoon for reporting, @GarrettKaupp for identifying the fix Changed# Updated task modal UI to use native Obsidian patterns for better theme compatibility Thanks to @kepano for feedback"},{"title":"TaskNotes 4.0.4","url":"/obsidian/releases/4.0.4/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1134, #779) Added CMD+Enter (Mac) / Ctrl+Enter (Windows/Linux) keyboard shortcut support for saving in all modals Works from any input field in task creation, task edit, time entry, timeblock, and property selector modals Thanks to @luckb0x, @hamlim and @nightroman for the feature requests Fixed# (#1181) Fixed vertical overflow in Kanban view columns with fewer than 15 tasks Prevents cards from extending beyond column boundaries before virtualization activates Thanks to @lomarcanys for reporting (#1177) Bases views now anchor recurring completion and calendar navigation to the right date Recurring completion from Bases Task List/Kanban uses the task's scheduled/due date instead of \"today\" (fixes complete_instances) Bases calendar navigation and property-based events use UTC anchors to avoid previous-day jumps Thanks to @nslee123 for flagging the issue Bases calendar navigation now respects UTC-anchored dates to avoid landing on the previous day Corrected all-day end date calculation to prevent off-by-one spans Added regression test for the UTC anchor behavior Thanks to KaCii for flagging the issue Changed# Refactored plugin styling to better align with Obsidian's native UI conventions Replaced all cursor: pointer with cursor: var(--cursor) (100+ instances) to follow Obsidian's cursor convention Removed forced border: none; box-shadow: none rules that were fighting against Obsidian's native button styling Scoped custom .tn-btn button system to settings modal only (.mod-settings), allowing Obsidian's native button styles to work elsewhere Thanks to @kepano for guidance"},{"title":"TaskNotes 4.0.5","url":"/obsidian/releases/4.0.5/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# (#790) Task edit modal now shows unresolved project links with appropriate styling Similar to how dependencies are displayed, unresolved projects now appear with visual indication Hovering over an unresolved project shows a tooltip explaining it couldn't be resolved Thanks to @aubreyz for reporting Fixed# (#1011) Fixed chevrons incorrectly showing on tasks with no subtasks Project index was incorrectly adding all linked files instead of only files referenced in the projects field Now properly parses the projects field and only indexes those specific files as projects Also fixed alias handling in project and dependency links - aliases are now correctly stripped before link resolution Thanks to @craziedde for reporting (#1200) Fixed kanban drag & drop not updating task properties correctly Dragging tasks to different columns now properly triggers business logic (completedDate, auto-archive, webhooks) Previously, kanban updates bypassed updateProperty and directly modified frontmatter Thanks very much to @tvoklov for the PR (#1203) Fixed autocomplete dropdown being clipped inside NLP field boundaries Configure CodeMirror tooltips to render in document.body instead of constrained editor container Prevents suggestion dropdown from being hidden when it extends beyond the NLP field height Thanks to @Andrei-Ioda for reporting (#1172) Fixed task lists and checkboxes rendering incorrectly in task details editor Remove padding-left override on .cm-line to allow CodeMirror decorations (checkboxes, indentation) to render properly Content padding is now handled by .cm-content while .cm-line uses natural spacing Thanks to @nightroman for reporting Fixed relationships widget not appearing on project notes without frontmatter Widget now correctly shows on any note referenced as a project by tasks, regardless of whether the note has frontmatter Fixed task card and relationships widgets not appearing when opening notes in source mode Removed live preview mode restriction to allow widgets to render in both source and live preview modes (#901) Fixed calendar view toolbar buttons overflowing on narrow screens Added flex-wrap: wrap to calendar header toolbar to allow buttons to wrap to multiple lines Thanks to @RumiaKitinari for reporting (#1193), (#1194), (#1185) Fixed new calendar views not respecting user's default calendar settings Previously, new Bases calendar views used hardcoded inline defaults instead of user-configured preferences Calendar view initialization now correctly uses plugin.settings.calendarViewSettings as the fallback Thanks @ki5ck, @minchinweb and @ThamirysOlv for reporting Fixed calendar to ensure that it respects user's locale Tries to use calendar locale, then tries UI language, then system language, then falls back to English (#1043) Fixed default reminders with \"at time of event\" (0 offset) not being applied to tasks UI was displaying \"1\" instead of \"0\" for zero-offset reminders in settings Thanks to @dblinnikov for reporting (#1206) Fixed NLP status parsing regressions with trigger prefixes and temporal keywords Manually typing status trigger + label now correctly parses (e.g., *Done when label is Done) Status values containing temporal keywords no longer misparsed as dates (e.g., Expedite = Now) Thanks very much to @renatomen for the PR (#1212) Fixed \"Show release notes on update\" toggle not saving correctly Thanks to @Jon-dog for reporting (#1197) Add Portuguese language to list of translations in general tab settings Allows users to select the Portuguese translation option Thanks to @andysteel for the PR Fixed file properties displaying incorrectly in Bases views File properties like file.name, file.basename, file.size, etc. were showing as \"Title\" or returning null Now correctly extracts and displays all file properties from Obsidian's file metadata Supports both direct TFile properties (name, basename, extension, path, size, ctime, mtime) and computed properties (links, embeds, tags, backlinks, aliases)"},{"title":"TaskNotes 4.1.0","url":"/obsidian/releases/4.1.0/","description":"(#1245), (#793) Added custom icon support for task statuses","product":"obsidian","text":"Added# (#1245), (#793) Added custom icon support for task statuses Configure a Lucide icon name (e.g., check, circle, clock) per status in Settings → Task Properties → Task Statuses Icons display instead of the colored dot, inheriting the status color Browse available icons at lucide.dev Improves accessibility by allowing shape-based status differentiation Thanks to @3Fish for the feature request and @Raonmir2, @aubreyz, @prayidae, and @anareaty for the discussion on accessibility and icon-based indicators (#1259) Added Property Types Reference documentation Documents expected data types (text, list, date, number) for all frontmatter properties Includes format specifications, examples, and a complete YAML reference Thanks to @Oblique82 for the suggestion (#1248) Added formula property support for sub-grouping in Bases Task List view Formula properties (e.g., formula.myFormula) now appear in the Sub-group by dropdown Supports all Bases Value types including strings, numbers, booleans, dates, and lists Thanks to @prayidae for the feature request (#1070) Added formula property support for swimlanes in Bases Kanban view Formula properties now appear in the Swim Lane dropdown Fixed swimlanes displaying empty when grouping by formula properties Note: Dragging tasks between formula-based columns/swimlanes is disabled (formulas are computed values) Thanks to @cathywu for reporting (#1010), (#1126) Added batch task selection and editing in Task List and Kanban views Shift+click to select multiple tasks Right-click selected tasks to open batch context menu Batch operations: change status, priority, due date, scheduled date, archive, delete Drag multiple selected cards in Kanban to move them together Click the selection count indicator to clear selection Thanks to @jalooc and @solidabstract for the feature requests (#1207) Added inline search box to Bases views (Task List, Kanban, Calendar) Enable via \"Enable search box\" toggle in view settings Searches across title, status, priority, tags, contexts, projects, and visible custom properties Press Escape or click × to clear search Thanks to @renatomen for the PR (#363) Added \"Create or open task\" command with NLP-based quick task creation Open via command palette or assign a hotkey Search existing tasks or type natural language to create new tasks (e.g., \"Buy groceries tomorrow #shopping\") Press Enter to select an existing task, Shift+Enter to create a new task Real-time preview shows parsed title, due date, priority, tags, and other metadata Can be used when adding sub-tasks to create sub-tasks on-the-fly Thanks to @luciolebrillante for the feature request (#1044), (#1222) Added unsaved changes confirmation when closing task edit modal Detects modifications to any field (title, dates, priority, tags, etc.) Shows confirmation dialog with Save/Discard/Keep Editing options Prevents accidental data loss from clicking outside the modal or pressing Escape Thanks to @renatomen for the PR and @0-BSCode for the feature request (#904) Added visual highlighting for overdue and past dates on task cards Overdue due dates now display in red text Past scheduled dates now display in blue text Thanks to @ras0q for the suggestion (#1164) Added priorityWeight formula to all default Bases templates for priority-based sorting Formula maps each priority value to a numeric weight based on your custom priority configuration Sort by formula.priorityWeight in ascending order to get highest priority tasks first Example: if(priority==\"high\",0,if(priority==\"normal\",1,if(priority==\"low\",2,999))) Thanks to @jhedlund for the suggestion (#1257), (#1064) Added configurable event stacking options for Bases Calendar view Allow events to overlap: Toggle whether timed events visually overlap or display side-by-side in week/day views Max stacked events: Limit horizontal event stacking in week/day views (0 = unlimited) Max events per day: Limit events shown per day cell in month view (0 = auto based on cell height) Max event rows per day: Limit event rows per day cell in month view (0 = unlimited) Configure per-view in the Bases Calendar view settings under Layout Thanks to @3zra47 and @hasanyilmaz for the feature requests Changed# Improved inline task conversion to merge TasksPlugin and NLP parsing results Previously, if a task had hashtags (e.g., - [ ] Buy milk tomorrow #groceries), NLP parsing was skipped entirely Now NLP always parses the clean title to extract dates/times, then merges with TasksPlugin-extracted metadata TasksPlugin explicit values (emoji dates like 📅) take priority over NLP-inferred values Tags, contexts, and projects from both sources are combined and deduplicated Polished task card styling for a more native Obsidian look Simplified hover and focus states to use native Obsidian colors Removed blur filter and shadows from metadata pills Fixed subtask chevron vertical alignment with status dot Reduced swimlane label column width in Kanban view (#1151) Increased mini calendar heatmap color intensity for better visibility Days with notes now show more noticeable colors, especially with low note counts Intensity levels increased from 10/25/45/65% to 25/40/55/70% Thanks to @arreme for the suggestion Fixed# (#1271) Fixed custom user fields not appearing in task modals after creation New custom fields are now automatically added to both creation and edit modals Deleting a custom field also removes it from modal configuration Updating a field's display name syncs to the modal configuration Thanks to @craziedde for reporting (#1256) Fixed links in custom properties not rendering as clickable in task cards Wikilinks ([[Note]]) now render correctly in Bases views Markdown links ([text](url)) now render correctly in all views Links in list-type properties are also properly rendered Thanks to @3zra47 for reporting (#1157) Fixed inline task embeds breaking layout when placed in indented bullet lists Task titles now wrap naturally within line boundaries instead of forcing the entire card to a new line Metadata (dates, tags, etc.) stays inline when space permits, with horizontal scrolling on hover when needed Thanks to @3zra47 for reporting (#1241) Fixed deleting custom priorities in settings removing the wrong priority when multiple priorities exist Thanks to @Anthonyhunter100 for reporting (#1165) Fixed Kanban view grouping by list properties (contexts, tags, projects) treating multiple values as a single combined column Tasks with multiple values now appear in each individual column (e.g., a task with contexts: [work, call] appears in both \"work\" and \"call\" columns) Added \"Show items in multiple columns\" option (enabled by default) to control this behavior Fixed drag-and-drop to properly add/remove individual values instead of replacing the entire list Fixed swimlane mode to also respect list property explosion Thanks to @dictionarymouse for reporting (#1217) Fixed inconsistent Ctrl+Click/Cmd+Click behavior for opening notes in new tabs Note cards and internal links now properly support Ctrl/Cmd+Click to open in new tab Added middle-click support for opening in new tab Thanks to @diegomarzaa for reporting (#1265) Fixed task edit modal corrupting markdown-style project links on save Links like [Project Name](path.md) were being wrapped in extra brackets: [[[Project Name](path.md)]] Plain text project names are now preserved as-is instead of being converted to wikilinks Markdown-style project links now resolve properly and display as linked (not orange/unresolved) Thanks to @minchinweb for reporting (#1266) Fixed Kanban view scroll position resetting to top of column after any change Clicking status dots, priority, or other task properties no longer jumps the column back to top Scroll position is now preserved for both regular columns and swimlane cells Thanks to @essouflenfer for reporting (#485), (#1221), (#1262) Fixed NLP parser not recognizing non-ASCII characters in tags, contexts, and projects Tags like #investigación were being truncated at accented characters (e.g., #investigaci) Non-Latin scripts (Chinese, Cyrillic, Japanese, etc.) were not recognized at all (e.g., @家, #杂事, @ознакомиться) Parser now uses Unicode-aware regex patterns to support all languages and scripts Thanks to @Arachnidai, @fidelaznar, and @qian1ing for reporting (#1249) Fixed project preview in task creation modal showing quadruple brackets ([[[[Project]]]]) Projects selected from autocomplete were being wrapped in extra wikilink brackets in the preview display Thanks to @2vzqwz8tvg-png for reporting (#1249) Fixed custom priority ordering in settings being unclear and non-intuitive Priority cards are now draggable to reorder (like statuses) Priorities are displayed in weight order (lowest to highest priority) New priorities are added at the end (highest priority) instead of with a fixed weight Thanks to @2vzqwz8tvg-png for reporting (#1272) Fixed recurrence anchor not being saved when set to \"completion\" during task creation Selecting \"completion\" as the recurrence anchor now correctly persists to the task frontmatter Thanks to @blaxcky for reporting (#1128) Fixed NLP parser not allowing slashes in context names Contexts like @shopping/groceries were being split into @shopping and /groceries Hierarchical context names now work the same as tags and projects Thanks to @wealthychef1 for reporting (#1170) Fixed dateCreated and dateModified not using custom property names when creating notes from calendar events Notes created from ICS events now respect the field mapping configured in settings Thanks to @maddie-m for reporting (#1171) Fixed calendar event toggles not responding to changes after initial load Toggling \"Show scheduled tasks\", \"Show due tasks\", and other event filters now correctly updates the calendar Previously, changing these toggles had no effect until the view was reloaded Thanks to @hangryscribe3 for reporting (#1198) Fixed project links being created relative to the wrong file when editing from Bases views Relative paths in project links are now correctly resolved relative to the task note file Previously, editing a task from a Bases view would create project links relative to the .base file Thanks to @minchinweb for reporting"},{"title":"TaskNotes 4.1.1","url":"/obsidian/releases/4.1.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1277) Icon autosuggestion for custom status settings Type to search through all available Lucide icons Thanks to @Arachnidai for the suggestion New formula properties in default Base templates Date calculations: daysUntilDue, daysUntilScheduled, daysSinceCreated, daysSinceModified Boolean helpers: isOverdue, isDueToday, isDueThisWeek, isScheduledToday, isRecurring, hasTimeEstimate Time tracking: timeRemaining, efficiencyRatio, timeTrackedThisWeek, timeTrackedToday, timeTrackedFormatted Grouping: dueMonth, dueWeek, scheduledMonth, scheduledWeek, dueDateCategory, timeEstimateCategory, ageCategory, createdMonth, modifiedMonth, priorityCategory, projectCount, contextCount, trackingStatus Combined due/scheduled: nextDate, daysUntilNext, hasDate, isToday, isThisWeek, nextDateCategory, nextDateMonth, nextDateWeek - work with whichever date comes first Sorting: priorityWeight, urgencyScore (combines priority with date proximity) Display: dueDateDisplay (relative dates like \"Today\", \"Tomorrow\", \"3d ago\") Action-oriented views (Not Blocked, Today, Overdue, This Week) now sort by urgency score, showing most important tasks first See Default Base Templates documentation for full details Note: To get these new formulas, either copy them from the documentation, or delete your .base files in TaskNotes/Views/ and restart Obsidian to regenerate them Changed# (#1282) Added spacing between task title and metadata in inline task widgets for improved readability Thanks to @3zra47 for the suggestion Custom status icons now display in all context menus (task context menu, batch operations menu, and task creation/edit modals) Added embedded video guide for Google Calendar OAuth setup in documentation Thanks to @antoneheyward for the tutorial Fixed# (#1279) Fixed Kanban column width setting not being respected on mobile devices Thanks to @guncav for reporting (#1026), (#1177) Fixed recurring task completion from Base views recording the wrong date for users in negative UTC offset timezones (e.g., PST/PDT) when completing tasks in the evening The bug caused complete_instances to record the next day instead of the user's current calendar day Thanks to @3zra47 and @nslee123 for reporting and providing detailed reproduction steps"},{"title":"TaskNotes 4.1.2","url":"/obsidian/releases/4.1.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# Significant performance improvements for Bases views (TaskList, Kanban, Calendar) Reduced extractDataItems time from ~4 seconds to ~5-10ms for large vaults (6000+ tasks) Computed file properties (file.backlinks, file.links, etc.) are now fetched lazily during render instead of upfront Only visible items (with virtualization) trigger expensive property computations Added debouncing to onDataUpdated to prevent UI freezes during typing Timeblock generation now uses Obsidian's metadataCache instead of file reads Added date range filtering for calendar events to skip events outside visible range (#1285) Calendar view uses 5-second debounce to prevent flickering while typing Thanks to @steven-murray for reporting Calendar view switching (month/week/day/list) is now much faster View type is now saved on unload instead of on every change Fixed task edit modal archive button being too narrow on mobile devices (#1319) Added missing properties to Field Mapping settings recurrence_anchor - now in Settings > Task Properties > Task Details skipped_instances - now in Settings > Task Properties > Metadata Properties Thanks to @kazerniel for reporting (#1310) Fixed inline task conversion deleting text when task title exceeds filename limits Text that cannot fit in the filename is now preserved in the task note's body Thanks to @prayidae for reporting (#1301) Fixed inline task wikilinks leaving blank space when no metadata properties are visible Thanks to @Richard-UMPV for reporting (#1317) Fixed project autosuggest filters not working correctly when only \"Required Property Key\" is configured NLP + trigger now properly filters by property existence when no property value is specified Modal \"Add to project\" button now shows consistent results with inline autosuggest Thanks to @JacksonMcDonaldDev for reporting (#1287), (#1307) The \"New\" button in Bases views now opens the TaskNotes creation modal Tasks created from Bases views now respect default properties (status, priority, etc.) Tasks are now created in the configured default folder instead of the views folder Thanks to @anareaty and @sylvainfct-dot for reporting (#1291) Fixed Microsoft Calendar OAuth documentation using wrong redirect URI Added instructions for configuring via Azure manifest editor Thanks to @PlecotusAustriacus for reporting Added# (#803) New command \"Convert current note to task\" to add task properties to an existing note Thanks to @GardarikanetS and @diegomarzaa for suggesting (#1080) Custom user fields now support default values Each field type has an appropriate input: text field, number input, toggle, date preset dropdown, or comma-separated list Defaults are applied when creating tasks via modal, instant conversion, \"Create or open task\" command, or HTTP API Thanks to @bradyrx for suggesting Changed# Added documentation link to settings panel (links to tasknotes.dev) Reorganized settings panel for improved discoverability Removed \"Defaults\" tab - default values are now configured alongside each property in the Task Properties tab Moved task filename format settings to the Title property section Moved project autosuggest settings to the Projects property section Body template setting moved to the Features tab Added descriptions to each property explaining its purpose Moved \"Folder for converted tasks\" setting to General tab under Task Storage for better discoverability Updated setting description to clarify that leaving empty uses the default tasks folder"},{"title":"TaskNotes 4.1.3","url":"/obsidian/releases/4.1.3/","description":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals.","product":"obsidian","text":"This patch fixes a critical performance issue affecting the Calendar views. As a bonus, it adds a configurable \"split\" view to the task creation/edit modals. Added# Split layout for task modals on wide screens (900px+) Details editor appears in a dedicated right column when the modal is expanded New setting \"Split layout on wide screens\" in Modal Fields settings tab to toggle this behavior Improves usability by showing form fields and details side-by-side Fixed# (#1330) Fixed calendar view regression taking 5 seconds to load and respond to user interactions Initial calendar load is now immediate again User interactions (drag/drop, creating timeblocks, etc.) respond instantly Removed redundant date filtering (FullCalendar handles this more efficiently) Thanks to @ysafonov, @kmaustral, @sunjiawe, @Мизгирь, and @FiliusIcari for reporting"},{"title":"TaskNotes 4.10.0","url":"/obsidian/releases/4.10.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# New companion plugin: TaskNotes Workflows adds Markdown-defined automation for TaskNotes tasks, events, schedules, and manual commands. It keeps automation workflows outside TaskNotes core while using the runtime API for safe task reads, writes, queries, events, and relationship resolution. See TaskNotes Workflows. (#1530) Auto-start time tracking starts a timer when a task moves into active work. Thanks to @Jendrik0 and @benmartinek for the request and follow-up. (#222, #184) Stop time tracking on complete stops active timers when a task is completed. Thanks to @bcohen44 and @cathywu for the requests, and @amarjt for the follow-up. (#265) Stamp started timestamp records a custom started timestamp when a task first moves into active work. Thanks to @cathywu, @digitaldoctors, and @Leo310 for the request and discussion. (#1703) Clear scheduled when started clears the scheduled date when a task moves into active work. Thanks to @kmaustral for the request. (#1293) Rollover overdue scheduled tasks moves incomplete tasks with past scheduled dates back to today. Thanks to @grosserfrank for the request. (#1896) Escalate upcoming due tasks raises priority as due dates approach. Thanks to @Neptune-Illusion for the request. (#214, #518, #1785, #1855) The subtask inheritance workflows can copy parent contexts, tags, priority, planning dates, and dependencies into new subtasks. Thanks to @timfidd, @bepolymathe, @AndyEveritt, @lindsaylearns, @tomsymonds, @wedgen, @poulpoulsen, and @misolex for the related requests and discussion. (#1166) Blocked task review provides a reminder-style review for blocked tasks without automatically deleting dependency links. Thanks to @jpmoo and @jortscity for the request and follow-up. Added a versioned TaskNotes JavaScript runtime API for companion plugins, with namespaced model validation, canonical task query validation/normalization/explain helpers, catalogs, query/support helpers, lifecycle events, typed errors/results, task, time-tracking, Pomodoro, recurring-task, settings, NLP, event, and extension-registry surfaces. Runtime API mutations carry source and correlation metadata so companion plugins can debug and coordinate workflow runs. See JavaScript API. Added documentation for the companion-plugin model. See Companion Plugins. (#288, #345, #361, #523, #573, #703, #925, #929, #1115, #1137, #1260, #1303, #1324, #1394, #1445, #1509, #1735, #1736, #1743, #1780, #1874, #1951, #1974) Added support for TaskNotes spec 0.2.0 materialized occurrences, including recurrence parent/date fields, generated mdbase schema roles, parent reconciliation when occurrence notes are completed, occurrence notes that inherit parent planning metadata without copying history, occurrence note controls in task, calendar, and edit-modal completion menus, and visible occurrence identity on task cards. This gives recurring tasks a concrete occurrence-note path for per-instance state, related notes, subtasks, templates, scheduling changes, completion history, and calendar behavior without forcing every recurring task to create files. See Recurring Tasks and Property Types Reference. Thanks to @LuxBetancourt, @jerzy-dudzic, @luciolebrillante, @BryanWall, @jhedlund, @kazerniel, @nschenone, @realJohnDoe, @cathywu, @Lorite, @EllenGYY, @JcMinarro, @gsssr, @slipstyle, @3zra47, @Leonard-44, @ak-42, @RumiaKitinari, @atos2212-blip, @kmaustral, @eugenedefox, @notDavid, @zitongcharliedeng, and @Jomo94 for the related recurrence, occurrence, completion, and calendar requests. (#1951) Added Calendar support for recurring tasks stretched between scheduled and due dates when the existing stretch option is enabled. Date-only ranges stay as all-day spans, and timed ranges render once per day in the range. Thanks to @atos2212-blip for the request. (#1751, #1792, #1969) Added a Task List and Kanban view option to hide top-level subtasks when their parent task is also in the filtered view, while still allowing inherited expanded relationships to show the subtasks under the parent. Thanks to @Glint-Eye and @Proxybat for the request and follow-up, and @stanley-910 and @Spencerduran for the earlier PRs. Changed# Moved core TaskNotes model behavior for field mapping, dates, recurrence, time-tracking, and adapter operation planning into a shared package used by the plugin and companion tooling. Calendar views now coalesce materialized occurrence notes with their matching virtual recurring instances. Dragging a materialized occurrence reschedules that occurrence note without changing the parent recurrence rule or the note's occurrence_date identity. See Recurring Tasks. Improved the Calendar Bases View Options menu by splitting settings into clearer groups and hiding view-specific controls until they apply to the selected calendar mode. Fixed# (#1976) Fixed embedded Calendar and Agenda Bases so \"Navigate to date from property\" can use the containing note's date property when the Base rows do not have that property. Thanks to @matesvecenik for reporting this. (#1977) Fixed Calendar and Agenda views showing duplicate all-day entries when a task's scheduled date and due date are the same day. Timed due dates on the same day still show as separate deadline markers. Thanks to @pdgBC for reporting this. Fixed the release notes view using cramped interface typography instead of regular reading typography. (#216) Improved inline conversion for Tasks plugin task lines, including Dataview-style fields, priority markers, recurrence text, date aliases, block links, and safer trailing-field parsing. Thanks to @ksdavidc for the request, @natleahh for the Dataview example, and @hangryscribe3 and @nayatiuh for the discussion. (#1974) Stopped Calendar and Agenda property-based events from logging date parse errors for entries that do not have the selected date property. Thanks to @Jomo94 for suggesting completed-date Agenda events. (#1973) Reduced unnecessary Calendar view recreations when external calendar providers are reported in a different order, and preserved Calendar scroll position when a config-driven refresh has to recreate the view. Thanks to @e-zz for reporting this. (#1972) Fixed ICS calendar event related notes so standalone events with similar numeric IDs no longer show unrelated notes or tasks on every event. Thanks to @ks-studio-net for reporting this. (#1970) Fixed generated default Base filters so updating default files applies configured excluded folders to TaskNotes task views. Thanks to @henrim01 for reporting that templates could still appear in regenerated views. (#1968) Fixed inline task link overlays collapsing on Obsidian mobile, which could hide the task title and leave a tall empty gap after the widget. Thanks to @renatomen for reporting and diagnosing the containment issue."},{"title":"TaskNotes 4.10.1","url":"/obsidian/releases/4.10.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# Added a startup check for new compatible TaskNotes releases. When a new release is available, TaskNotes shows a notice that opens the TaskNotes entry in Obsidian's Community Plugins browser. (#1989) Added a command-palette action plus runtime and HTTP API actions for updating configured default .base files from the current TaskNotes templates. Thanks to @businessBoris for the request. (#1115) Added API and MCP support for creating materialized occurrence notes from recurring tasks, and made headless recurring-instance completion respect occurrence notes when the parent uses Create next after completion. Thanks to @gsssr for the original request, @slipstyle for the follow-up, and @martin-forge for identifying the API/MCP gap. Fixed# (#1985) Fixed embedded Calendar and Agenda time-grid views drifting out of alignment inside callouts and Reading mode. Thanks to @matesvecenik for reporting and sharing screenshots. (#1986) Fixed the local HTTP API rejecting requests from the TaskNotes browser extension's Chrome extension origin. Thanks to @n1njaznutz for reporting this. (#1980) Added mobile bottom spacing to Agenda Calendar views so the last visible tasks can scroll above Obsidian's bottom navigation bar. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1984) Fixed mobile task link overlays hiding configured inline task card properties such as scheduled date, due date, contexts, and projects. Thanks to @stil-sudo for reporting. (#1979) Kept the left-positioned subtask chevron from overlapping the task status control on mobile task cards. Thanks to @Jomo94 for reporting and sharing the screenshot. (#1903) Reduced the Edit Task modal's mobile action-button footer so Open note, Archive, Delete, Save, and Cancel take two rows instead of three on iPhone-sized screens. Thanks to @3zra47 for the original report and @krzyfu for the follow-up about the button area crowding the editor. (#1982) Preserved scroll position in TaskNotes Bases after task edits and data refreshes, avoiding jumps back to the top on mobile. Thanks to @3zra47 for reporting. (#1978) Restored Obsidian editor shortcuts such as insert link, headings, and list toggles inside the Edit Task modal's Details editor. Thanks to @krzyfu for reporting this."},{"title":"TaskNotes 4.10.2","url":"/obsidian/releases/4.10.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1995) Fixed Bases Calendar views showing both a materialized occurrence note and its matching virtual recurring task instance. Thanks to @rdefaccio for reporting this. (Discussion #1994) Fixed timed recurring tasks failing to advance their due dates when due-date offset preservation is enabled. Thanks to @mgrecar for raising this."},{"title":"TaskNotes 4.11.0","url":"/obsidian/releases/4.11.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#730, #1897, #1942, #1998) Added Canvas Bases, an optional companion plugin that turns Obsidian Bases views into canvas-style boards and reusable JSON Canvas snapshots, with TaskNotes badges, task menus, dependency and subtask edges, and assignment zones for supported TaskNotes actions. See Canvas Bases for setup details. Thanks to @DillPickle80, @BradGaddis, @Hyadhuad, and @AlinaWithAFace for the visual planning requests, and to @renatomen, @prayidae, and @maranqz for the related discussion. Added a TaskNotes starter note that is created and opened automatically on first install to introduce task creation, inline conversion, and embedded Bases views. Added a runtime API surface for companion plugins to show or populate the standard TaskNotes task context menu. (#2000) Added separate settings for using the active note as a project during normal task creation and during inline task creation or instant conversion. Thanks to @BlueScreen32 for suggesting the split. (#1303, #2001) Added separate templates for materialized occurrence notes, including parent-level occurrence_template support and a global fallback setting. Thanks to @BrucePlumb for suggesting a separate occurrence-note template and @ak-42 for the related per-recurrence template request. (#2006) Added the projected local finish time beside the remaining duration while a Pomodoro is running. See Pomodoro View for the timer behavior. Thanks to @abbiefalls90 for suggesting this. (#2016) Added a setting for recurring external calendar event related notes, so Google, Microsoft, and ICS recurrences can either share notes across the series or keep notes limited to the selected instance. See Integrations Settings for the setting. Thanks to @akhtsang for reporting this, and to @cathywu and @mdbraber for the earlier series-linking discussion. Changed# (#1737) Clarified that changing the task tag does not automatically update existing Base view filters. Thanks to @goldorak00 for reporting this, and to @Domcoppinger and @imsuck for the first-time setup feedback. (#2005) Excluded archived task notes and archived project-note references from Task & Project Statistics. Thanks to @Xiarno for suggesting this. Added a local review-type lint check that catches dependency-resolution warnings from Obsidian's online review before submission. Improved dependency and project relationship cache updates so ordinary note edits avoid unnecessary relationship recalculation, while blocked and blocking state stays current when dependency status changes. Improved filter and view query caching so filter options update immediately after relevant task-field changes while large Task List, Kanban, and Calendar queries avoid repeated vault scans. Extended the in-app release notes bundle to include the current major release, with collapsed versions rendered only when opened. Fixed# (#2015) Fixed Google Calendar events from the previous six months disappearing from Calendar and Mini Calendar views after a fresh sync. Thanks to @akhtsang for reporting this. (#2013) Fixed task-card status and priority dots becoming oversized on touch-capable desktop devices. Thanks to @RumiaKitinari for reporting this. (#2009) Restored Tab and Shift+Tab focus movement in the Create new task modal's natural language input instead of letting the markdown editor indent the title. Thanks to @prepare4robots for reporting this. (#2007) Fixed status autocomplete in the task creation modal leaving status value fragments in the task title when the editor auto-paired the status trigger. Thanks to @prepare4robots for reporting this. (#2004) Fixed the Pomodoro start command forgetting the selected task after it was completed, so reopening the task lets it be picked up again. Thanks to @MPourjam for reporting this. (#1996) Made Kanban card drag-and-drop show a clear drop slot marker while cards are being repositioned, so the landing position remains visible during sorting. Thanks to @phillipadsmith for reporting this. Fixed runtime API dependency removal so removing the last dependency from a task also clears the mapped blockedBy property from the note."},{"title":"TaskNotes 4.11.1","url":"/obsidian/releases/4.11.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#2024) Added materialized occurrence notes to the Relationships widget, so recurring parent task notes can show their occurrence notes in an Occurrences tab. See Relationships Widget. Thanks to @3zra47 for requesting this. (#2022) Added a Skip instance / Unskip instance action to the recurring task edit modal's completion calendar, so skipped dates can be adjusted from the same date menu as completions. See Recurring Tasks. Thanks to @AmonAmarthFTW for requesting this. (#2048) Added current due and scheduled dates to the edit modal's task information. Thanks to @1activegeek for requesting this. (#2058, #2059) Added natural-language parsing and the full date picker to date-type custom fields. Thanks to @chmac for requesting this. (#2060) Added date-type custom fields to the task right-click menu under Custom dates. Thanks to @chmac for requesting this. (#2067) Added an Edit task action to the task card context menu, including inline task cards. Thanks to @DarkCellar for requesting this. (#2068) Added reminders input support to the MCP tasknotes_create_task and tasknotes_update_task tools. Thanks to @Spirit597 for requesting this. (#2069) Added an Add project action to the Quick Actions palette. Thanks to @chmac for requesting this. Fixed# (#2007) Fixed a remaining task creation autocomplete case where a status value containing another status label could leave status fragments in the task title. Thanks to @prepare4robots for the follow-up report. (#2031) Fixed quick task creation failing when natural language input created a recurring task with a scheduled time. Thanks to @rdefaccio for reporting this. (#2034) Fixed Advanced Calendar timed events switching to a high-contrast mobile fill when Obsidian is narrowed or split on desktop. Thanks to @RumiaKitinari for reporting this. (#2039) Fixed broken images on the Workflows and Calendar Setup documentation pages. Thanks to @chmac for reporting this. (#2045) Fixed custom modal fields assigned to Basic Information not appearing in task creation or edit modals. Thanks to @chmac for reporting this. (#2063) Fixed project autocomplete storing ambiguous project links without the selected note's folder path. Thanks to @chmac for reporting this. (#2072) Fixed inline task links to headings so they show both the task title and heading instead of only the heading. Thanks to @spasche for reporting this. (#2075) Fixed multiday Calendar events being clipped to one day when a Base is embedded in Reading view. Thanks to @ddevaal for reporting this. (#2079) Fixed the reminder modal's Absolute tab so it switches from relative fields to absolute date and time fields. Thanks to @JunwonYoon for reporting this and identifying the CSS specificity issue. Changed# Improved local review checks so unsafe direct Object.prototype method access is caught before submission."},{"title":"TaskNotes 4.12.0","url":"/obsidian/releases/4.12.0/","description":"[!info] TaskNotes v5 beta","product":"obsidian","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Security# Calendar OAuth credentials and account tokens are now stored in Obsidian Secret Storage instead of TaskNotes' data.json, with automatic migration for existing connections. See Calendar Integration. Thanks to @mcuste for the contribution Updated bundled HTTP, address parsing, and schema validation dependencies to versions containing their current security fixes. Added# Added portable task attachment references. Attachments now round-trip as an ordered attachments link list in task frontmatter and are exposed through the TaskNotes model and runtime API. These are collection-file references only; attachment bytes and binary metadata remain owned by the host. (#2142) MCP tasknotes_create_task and tasknotes_update_task now accept customProperties for configured TaskNotes user fields. Thanks to @phillipadsmith for suggesting this. (#2126, #2134) Added optional filename templates for materialized recurring occurrence notes, with explicit date, ISO week, month, year, and month-name variables plus per-parent overrides. Existing naming remains unchanged until a template is configured. See Recurring Tasks. Thanks to @raphaelfaouakhiri for reporting and implementing this. (#2105) Added {{projectFolder}} and {{projectFolders}} folder template variables for storing tasks alongside linked project notes. See Template Variables. Thanks to @carypruitt for this contribution. Changed# Generated TaskNotes type contracts now include configured natural-language capture triggers, allowing compatible clients to offer the same field suggestions. Rebuilt the TaskNotes documentation with reorganized navigation, full-text search, mobile and accessibility improvements, and references generated from the current commands, settings, compatibility metadata, HTTP routes, and default Bases. Added practical guides for adopting TaskNotes in an existing vault, mobile use, custom Bases, and backup and recovery. See the TaskNotes documentation. (#2088) Convert current note to task now uses your default scheduled date when the note does not already have scheduled frontmatter, while the None default still leaves converted notes unscheduled. See Task Properties. Thanks to @e-zz for suggesting this. Fixed# Plugin settings now recover when Obsidian briefly returns no data while reloading an externally changed settings file, preventing a post-reload error without overwriting the existing settings. (#2194) Pomodoro task selection suggestions now keep rich task cards at the menu width, preventing task titles from wrapping one letter per line. Thanks to @Evilgenee for reporting this. (#2196) Drag-to-reorder now works for Task List Bases embedded in Live Preview notes, matching the behavior of directly opened Bases and Reading mode embeds. Thanks to @jimbo108108 for reporting this. (#2198) Agenda Bases can now show overdue scheduled or due tasks on today's row with showOverdueOnToday, and regenerated default Agenda files enable that behavior by default. Thanks to @vicrdguez for reporting this. (#2182) Checklist progress on task cards now excludes cancelled markdown checklist items such as [-] from the completed/total count. Thanks to @ctrl-q for reporting this. (#2180) Inline task cards in Live Preview now keep their click and context menu handlers active on Obsidian 1.13, so clicking a rendered task link opens the edit modal instead of revealing the raw wikilink. Thanks to @npondel for the detailed diagnosis and @minchinweb for confirming the issue. (#2171) Stopped recurring notification and status-bar scans from reading unindexed notes directly from disk while preserving the fallback for direct task lookups. Thanks to @tgrosinger for identifying and diagnosing the excessive vault reads. (#2174) Open or create occurrence note from Quick Actions now uses the recurring task's scheduled occurrence date, preventing duplicate occurrence notes keyed to the day the action was run. Thanks to @chmac for reporting this. (#2169) Regenerated default Base views now include tasks whose identifying property is stored as a list containing the configured task value. Thanks to @GlebYavorski for reporting this. (#2166) Fixed Task List views configured to start collapsed so the first chevron click expands only the selected group instead of expanding every other group. Thanks to @renatomen for reporting and fixing this. (#2165) Convert current note to task now reads configured field mappings, including list-valued title fields such as aliases, and preserves an existing aliases list when the title is unchanged. Thanks to @jkuball for reporting this. (#2164) Flat Kanban boards now clear stale swimlane layout state when they rerender, preventing columns from occasionally stacking into one vertical strip after switching tabs. Thanks to @brienna for reporting this. (#2160, #2161) Generated Kanban Bases now use the correct TaskNotes status property and configuration block. Rich Bases status values render as their configured labels, while pinned columns and saved column order are honored. Thanks to @kevin-4c for the detailed reports and diagnosis. (#2111, #2159) Recurring task instances now remain visible through the final day of Calendar and Agenda ranges in positive-offset time zones, regardless of the configured first day of the week. Thanks to @Arachnidai and @odxn0803 for reporting this. (#2155) Regenerated default Calendar Bases now inherit the app-level time slot duration instead of hardcoding 30 minutes. Existing per-Base time settings remain intentional overrides. Thanks to @SZZ504232 for reporting this. (#2154) Timed ICS events without a TZID now preserve their floating wall time in the user's local timezone instead of being interpreted as UTC. Thanks to @cloesophia for the reproducible calendar sample. (#2152) Fixed paginated Google Calendar refreshes for calendars with many events so secondary calendars do not disappear after Google returns a second page. Thanks to @wobafett for reporting and diagnosing this. (#2141) Fixed Task List groups for tasks without scheduled or due dates showing a raw Bases icon object instead of None. Thanks to @ks-studio-net for reporting this. (#2140) The edit task modal now shows saved task-identification tags when hiding identification tags is disabled. Thanks to @3zra47 for reporting this. (#2148) Empty list-like frontmatter values no longer become literal \"null\" entries when tasks are edited. Thanks to @minchinweb for reporting this. (#2120, #2135) Long all-day event titles in Calendar week and day views now truncate instead of stretching the all-day row. Thanks to @same774 and @ks-studio-net for reporting this. (#2124) Fixed a Kanban crash when opening or closing the edit modal immediately after moving a task between list-valued swimlanes such as contexts. Thanks to @Decia-C for reporting this. (#2114) Completing a rescheduled occurrence for a scheduled-anchored recurring task now advances the parent from the moved occurrence date instead of an earlier original occurrence date. Thanks to @chrabia for reporting this. (#2113) Failed Google Calendar manual refreshes no longer make the next immediate refresh show a misleading success notice. Thanks to @JohWQ for reporting this. (#2109) TaskNotes no longer injects instant-conversion controls into embedded or detached Markdown editors, preventing checkbox notes opened from unrelated Bases from freezing Obsidian on mobile. Thanks to @jmartinmcfly for the clear reproduction and recording. (#2107, #2108) Creating tasks with Store title in filename enabled now handles duplicate or case-variant titles without failing or replacing the task title with a suffixed filename. Thanks to @AdmiralClackington for reporting and diagnosing this. (#2106) Regenerated default Calendar Base files now use your configured first day of the week instead of forcing Sunday. Thanks to @atos2212-blip, @cweekly, @idontcode34, and @hikatamika for reporting this. (#2100) Tags added while creating a task now keep the same frontmatter order as tags added later from the task context menu. Thanks to @mgrecar for reporting this. (#2092) New non-recurring tasks created directly in a completed status now get a completed date, so completed-date views can find them immediately. Thanks to @Crell for reporting this. (#2096) Fixed TaskNotes Kanban swimlanes falling back to None when the swimlane used a Bases formula that was not already cached by Bases. Thanks to @ddevaal for reporting this. (#2093) TaskNotes now retries custom Bases view registration when the Bases core plugin is enabled after TaskNotes, preventing default views from showing Unknown view type until TaskNotes is reloaded. Thanks to @yaye-work for reporting this. (#2084) The Relationships widget no longer prevents editor text selection from autoscrolling when dragging below the bottom edge of a task note. Thanks to @lostwildland for reporting this. (#2081, #2103) Kept task card and relationships widgets visible in reading mode when Obsidian scroll or preview updates remove their DOM, and refreshed visible widgets promptly after metadata changes. Thanks to @mukhozhuk for reporting and debugging this and @martin-forge for fixing it. (#2064, #2066) Recurring tasks now advance correctly after their next scheduled date is manually adjusted, preserving due-date offsets and times without jumping back to an earlier occurrence. Thanks to @chmac for reporting and fixing this. (#2018) Fixed Hide empty columns in Kanban views with swimlanes so columns with no visible tasks are hidden while pinned columns remain. Thanks to @scottTomaszewski for reporting and fixing this. Fixed recurring all-day ICS subscription events keeping the original end date on later instances, which could cause calendar list views to show events under the wrong day. Thanks to @abbiefalls90. (#2033) Fixed the project folder badge on task cards so, when expandable subtasks are enabled, it expands or collapses inline subtasks instead of showing an unavailable-action notice. Thanks to @abbiefalls90 for the fix and @scottkodai for the follow-up feedback. (#2040, #2041) Stopped newly created tasks from filling the Google Calendar retry queue when calendar export is disabled. Thanks to @chmac for reporting and fixing this. (#2046, #2051) The date and time picker now focuses the natural-language input when it is enabled, making keyboard-driven quick actions ready for immediate typing. Thanks to @DevOps-Toast for reporting this and @ther12k for fixing it. (#2125, #2129) Materialized recurring occurrence notes now record the date they were actually completed, while the parent recurring task continues to track the occurrence date. Thanks to @raphaelfaouakhiri for reporting and fixing this. (#2173, #2175) Completion-anchored recurring tasks with materialized occurrence notes now schedule the next occurrence from the day the occurrence was actually completed. Thanks to @chmac for reporting and fixing this. (#1982) Preserved the Task List's own scroll position during Bases refreshes so long mobile lists do not jump back to the top after task updates. Thanks to @3zra47 for the follow-up report. (#1863) Microsoft Calendar event updates now accept opaque Exchange calendar IDs instead of failing local validation before contacting Microsoft Graph. Thanks to @fmacondray for reporting this and providing the follow-up stack trace."},{"title":"TaskNotes 4.12.1","url":"/obsidian/releases/4.12.1/","description":"[!info] TaskNotes v5 beta","product":"obsidian","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Changed# (#2204) Public documentation is now published from the dedicated tasknotes.dev repository. Plugin release notes and internal documentation remain in this repository. Updated compatibility with Obsidian's current plugin review and settings search. Fixed# Fixed TaskNotes interface elements sometimes appearing in the wrong window when using Obsidian pop-out windows. Improved confirmation dialogs, icons, and modal styling to use Obsidian's current interface APIs."},{"title":"TaskNotes 4.12.2","url":"/obsidian/releases/4.12.2/","description":"[!info] TaskNotes v5 beta","product":"obsidian","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Fixed# (#2212) Fixed TaskNotes settings sections appearing pushed across the Obsidian settings pane on desktop. Thanks to @RafaQNunes for reporting this."},{"title":"TaskNotes 4.12.3","url":"/obsidian/releases/4.12.3/","description":"[!info] TaskNotes v5 beta","product":"obsidian","text":"[!info] TaskNotes v5 beta TaskNotes v5 is available as an opt-in beta alongside TaskNotes 4.12. TaskNotes 4.12 remains the recommended stable release. The major change in v5 is support for portable TaskNotes collections. These collections can be used in both Obsidian and the TaskNotes app, which is also available in beta, so the same tasks can be managed through either interface. TaskNotes collections are built on mdbase, a Markdown-native collection format. mdbase Connect provides the permissioned bridge that makes those collections available to the TaskNotes app. Your tasks remain ordinary Markdown files in your vault; mdbase adds a shared structure that compatible tools can understand. TaskNotes v5, mdbase Connect, and the TaskNotes app are all under active development. Please use a backed-up vault, expect some rough edges, and report any problems you encounter. Fixed# (#2212) Fixed TaskNotes settings sections appearing offscreen or blank on Obsidian 1.13 desktop. Thanks to @RafaQNunes for reporting this, and to @m4to-3pe and @matthewrishii for confirming it remained in 4.12.2. (#2213) Runtime plugin-data updates now avoid writing when Obsidian cannot safely read an existing TaskNotes data.json, preventing calendar sync, Pomodoro, ICS, or auto-archive state writes from replacing saved settings. Thanks to @3zra47 for the follow-up details and file-history evidence. (#2216) Fixed updated default Kanban Bases grouping every task into the None column when grouping by status. The generated Kanban templates now use the real status property, and existing Kanban files using task.status keep grouping from TaskNotes task data. Thanks to @Esvorst for reporting this. (#2120, #2135) Long all-day event titles in Calendar week and day views now truncate in the all-day row instead of stretching it vertically. Thanks to @same774 and @ks-studio-net for reporting this, and to @Admorei for confirming it remained in 4.12.2."},{"title":"TaskNotes 4.2.0","url":"/obsidian/releases/4.2.0/","description":"Added Korean (한국어) language support","product":"obsidian","text":"Added# Added Korean (한국어) language support Full translation of all 1911 localization keys Korean language option now available in Settings → General → Language Adopted Obsidian 1.11.0 API features with backwards compatibility Settings tab now displays TaskNotes icon in the sidebar (Obsidian 1.11.0+) Settings sections now use native SettingGroup for improved visual grouping (Obsidian 1.11.0+) Falls back gracefully to traditional section headers on older Obsidian versions (#59) Added shortYear template variable for custom filename and folder templates Use {shortYear} in filename templates (e.g., \"25\" for 2025) Use {{shortYear}} in folder templates Thanks to @Pixeltica for the feature request (#1393) Option to prevent auto-creation of default Base view files on startup New \"Auto-create default files\" toggle in Settings → Integrations → Bases Integration When disabled, deleted sample Base files will not be recreated on plugin load The manual \"Create Default Files\" button remains available for on-demand recreation Thanks to @wealthychef1 for the feature request (#1408) Shift+click on status icon to cycle backwards through statuses Normal click cycles forward through status order Shift+click cycles in reverse order Thanks to @JerryLu086 for the feature request (#1410) Task creation modal now starts in vim insert mode when vim keybindings are enabled Previously required pressing 'i' before typing when Obsidian vim mode was active The modal now automatically enters insert mode on focus, allowing immediate typing Thanks to @Leo310 for the feature request Added button tooltips to calendar view toolbar Hovering over navigation and view buttons now shows descriptive hints Buttons include: Today, Previous, Next, Month, Week, Day, Year, List Added tooltips to task modal action icons Icon buttons for status, date, project, priority, recurrence, and reminder now show tooltips on hover Improves discoverability for new users (#503) Settings now sync automatically across devices via Obsidian Sync Changes to custom statuses, priorities, and other settings apply immediately without restart Thanks to @jhedlund for the feature request and @l-mb for the implementation (#1403) Kanban view option to consolidate status icons in column headers New \"Show status icon in column header only\" toggle in Kanban view settings (disabled by default) When enabled and grouped by status, shows the icon in the column header and hides it on cards Reduces visual redundancy when the column already indicates the status Thanks to @l-mb for the feature request and implementation (#1401) Calendar view option to span tasks between scheduled and due dates New \"Span tasks between scheduled and due dates\" toggle in Calendar view Layout settings When enabled, tasks with both scheduled and due dates display as multi-day bars Provides Gantt chart-style visualization for project planning Thanks to @0atman for the feature request (#1334) {{currentNotePath}} now works for \"Create new inline task\" command The inline task folder setting with {{currentNotePath}} previously only worked for checkbox conversion Now also applies when using the \"Create new inline task\" command from the command palette Thanks to @kmaustral for the feature request (#1264) Option to open Pomodoro timer in mobile sidebar instead of note panel New \"Mobile sidebar\" setting in Settings → Features → Pomodoro Timer Choose between: Note panel (default tab behavior), Left sidebar, or Right sidebar Allows quick swipe access to the timer without switching notes on mobile devices Thanks to @Evthestrike for the feature request (#1220) Option to use ICS event end time as task due date New \"Use ICS event end time as task due date\" toggle in Settings → Integrations → Calendar Subscriptions When enabled, tasks created from calendar events will have their due date set to the event's end time For all-day events, uses the event date (not the ICS container end date which is the next day per ICS spec) For timed events, includes the exact end time Defaults to disabled to preserve existing behavior Thanks to @MiserMagus for the feature request (#1108) Option to use task duration instead of due date for ICS calendar export New \"Use task duration for event length\" toggle in Settings → Integrations → Automatic ICS Export When enabled, exported calendar events use scheduled date + time estimate as DTSTART/DTEND This aligns with GTD workflows where scheduled + duration represents work planning, while due date represents deadlines When disabled (default), preserves existing behavior using due date as DTEND Thanks to @bepolymathe for the feature request Fixed# (#1421) Fixed natural language parser only capturing one date when both scheduled and due dates are specified Input like \"Task scheduled for tomorrow due next week\" now correctly sets both scheduled and due dates Previously the parser would return early after finding the first date trigger, ignoring any subsequent triggers Thanks to @wealthychef1 for reporting (#1384) Fixed title being sanitized even when \"Store Task Title in Filename\" is disabled Characters like ?, <, >, :, etc. are now preserved in task titles when they won't be used in filenames When storeTitleInFilename is false, only minimal sanitization (whitespace normalization, control character removal) is applied Thanks to @allison-casey for reporting (#1028), (#1140), (#1152), (#1354), (#1362) Fixed duplicate task entries appearing in Agenda view Tasks were shown twice: once as TaskNotes events and again as property-based events with a file icon Changed default Agenda template to disable property-based events (showPropertyBasedEvents: false) Users can re-enable property-based events in view settings if needed for non-task date properties Thanks to @YIRU69, @jhedlund, @dblinnikov, @Snakiest, @WeiYiAcc, @JacksonMcDonaldDev, @jimbo108108, and @krelltunez for reporting (#1386) Fixed timeEstimateCategory formula showing \"Long (>2h)\" instead of \"No estimate\" for new tasks The condition didn't properly handle null values when timeEstimate property is unset Also fixed the same issue in trackingStatus formula Thanks to @nicou for reporting and @osxisl for the PR (#1397) Fixed Bases views (Kanban, Calendar, Task List) resetting to Calendar view after a few minutes Also fixed CalendarView corrupting other view files when saving state on unload Thanks to @music-soul1-1 for reporting (#1398) Fixed overdue strikethrough showing on completed tasks Completed tasks with past due dates no longer display overdue styling Respects the \"Hide completed from overdue\" setting which defaults to true (#1363) Fixed calendar view showing nothing when a task has an invalid date format Tasks with malformed dates (e.g., \"262025-12-16\" instead of \"2025-12-16\") no longer crash the entire calendar Invalid tasks are now skipped with a console warning, allowing other events to display normally Thanks to @Erelen for reporting Fixed today column in week/day calendar views using FullCalendar's default yellow instead of theme accent Today's column now uses a tint of the theme accent color for consistent styling (#1399) Fixed drag-and-drop not working in Kanban view on mobile Cards and columns can now be dragged using long-press gesture on touch devices Includes haptic feedback and auto-scroll when dragging near edges Thanks to @l-mb for reporting and the fix (#1381) Fixed Pomodoro \"Change Task\" menu not showing newly created tasks Tasks created while the Pomodoro view was open would not appear in the task selector Improved metadata cache synchronization to properly wait for new files to be indexed Thanks to @Ghosthael for reporting (#1344) Fixed \"Unsaved Changes\" popup appearing randomly when closing task edit modal The popup would appear even when no changes were made to the task Caused by inconsistent trailing whitespace normalization when comparing details content Thanks to @hasanyilmaz for reporting (#1402) Fixed Kanban swimlane view showing tasks in wrong column when grouped by formula After editing task metadata, cards would jump to \"None\" column until Obsidian reload Column assignment now uses Bases' computed grouping instead of cached formula outputs Thanks to @bailob for the fix (#1352) Fixed date context menu not preserving time when using increment options Using +1 day, -1 day, +1 week, or -1 week on a task with a time (e.g., 2025-12-10T16:00) now preserves the time Previously the time would be stripped, changing 2025-12-10T16:00 to 2025-12-11 instead of 2025-12-11T16:00 Thanks to @cathywu for the feature request Fixed v3 saved views exporting incorrectly to Bases format Title filters now correctly use file.name instead of note.title Archived filters now generate valid boolean expressions instead of malformed comparisons \"Is Blocked\" filters now generate correct expressions with proper operator precedence (#1036) Due dates can now be dragged in the calendar view Previously only scheduled dates were draggable; due dates were locked in place Dragging a due event now updates the task's due date property Thanks to @same774 for reporting Improved calendar view responsiveness for user interactions Task creation, editing, timeblock changes, and view option toggles now update immediately Previously these actions waited 5 seconds due to the debounce intended for external file changes The 5-second debounce is now bypassed for direct user actions while still preventing flicker during typing Improved visual affordance for Pomodoro timer duration adjustment buttons The +/- buttons below the timer now have visible backgrounds and borders Hover states show accent color border for clearer interactivity feedback Previously buttons were nearly invisible with transparent backgrounds (#1409), (#1214), (#979) Improved Calendar, Agenda, Kanban, and Stats views in pop-out windows Drag-and-drop in Kanban view now works correctly when the view is in a new window Context menus (status, priority, task) now work correctly in pop-out windows Stats view drill-down modal now appears in the correct window Search boxes, task cards, and grouped task lists render correctly Root cause: Code was using global document and standard instanceof checks which fail across windows Solution: Use ownerDocument for DOM operations and Obsidian's cross-window instanceOf() method Known limitation: Calendar event dragging does not work in pop-out windows due to FullCalendar library using global document for mouse event listeners. Use context menus or edit modals as a workaround. Updated FullCalendar to v6.1.20 Thanks to @Snakiest, @same774, and @3zra47 for reporting (#1337) Fixed \"Convert current note to task\" hotkey not applying default values from settings When user configured default status/priority as \"None\", the modal would show \"Open\" and \"Normal\" instead Root cause: Task edit modal was refreshing data from file and overwriting user-configured defaults Now preserves constructor-provided task data when converting non-task files Thanks to @guihasparyk for reporting (#1304) Fixed \"Cannot find function map on type Link\" error in Blocking view Error occurred when embedding the Relationships base and opening the Blocking view Root cause: When blockedBy contained a single dependency, Bases returned it as a Link object without a .map() method Fixed by wrapping blockedBy with list() before calling .map(), consistent with the Blocked By view Thanks to @prayidae for reporting (#1295) Fixed missing navigation link to Default Base Templates page on tasknotes.dev The page existed but was not accessible from the site navigation Thanks to @Arachnidai for reporting (#1223) Fixed \"Go to today's note\" command opening wrong date in positive UTC offset timezones In timezones like Japan (UTC+9), early morning use of this command opened yesterday's note Root cause: Incorrectly extracting UTC date components instead of local timezone date Thanks to @BrucePlumb for reporting"},{"title":"TaskNotes 4.2.1","url":"/obsidian/releases/4.2.1/","description":"(#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder","product":"obsidian","text":"Added# New Calendars API endpoint for access to calendar data Access calendar provider information and connection status Query events from Google Calendar, Microsoft Calendar, and ICS subscriptions Filter events by date range tasknotes-cli has been updated to make use of this endpoint Fixed# (#1424) Fixed \"Create New Task\" command creating tasks in active folder instead of default folder \"Create New Task\" now correctly uses the configured default task folder \"Create New Inline Task\" continues to use the inline task folder setting Thanks to @Gogo-XD for reporting and @TonyAtlas for confirming (#1421), (#1042) Fixed natural language parser only setting one date when both scheduled and due dates are specified Entering something like \"task due Jan 9 at Jan 9\" now correctly sets both the due date and scheduled date Thanks to @wealthychef1 and @dblinnikov for reporting (#1410) Fixed vim insert mode not activating in task creation modal The modal now correctly enters insert mode when vim keybindings are enabled Thanks to @Leo310 for the feature request (#1422) Fixed tags with dashes not being parsed correctly Tags like #my-tag were being truncated to #my Thanks to @JerryLu086 for reporting (#1419) Fixed custom statuses and priorities not saving in settings Values entered in text fields were sometimes lost when closing the settings modal Thanks to @s33a for reporting"},{"title":"TaskNotes 4.3.0","url":"/obsidian/releases/4.3.0/","description":"(#1361) Option to disable inline task overlay for aliased wikilinks","product":"obsidian","text":"Changed# (#1437) Unified template variable syntax and available variables across filename and body templates Both systems now use double-brace {{variable}} syntax consistently Single-brace {variable} syntax remains supported for backwards compatibility but is deprecated Settings UI shows a warning when deprecated single-brace syntax is detected Filename templates gain body template variables: {{contexts}}, {{tags}}, {{hashtags}}, {{timeEstimate}}, {{details}}, {{parentNote}} Body templates gain filename template variables: {{zettel}}, {{nano}}, and all extended date/time variables Thanks to @23maverick23 for reporting Added# (#1361) Option to disable inline task overlay for aliased wikilinks New setting in Features → Inline Tasks: \"Disable overlay for aliased links\" When enabled, links with aliases like [[Task|Check Status]] render as plain links Links without aliases continue to show the interactive task widget Useful when embedding tasks in prose where the widget would be disruptive Thanks to @diegomarzaa for the contribution and @jldiaz for proposing this feature in #1117 (#1199, #1205) Google Calendar export for tasks Sync tasks to Google Calendar based on scheduled or due dates Automatic sync on task create, update, complete, and delete Configurable event title templates with placeholders ({{title}}, {{status}}, {{priority}}, etc.) Event descriptions include task metadata and optional Obsidian deep link Support for all-day or timed events with customizable duration Event color customization using Google Calendar's color palette Default reminder setting for popup notifications Bulk sync and unlink actions in settings Task-event linking stored in frontmatter (googleCalendarEventId) Recurring tasks sync as Google Calendar recurring events Completed or skipped recurring instances are automatically excluded Thanks to @someromans and @Leonard-44 for requesting this feature, and @dmantisk, @farangkao, @rayvermey, and @rdpr for their input Fixed# (#1413) Fixed angle-bracket links and project title display Angle-bracket links like [Spec]() now resolve correctly Project links display frontmatter title instead of raw filename/path when available Dependency values normalize consistently across wikilinks, markdown links, and angle-bracket variants Many thanks to @normenmueller for the contribution (#1414) Kanban column headers now display configured priority labels instead of raw values Many thanks to @normenmueller for the contribution (#1416) Fixed property-based task identification mutating tags unexpectedly Tags are only written when explicitly changed by the user Task tag is only added in tag-based identification mode Fixes #1391 Thanks to @loukandr for reporting and @normenmueller for the fix (#1187) Fixed \"Unknown view types\" error when opening Bases views after upgrading from pre-V4 Users who had disabled Bases support in earlier versions could not open Bases views after upgrading Settings migration now automatically re-enables Bases support since the toggle was removed in V4 Thanks to @MiracleXYZ for reporting (#1144) Fixed relationships.base showing empty views for Projects, Blocked By, and Blocking tabs The top-level task filter was excluding non-task files from the Projects view Projects can be any file type (not just tasks), so the filter is now applied per-view Subtasks, Blocked By, and Blocking views retain the task filter; Projects view does not Users with existing relationships.base files should delete and regenerate them to get the fix Thanks to @needo37 for reporting, and @n1njaznutz, @nestor50, and @IvyDliu for investigating and confirming the solution Fixed calendar view type not persisting or applying when changed View type changes via header buttons (week/day/month) are now saved to the .base file View type changes via Bases settings panel now apply immediately without reload (#1441) Fixed task dragging broken with \"Span tasks between scheduled and due dates\" enabled Span events can now be dragged to move tasks in time Dragging shifts both scheduled and due dates proportionally, preserving the span duration Previously, dragging span events would cause a visual/data mismatch where the calendar showed the wrong position Thanks to @Peeeet for reporting"},{"title":"TaskNotes 4.3.1","url":"/obsidian/releases/4.3.1/","description":"(#1546) Added sticky kanban column headers that remain visible while scrolling","product":"obsidian","text":"Added# (#1546) Added sticky kanban column headers that remain visible while scrolling Thanks to @normenmueller for the contribution (#1458) Added CSS color classes to context tags for custom styling Each context tag now receives a unique CSS class based on its name (e.g., context-tag--color-0 through context-tag--color-19) Enables styling individual contexts via CSS snippets Thanks to @phortx for the contribution Added mdbase-spec type definition generation New setting in Integrations tab to generate mdbase-spec v0.2.0 type definition files (mdbase.yaml and _types/task.md) at the vault root Type definitions are derived from TaskNotes settings (statuses, priorities, field mappings, user fields) and regenerated automatically when settings change Enables interoperability with other tools that support the mdbase-spec format Fixed# (#1472) Fixed task dependencies not being stored as wikilinks in frontmatter Dependencies now retain their [[wikilink]] format when saved, preventing them from breaking on file rename Thanks to @renekalff for reporting (#1443) Fixed default status/priority not updating when the referenced custom value is deleted Deleting a custom status or priority that was set as the default now resets the default to the first available value Thanks to @l-mb for the contribution (#1448) Fixed project removals not persisting from the task edit modal Removing all projects from a task now correctly clears the projects field Different link formats (e.g., markdown links vs wikilinks) no longer cause false change detection Thanks to @normenmueller for the contribution (#1514), (#1517) Fixed task reminders not syncing to Google Calendar Task-specific reminders (both relative and absolute) now sync to Google Calendar Previously only the global default reminder setting was used, ignoring per-task reminders Thanks to @christenbc for the contribution (#1525), (#1531) Fixed subtask status dot not refreshing visually when clicked Status dot, checkbox, and card styling now update instantly when cycling status Thanks to @christenbc for the contribution (#1537) Fixed Google Calendar errors during bulk sync Added rate limiting to space out API calls, preventing errors when syncing many tasks at once Thanks to @Lorite for the contribution (#1515), (#1540) Fixed time loss when setting recurrence and recurrence not clearing from Google Calendar Setting recurrence on a task with a scheduled time now preserves the time, preventing Google Calendar events from appearing as all-day Clearing recurrence from a task now also removes it from the synced Google Calendar event Thanks to @christenbc for the contribution (#1428), (#1559) Fixed hierarchical tags with slashes (e.g., #project/sub-project) being truncated in link text Tags containing slashes, hyphens, and Unicode characters now render correctly Thanks to @normenmueller for the contribution and @ysafonov for reporting (#1565) Fixed Google Calendar target calendar dropdown appearing empty after app restart The dropdown now re-populates once calendars are fetched during startup Thanks to @N-HEDGER for reporting (#1567) Fixed inline task card widgets disappearing momentarily When the task cache is temporarily cleared (e.g., during Smart Connections processing), the previously-rendered widget is now preserved instead of reverting to a plain wiki link Thanks to @scztt for reporting (#1568) Fixed deleted tasks not being removed from Google Calendar When a task file is deleted outside of TaskNotes (e.g., via Obsidian's file manager), the synced Google Calendar event is now cleaned up automatically Thanks to @kmaustral for reporting Fixed Integrations tab spacing and layout issues Improved positioning of buttons and status indicators across Google Calendar, ICS, and Webhooks sections"},{"title":"TaskNotes 4.3.2","url":"/obsidian/releases/4.3.2/","description":"(#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus","product":"obsidian","text":"Added# (#1520) Tag and Context fields in Edit Task modal now show all available suggestions immediately on focus Previously required typing at least one character before suggestions appeared Already-selected values are excluded from the suggestion list Thanks to @Glint-Eye for the suggestion (#1506) Added setting to configure the default color for new timeblocks New color picker in Settings > Features > Timeblocking Previously hardcoded to indigo; now user-configurable Thanks to @phillipadsmith for the suggestion Fixed# Fixed mdbase-spec type definition generation not triggering when settings change (#1456) Fixed inline tasks jumping visually when marked as completed Thanks to @3zra47 for reporting (#1364) Fixed auto-stop time tracking not triggering when completing recurring task instances Thanks to @slipstyle for reporting (#1465) Fixed all-day events synced to Google Calendar receiving wrong notification time All-day events now use Google Calendar's configured all-day notification defaults instead of a minutes-based reminder Thanks to @Jomo94 for reporting (#1470) Fixed cursor showing as default instead of pointer on interactive elements Thanks to @TheFrostedDev for reporting (#1491) Fixed boolean property values being quoted as strings in Bases filter generation When using a boolean property (e.g. tasknote: true) for task identification, the filter now correctly handles the value Thanks to @denisgorod for reporting (#1494) Fixed Kanban swimlane resetting to \"None\" on initial load and after navigation Thanks to @tnguyen2018 for reporting (#1555) Fixed \"Folder already exists\" error when creating tasks or converting inline tasks Thanks to @jkune5 for reporting (#1532) Fixed expanded task modal buttons being cut off when content exceeds viewport height Thanks to @willfanguy for reporting (#1542) Fixed declined and cancelled events from ICS calendar subscriptions appearing in calendar view Thanks to @karenchoe428 for reporting (#1556) Fixed completion-based recurring tasks not rescheduling when the recurrence interval is large Thanks to @kazerniel for reporting (#1492) Fixed hardcoded \"open\" status leaking into filenames, recurring task displays, and parsing fallbacks Users with custom default statuses (e.g. \"inbox\") no longer see \"open\" where their configured default should appear Recurring tasks now show their actual configured status instead of always displaying \"open\" when not completed Thanks to @macdrifter for reporting (#1501) Fixed Google/Microsoft Calendar event colors not showing in agenda/list view Per-event and calendar-level colors now display correctly in the list view, matching grid view behavior Added today indicator highlighting to list view day headers Thanks to @Robubble for the suggestion"},{"title":"TaskNotes 4.3.3","url":"/obsidian/releases/4.3.3/","description":"Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase","product":"obsidian","text":"Changed# Published mdbase-tasknotes (mtn), a standalone CLI for managing tasks in markdown files via mdbase Works on the same vault and _types/task.md schema that TaskNotes generates, without requiring the plugin or HTTP API Preferable over tasknotes-cli as a lighter-weight alternative and when Obsidian is not running, on remote machines, or in scripts and CI environments Supports natural language task creation, time tracking, project aggregation, statistics, and an interactive REPL Extracted shared natural language parsing logic into the standalone npm package tasknotes-nlp-core The NLP parser and related language configuration are now shared through this package This keeps behavior consistent between the plugin and CLI tools Added# (#1549) Added setting to reset markdown checkboxes when recurring tasks are completed When enabled, all checked checkboxes (- [x]) in the task body are reset to unchecked when a recurring task instance is completed and rescheduled Useful for recurring tasks with subtask checklists that need to be repeated each instance Configurable via Settings > Features > Recurring Tasks > \"Reset checkboxes on recurrence\" Thanks to @phortx for the feature request (#1548) Added ability to create calendar events on connected external calendars directly from the calendar view When clicking or dragging to select a time slot, a new \"Create calendar event\" option appears in the context menu Opens a modal to enter event title, description, location, and select which calendar to create on Supports both Google Calendar and Microsoft Calendar providers Thanks to @Robubble for the feature request (#1597) Added MCP server for AI agent integration Exposes TaskNotes tools at /mcp endpoint, gated behind enableMCP setting Supports tasks (CRUD, query, toggle status/archive, parse from text), time tracking, pomodoro, calendar events, and task statistics Thanks to @dstotijn for the contribution Fixed# Fixed generated mdbase type definitions for task dependencies using the wrong field type In _types/task.md, blockedBy[].uid now uses type: link (was type: string) Better matches how dependency links are serialized in task frontmatter ([[...]]) Fixed generated mdbase reminder type definitions to better match TaskNotes reminder data In _types/task.md, reminders[].type now uses enum values absolute|relative reminders[].relatedTo now uses enum values due|scheduled reminders[].absoluteTime now uses type: datetime (was type: string) (#1597) Fixed webhook payloads for time tracking start-with-description containing stale data Thanks to @dstotijn for the fix (#1581) Fixed Pomodoro starting break instead of work session after app restart After completing a work session and restarting, pressing Start would incorrectly start a break Now properly resets nextSessionType when clearing stale sessions or stopping the timer Thanks to @Sirnii for the detailed bug report and root cause analysis (#1577) Fixed Edit Note/Task modal hiding action buttons when content exceeds viewport height Added vertical scroll to modal content area while keeping buttons pinned at bottom Thanks to @hossam-elshabory for reporting and @ivannin for helping in discussion (#1600) Fixed kanban view grouping not working when more than 20 views exist The getGroupByPropertyId() method had a hardcoded loop limit of 20 iterations Views at index 20 or higher would not be found, causing groupBy to return null Thanks to @IHaveNoShame for reporting (#1595) Fixed task modal floating buttons blocking content on mobile Added mobile-specific (body.is-mobile) CSS to ensure proper flex layout Button container now stays pinned at bottom without overlapping scrollable content Thanks to @Jomo94 for reporting (#1590) Fixed HTTP API not allowing blockedBy dependencies when creating tasks Added blockedBy field support to TaskService.createTask() Updated API documentation with blockedBy, recurrence, and reminders fields Thanks to @hGriff0n for reporting (#1582) Fixed recurring tasks not appearing at end of visible calendar range for non-UTC timezones Daily/weekly recurring tasks with times after ~1pm would disappear on the last day of the visible range for users in positive UTC offsets (e.g., UTC+11) Fixed date boundary comparisons in both generateRecurringInstances() and generateRecurringTaskInstances() to compare dates only, not timestamps Thanks to @benefitbug for reporting (#1580) Fixed Google Calendar sync failing after OAuth token expires with unhelpful error message When refresh tokens expire or are revoked (e.g., Google Cloud project in Testing mode, user revoked access), the error message was confusing: \"Failed to refresh google token: Request failed, status 400\" Now detects irrecoverable token errors (invalid_grant, invalid_client) and automatically disconnects the OAuth connection Shows actionable error message: \"Google Calendar connection expired. Please reconnect in Settings > Integrations.\" Prevents repeated failed refresh attempts and error message spam Thanks to @osxisl for reporting and @Naesue for helping in discussion (#1584) Fixed DOMTokenList error when task status values contain spaces Clicking the status ring on a task card threw an error when status contained spaces (e.g., \"In Progress\") Status and priority values are now sanitized before being used as CSS class names Thanks to @omber for reporting"},{"title":"TaskNotes 4.4.0","url":"/obsidian/releases/4.4.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# Mdbase type generation now includes tn_role annotations so external tools can identify each field's role even when frontmatter names are customized (#1618) Mdbase type matching now follows your task identification settings (tag or frontmatter property), with fallback to tag matching when needed Thanks to @jimbo108108 for reporting Mdbase type status fields now include tn_completed_values so external tools can reliably identify which status values count as completed (#1576) Added an optional Checklist Progress task-card property that renders a compact progress bar and completed/total count from top-level markdown checkboxes Uses metadata cache list items and excludes nested checklist entries so progress reflects top-level task steps In Bases views, map tasks (file.tasks) to Checklist Progress Existing .base files need file.tasks added to the view order YAML manually Newly generated .base templates now include file.tasks in view order by default Thanks to @phortx for opening #1576 and for the earlier implementation PR, and @piyushaswani55 for feedback in the issue discussion Changed# Mdbase type generation no longer overwrites mdbase.yaml if the file already exists, preserving user customisations Webhooks now fire consistently regardless of whether updates come from the UI, HTTP API, or MCP Webhook runtime state now syncs automatically when plugin settings change Shared HTTP response/body parsing utilities are now consolidated in a dedicated httpUtils module Release notes now include a reminder on every release page that default generated .base template changes never overwrite existing user .base files, and that users can regenerate templates from Settings to pick up updates Fixed# (#1608) Fixed task title frontmatter being removed when storeTitleInFilename is enabled title is now retained in frontmatter while filename derivation from title remains unchanged Thanks to @victoraraujo105 for the PR (#1602) Fixed time tracking statistics showing incorrect or zero values for Today/Week/Month due to UTC-anchored date range boundaries in Stats View Updated range calculations to use local calendar-day boundaries consistently (#1602) Fixed inconsistent timeEntries timestamp formats across create/edit/drag/resize flows Time entry timestamps are now written in canonical UTC ISO format (toISOString() with Z) across all write paths (#1602) Fixed denormalized timeEntries.duration drift after edits Time tracking calculations now derive duration from startTime/endTime Time entry save paths now strip legacy duration values instead of persisting them Thanks to @dy66 for opening #1602"},{"title":"TaskNotes 4.5.0","url":"/obsidian/releases/4.5.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1652) Fixed API, MCP, and NLP task creation so it respects your configured filename format when title storage in filenames is disabled Thanks to @36mimu36 for reporting, and @rafavital and @warm-july for follow-up discussion and reports (#1601, #1709) Fixed reading-mode relationship widgets sometimes rendering multiple times during startup Applied the same protection to task cards so overlapping refreshes are coalesced there too Thanks to @wealthychef1 and @CarlJohnson99 for reporting, and @benmartinek for confirming the behavior (#1713) Fixed ICS export so date-only scheduled tasks are written as all-day events instead of midnight events Thanks to @bepolymathe for the request and interoperability details (#267, #948, #1682, #1717, #1725) Fixed expanded subtasks and dependency cards in Bases Task List and Kanban views so related items can inherit the current view's filters instead of always showing every linked task Added a per-view \"Expanded relationships\" option so you can switch between inherited filters and showing all related tasks Thanks to @mdbraber, @GardarikanetS, @Glint-Eye, @prepare4robots, and @robmcphers0n for the original reports and feature requests, and @marblebyte for follow-up discussion Improved custom view and search-pane activation when reopening deferred tabs (#1720) Fixed Bases Task List cards showing icon tokens such as clock instead of readable date-like values, and fixed property labels to use Bases display names instead of raw property IDs Thanks to @Sirnii for reporting (#1633) Fixed interactive task-card labels and ribbon labels so Bases-backed cards use translations and configured display names instead of hardcoded English or raw property IDs Thanks to @Sarryaz for reporting (#1651) Fixed date is query filtering so date-only searches also match timed scheduled and due values during prefiltering Thanks to @36mimu36 for reporting (#1644) Fixed generated default task views so recurring tasks without a complete_instances property still appear as incomplete where appropriate Thanks to @bkennedy-improving for reporting, and @SandroK for follow-up discussion on related default-view behavior (#1513, #1686) Fixed a calendar issue where creating or editing events and timeblocks could reset the visible date back to today In-place calendar recreation now preserves the visible date unless you explicitly navigate elsewhere Thanks to @owenoxen for opening #1513, and @Lorite for opening #1686 and contributing the fix Fixed documentation deployment CI failures caused by docs-builder/src/js/main.js being excluded by a broad .gitignore rule Reduced background calendar-sync overhead when persisting sync tokens Prevented duplicate auto-stop time-tracking listeners from accumulating after settings reloads Fixed a settings-lifecycle issue that could accumulate calendar update callbacks while the Integrations tab is repeatedly opened (#1630) Fixed TaskNote inline task cards ignoring centered \"Readable line length\" layout in the Minimal theme Thanks to @martin-forge for reporting Fixed a broken docs cross-reference from Property Types Reference to Task Properties settings Fixed docs site links so internal Markdown links resolve to app routes instead of broken .md paths Fixed docs release-note links by building Markdown pages even when they are not listed directly in the sidebar Added# (#1704) Added an option to widen the current day column in multi-day calendar time-grid views You can control the width multiplier and choose whether it applies to week view, custom multi-day view, or both Thanks to @dictionarymouse for the feature request Added TaskNotes Obsidian CLI commands for task creation, time tracking, and Pomodoro control Includes shared NLP-to-task conversion across the CLI, modal, and API capture flows, plus new user documentation for the built-in CLI commands (#1716) Added roomier subtask and dependency cards inside the task modal while keeping the task options menu available Thanks to @hokfujow for the feature request (#1619, #386, #621) Added drag-to-reorder for Kanban and Task List views Supports grouped Task List moves, manual ordering via the tasknotes_manual_order property, and improved drag/drop behavior for swimlanes, filtered views, and interactive task controls To use it, sort the view by the Manual Order field (tasknotes_manual_order by default), or regenerate the built-in .base templates from Settings → TaskNotes → General → Create Default Files Thanks to @ac8318740 for the original contribution in PR #1619, @iholston and @dsebastien for opening #386 and #621, and @mdbraber, @elvarb, @LucidToday, @craziedde, @kmaustral, @SKIERZZ, @sookochoff, and @kanzaki1201 for follow-up discussion and testing across the linked issues and PR Added a standalone TaskNotes Specification repo and docs section covering the data model, field mapping, recurrence behavior, validation rules, and conformance tests Added tasknotes-tui, a terminal UI for working with TaskNotes vaults Includes keyboard-driven views, date navigation, time tracking, recurring task support, and a command palette Changed# Refactored several internal modules to reduce coupling and make maintenance safer Updated generated _types/task.md output so dateCreated and dateModified include generated timestamp values, and recurrence_anchor defaults to scheduled Cleaned up API, webhook, NLP, privacy, settings, and view documentation for clarity and accuracy Expanded Task List and Kanban documentation for drag-to-reorder, including manual-order sorting, grouped and swimlane scope, and filtered-view limitations"},{"title":"TaskNotes 4.5.1","url":"/obsidian/releases/4.5.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1672) Fixed custom date ranges in the MCP time summary tool so from and to dates work as expected Thanks to @pib for the fix (#1742) Fixed calendar week and day views so the time scale stays aligned on the left instead of drifting inward Thanks to @ysafonov for the report and screenshot"},{"title":"TaskNotes 4.5.2","url":"/obsidian/releases/4.5.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1342, #1793) Added native tag autocomplete to time entry descriptions by using the embedded markdown editor in the time entry editor modal. Thanks to @fastrick for the request and @renatomen for the PR. (#1756, #1798) Added HTTP API support for configured custom user fields so task responses include them and create/update requests can round-trip their values. Thanks to @Treygec for the request and PR. (#1777) Added a Modal Fields setting to choose whether Tab/Shift+Tab move focus out of the task details editor or use the markdown editor's indentation behavior. Thanks to @P-Sc for the PR. Changed# Updated the Obsidian API dependency to 1.12.3 and switched the Bases integration to the official API type declarations. Bases task cards and property-event cards now render metadata values through Obsidian's native Bases value renderer so links, dates, lists, icons, and formula values display more faithfully. Fixed# (#1778) Fixed MCP initialize requests using newer protocol versions such as 2025-11-25 failing instead of negotiating down to TaskNotes' supported MCP version. Thanks to @SakulaPor for reporting. (#1781) Fixed duplicate metadata properties on Bases task cards when bare and note.-prefixed property IDs map to the same TaskNotes field. Thanks to @loukandr for reporting and tracing the issue. (#1787) Removed the \"(click to change)\" helper text from recurrence tooltips on task cards. Thanks to @kazerniel for reporting. (#1828) Fixed subtask creation from a task card dropping the parent task project when natural-language input also adds projects. Thanks to @prepare4robots for reporting. (#1786) Fixed TaskNotes task cards and relationships/subtasks widgets appearing inside embedded task-note heading or block sections. Skips note-level widget injection in detached or embedded Markdown editor contexts used by plugins such as Block Link Plus. Thanks to @3zra47 for reporting. (#1815) Fixed the Priority property settings so the NLP trigger character field is visible and editable even when priority NLP parsing is disabled. Thanks to @spiv for reporting. (#1035) Fixed the task modal title field causing the modal to jump to the bottom when focused on iPhone. Thanks to @3zra47 for reporting and following up. (#1045) Fixed inline linked recurring tasks keeping the previous day's completed state after the calendar day changes. Thanks to @3zra47 for reporting and following up. (#1788) Fixed Task List subgroup headers and cards rendering without clear indentation. Thanks to @renatomen for the PR. (#1810) Updated Japanese Kanban terminology to use the more natural katakana spelling. Thanks to @sigma7863 for the PR. (#1633) Fixed Bases task cards using fallback labels instead of Bases display names for mapped task fields and file properties. Thanks to @Sarryaz for reporting the Bases task card i18n and field-mapping issue. (#884) Fixed untranslated strings and English placeholder examples across non-English interface translations. Thanks to @berzernberg for reporting Russian translation gaps. (#1765, #1769) Fixed auto-archived tasks leaving stale Google Calendar events when cleanup runs before calendar sync is ready or after the task moves into the archive folder. Thanks to @martin-forge for reporting and the PR. (#1764) Fixed Google Calendar sync using stale task metadata after rapid task updates, and fixed late recurring completions/skips recording the completion day instead of the scheduled occurrence date. Thanks to @martin-forge for the PR and to @jpmoo for reporting the recurring completion issues. (#1782) Fixed CI test runs resolving the NLP parser package from a local sibling checkout instead of the published dependency. Thanks to @martin-forge for reporting. Published mdbase-tasknotes 0.1.3 with compatibility fixes for TaskNotes-generated mdbase schemas. Includes clearer create-path diagnostics, natural-language mtn list --due filters, timer log datetime filters, home-directory path expansion, project wikilink preservation, and correct mtn --version reporting. Thanks to @tparsons9, @anomatomato, @npondel, @plashal, and @waspeer for the reports and PR. (#1667) Fixed NLP scheduled-date parsing so standalone scheduled and start triggers can set scheduled dates alongside due dates. Thanks to @hokfujow for reporting and @UniqueClone for the NLP core PR. Fixed NLP parser title cleanup for explicit date triggers and Japanese/Chinese priority phrases. (#1658) Fixed Pomodoro stats date bucketing for sessions near local midnight. Pomodoro session stats now compare the recorded session calendar date against UTC-anchored target days without shifting through UTC or the reader's current timezone. Pomodoro daily-note storage now writes sessions to the daily note matching the recorded session date. Thanks to @ewgdg for reporting, @AntonIlinykh and @dkchacha for follow-up discussion, and @ITblacksheep for PR #1758. (#1813) Fixed Pomodoro timer UI stalls caused by refreshing session statistics on every timer tick. Pomodoro stats now refresh on initial render and session completion instead of once per second. Pomodoro daily-note stats now read the relevant date/range instead of routing through all history. Native Pomodoro notifications now respect the notification setting and granted permission before showing. Thanks to @Szu-Szu for reporting and @its-thex for confirming. (#1744) Fixed Bases Task List views so changing the per-view Expanded relationships option takes effect on re-render. Restores the expected show-all behavior for setups that hide subtasks at the top level with note.projects.isEmpty(). Thanks to @minol-dev for reporting, @Glint-Eye for follow-up discussion, and @stanley-910 for PR #1792 exploring the related standalone-subtask workflow. Fixed tag clicks in task cards opening the task edit modal in addition to the tag search panel, and kept rendered tag metadata on a single row inside task cards."},{"title":"TaskNotes 4.5.3","url":"/obsidian/releases/4.5.3/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1834, #1847) Fixed empty Bases formula and custom properties showing null or undefined on TaskNotes task cards. A big thanks to @Glint-Eye and @3zra47 for reporting. (#1836) Fixed TaskNotes Bases views not refreshing task cards after status, archive, and auto-archive updates. A big thanks to @kmaustral for reporting."},{"title":"TaskNotes 4.6.0","url":"/obsidian/releases/4.6.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# TaskNotes now requires Obsidian 1.12.2 or later, matching the Obsidian APIs used by the plugin. Improved internal code quality by resolving lint warnings, moving static inline styles into CSS utilities, and extending sentence-case lint coverage to English localization strings, with no intended behavior changes. Fixed# Fixed TaskNotes failing to load when Obsidian opened without an active Markdown file."},{"title":"TaskNotes 4.7.0","url":"/obsidian/releases/4.7.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# Enabled lint checks that mirror Obsidian community plugin review findings, including dynamic code execution, Promise handling, deprecated APIs, unsafe stringification, directive comments, Node built-in imports, and explicit any usage. Clarified privacy documentation for optional integrations that make periodic background network refreshes. Cleaned up internal Obsidian and Bases compatibility adapters used by search and grouped views. (#1839, #1881) Updated default Base urgency scoring so timed tasks earlier in the day sort above later tasks with the same priority and date Thanks to @loukandr for the contribution Fixed# Fixed project autocomplete searches so non-empty + queries only return files matching the query in the basename, title, aliases, or explicitly searchable metadata rows. (#1713) Fixed all-tasks ICS export when a task uses a space-separated scheduled datetime such as 2025-08-12 18:00 Thanks to @bepolymathe for requesting this and @m4to-3pe for following up Fixed Pomodoro stats reopening immediately after a plugin reload before the Pomodoro service has finished initializing. (#1872) Fixed unarchiving moved tasks so the destination task folder processes template variables such as {{project}} before moving the file Thanks to @OXI-717 for reporting (#1870) Fixed custom user field NLP triggers with file autosuggest so selecting a wikilink suggestion stores the link in the user field instead of leaving it in the task title Thanks to @Sineapple for reporting (#1878) Fixed completed tasks still appearing as active blockers for dependent tasks Thanks to @macbikegeek for reporting (#1880) Fixed the status bar time-tracking label for task titles that contain a dash Thanks to @ubidev for reporting (#1854) Fixed modal task completion so completed tasks receive a completed date consistently Thanks to @misolex for reporting (#1124, #1838, #1881) Fixed default Base views and formulas excluding tasks scheduled or due today at a non-midnight time from day-level comparisons Thanks to @kmaustral for reporting and @loukandr for the fix Removed# Removed JavaScript webhook transform support and examples. JSON webhook transform templates remain supported."},{"title":"TaskNotes 4.7.1","url":"/obsidian/releases/4.7.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# Release assets are now built with GitHub artifact attestations so users and reviewers can verify the provenance of main.js, manifest.json, and styles.css."},{"title":"TaskNotes 4.7.2","url":"/obsidian/releases/4.7.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Changed# Improved local lint checks so package and CSS issues reported by Obsidian's online review can be caught before submission. Cleaned up stylesheet compatibility issues reported by Obsidian's online review without changing the intended TaskNotes appearance. Improved spacing and alignment in task, timeblock, and webhook modals after the stylesheet cleanup. Reworked optional calendar and ICS subscription refresh scheduling to avoid interval-based network polling while preserving the same refresh intervals. Cleaned up additional source patterns reported by Obsidian's online review, including unsafe default object stringification and redundant external type unions. Prevented a console error when plugin listeners are cleaned up after reloads. Added a local lint check to prevent interval-based polling in files that also perform network requests."},{"title":"TaskNotes 4.8.0","url":"/obsidian/releases/4.8.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#353) Added a Has Subtasks filter for task queries, so views and API clients can show only project-style tasks or direct tasks. Thanks to @mdbraber for suggesting this. (#380) Added a test-reminder button in notification settings, so reminder setup can be checked without creating a real task reminder. Thanks to @mdbraber for suggesting this. (#711, #168) Added an optional task-creation setting to open the new task note after saving, either in the current tab or a new tab. Thanks to @phortx and @23426356587 for suggesting this, and to @edward-peters and @obsilover for the follow-up. (#1041, #1800) Added copy-drag support for timeblocks: hold Ctrl, Cmd, or Alt/Option while dragging an existing timeblock to duplicate it at the new date and time. Thanks to @0-BSCode and @cweekly for suggesting this. (#1052) Added a public JavaScript API for in-vault scripts at app.plugins.plugins.tasknotes.api.parseNaturalLanguage(text), so Templater, QuickAdd, and MetaBind workflows can use TaskNotes' natural-language parser without running the HTTP API. Thanks to @edakimling for suggesting this. (#1235) Added a task-card toggle for blocked tasks, so you can expand a blocked task to see the tasks it is waiting on. Thanks to @craziedde for suggesting this. (#1254) Added ../ and ./ normalization for folder templates after variables are expanded, so instant task conversion can target sibling folders such as {{currentNotePath}}/../Tasks. Thanks to @rdick for suggesting this. (#1267) Added Daily Notes-style date tokens such as YYYY, MM, DD, MMMM, and dddd to TaskNotes folder templates. Thanks to @paulsen-it for suggesting this. (#1380) Added tag actions to task context menus, including add/remove actions for individual tasks and batch-selected tasks. Thanks to @Chuhtra for suggesting this. (#1377) Added right-click Mini Calendar actions for opening daily notes from day cells and weekly notes from week numbers. Thanks to @hasanyilmaz for suggesting this. (#1151) Added a Mini Calendar max color note count option, so one-note days can use the strongest heatmap color when that better fits the view. Thanks to @arreme for suggesting this. (#1376) Added backslash escapes for NLP trigger tokens, so text like \\@context, \\*done, or \\tomorrow can stay in the task title. Thanks to @JerryLu086 for suggesting this. (#1366) Added CSS variables for compacting nested task-card indentation, with smaller defaults on mobile and documented snippets for tighter task-link lists. Thanks to @rk-kontur for suggesting this. (#1502, #603) Added calendar indicators for external events that have linked notes or tasks, and showed loaded event titles in task-card calendar metadata instead of only the linked event count. Thanks to @Robubble and @mdbraber for suggesting this, and to @ubidev for the follow-up. (#1522) Added a per-status option to skip rarely used statuses when cycling task-card status indicators. Thanks to @Glint-Eye for suggesting this. (#144) Added an \"Open note in new tab\" action to the task context menu. Thanks to @cathywu for suggesting this and @macbikegeek for the follow-up feedback. (#167) Added an optional next-status override for each status, so forward cycling can jump to a configured status instead of always following the status order. Thanks to @DanBrazelton for suggesting this, and to @michelebugio, @Moyf, @anareaty, and @vorrermid for the follow-up feedback. (#1520) Made tag and context fields show available suggestions as soon as the field is focused. Thanks to @Glint-Eye for suggesting this, and to @craziedde for the follow-up. (#1541) Added {{currentNotePath}} and {{currentNoteTitle}} support to the default tasks folder, so normal task creation can place new tasks beside the active note without creating an inline link. Thanks to @ChristianAnyanwu for suggesting this, and to @abbasou and @ttlaylor for the follow-up feedback. (#648, #1605) Added clickable links in task-card contexts for note links, markdown links, and web URLs while keeping plain contexts as tag-search buttons. Thanks to @trdischat and @Glint-Eye for suggesting this, and to @renatomen for the follow-up feedback. (#1482) Added clickable custom-field links on task cards for wikilinks, markdown links, autolinks, and bare web URLs. Thanks to @ptbosch-figueiredorj for suggesting this, and to @Soleone for the follow-up use case. (#1471) Added Kanban column and swimlane-cell add buttons that open the TaskNotes creation modal with the grouped values already filled in. Thanks to @byheaven for suggesting this and @Davincible for the project-board use case. (#933) Added non-Markdown vault files such as canvases to project suggestions, using extension-qualified link targets so those files can be selected as task projects. Thanks to @Alvin21Bon for suggesting this. (#1475, #725) Added quote/backtick escapes for NLP input, so literal course codes or date words can stay in task titles without being parsed as estimates or dates. Thanks to @RumiaKitinari and @gavingwebb for suggesting this. (#1462) Added natural-language date entry to the task date picker, so existing due and scheduled dates can be changed with phrases such as \"tomorrow at 3pm\" when NLP is enabled. Thanks to @Ruboks-Cube for suggesting this. (#1526) Added a native date field to the task date picker, so scheduled and due dates can be changed with the device date picker while keeping optional times visible. Thanks to @jmartinmcfly for suggesting this and @23426356587 for the follow-up feedback. (#1603) Added Calendar view toggles for hiding completed or skipped recurring task instances while keeping future outstanding instances visible. Thanks to @wandererovertheseaofpiss for suggesting this. (#287, #273, #274) Added linked hover highlighting for Calendar and Agenda events that come from the same task note, so scheduled, due, and recurring entries are easier to connect. Thanks to @girisumit for suggesting this. (#280) Added project-specific CSS hooks to task cards and Calendar events, so project-based visual styling can be handled with user snippets. Thanks to @girisumit for suggesting this. (#1625) Added Shift + Cmd/Ctrl + Enter in the Create Task modal to save the current task and reopen the modal for the next one. Thanks to @tcb678 for suggesting this. (#1353) Focused the Create Task modal's natural-language input when the modal opens, with a longer mobile delay so the keyboard can open after layout. Thanks to @GiovanH for suggesting this. (#1664) Added project-based custom filename template variables, including the first project, all projects, and a short projectId. Thanks to @bendavis987 for the contribution. (#923) Added {{projectFilePath}} and {{projectFilePaths}} folder template variables, so task folders can mirror project note locations in the vault. Thanks to @PacoTaco2 for suggesting this. (#1697) Added cached Google Calendar, Microsoft Calendar, and ICS events to Mini Calendar days, with compact colored dots and event details from the existing calendar connection. Thanks to @RPGArchivist for suggesting this. (#1754) Added optional icons for priority values, so task cards can show a configured priority icon instead of only a colored dot. Thanks to @BrucePlumb for suggesting this and @prepare4robots for the follow-up feedback. (#1761) Added TaskNotes edit and task-action submenu entries to Obsidian's native file context menu for recognized task notes. Thanks to @delzero for suggesting this. (#1771) Added mobile drag handles to manually sorted Task List Bases views, so dragging can start from the handle without disabling normal text interaction on the rest of the card. Thanks to @PatrickGolz for suggesting this. (#1776) Allowed calendar timeline end times after midnight, such as 26:00 for a 2 AM next-day end. Thanks to @chrabia for suggesting this. (#1784, #1833) Added a per-view pinnedColumns option for TaskNotes Kanban views, so selected empty columns can stay visible as drop targets while other empty columns remain hidden. Thanks to @loukandr for suggesting and prototyping this. (#1794) Added context updates to the task card context menu, so contexts can be added, toggled, or cleared without opening the task edit modal. Thanks to @m13ntrpn for suggesting this. (#315, #1356, #1748, #1809) Added a subtle task-card indicator and CSS hooks for tasks with note body details, including existing task bodies read through Obsidian's metadata cache. Thanks to @volodxyz, @Karut, @yeHHH1g, and @aliceinwaterdeep for suggesting this, and to @minchinweb for the follow-up. (#1808) Added advanced Kanban swimlane ordering through swimLaneOrder, so swimlane rows can stay in a stable configured order. Thanks to @rookledookle for suggesting this, and to @benmartinek and @chrabia for the follow-up feedback. (#1805) Added an ICS export option to omit completed tasks from generated calendar files. Thanks to @bepolymathe for suggesting this. (#659) Added Obsidian links to ICS export descriptions, so exported calendar events can open their source task notes. Thanks to @bepolymathe for suggesting this. (#589) Added an Appearance toggle to turn off strikethrough styling on completed task card titles. Thanks to @BrucePlumb for suggesting this. (#561) Added a \"Last day\" option to the custom recurrence month-day picker for month-end repeating tasks. Thanks to @TonyAtlas for suggesting this and @BrucePlumb for the follow-up. (#217) Added weekday selection to daily custom recurrence rules, so interval rules such as every three days can skip weekends from the recurrence modal. Thanks to @kmaustral for suggesting this. (#1818) Added an auto-height mode for TaskNotes Calendar Bases views so embedded agenda/list sections can size to their content instead of forcing an inner scroller. Thanks to @martin-forge for suggesting this. (#1201) Added a Calendar Bases toggle to hide the hourly breakdown in week, custom-days, and day views while keeping the all-day planning row visible. Thanks to @PacoTaco2 for suggesting this. (#1176) Added advanced Kanban WIP limits through wipLimits, so column headers can show (current/limit) counts and highlight exceeded limits. Thanks to @williamcheuk03 for suggesting this. (#914) Added a generated Due in countdown to the default Agenda Base and allowed Calendar Bases list agendas to span up to 365 days. Thanks to @williamcheuk03 for suggesting this. (#900) Added an instant-conversion setting to keep the original Markdown checkbox marker when converting a checkbox into a TaskNote link. Thanks to @dsebastien for suggesting this. (#898) Added a mobile-only calendar integration opt-out, so synced desktop calendar settings no longer have to trigger external calendar loading on Obsidian Mobile. Thanks to @cathywu for suggesting this. (#887) Added built-in scheduled and due date presets to the Quick actions palette for current tasks. Thanks to @willgraham345 for suggesting this and @anrie for the related preset feedback. (#819) Added a command to open Quick actions for the inline task link under the cursor. Thanks to @rlolingo for suggesting this. (#798, #1732, #1835) Added hotkeyable commands to edit the current task, add a project to the current task, and add an existing task as a subtask of the current note. Thanks to @xorander00 and @prepare4robots for requesting this, and to @musta-code and @ubidev for the follow-up suggestions. (#791) Added a UUID v4 task filename format and {{uuid}} custom filename template variable. Thanks to @bangbangbanggit for suggesting this. (#932) Added hotkeyable commands to cycle the current task's status and priority. Thanks to @rxunique for suggesting this and @luckb0x for the follow-up feedback. (#1655) Added live elapsed time to the optional active time tracking status bar item. Thanks to @connradolisboa for suggesting this. (#1622) Allowed multiple comma-separated default reminder offsets for timed Google Calendar task exports. Thanks to @solidabstract for suggesting this. (#706, #820, #1040) Added direct Pomodoro duration editing, hour-aware timer formatting, clearer one-minute controls, and an optional active Pomodoro status bar countdown. Thanks to @SublunarSage, @lj1446615403-cloud, @0-BSCode, and @thestrike72 for the suggestions and feedback. (#873) Added an optional built-in sound for task reminder notifications, with volume and preview controls in Settings. Thanks to @berzernberg for suggesting this. Added a generated Pomodoro statistics Base with daily and monthly summary views for Pomodoro history stored in daily notes. Changed# Expanded the bug report template to ask for Obsidian \"Show debug info\" output, affected task frontmatter, relevant Bases file contents, reproduction steps, and related logs or screenshots. Release notes now show the default .base file regeneration reminder only on the current version section, keeping older bundled sections focused on their own changes. Updated the release notes GitHub prompt to invite feedback while still asking satisfied users to star the project. (#239) Ordered Kanban status and priority columns by the configured status order and priority weights when no manual column order is saved. Thanks to @ScumbagScalawag for asking about this, and to @nightroman, @lavir, and @elvarb for the follow-up discussion. (#269) Marked Kanban status columns that come from values outside the configured TaskNotes statuses, so manually edited or external status values are visible as non-standard instead of blending into the board. Thanks to @cstelmach for suggesting this and @digitaldoctors for the follow-up. Refined Kanban empty columns, swimlane rows, and column drag handles, and added a per-view compact card layout option for denser boards. Kept Kanban swimlane rows from shrinking to share the viewport so the Max Swimlane Height setting is respected. Added guidance in Pomodoro statistics and Base file settings explaining that Pomodoro Base views require daily notes storage. (#323) Reordered task modal action buttons to match the right-click task menu order. Thanks to @23426356587 for suggesting this. (#1189) Made the Create/Edit Task modal priority picker follow the priority order configured in Settings. Thanks to @n1njaznutz for suggesting this. Made task-card priority dots and configured priority icons slightly larger for better visibility. (#1244) Clarified the Task Properties documentation for custom property keys and status values in Bases filters and sorting. Thanks to @Arachnidai for suggesting this. (#1234) Kept right-aligned subtask chevrons visible on task cards instead of only showing them on hover. Thanks to @n1njaznutz for suggesting this. (#1237) Made today's date more visible in the Mini Calendar view when another day is selected. Thanks to @riekusr for suggesting this. (#1348) Let long task titles wrap inside the Create/Edit Task modal title field while keeping saved titles single-line, and widened the contexts and tags fields in the modal details area. Thanks to @hasanyilmaz for suggesting this. (#1392) Made TaskNotes date fields accept compact YYYYMMDD typing and pasted dates. Thanks to @kazerniel for suggesting this. (#1431) Showed the year on task-card due and scheduled dates when the date is outside the current year. Thanks to @kazerniel for suggesting this. (#1429) Opened TaskNotes view commands in a new tab when they load configured Base files, so they do not replace the active note. Thanks to @Ruboks-Cube for suggesting this. (#1426) Added copy actions for TaskNotes Bases views, including current-view filenames, links, and titles from the result count menu, plus selected-task copy actions in the batch menu, while keeping the native Bases copy and CSV export actions available. Thanks to @kmaustral for suggesting this. Improved keyboard access, mobile layout, and theme color consistency across task cards, TaskNotes Kanban, Bases Kanban, calendar controls, stats, settings, and filter popovers. (#1526) Made the Create/Edit Task modal due and scheduled date buttons open a calendar-first "},{"title":"TaskNotes 4.8.1","url":"/obsidian/releases/4.8.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Fixed# (#1903) Improved the Edit Task modal on iPhone-sized screens so opening a task no longer automatically focuses the title field, and the mobile layout gives the title, fields, and action buttons more usable space. Thanks to @3zra47 for reporting the issue and sharing the screen recording. (#1909) Fixed compact Kanban task cards showing oversized status and priority indicators on touch devices. Thanks to @pxxush for reporting the issue. (#1908) Restored newly generated Calendar Bases to show the full day by default and inherit the calendar start/end settings instead of hard-coding 06:00-22:00. Thanks to @AndreMonthy for the report. (#1907) Fixed calendar time labels drifting away from the left axis in narrow sidebar calendar views. Thanks to @kmaustral for reporting the issue. (#1906) Fixed NLP priority shortcuts leaving partial text in task titles when custom priority values include words like high or low. Thanks to @RumiaKitinari for reporting the issue. (#1904, #1905) Fixed long tags in task cards wrapping instead of forcing horizontal scrolling in TaskNotes Bases views and note cards. Long tag pills can now wrap across lines and break within very long tag names on narrow screens. Thanks to @3zra47 for reporting the issue and to @zhouzhou626 for the contribution. (#1901) Fixed the task context menu creating an undefined property when adding or removing tags. Hardened task property updates so invalid frontmatter property names are rejected instead of written. Thanks to @mgrecar for reporting the issue. (#1902) Fixed Markdown-style project links in task frontmatter not appearing as subtasks on project pages. Thanks to @minchinweb for reporting the issue. Changed# Improved the internal structure around service notifications, vault writes, and shared utilities to make future fixes easier to test and maintain."},{"title":"TaskNotes 4.9.0","url":"/obsidian/releases/4.9.0/","description":"TaskNotes documentation.","product":"obsidian","text":"Security# (#1923) Restricted the HTTP API server to loopback and limited browser CORS access to loopback origins. Thanks to @martin-forge for reporting. Added# (#1932) Added middle-click support for opening task cards in a new tab. Thanks to @imsuck for the request. Fixed# (#1934) Fixed custom priority colors being overridden by default task-card priority styles in views. Thanks to @KittehBit for reporting. (#1933) Added the note path to fallback frontmatter parse warnings so malformed task YAML is easier to find. Thanks to @rayvermey for reporting. (#1931) Made the Pomodoro task chooser open from cached task data and ignore repeated clicks while it is already opening. Thanks to @sumiyalairu03 for reporting. (#1930) Fixed starting the Pomodoro timer from its hotkey without starting time tracking for the selected Pomodoro task. Thanks to @sumiyalairu03 for reporting. (#1929) Fixed the bottom Relationships widget overlapping embedded content such as Bases/Kanban views in task notes. Thanks to @rchaklashiya for reporting and following up with the embed case. (#1922) Restored the native color picker alongside manual color text entry in Create/Edit Timeblock fields. Thanks to @AndreMonthy for reporting. (#1921) Fixed direct frontmatter edits to lifecycle-relevant task fields not triggering Google Calendar sync or auto-archive side effects. Thanks to @martin-forge for reporting and verifying the direct-edit reproduction. (#1919) Fixed the Pomodoro view rapidly resizing at certain sidebar sizes. Thanks to @RumiaKitinari for reporting. (#1898, #1907) Fixed Calendar time labels shifting into the middle of Day and sidebar calendar grids after switching views. Thanks to @ddevaal for reporting and confirming the regression, and to @kmaustral for confirming the sidebar case in 4.8.1. (#1936) Added a Calendar Base drag/drop resolution option so events can snap to smaller increments than the visible time slot grid. Thanks to @benmartinek for suggesting this. Improved mobile task cards, inline widgets, modals, and settings layouts so dense controls and long labels fit more comfortably on small screens. (#1916) Fixed Markdown task links using Obsidian's generated filename label instead of the TaskNote title in the task link overlay. Thanks to @minchinweb for reporting. (#1911) Fixed recurrence choices starting from today instead of the selected calendar date when creating a task from Calendar view. Thanks to @mikhailmarka for reporting. (#1912) Fixed \"Create subtask\" pre-filling the parent task's full folder path in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming."},{"title":"TaskNotes 4.9.1","url":"/obsidian/releases/4.9.1/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1885) Added Shift+arrow keyboard range selection while bulk task selection mode is active. Thanks to @chrabia for suggesting bulk selection improvements and @sumiyalairu03 for the keyboard selection idea. Fixed# (#781, #1085) Fixed Outlook-published ICS calendar events appearing at the wrong time when their feed used Windows timezone names without matching timezone definitions. Thanks to @chrlaney for reporting and @mjkrasny for confirming the Outlook timezone case. (#1696) Fixed Google Calendar export for scheduled recurring tasks when a single occurrence is moved to a different date. Keeps the recurring master event on its original rule, excludes the original occurrence date, and syncs the moved occurrence as a detached event. Thanks to @martin-forge for reporting and contributing the fix. (#1912) Fixed \"Create subtask\" inserting the full path of the parent task in the Projects field instead of using the normal Obsidian link text. Thanks to @pkuehne for reporting and @benmartinek for confirming. (#1921) Fixed Google Calendar and auto-archive updates not running after direct task file edits. TaskNotes now picks up status, completion, and date changes made directly in a task file without triggering a large one-time Google Calendar rewrite at startup. Recovery also removes stale Google Calendar links when task files were deleted or replaced outside TaskNotes. Thanks to @martin-forge for reporting and contributing the fix. (#1938) Fixed partial HTTP API task updates rewriting native tags with # prefixes or duplicate task tags. Thanks to @joseluisgonzalezdelgado-ctrl for reporting. (#1939) Fixed the task Details field rendering as a small nested textarea when the embedded editor falls back. Thanks to @g-arthurvanderbilt for reporting and @cookbr for confirming the desktop impact. Fixed tag and modal preview edge cases found during validation: double-hash tags no longer match the task tag, empty tag lists stay empty when read back, and natural-language previews remain visible when enabled. (#1941) Fixed mobile Kanban boards scrolling the whole board vertically instead of keeping each list independently scrollable. Thanks to @pxxush for reporting. (#1943) Fixed MCP task-query tool instructions so filter operators match the operators TaskNotes actually accepts. Thanks to @jordankbartos for reporting and proposing a fix in #1944. (#1945) Fixed Google Calendar export so overlapping sync services do not create duplicate events for the same task while the saved event ID is still catching up. Thanks to @martin-forge for reporting and contributing the fix. (#1946) Fixed the bottom task in virtualized Task List Bases being partially hidden behind Obsidian's mobile bottom bar. Thanks to @3zra47 for reporting. (#1947) Fixed mobile Task List cards with left-positioned subtask chevrons so the chevron remains visible and project/detail badges stay on the main row. Thanks to @Jomo94 for reporting. (#1948) Fixed Agenda Calendar Bases so completed recurring instances can appear on their recorded completion dates, even when recurring task projections are hidden or the completion date is outside the recurrence pattern. Thanks to @Jomo94 for reporting."},{"title":"TaskNotes 4.9.2","url":"/obsidian/releases/4.9.2/","description":"TaskNotes documentation.","product":"obsidian","text":"Added# (#1791) Added collapse and expand controls for grouped Bases Task List views, including a default collapsed state option. Thanks to @renatomen for the contribution. Fixed# Fixed Pomodoro storage migration so existing plugin-data history is written to daily notes before switching storage, and clarified that daily notes can come from either the core Daily Notes plugin or Periodic Notes. (#1964) Fixed Microsoft Calendar OAuth so connecting no longer forces a fresh consent prompt every time, and clarified the Microsoft desktop app setup steps. Thanks to @thechonta for reporting. (#1966) Fixed custom priority icons so they render as icons instead of filled squares on task cards. Thanks to @sruiz-savia for reporting. (#1963) Fixed Google Calendar sync so duplicate event ID fields are repaired when saving task calendar metadata. Thanks to @christenbc for reporting. (#1961) Fixed the default custom filename template so it uses the recommended double-brace syntax and no longer warns on first use. Thanks to @chmac for reporting. (#1962) Fixed task tag normalization so tags entered with spaces are saved with hyphens for Obsidian tag compatibility. Thanks to @christenbc for reporting. (#1959) Fixed the MCP tasknotes_list_tasks tool so circular internal task data and live Obsidian object references no longer break task-list responses. Thanks to @kmaustral for reporting. (#1957) Fixed the Pomodoro timer layout in vertically split panes so the timer header and progress circle remain reachable when the pane is short. Thanks to @sumiyalairu03 for reporting. (#1956) Fixed Google Calendar sync so completing a recurring task updates the linked event title with the completion checkmark. Thanks to @jacksoluke for reporting. (#1953) Fixed inline task conversion so source-line wikilinks no longer create nested wikilinks in the replacement link text. Thanks to @bgk0018 for reporting. (#1952) Fixed Pomodoro task picker search results so matching task titles are ranked and sorted ahead of due-date ordering. Thanks to @KFrancoD for reporting. (#1392, #1949) Fixed due and scheduled date picker fields so typed or pasted date edits stay open until you choose Select, including compact YYYYMMDD entry when a date is already set. Thanks to @kazerniel for reporting and following up. (#982, #1947) Restored larger mobile task-card typography and let secondary card icons wrap below the task details when they no longer fit comfortably on mobile. Thanks to @3zra47 for reporting the font-size regression, @chrsdk and @scottaltham-payroc for confirming the mobile font-size issue, and @Jomo94 for reporting the mobile card layout problem."},{"title":"TaskNotes - Unreleased","url":"/obsidian/releases/unreleased/","description":"TaskNotes documentation.","product":"obsidian","text":""},{"title":"Settings","url":"/obsidian/settings/","description":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior.","product":"obsidian","text":"TaskNotes settings are organized into tabs. Each tab controls a different part of plugin behavior. General# The General tab controls task identification, storage locations, and task-card click behavior. Use this tab when your vault already has conventions such as custom tags, property-based identification, or specific folder structures. For more information, see the General Settings documentation. Task Properties# Task Properties defines the schema TaskNotes writes to frontmatter, including status, priority, dates, reminders, projects, and user fields. Each property card lets you remap key names and behavior so TaskNotes can match existing metadata rather than forcing a migration. For more detailed information, see the Task Properties Settings documentation. Modal Fields# Modal Fields controls the task create/edit experience by deciding which fields are visible and in what order. If your workflow depends on a handful of fields, you can surface only those and reduce form noise. For more information, see the Modal Fields Settings documentation. Appearance & UI# Appearance & UI handles task card density, calendar defaults, time formatting, and visual toggles for supporting widgets. Use this tab to tune how much information is visible at a glance. For more detailed information, see the Appearance & UI Settings documentation. Features# Features groups behavior toggles for inline tasks, natural language input, Pomodoro, reminders, and performance-related options. It is where you enable advanced workflow capabilities and then refine defaults. For more information, see the Features Settings documentation. Integrations# Integrations covers external connectivity: Bases view wiring, Google/Microsoft OAuth calendar sync, ICS subscriptions, automatic ICS export, HTTP API settings, and webhook endpoints. For more detailed information, see the Integrations Settings documentation."},{"title":"Appearance & UI Settings","url":"/obsidian/settings/appearance/","description":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements.","product":"obsidian","text":"These settings control the visual appearance of the plugin, including the calendar, task cards, and other UI elements. Task Cards# Use Default visible properties to decide what metadata appears on task cards without opening each task. This is the primary control for card density. Checklist progress is available as a visible property in task cards. In Bases view order arrays, the corresponding source property is file.tasks (shown as tasks in Bases property pickers once present in the view order list). Nested task cards use CSS variables for their indentation. Add a CSS snippet if you want a denser hierarchy than the default: .tasknotes-plugin { --tn-nested-task-indent: 12px; --tn-nested-task-padding: 8px; } body.is-mobile .tasknotes-plugin { --tn-nested-task-indent: 8px; --tn-nested-task-padding: 6px; } If task links inside normal markdown lists feel visually doubled with both a list marker and the task status indicator, a CSS snippet can hide those markers for task-link lines: .markdown-reading-view li:has(.task-inline-preview--reading-mode)::marker { content: \"\"; } .markdown-source-view.mod-cm6 .cm-line:has(.tasknotes-inline-widget) .cm-formatting-list { display: none; } Display Formatting# Use Time format to switch between 12-hour and 24-hour display across all TaskNotes surfaces. Calendar View# Calendar view settings determine the default landing mode, day/week framing, and timeline affordances. You can choose the default view, custom day span, first day of week, weekend visibility, week numbers, and whether today/current-time markers are shown. Selection mirror controls whether drag selections show a visual preview before committing. Use Calendar locale for region-specific formatting and calendar systems (for example en, de, or fa). Leave it empty to use automatic detection. Default Event Visibility# This section controls which event layers are enabled when a calendar view opens. You can independently toggle scheduled tasks, due dates, due dates for already-scheduled tasks, time entries, recurring tasks, and ICS events. Time Settings# Time settings define the structure of timeline views: slot duration, earliest visible time, latest visible time, and initial scroll position. Use these together to match your workday shape. UI Elements# UI element toggles control auxiliary surfaces such as the tracked-task status bar entry, the project subtasks widget and its placement, expandable subtasks in cards, chevron position, and the alignment of the views/filters button. Related Settings# Some appearance-related settings are configured elsewhere: Task filename format: Configured in Task Properties → Title card Project autosuggest display: Configured in Task Properties → Projects card"},{"title":"Features Settings","url":"/obsidian/settings/features/","description":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notific...","product":"obsidian","text":"These settings allow you to enable, disable, and configure the various features of the plugin, such as inline tasks, natural language processing, the Pomodoro timer, and notifications. Inline Tasks# Inline task settings control how aggressively TaskNotes turns plain note content into structured task interactions. Task link overlay enables the Live Preview card behavior for task links, while Instant task convert surfaces conversion buttons next to list items and checkboxes. Keep checkbox when converting leaves the original Markdown checkbox marker in the source note when a checkbox becomes a TaskNote link. For conversion output, Inline task convert folder sets destination behavior and supports {{currentNotePath}}, and Use task defaults on instant convert applies your default task values at conversion time. The separate Convert current note to task command keeps the current note body as the task details. If the note has no scheduled frontmatter, the command uses the Scheduled Date default from Task Properties; it does not apply body templates. Body Template# Body template settings let you scaffold newly created tasks with consistent note content. When enabled, TaskNotes reads the configured template file and expands variables like {{title}}, {{date}}, {{time}}, {{priority}}, {{status}}, {{contexts}}, {{tags}}, and {{projects}}. Materialized occurrence notes can use a separate template. Set Occurrence note template file to provide a global fallback for occurrence notes; a recurring task's occurrence_template frontmatter field takes priority when it is set. If neither occurrence-specific template is configured, occurrence notes continue through the normal body template behavior. Natural Language Processing# NLP settings define how text input is interpreted during task capture. Enable natural language task input activates date and metadata parsing, Default to scheduled changes ambiguous date handling, NLP language selects parsing patterns, and Status suggestion trigger controls optional status autocomplete activation. Wrap text in double quotes, single quotes, or backticks to keep it as literal title text during NLP parsing. For example, BIO \"123H\" - HW1 keeps 123H in the title instead of treating it as a 123-hour estimate, while Review \"Today\" notes keeps Today as text instead of parsing it as a date. Pomodoro Timer# Pomodoro settings control interval lengths, long-break cadence, optional auto-start behavior, and end-of-session notifications/sound. Pomodoro data storage chooses whether history is kept in plugin data or daily notes. Notifications# Use this section to enable reminders globally, choose whether notices are shown in-app or through system notifications, and optionally play a built-in reminder sound with its own volume control. Performance & Behavior# Performance and behavior toggles let you refine overhead and interaction feel: exclude completed tasks from overdue calculations, disable indexing for very large vaults, and tune suggestion debounce timing. Time Tracking# Time tracking options handle completion behavior. You can automatically stop running timers when a task is completed and optionally show a confirmation notification. Recurring Tasks# Use Maintain due date offset in recurring tasks to keep due/scheduled spacing consistent when recurring tasks roll forward. Occurrence note behavior is configured per recurring task from the task context menu: open Recurrence → Occurrence notes to choose manual creation or automatic creation of the next materialized occurrence after completion. See Recurring Tasks for the workflow and storage model. Timeblocking# Timeblocking enables lightweight daily-note scheduling blocks and controls whether those blocks are visible by default in calendar views. Usage# In the calendar view, click and drag on a time slot to select a time range. A context menu will appear—select \"Create timeblock\" to create a timeblock (this option only appears if timeblocking is enabled in settings). Drag existing timeblocks to move them. Resize edges to adjust duration."},{"title":"General Settings","url":"/obsidian/settings/general/","description":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior.","product":"obsidian","text":"These settings control the foundational aspects of the plugin, such as task identification, file storage, and click behavior. Task Storage# Task storage settings define where new and inline-created task files are created and how archived tasks are relocated. Default tasks folder sets the base location and supports folder template variables, including {{currentNotePath}} and {{currentNoteTitle}} for creating command-palette or ribbon tasks beside the active note. It also supports date variables such as {{year}} and Daily Notes-style date tokens such as YYYY/MM/DD. Folder for inline-created tasks controls the Create Inline Task command and instant conversion output. Leave it empty to use the default tasks folder, set a fixed folder path to centralize inline tasks, or use {{currentNotePath}} and {{currentNoteTitle}} placeholders for contextual routing. Relative path segments such as ../ are normalized after variables are expanded. If archive moves are enabled, completed archived tasks are moved automatically to your configured archive folder. Task Identification# TaskNotes can identify task notes using either a tag or a frontmatter property. Use Identify tasks by to select a strategy. Tag mode uses a configured task tag (for example task) and can optionally hide that identifying tag in card displays. Property mode matches a property/value pair (for example isTask: true or category: task) and is useful when you avoid tag-based identification. If you change the task tag after creating default Base views, existing .base filters will still point at the old tag until you update the default Base files or edit those filters. Hide Identification Tags# When using tag-based identification, you may want to keep your task identification tags in the frontmatter for organizational purposes, but hide them from the visual display in task cards to reduce clutter. The Hide identification tags in task cards setting allows you to do this. When enabled: Tags that exactly match your task identification tag (e.g., #task) will be hidden Hierarchical child tags (e.g., #task/project, #task/work/urgent) will also be hidden Other tags that don't match the identification pattern will still be displayed The setting only affects the visual display—tags remain in the frontmatter Example: If your task identification tag is task and a task has the tags #task, #task/project, #important, and #review: With the setting disabled (default): All tags are shown: #task, #task/project, #important, #review With the setting enabled: Only non-identifying tags are shown: #important, #review Folder Management# Use Excluded folders to omit paths from Notes tab indexing and keep large archive areas out of regular task browsing. Views & Base Files# TaskNotes uses Obsidian Bases files (.base) to power its task views. By default, missing view files are created automatically on startup. Use Create files to generate missing default files in TaskNotes/Views/ without overwriting existing files. Use Update files to overwrite the configured default files with templates generated from your current TaskNotes settings. Frontmatter# This section only appears when you have markdown links enabled globally in Obsidian settings. Use markdown links in frontmatter switches project/dependency serialization from wikilinks ([[path]]) to markdown links ([text](path)). This requires the obsidian-frontmatter-markdown-links plugin. Task Interaction# Task interaction settings define default click behavior on task cards. You can independently choose single-click and double-click actions (edit task, open note, or no action for double click). Release Notes# View release notes opens the release notes view for the current version. Notes also open automatically after updates and remain available from the command palette."},{"title":"Integrations Settings","url":"/obsidian/settings/integrations/","description":"These settings control the integration with other plugins and services, such as Bases and external calendars.","product":"obsidian","text":"These settings control the integration with other plugins and services, such as Bases and external calendars. Bases# TaskNotes v4 uses Obsidian's Bases core plugin for its main views. For setup instructions, see Core Concepts. View Commands Configuration# View command settings map TaskNotes commands and ribbon actions to specific .base files. This is useful when you maintain custom variants of the default views and want first-class command access to those files. Access these settings in Settings → TaskNotes → General → Views & base files. Default mappings: Open Mini Calendar View → TaskNotes/Views/mini-calendar-default.base Open Kanban View → TaskNotes/Views/kanban-default.base Open Tasks View → TaskNotes/Views/tasks-default.base Open Calendar View → TaskNotes/Views/calendar-default.base Open Agenda View → TaskNotes/Views/agenda-default.base Pomodoro Statistics Base → TaskNotes/Views/pomodoro-stats.base Relationships Widget → TaskNotes/Views/relationships.base Each command allows you to specify a custom .base file path and includes a reset button to restore the default path. Auto-create default files: When enabled, TaskNotes creates missing default .base files automatically on startup. Create files: Button to generate all default .base files in the TaskNotes/Views/ directory. Existing files are not overwritten. The generated Pomodoro statistics Base reads Pomodoro sessions from daily notes frontmatter. If your Pomodoro history is still stored in plugin data, migrate it from Settings → TaskNotes → Features before using that Base file. OAuth Calendar Integration# Connect Google Calendar or Microsoft Outlook to sync events bidirectionally with TaskNotes. Events automatically refresh every 15 minutes and sync when local changes are made (such as dragging events to reschedule). Enable Disable calendar integrations on mobile when you sync TaskNotes settings between desktop and mobile but do not want Obsidian Mobile to load external calendars on startup. The setting only affects mobile devices; desktop calendar integrations continue to run normally. Setup Requirements# OAuth integration requires creating your own OAuth application with Google and/or Microsoft. Initial setup takes approximately 15 minutes per provider. Setup Guide: See Calendar Integration Setup for detailed instructions on creating OAuth credentials with Google Cloud Console and Azure Portal. Google Calendar# Provide Client ID and Client Secret from Google Cloud Console, then use Connect Google Calendar to complete OAuth loopback authentication. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. The Target calendar setting used for exporting tasks to Google Calendar is also used as the default selection when creating a manual external calendar event from the calendar view. If the target calendar is unavailable, TaskNotes falls back to the provider's primary calendar. For timed task exports, Default reminder accepts one or more minute offsets separated by commas, such as 60, 1440. All-day task exports use the target Google Calendar's default reminder settings. When connected, displays: Connected account email Connection time Last sync time Manual refresh button Microsoft Outlook Calendar# Provide Client ID and Client Secret from Azure App Registration, then use Connect Microsoft Calendar to authenticate. Disconnect revokes account tokens while retaining the OAuth app credentials for reconnection. Use Forget saved credentials to remove the client ID and client secret. When connected, displays: Connected account email Connection time Last sync time Security# OAuth client credentials and account tokens are stored in Obsidian Secret Storage, which is encrypted at rest when supported by the operating system OAuth credentials and account tokens are not written to TaskNotes' data.json Access tokens refresh automatically Calendar data syncs directly between Obsidian and the calendar provider (no intermediary servers) Disconnect at any time to revoke account access; use Forget saved credentials to remove the OAuth app credentials Calendar subscriptions (ICS)# ICS settings define how subscribed calendar events are represented in your vault. You can set a default template, destination folder, filename strategy, and custom filename template for generated notes. Use Add Calendar Subscription to register URLs or local files, and Refresh all subscriptions for manual synchronization. Recurring event related notes controls how notes linked from recurring external calendar events are matched. Series-wide keeps the current behavior: a note linked to one loaded recurrence can appear on the other loaded recurrences from the same Google, Microsoft, or ICS event series. Selected instance only limits related notes and counts to the exact recurrence instance that was linked. Automatic ICS export# Automatic export keeps an ICS feed of your tasks updated on a schedule. Configure whether it is enabled, where the file is written (vault-relative path), the refresh interval, and use Export now for immediate output. Export filters can omit archived tasks, completed tasks, tasks without due dates, or tasks without scheduled dates. When both due-date and scheduled-date requirements are enabled, exported tasks must have both dates. HTTP API# HTTP API settings control the local server lifecycle, listening port, and request authentication token. Changes to API enablement or port require an Obsidian restart to take effect. WarningThe HTTP API binds to loopback only and browser CORS is limited to loopback origins. If the authentication token is empty, local API requests are still unauthenticated. Set a token unless your local environment is fully trusted. Webhooks# Add Webhook: Register a new webhook endpoint."},{"title":"Modal Fields Settings","url":"/obsidian/settings/modal-fields/","description":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration.","product":"obsidian","text":"The Modal Fields tab lets you decide exactly which fields appear in the task creation and edit modals. Open Settings → TaskNotes → Modal Fields to manage the configuration. Field Groups# Fields are organized into draggable groups: Basic Information – Title and Details Metadata – Contexts, Tags, Time Estimate Organization – Projects and Subtasks Dependencies – Blocked By and Blocking Custom Fields – Any user-defined fields that you add through Task Properties Each group can be collapsed, and their order in the manager matches the order shown in the modal. Managing Fields# Every field entry includes: Visibility toggles for creation and edit modals Enable/disable checkbox Drag handle for ordering within its group Required toggle (where applicable, e.g., Title) Changes are saved automatically. Use this to hide fields you never touch, ensure required metadata appears up front, or reorder fields to match your workflow. Syncing User Fields# The Sync User Fields button pulls the latest user-defined fields from the Task Properties tab into the Custom Fields group. New user fields are appended, renamed fields update in place, and removed fields drop out of the configuration. Re-run the sync whenever you add or rename custom fields. Resetting to Defaults# Select Reset to Defaults to restore the stock configuration (all built-in fields enabled plus empty custom slots). The reset keeps your existing user field definitions; it only reverts modal layout and visibility."},{"title":"Property-based Task Identification","url":"/obsidian/settings/property-identification/","description":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value.","product":"obsidian","text":"When you choose to identify task files by a frontmatter property (instead of a tag), TaskNotes will match notes whose frontmatter property equals the configured value. Boolean values# Enter the setting value as true or false (without quotes) in the settings UI. Obsidian stores checkbox properties as real booleans, not strings. The plugin compares booleans correctly: \"true\" in settings matches frontmatter boolean true \"false\" in settings matches frontmatter boolean false Arrays are supported (e.g., property: [false, true]) Tip: You don’t need to quote boolean values in frontmatter. Use plain true/false to keep Obsidian’s property types consistent. Examples# Setting: Property Name = isTask, Property Value = true Matches: isTask: true Does not match: isTask: false Setting: Property Name = isTask, Property Value = false Matches: isTask: false Does not match: isTask: true For related configuration details, see Task Properties."},{"title":"Property Types Reference","url":"/obsidian/settings/property-types-reference/","description":"This reference documents the expected data types for each frontmatter property that TaskNotes uses.","product":"obsidian","text":"This reference documents the expected data types for each frontmatter property that TaskNotes uses. Quick Reference# Property Type Example title text \"My Task\" status text \"open\", \"in-progress\", \"done\" priority text \"low\", \"normal\", \"high\" due text (date) \"2025-01-15\" scheduled text (date) \"2025-01-10\" completedDate text (date) \"2025-01-20\" dateCreated text (datetime) \"2025-01-01T08:00:00Z\" dateModified text (datetime) \"2025-01-15T10:30:00Z\" tags list [\"work\", \"urgent\"] contexts list [\"office\", \"home\"] projects list [\"[[Project A]]\"] timeEstimate number 120 (minutes) recurrence text \"FREQ=WEEKLY;BYDAY=MO\" recurrence_anchor text \"scheduled\" or \"completion\" timeEntries list (objects) See Time Entries blockedBy list (objects) See Dependencies reminders list (objects) See Reminders complete_instances list [\"2025-01-08\", \"2025-01-15\"] skipped_instances list [\"2025-01-22\"] recurrence_parent text (link/path) \"[[Tasks/Weekly review]]\" occurrence_date text (date) \"2025-01-15\" occurrence_materialization text \"manual\" or \"on_completion\" occurrence_next_trigger text \"completion\" or \"completion_or_skip\" occurrence_template text (link/path) \"[[Templates/Occurrence]]\" occurrence_past_horizon text (duration) \"P7D\" occurrence_future_horizon text (duration) \"P14D\" icsEventId list [\"event-abc123\"] Use this table for fast validation when a field is not behaving as expected in views or API calls. Most parsing issues come from shape mismatches (for example scalar vs list) rather than missing values. Property Details# The sections below describe storage formats, but there is flexibility in authoring style. TaskNotes normalizes many equivalent YAML representations as long as the resulting data type is correct. Text Properties# title# Type: text (string) Description: The task's title or name Example: title: \"Complete project documentation\" status# Type: text (string) Description: The task's current status. Must match one of the status values configured in your settings. Default values: \"open\", \"in-progress\", \"done\" Example: status: \"in-progress\" Note: Also supports boolean values (true/false) for Obsidian checkbox compatibility. See Boolean Status Values. priority# Type: text (string) Description: The task's priority level. Must match one of the priority values configured in your settings. Default values: \"low\", \"normal\", \"high\" Example: priority: \"high\" Date Properties# All date properties are stored as text strings in your frontmatter. TaskNotes expects specific formats: When in doubt, prefer ISO-style values. They sort correctly as text, travel well through APIs, and are easiest to parse consistently. due# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: The task's due date Examples: due: \"2025-01-15\" due: \"2025-01-15T17:00:00\" scheduled# Type: text (date string) Format: YYYY-MM-DD or ISO 8601 timestamp Description: When the task is scheduled to be worked on Examples: scheduled: \"2025-01-10\" scheduled: \"2025-01-10T09:00:00\" completedDate# Type: text (date string) Format: YYYY-MM-DD Description: The date when the task was completed Example: completedDate: \"2025-01-20\" dateCreated# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was created Example: dateCreated: \"2025-01-01T08:00:00Z\" dateModified# Type: text (datetime string) Format: ISO 8601 timestamp Description: When the task was last modified Example: dateModified: \"2025-01-15T10:30:00Z\" List Properties# List properties must be arrays, even when containing a single value. Single-item arrays may look verbose, but they prevent edge cases when filters and formulas assume list semantics. tags# Type: list (array of strings) Description: Tags associated with the task Examples: tags: [\"work\", \"documentation\"] tags: - work - documentation contexts# Type: list (array of strings) Description: Context labels for the task Examples: contexts: [\"office\", \"computer\"] contexts: - \"office\" - \"computer\" projects# Type: list (array of strings) Description: Project references (typically wiki-links) Examples: projects: [\"[[Website Redesign]]\", \"[[Q1 Planning]]\"] projects: - \"[[Website Redesign]]\" - \"[[Q1 Planning]]\" Numeric Properties# timeEstimate# Type: number Unit: minutes Description: Estimated time to complete the task Example: timeEstimate: 120 (2 hours) Recurrence Properties# recurrence# Type: text (string) Format: RFC 5545 RRULE format Description: Defines how the task repeats Examples: recurrence: \"FREQ=DAILY\" recurrence: \"FREQ=WEEKLY;BYDAY=MO,WE,FR\" recurrence: \"FREQ=MONTHLY;BYMONTHDAY=1\" recurrence_anchor# Type: text (string) Valid values: \"scheduled\" or \"completion\" Description: Determines whether the next occurrence is calculated from the scheduled date or when the task was completed Example: recurrence_anchor: \"scheduled\" complete_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were completed Example: complete_instances: - \"2025-01-08\" - \"2025-01-15\" skipped_instances# Type: list (array of date strings) Format: YYYY-MM-DD Description: Dates when recurring task instances were skipped Example: skipped_instances: - \"2025-01-22\" Materialized Occurrence Properties# Materialized occurrence notes are ordinary task notes created for one date in a recurring series. The parent recurring task owns the recurrence rule; the occurrence note owns date-specific state such as status, completed date, body content, time entries, reminders, and comments. When an occurrence note is created, TaskNotes inherits parent planning metadata such as scheduled time, due offset, priority, tags, contexts, projects, reminders, dependencies, details, custom properties, and time estimate. It does not copy parent recurrence/history/runtime fields such as recurrence, complete_instances, skipped_instances, completedDate, provider event IDs, or timeEntries. recurrence_parent# Type: text (link or path string) Description: Parent recurring task for a materialized occurrence note Example: recurrence_parent: \"[[Tasks/Weekly review]]\" occurrence_date# Type: text (date string) Format: YYYY-MM-DD Description: Target recurrence date represented by a materialized occurrence note Example: occurrence_date: \"2025-01-15\" occurrence_materialization# Type: text (string) Valid values: \"manual\", \"on_completion\", \"rolling\" Description: Parent task policy for creating occurrence notes. The plugin currently supports manual creation and creating the next note after completion; rolling windows are defined by the spec but are not automated yet. Example: occurrence_materialization: \"on_completion\" occurrence_next_trigger# Type: text (string) Valid values: \"completion\" or \"completion_or_skip\" Description: Parent task policy for whether skip actions should also create the next occurrence note when occurrence materialization is set to on_completion Example: occurrence_next_trigger: \"completion_or_skip\" occurrence_template# Type: text (link or path string) Description: Optional template reference used when creating materialized occurrence notes. This parent-level template takes priority over the global occurrence note template fallback in Features settings. Example: occurrence_template: \"[[Templates/Weekly occurrence]]\" occurrence_past_horizon and occurrence_future_horizon# Type: text (ISO 8601 duration string) Description: Optional rolling-window bounds for occurrence materialization. These fields are part of the TaskNotes spec; automated rolling materialization is not currently enabled in the plugin. Examples: occurrence_past_horizon: \"P7D\" occurrence_future_horizon: \"P14D\" Complex Properties# These properties contain structured data with multiple fields. For these fields, copy known-good examples before editing manually. Minor schema deviations can break downstream features such as reminders, recurrence, or dependency checks. Time Entries# Type: list (array of objects) Description: Time tracking entries for the task Structure: timeEntries: - startTime: \"2025-01-15T10:30:00Z\" # Required: ISO 8601 timestamp endTime: \"2025-01-15T11:15:00Z\" # Optional: ISO 8601 timestamp description: \"Initial work\" # Optional: text Dependencies (blockedBy)# Type: list (array of objects) Description: Tasks that must be completed before this task can start Structure: blockedBy: - uid: \"path/to/blocking-task.md\" # Required: path to blocking task reltype: \"FINISHTOSTART\" # Required: relationship type gap: \"P1D\" # Optional: ISO 8601 duration offset Relationship types accepted in stored data: FINISHTOSTART, STARTTOSTART, FINISHTOFINISH, STARTTOFINISH Current behavior: Dependencies created from the UI use FINISHTOSTART. Blocking evaluation is based on dependency presence/completion state and does not currently apply distinct scheduling semantics for different reltype values or gap. Reminders# Type: list (array of objects) Description: Reminder notifications for the task Structure for relative reminders: reminders: - id: \"rem_1\" # Required: unique identifier type: \"relative\" # Required: \"relative\" or \"absolute\" relatedTo: \"due\" # Required for relative: \"due\" or \"scheduled\" offset: \"-PT1H\" # Required for relative: ISO 8601 duration description: \"1 hour before due\" # Optional: description Structure for absolute reminders: reminders: - id: \"rem_2\" type: \"absolute\" absoluteTime: \"2025-01-15T09:00:00Z\" # Required for absolute: ISO 8601 timestamp description: \"Morning reminder\" icsEventId# Type: list (array of strings) Description: ICS calendar event IDs linked to this task Example: icsEventId: - \"event-abc123\" - \"event-def456\" Complete Example# Here's a complete task with all property types: --- title: \"Complete quarterly report\" status: \"in-progress\" priority: \"high\" due: \"2025-01-31\" scheduled: \"2025-01-25\" tags: - work - reports contexts: - office projects: - \"[[Q1 Planning]]\" timeEstimate: 240 dateCreated: \"2025-01-01T08:00:00Z\" dateModified: \"2025-01-20T14:30:00Z\" timeEntries: - startTime: \"2025-01-20T10:00:00Z\" endTime: \"2025-01-20T11:30:00Z\" blockedBy: - uid: \"tasks/gather-data.md\" reltype: \"FINISHTOSTART\" reminders: - id: \"rem_1\" type: \"relative\" relatedTo: \"due\" offset: \"-P1D\" description: \"Due tomorrow\" --- Field Mapping# All property names can be customized via Settings → Task Properties → Field Mapping. If you change a field mapping, TaskNotes will read and write using your custom property name. Custom property names are frontmatter keys, so names with spaces or punctuation are valid in task files. When you write your own Bases filters or formulas for those keys, use bracket notation such as note[\"TN-status\"] or note[\"Task Type\"] instead of dot notation. Dot notation only works reliably for simple identifier-style names. For example, if you map due to dueDate, TaskNotes will expect: dueDate: \"2025-01-15\" See Task Properties settings for configuration details. Custom User Fields# You can define additional properties with these types: text - Single text value number - Numeric value date - Date string (YYYY-MM-DD) boolean - true/false list - Array of values See Custom User Fields for configuration details."},{"title":"Task Properties Settings","url":"/obsidian/settings/task-properties/","description":"This tab configures all task properties. Each property is displayed as a card containing its configuration options.","product":"obsidian","text":"This tab configures all task properties. Each property is displayed as a card containing its configuration options. Looking for property type documentation?See the Property Types Reference for detailed documentation on the expected data types (text, list, date, etc.) for each frontmatter property. Property Card Structure# Each property card contains: Property key: The frontmatter field name used to store this property Default: The default value applied to new tasks (where applicable) NLP trigger: Toggle and character configuration for natural language parsing (where applicable) Property-specific settings: Additional configuration options specific to that property This tab defines the task schema used by creation flows, NLP parsing, views, and API payloads. Property keys are YAML/frontmatter keys. TaskNotes can read and write keys that contain spaces or punctuation, but hand-written Bases filters and formulas must reference those keys with bracket syntax, for example note[\"TN-status\"], rather than dot syntax such as note.TN-status. Core Properties# Title# The task title property. Configuration options: Property key: Frontmatter field name (default: title) Store title in filename: When enabled, the task title is stored in the filename instead of frontmatter. The filename updates when the title changes. Filename format: When \"Store title in filename\" is disabled, choose how filenames are generated: Title-based Zettelkasten-style Timestamp-based UUID v4 Custom template Custom template: Define a custom filename pattern using variables (shown when \"custom\" format is selected) Status# Task completion state. Configuration options: Property key: Frontmatter field name (default: status) Default: Default status for new tasks NLP trigger: Character that triggers status parsing (default: *) Status Values: Expandable section containing individual status cards Each status value has: Value: Internal identifier stored in frontmatter (e.g., \"in-progress\") Label: Display name shown in the interface (e.g., \"In Progress\") Color: Visual indicator color Icon: Optional icon identifier Completed: Whether this status represents a finished task Skip when cycling: Exclude this status from the click-to-cycle order on task cards while keeping it available in menus, suggestions, and direct edits Next status: Optional override for the status used when cycling forward from this status; leave it set to the status order to use the normal sequence Auto-archive: Automatically archive tasks after a delay (1-1440 minutes) Status cards support drag-and-drop reordering. Use the Value field as the stable stored identifier and the Label field for display text with spaces or title casing. TaskNotes status menus and cycling use the configured order, and TaskNotes Kanban views can preserve dragged column order. Native Bases grouping/sorting may still order status values alphabetically by their stored Value, so use prefixes such as 1-open, 2-doing, 3-done if you need predictable native Bases order. Boolean Status Values# TaskNotes supports using boolean values (true and false) as status values, which integrates with Obsidian's native checkbox property format: When you set a task's status to \"true\" or \"false\" (case-insensitive), TaskNotes automatically converts it to a boolean in frontmatter When reading tasks with boolean status values from frontmatter, they are converted back to the strings \"true\" or \"false\" This allows you to use Obsidian's native checkbox property toggles in the Properties panel while maintaining compatibility with TaskNotes Example: --- status: true # Boolean checkbox in Obsidian --- Priority# Task priority level. Configuration options: Property key: Frontmatter field name (default: priority) Default: Default priority for new tasks (can be set to \"No default\") NLP trigger: Character that triggers priority parsing (default: !, disabled by default) Priority Values: Expandable section containing individual priority cards Each priority value has: Value: Internal identifier stored in frontmatter (e.g., \"high\") Label: Display name shown in the interface (e.g., \"High Priority\") Color: Visual indicator color Priority cards support drag-and-drop reordering. Status and priority values are stored in frontmatter; renaming them later may require migration of existing task files. Note for Bases plugin users: Obsidian's Bases plugin sorts priorities alphabetically by their Value. To control sort order, name values to sort alphabetically in the desired order: Example: 1-urgent, 2-high, 3-medium, 4-normal, 5-low Or: a-urgent, b-high, c-medium, d-normal, e-low Date Properties# Due Date# When the task must be completed. Configuration options: Property key: Frontmatter field name (default: due) Default: Default due date for new tasks (None, Today, Tomorrow, Next Week) Scheduled Date# When to work on the task. Configuration options: Property key: Frontmatter field name (default: scheduled) Default: Default scheduled date for new tasks (None, Today, Tomorrow, Next Week) When you use Convert current note to task, this default is also applied if the source note does not already have scheduled frontmatter. Choose None to keep converted notes unscheduled by default. due tracks commitment deadlines, while scheduled tracks intended execution time. Organization Properties# Contexts# Where or how the task can be done. Configuration options: Property key: Frontmatter field name (default: contexts) Default: Comma-separated list of default contexts (e.g., @home, @work) NLP trigger: Character that triggers context parsing (default: @) Projects# Projects the task belongs to. Configuration options: Property key: Frontmatter field name (default: projects) Default projects: Select project notes to automatically link to new tasks Use active note for new tasks: Automatically link the active note as a project when opening task creation from the command palette or ribbon Use parent note for inline/instant conversion: Automatically link the source note as a project when using inline task creation or instant task conversion NLP trigger: Character that triggers project parsing (default: +) Autosuggest Filters: Expandable section to filter which notes appear in project suggestions Customize Display: Expandable section to configure how project suggestions appear Autosuggest Filters# Control which notes appear when selecting projects: Required tags: Comma-separated list of tags (shows notes with ANY of these tags) Include folders: Comma-separated list of folder paths (shows notes in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) These filters reduce suggestion noise in large vaults. A \"Filters On\" badge appears when any filters are configured. Customize Display# Configure project suggestion appearance: Enable fuzzy matching: Allow typos and partial matches in project search Row 1, 2, 3: Configure up to 3 lines of information for each project suggestion Tags# Obsidian tags for categorization. Configuration options: Default: Comma-separated list of default tags (without #) NLP trigger: Character that triggers tag parsing (default: #) Note: Tags use native Obsidian tags and do not have a separate property key setting. Task Details# Time Estimate# Estimated time to complete the task. Configuration options: Property key: Frontmatter field name (default: timeEstimate) Default: Default time estimate in minutes (0 = no default) Recurrence# Pattern for repeating tasks. Configuration options: Property key: Frontmatter field name (default: recurrence) Default: Default recurrence pattern (None, Daily, Weekly, Monthly, Yearly) Recurring tasks also use the Recurrence anchor metadata property to decide whether the series advances from the scheduled date or the completion date. Materialized occurrence note controls live on each recurring task's context menu under Recurrence → Occurrence notes rather than as a global default. Reminders# Notifications before task deadlines. Configuration options: Property key: Frontmatter field name (default: reminders) Default Reminders: Expandable section containing default reminder cards Each default reminder can be: Relative reminders (triggered relative to due or scheduled date): Anchor date (due date or scheduled date) Offset amount and unit (minutes, hours, days) Direction (before or after) Description Absolute reminders (triggered at specific times): Date Time Description Metadata Properties# These properties are system-managed and typically only require property key configuration: Date Created: When the task was created Date Modified: When the task was last modified Completed Date: When the task was completed Archive Tag: Tag used to mark archived tasks Time Entries: Time tracking entries for the task Complete Instances: Completion history for recurring tasks Skipped Instances: Skip history for recurring tasks Recurrence Anchor: Whether recurring progression is based on scheduled date or completion date Blocked By: Tasks that must be completed first Materialized occurrence notes also use system-managed frontmatter fields such as recurrence_parent, occurrence_date, occurrence_materialization, occurrence_next_trigger, and optional occurrence template/horizon fields. Occurrence notes inherit parent planning metadata when they are created, but keep their own status, completion date, and time entries. These fields are documented in the Property Types Reference and are normally changed through recurrence and occurrence-note controls instead of by hand. Feature Properties# These properties are used by specific TaskNotes features and are not stored in task frontmatter: Pomodoros: Property key for Pomodoro session counts. When Pomodoro data storage is set to \"Daily notes\", this property is written to daily notes rather than task files. ICS Event ID: Property key for calendar event identifiers. Added to notes created from ICS calendar events to link them back to the source event. ICS Event Tag: Property key for calendar event tags. Added to notes created from ICS calendar events for identification. Custom User Fields# Define custom frontmatter properties to appear as filter options across views. Configuration options for each field: Display Name: How the field appears in the UI Property Key: The frontmatter property name Type: Data type (text, number, boolean, date, or list) Default Value: Pre-fill value for new tasks (format varies by type) NLP trigger: Toggle and character for natural language parsing Autosuggest Filters: Filter which files appear when using [[ wikilink autocomplete Custom fields are most maintainable when they map to repeated workflow decisions (for example effort, owner, or client). Link Values# Use a Text custom field for a single link and a List custom field for multiple links. Task cards render [[wikilinks]], [label](https://example.com), , and bare https://example.com values as clickable links. Autosuggest filters work with text and list fields when entering [[ wikilinks, so a field such as Related Note can suggest only files from a chosen folder or tag. Default Values# Each field type has a different input format for default values: Text: Enter the default text value Number: Enter the default number Boolean: Toggle switch to set default checked/unchecked state Date: Select from presets (None, Today, Tomorrow, Next Week) List: Enter comma-separated default values Default values are applied when creating tasks via: Task creation modal Instant task conversion \"Create or open task\" command HTTP API (when using task creation defaults) Autosuggestion Filters# Each custom field can configure filters to control which files appear in wikilink suggestions: Required tags: Comma-separated list of tags (shows files with ANY of these tags) Include folders: Comma-separated list of folder paths (shows files in ANY of these folders) Required property key: Frontmatter property that must exist Required property value: Expected value for the property (optional) A \"Filters On\" badge appears when filters are configured. See User Fields Feature Documentation for detailed examples."},{"title":"Troubleshooting","url":"/obsidian/troubleshooting/","description":"Common issues and solutions for TaskNotes.","product":"obsidian","text":"Common issues and solutions for TaskNotes. When debugging, start with one affected task and one affected view. Record the TaskNotes version from the plugin list, the Obsidian version from About, the operating system, and whether the problem also occurs in a fresh default Base. First checks# Confirm Obsidian meets the current version requirement and Bases is enabled. Open the affected task as Markdown and validate the --- frontmatter delimiters and indentation. Confirm the task matches Settings → TaskNotes → General → Task identification and is not in an excluded folder. Run TaskNotes: Refresh cache from the command palette. Close and reopen the affected .base file. Restart Obsidian only after the targeted checks above. If the issue remains, enable Settings → TaskNotes → Features → Debug logging, reproduce it once, and inspect the developer console with Ctrl/Cmd + Shift + I. Disable debug logging after collecting the relevant entries. Bases and Views (v4)# Views Not Loading# Symptoms: TaskNotes views show errors or don't display tasks First confirm Bases is enabled (Settings -> Core Plugins -> Bases), then restart Obsidian once. If views are still missing, verify .base files exist in TaskNotes/Views/. If needed, regenerate defaults from Settings -> TaskNotes -> General -> Views & base files (Create files). Commands Open Wrong Files# Symptoms: Ribbon icons or commands open unexpected files Check command mappings in Settings -> TaskNotes -> General (View Commands). Reset mappings that were changed unintentionally, then verify each referenced .base file exists at the configured path. Common Issues# Tasks Not Appearing in Views# Symptoms: Tasks you've created don't show up in TaskNotes views Follow this decision tree: Does Quick actions for current task work on the note? No: compare its tag or identification property with General → Task identification. Yes: task recognition works; continue to the Base filter. Is the note inside an excluded folder? Yes: move it or update Excluded folders. No: continue. Does a newly generated default task Base show it? Yes: the custom Base has a stale property name or filter. No: run TaskNotes: Refresh cache and validate the frontmatter. Did identification or field mapping change recently? Yes: update the default Base files or edit their filters and columns. Generated files do not update automatically when settings change. Task Link Widgets Not Working# Symptoms: Links to task files appear as normal wikilinks instead of interactive widgets Check that Task link overlay is enabled, then verify linked files are actually recognized as tasks (matching tag/property configuration). Links to normal notes will render as normal links by design. Instant Conversion Buttons Missing# Symptoms: Convert buttons don't appear next to checkbox tasks Instant convert buttons only appear when the feature is enabled, in edit mode, and with cursor proximity to list items. Enable the feature, switch from reading mode to edit mode, and place the cursor near the target checkbox. Calendar View Performance Issues# Symptoms: Calendar views are slow or unresponsive Reduce visible event layers first (scheduled/due/recurring/time entries), then increase ICS refresh intervals and shorten displayed date ranges. If slowness persists, apply the general performance guidance below. Natural Language Parsing Not Working# Symptoms: Natural language input doesn't extract expected task properties Enable NLP in Settings -> TaskNotes -> Features, then verify your trigger characters (@, #, ! by default) and any custom status/priority mappings. If parsing still seems inconsistent, compare input against the syntax in NLP API. Time Tracking Issues# Symptoms: Time tracking doesn't start/stop properly or data is lost Most tracking issues come from overlapping sessions, interrupted shutdowns, or save failures. Stop active sessions before starting new ones, confirm files are writable, and restart interrupted sessions. If needed, repair malformed time entries directly in frontmatter. Data Issues# Corrupted Task Files# Symptoms: Tasks appear broken or cause errors in views Open the task file directly and validate frontmatter syntax. Quote values that include special characters, validate YAML if necessary, and restore from backup for severe corruption. Missing Task Properties# Symptoms: Tasks missing expected properties or using default values unexpectedly Check field mappings first, then confirm Task Defaults. If properties are absent on older notes, add them manually or re-save through TaskNotes so current mapping rules are applied. Date Format Issues# Symptoms: Dates not displaying correctly or causing parse errors Use supported formats (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS), quote where needed, and re-enter problematic dates via TaskNotes date pickers to normalize formatting and timezone handling. Performance Troubleshooting# Slow View Loading# To improve loading times, reduce external calendar subscriptions, increase ICS refresh intervals, exclude large folders, and disable event types you do not use. External Calendar Issues# OAuth Calendar Not Connecting# Symptoms: Google Calendar or Microsoft Outlook won't connect Verify credentials and loopback redirect configuration (127.0.0.1 with dynamic local port), ensure app publication/test-user access is correct, and retry after disconnecting. Also check popup blockers. For provider-specific setup details, use Calendar Setup. OAuth Calendar Not Syncing# Symptoms: Connected calendar shows old events or doesn't update Run manual refresh, check last-sync timestamps, reconnect if needed, and verify events exist in the source provider before debugging TaskNotes behavior. ICS Subscriptions Not Loading# Symptoms: ICS calendar events don't appear in calendar views Confirm the ICS URL/file is reachable, run manual refresh, validate the feed format, and inspect subscription status errors for provider-side failures. Calendar Sync Problems# Symptoms: External calendar changes not reflected in TaskNotes Check refresh intervals and force a manual refresh first. If source data is current but TaskNotes remains stale, remove and re-add the subscription to clear cached state. Getting Help# Reporting Issues# Report bugs on GitHub Issues. Include: Exact TaskNotes and Obsidian versions Operating system The smallest affected task frontmatter with private values removed The .base path and whether a regenerated default has the same problem Steps to reproduce from a fresh Obsidian start Relevant console errors and TaskNotes debug entries Screenshots if relevant Configuration Reset# Use a reversible reset only after the checks above: Close Obsidian Navigate to .obsidian/plugins/tasknotes/ Copy data.json to a backup outside the plugin directory Rename the original to data.json.backup-YYYY-MM-DD Restart Obsidian WarningA reset affects settings, status and priority configurations, integration state, saved views, and plugin-stored Pomodoro history. Keep the backup until the problem is resolved. Restore it only while Obsidian is closed. For full restore and uninstall guidance, see Backup, restore, and removal."},{"title":"Views","url":"/obsidian/views/","description":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and requi...","product":"obsidian","text":"TaskNotes provides multiple views for managing tasks and tracking productivity. All task-focused views operate as .base files located in the TaskNotes/Views/ directory and require Obsidian's Bases core plugin to be enabled. For details on Bases integration and how to enable it, see Core Concepts. For view templates and configuration examples, see Default Base Templates. Task-Focused Views# Task-focused views are different entry points into the same underlying task notes. The Task List View is a common starting view for day-to-day planning because it exposes filters, sorting, and grouping in list format. When you want workflow by status, Kanban View organizes cards into columns and can optionally add swimlanes for an extra organizational layer. Calendar Views are useful when schedule and timing matter more than backlog shape, with month/week/day/year/list modes plus drag-and-drop scheduling and time-block support. Agenda View is a preconfigured list-oriented calendar layout designed for short-horizon planning, while MiniCalendar View gives a compact month heatmap and fast keyboard navigation. Productivity-Focused Views# These views support time management and work tracking. Pomodoro View supports focused intervals directly inside Obsidian, and Pomodoro Stats View summarizes completed sessions so you can see pace and consistency over time. Screenshots in this section are captured via the Playwright docs suite (npm run e2e:docs)."},{"title":"Agenda View","url":"/obsidian/views/agenda-view/","description":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without ne...","product":"obsidian","text":"The Agenda view is a dedicated .base file that opens the calendar in list mode. It provides a scrollable agenda of upcoming tasks, notes, and external calendar events without needing to switch the primary calendar into list view manually. File Location# Default file: TaskNotes/Views/agenda-default.base Command: Open Agenda View (ribbon icon and command palette) Configure the file path in Settings → TaskNotes → General → View Commands TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled. You can replace the command path with your own .base file if you maintain multiple agendas. Default Configuration# The stock agenda file renders the calendar in listWeek mode: views: - type: tasknotesCalendar name: \"Agenda\" calendarView: \"listWeek\" listDayCount: 7 startDateProperty: file.ctime titleProperty: file.basename order: - note.status - note.priority - note.due - formula.dueIn - note.scheduled This configuration displays seven days at a time, derives entries from file.ctime/file.basename, shows the generated Due in countdown next to due dates, and inherits the same display options (show scheduled/due/recurring/timeblocks/time entries/ICS events) as the primary calendar view. Customization# Edit the .base file to tailor the agenda: Change calendarView to listDay or listMonth for different spans Adjust listDayCount for shorter or longer agendas; the Bases option supports up to 365 days Add filters to focus on specific projects, tags, or statuses Modify order to control which task properties appear in the row layout Because the view runs inside Bases, any YAML changes are applied immediately after saving the file. Usage Tips# Use the calendar toolbar arrows (Previous/Next) to move the agenda window forward or backward, or simply scroll the list to review upcoming entries Saved views within Bases let you maintain multiple agenda variants (e.g., \"Work Week\" vs. \"Personal\") Calendar display options (show due, show scheduled, etc.) persist when you save the .base file, so you can maintain one agenda that includes external events and another that focuses strictly on TaskNotes tasks"},{"title":"Calendar Views","url":"/obsidian/views/calendar-views/","description":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled i...","product":"obsidian","text":"TaskNotes provides two calendar-based views: the Mini Calendar and the Calendar View. Both operate as Bases views (.base files) and require the Bases core plugin to be enabled in Obsidian. Mini Calendar is date-density and navigation focused, while Calendar View is scheduling focused. Bases View Architecture# Calendar views in TaskNotes v4 are implemented as Bases views, which means: Calendar views are created as .base files in your vault Configuration is controlled through YAML frontmatter in the base file The Bases plugin is an official Obsidian core plugin and must be enabled Views can be opened in tabs, pinned, and managed like other Obsidian views This architecture makes calendar behavior auditable. Filters, formulas, and display options are stored with the view file, so they are versionable and easy to share across vault setups. Mini Calendar View# The Mini Calendar displays a month-based view that shows which days contain tasks or other dated notes. It provides navigation and an overview of your task distribution across time. Features# Date Navigation: Click any date to open a fuzzy selector modal showing all notes associated with that date Keyboard Navigation: Navigate the calendar using arrow keys and select dates with Enter Heatmap Styling: Visual indicators show the density of tasks or notes on each day Configurable Date Property: Set which date property to track (not limited to tasks - can display any dated notes based on configured property) Month Navigation: Browse forward and backward through months to view historical and future task distribution Mini Calendar is commonly used as an entry view: select a date, then open Task List, Agenda, or Calendar for execution. Calendar View# The Calendar View provides multiple view modes (month, week, day, year, list, and custom days) with drag-and-drop scheduling and time-blocking capabilities. Tasks can be created by clicking on dates or time slots, and rescheduled by dragging them to new dates or times. View Modes# The Calendar View supports the following view modes: Month: Month grid showing all-day and timed events Week: Week view with hourly time slots for detailed scheduling Day: Single day view with hourly breakdown Year: Annual overview showing event distribution across months List: Chronological list of events. TaskNotes also includes a dedicated Agenda command that opens this mode via its own .base file for quick reviews. Custom Days: Configurable multi-day view (2-10 days) View modes can be switched within a single .base file based on planning horizon (day, week, month, year, or custom range). Week View Day View Year View Performance Improvements# The Calendar View uses virtual scrolling to maintain performance when displaying large numbers of events. This allows the calendar to handle extensive task lists and long time ranges without degradation in responsiveness. Custom Days View# The Custom Days view provides a configurable multi-day calendar that displays between 2-10 days at once. This view addresses screen space utilization by offering a middle ground between the single-day view and the full week view. Key Features# Configurable Duration: Set the number of days to display (2-10 days) via Settings > Calendar > Custom view day count TimeGrid Format: Uses the same hourly time slots and time-based event layout as Week and Day views Real-time Updates: The view updates immediately when the day count setting is changed Default Configuration: Ships with 3 days displayed by default for optimal space utilization Use Cases# The Custom Days view is particularly useful for: Users who find the single-day view too wide and wasteful of screen space Planning workflows that require seeing a few days at a glance without the full week Detailed scheduling tasks that benefit from the time-grid format Customizing the viewing window to match personal preference and screen size Configuration# Select the View: Choose \"Custom Days\" from the calendar toolbar alongside Month, Week, Day, and Year views Adjust Day Count: Navigate to Settings > Calendar > Custom view day count and use the slider to select 2-10 days Set as Default: Optionally set \"Custom Days\" as your default view in Settings > Calendar > Default view Recurring Task Support# The Calendar View provides recurring task management with visual hierarchy and drag-and-drop behavior. Visual Hierarchy# Recurring tasks are displayed with distinct visual styling: Next Scheduled Occurrence: Solid border with full opacity, representing the specific date/time when you plan to work on the next instance Pattern Instances: Dashed border with reduced opacity (70%), showing preview of when future recurring instances will appear based on the DTSTART and recurrence rule Drag and Drop Behavior# The calendar provides different behaviors depending on which type of recurring event you drag: Dragging Next Scheduled Occurrence (Solid Border): Updates only the scheduled field in the task Reschedules just that specific occurrence to the new date/time Leaves the recurrence pattern unchanged Notice: \"Rescheduled next occurrence. This does not change the recurrence pattern.\" Dragging Pattern Instances (Dashed Border): Updates the DTSTART time in the recurrence rule Changes when all future pattern instances appear Does not affect the independently scheduled next occurrence Notice: \"Updated recurring pattern time. All future instances now appear at this time.\" Flexible Scheduling# The next scheduled occurrence can appear on any date, even: Before the DTSTART date On days that don't match the recurring pattern (e.g., Tuesday for a weekly Monday pattern) At different times than the pattern instances This flexibility allows for complete control over both the recurring pattern and individual occurrence scheduling. View Options# The Calendar View provides several display options that control what types of events appear on the calendar: Show scheduled: Display tasks with scheduled dates Show due: Display tasks with due dates Show timeblocks: Display time-blocking entries Show recurring: Display recurring task events Show ICS events: Display events from imported ICS calendars Show time entries: Display time tracking entries All-day slot: Show or hide the all-day event area at the top of time grid views (Week, Day, and Custom views) Create daily notes from date links: Let date header links create a missing daily note before opening it. Turn this off if date links should only open existing daily notes. Drag/drop resolution: Set snapDuration when you want events to drag or resize in smaller increments than the visible slotDuration, such as 5-minute dragging on a 30-minute grid. Span tasks between scheduled and due dates: Display tasks as multi-day bars spanning from their scheduled date to their due date (see below) Multiple saved calendar views can store different option sets (for example planning vs focus), avoiding repeated manual toggles. The All-day slot option is particularly useful when you have many all-day tasks on a single date, as hiding it can resolve scrolling issues and make the hourly time slots more accessible. When disabled, all-day events will not be displayed in time grid views, but they will still appear in month view. Multi-Day Task Spans# The Span tasks between scheduled and due dates option provides a visual representation of task duration on the calendar. When enabled: Tasks with both a scheduled date and a due date display as a single bar spanning across all days from the scheduled date to the due date This replaces the separate scheduled and due markers for qualifying tasks Tasks with only a scheduled date or only a due date continue to display as single-day events Span events are shown as all-day bars with the task's priority color Span events are read-only on the calendar (edit the underlying scheduled/due dates to modify) This option is useful for project planning and visualizing how long tasks are expected to take, similar to Gantt chart-style views. These display options are preserved when you save a view, allowing you to create specialized calendar views that show only specific types of events and maintain those preferences across sessions. OAuth Calendar Integration# The Calendar View supports bidirectional synchronization with external calendar services through OAuth authentication: Google Calendar: Connect to Google Calendar accounts to display and sync events Microsoft Outlook: Connect to Microsoft Outlook accounts for calendar integration Synchronization Behavior# External calendar events appear alongside TaskNotes tasks in all calendar views Drag and drop events to reschedule them - changes sync back to the external calendar service Events from external calendars respect the same view options and display settings as native TaskNotes tasks Configuration# OAuth calendar connections are configured through the TaskNotes settings panel. Authentication uses standard OAuth flows to securely connect to external services. Time Entry Editor Modal# The Calendar View includes a Time Entry Editor Modal for creating time tracking entries directly from the calendar interface. Creating Time Entries# Drag on the calendar to select a time range When the selection menu appears, choose Create time entry The modal opens with the start and end times pre-populated based on the selection, and the entry can be linked to a task or left standalone Editing Time Entries# Time entries displayed on the calendar can be selected to open the Time Entry Editor Modal for modification. The modal provides fields for adjusting start time, end time, associated task, and other time entry metadata. Filtering and View Configuration# Calendar filtering is configured through the Bases YAML frontmatter in the .base file. This allows you to define which tasks and events appear in each calendar view. Filtering options include task properties, date ranges, tags, and other criteria supported by the Bases plugin. Saved calendar views retain their filter configuration, display options, and view mode, allowing you to create specialized calendar views for different purposes."},{"title":"Kanban View","url":"/obsidian/views/kanban-view/","description":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag o...","product":"obsidian","text":"The Kanban View displays tasks as cards organized in columns, where each column represents a distinct value of a grouped property. Kanban emphasizes state transitions and drag operations over dense list scanning. Configuration# Kanban views are stored as .base files in TaskNotes/Views/. The groupBy property determines the column structure—each unique value becomes a column in the board. Open a .base file and access the view settings panel to configure options. Core Settings (Bases)# Data source: Select which files or folders to include in the view Filter: Define criteria to include or exclude specific tasks Sort: Specify the order of tasks within each column Group by: Required. Defines the property that creates columns (e.g., status, priority) Choosing a stable groupBy field is the most important design decision. Frequent changes to this field create column churn and make historical comparisons harder. Kanban-Specific Options# Access these options through the Bases view settings panel: Swim Lane: Optional property for horizontal grouping. Creates a two-dimensional layout where tasks are organized by both column (groupBy) and row (swimLane) Column Width: Controls the width of columns in pixels. Range: 200-500px. Default: 280px Max Swimlane Height: Caps each swimlane row before the task area scrolls. Range: 300-1200px. Default: 600px Hide Empty Columns: When enabled, columns containing no tasks are hidden from the view Pinned Columns: Optional comma-separated list of column values that should stay visible even when empty. This is useful with Hide Empty Columns when each board needs a small stable subset of shared statuses or categories WIP Limits: Advanced JSON configuration for showing per-column work-in-progress limits in column headers Hide Empty Swimlanes: When enabled, ordered swimlanes with no tasks are hidden from the view Card Layout: Chooses the task card density for this board. Default uses the standard TaskNotes card layout. Compact uses a tighter card layout for denser boards Show items in multiple columns: When enabled (default), tasks with multiple values in list properties (contexts, tags, projects) appear in each individual column. For example, a task with contexts: [work, call] appears in both the \"work\" and \"call\" columns. When disabled, tasks appear in a single combined column (e.g., \"work, call\") Hide top-level subtasks: When enabled, tasks whose Projects field links to another task in the current filtered board are hidden as standalone cards and remain available through the parent task's expanded subtasks Column Order: Managed automatically when dragging column headers. Stores custom column ordering Swim Lane Order: Advanced JSON configuration for pinning swimlane rows in a stable order A common setup is to keep one board grouped by status and another grouped by project or context, each in a separate .base file. Interface Layout# Standard Layout# In standard mode, the Kanban board displays a horizontal row of columns. Each column corresponds to a unique value of the groupBy property. Each column includes: A header showing the property value and task count A scrollable area containing task cards An add button that opens the TaskNotes creation modal with the column value filled in Drag-and-drop functionality for reordering columns or moving tasks between columns Swimlane Layout# When a swimLane property is configured, the board displays a grid layout. The horizontal axis represents columns (groupBy values), and the vertical axis represents swimlanes. Each swimlane row includes: A label cell showing the swimlane property value and total task count Multiple cells, each representing a column within that swimlane Scrollable cells containing task cards Add buttons inside cells that fill in both the column value and swimlane value To pin swimlanes in a stable order, set the advanced swimLaneOrder option to a JSON object keyed by the swimlane property: config: swimLane: note.contexts swimLaneOrder: '{\"note.contexts\":[\"transitcal\",\"bill\",\"cycles-research\",\"astrolabe\"]}' Listed swimlane values render first in the configured order. Values not listed in swimLaneOrder render below them using the default order for status and priority swimlanes, or alphabetically for other properties. If hideEmptySwimLanes is disabled, listed values can remain visible even when no matching tasks are currently present. To show WIP limits in column headers, set the advanced wipLimits option to a JSON object keyed by column value: config: wipLimits: '{\"in-progress\":5,\"review\":2}' Columns with limits display counts as (current/limit). When the current count is above the configured limit, the count uses the error color. In swimlane boards, the column header count is the total for that column across all swimlanes. Task Cards# Each task card displays information based on the visible properties configured in the Bases view. Standard task information includes title, priority, due date, and scheduled date. Use the Card Layout setting when a board needs a different density from other task views. Existing boards use Default unless cardLayout: compact is set in the view options. To show checklist progress on cards, include file.tasks in the view order array. For existing .base files, add this in YAML manually first; after it is in order, it appears in the Bases picker as tasks. Click a card to open the task file for editing. Right-click to access the context menu for task actions. Drag cards between columns or swimlane cells to update the task's properties. Column Operations# Reordering Columns# Drag column headers to reorder columns. The new order persists across sessions and is stored in the columnOrder configuration. Drag-and-Drop Tasks# Drag task cards between columns to update the groupBy property value. In swimlane mode, dragging a task to a different cell updates both the groupBy and swimLane properties. When grouping by a list property (contexts, tags, projects) with \"Show items in multiple columns\" enabled, dragging a task between columns modifies the list rather than replacing it. The source column's value is removed and the target column's value is added. For example, dragging a task from the \"work\" column to the \"home\" column changes contexts: [work, call] to contexts: [call, home]. Drag operations write directly to task metadata, so consistent grouping values reduce ambiguity. The add button at the bottom of a column or swimlane cell keeps deterministic view filter defaults and fills in the grouped values for that location. Manual Reordering Within Columns# Kanban also supports drag-to-reorder within a column or swimlane cell when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering within Kanban columns: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, dragging a card within the same column updates stored frontmatter values so the new order persists across refreshes and sessions. In swimlane mode, the reorder scope is a single cell, not the entire board. A reorder inside the \"In Progress\" column for the \"High\" swimlane only adjusts the tasks in that cell. Important constraints: Manual drag-to-reorder only works when the view sort includes the manual-order property. Moving a card to a different column or swimlane still updates the grouped property values as usual. In filtered or partially visible columns, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes templates use manual-order sorting in places where drag-to-reorder should work immediately, such as relationship views and manual-order task lists. Performance Optimization# The Kanban view implements virtual scrolling for columns or swimlane cells containing 30 or more tasks. This optimization reduces memory usage by approximately 85% and maintains 60fps scrolling performance for columns with 200+ tasks. Virtual scrolling activates automatically based on task count. No configuration is required. Example Configuration# A typical Kanban view .base file includes: --- type: query source: TaskNotes view: TaskNotes Kanban views: - name: TaskNotes Kanban type: tasknotesKanban groupBy: property: task.status config: swimLane: task.priority swimLaneOrder: '{\"task.priority\":[\"high\",\"normal\",\"low\"]}' columnWidth: 300 hideEmptyColumns: true pinnedColumns: to-do, in-progress, done wipLimits: '{\"in-progress\":5}' --- This configuration creates a Kanban board with: Columns based on task status Swimlanes based on task priority Priority swimlanes pinned in high, normal, low order 300px column width Empty unpinned columns hidden, while the to-do, in-progress, and done columns stay visible as drop targets A WIP limit of 5 tasks on the in-progress column Filtering and Sorting# Filtering and sorting are configured through the Bases view settings, not through a separate FilterBar component. Use the Bases filter editor to define conditions based on task properties. Use the Bases sort editor to specify the order of tasks within each column."},{"title":"Pomodoro View","url":"/obsidian/views/pomodoro-view/","description":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique.","product":"obsidian","text":"The Pomodoro View provides a timer for working in focused intervals, based on the Pomodoro Technique. Timer Interface# The Pomodoro View includes a timer with controls to start, stop, and reset the timer. While a timer is running, the view shows both the remaining duration and the projected local finish time. You can also associate a task with the timer, and the time will be automatically recorded in the task's time tracking data when the session is complete. Pomodoro Stats View# The Pomodoro Stats View provides analytics and historical data about your Pomodoro sessions. This includes a history of completed sessions, as well as metrics like completion rates and total time spent on tasks."},{"title":"Task List View","url":"/obsidian/views/task-list/","description":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured...","product":"obsidian","text":"The Task List View displays tasks in a scrollable list format with filtering, sorting, and grouping capabilities. In TaskNotes v4, this view operates as a Bases view configured through YAML. This view is optimized for high task volume and explicit filter definitions. Bases Architecture# Task List is implemented as a .base file located in TaskNotes/Views/tasks-default.base by default. It requires the Bases core plugin to be enabled. What is Bases?# Bases is an official Obsidian core plugin built directly into Obsidian (not a community plugin). It provides a framework for creating database views of notes and tasks. To enable Bases: Open Settings -> Core Plugins Enable \"Bases\" TaskNotes view commands will now open .base files from TaskNotes/Views/ If commands open empty or unexpected views, first confirm Bases is enabled and the command path points to the intended .base file. View File Location# When you use the \"Open Tasks View\" command or ribbon icon, TaskNotes opens the .base file configured under Settings -> TaskNotes -> General -> Views & base files (initially TaskNotes/Views/tasks-default.base). TaskNotes creates missing default .base files automatically on startup when Auto-create default files is enabled, and you can point the command to any other .base file if you maintain multiple task-list layouts. Configuration# Task List views are configured through YAML frontmatter in the .base file. The YAML defines which tasks to show, how to sort them, and how to group them. Basic Structure# # All Tasks views: - type: tasknotesTaskList name: \"All Tasks\" order: - note.status - note.priority - note.due - note.scheduled - note.projects - note.contexts - file.tags sort: - column: due direction: ASC Configuration Options# type: Must be tasknotesTaskList for Task List views name: Display name shown in the view header order: Array of property names that control which task properties are visible in the task cards. Properties are referenced using their Bases property paths (e.g., note.status, note.priority, note.due, file.tasks). For existing .base files, add file.tasks in YAML manually; once present in order, it appears in the Bases picker as tasks. sort: Array of sort criteria. Tasks are sorted by the first criterion, with ties broken by subsequent criteria. column: Property to sort by (e.g., due, scheduled, priority, title) direction: ASC (ascending) or DESC (descending) groupBy: Optional grouping configuration property: Property to group by (e.g., note.status, note.priority) direction: Sort direction for group headers hideTopLevelSubtasks: Optional boolean. When true, tasks whose Projects field links to another task in the current filtered result set are hidden as top-level rows and remain available through the parent task's expanded subtasks. filters: Optional filter conditions using Bases query syntax filters: and: - note.status == \"Open\" - note.priority == \"High\" Start with one or two simple filters, verify results, then layer complexity. Incremental edits are much easier to debug than large one-shot query rewrites. Property Mapping# TaskNotes properties are accessed in Bases YAML using these paths: TaskNotes Property Bases Property Path Description Status note.status Task status value Priority note.priority Priority level Due date note.due Due date/time Scheduled date note.scheduled Scheduled date/time Projects note.projects Associated projects Contexts note.contexts Task contexts Tags file.tags File tags Checklist progress file.tasks First-level markdown checkbox progress shown as the TaskNotes checklist progress bar Time estimate note.timeEstimate Estimated duration Recurrence note.recurrence Recurrence pattern Blocked by note.blockedBy Blocking dependencies Title file.name Task title (file name) Created file.ctime File creation date Modified file.mtime File modification date The exact property names depend on your TaskNotes field mapping settings (Settings -> TaskNotes -> Task Properties). The table above shows default mappings. Filtering and Sorting# Adding Filters# Edit the .base file to add filter conditions using Bases query syntax: views: - type: tasknotesTaskList name: \"High Priority Tasks\" filters: and: - note.priority == \"High\" - note.status != \"Completed\" order: - note.status - note.priority - note.due Filter Operators# Bases supports standard comparison operators: == (equals), != (not equals) >, <, >=, <= (comparison) contains() (substring/array membership) Boolean logic: and, or For detailed filter syntax, see the Bases documentation. Sorting Examples# Single sort criterion: sort: - column: due direction: ASC Multiple sort criteria: sort: - column: priority direction: DESC - column: due direction: ASC - column: title direction: ASC Drag-to-Reorder# Task List supports drag-to-reorder when the view is sorted by the manual-order property. With the default field mapping, that property is tasknotes_manual_order. To enable persistent manual ordering in a Task List view: sort: - column: tasknotes_manual_order direction: DESC Once the first sort criterion is the manual-order property, you can drag task cards to reorder them. TaskNotes writes updated LexoRank-style values into task frontmatter so the order persists across refreshes and sessions. If your field mapping changes the sort-order property name, use that mapped property name instead of tasknotes_manual_order. Drag-to-Reorder with Grouping# Grouped Task List views can also be reordered, but the reorder scope is the current group. For example, when grouping by status, dragging within the \"In Progress\" group updates the manual order for tasks in that group. Important constraints: Drag-to-reorder only works when the view sort includes the manual-order property. Reordering in formula-based groups is blocked because formula values are computed and cannot be edited directly. In filtered or partially visible lists, TaskNotes may also update hidden or filtered notes in the same reorder scope to preserve a stable persistent order. Large reorder operations may show a confirmation dialog before writing changes. The default generated TaskNotes task-list templates include a Manual Order view that is already configured for this behavior. Grouping# Groups organize tasks under collapsible headers based on a property value. Enable Grouping# Add groupBy configuration to your view: views: - type: tasknotesTaskList name: \"Tasks by Status\" groupBy: property: note.status direction: ASC order: - note.status - note.priority - note.due Available Grouping Properties# Common grouping properties: note.status - Group by task status note.priority - Group by priority level note.contexts - Group by first context note.projects - Group by project (tasks can appear in multiple groups) Interactive Group Headers# Group headers support interaction: Click to expand/collapse the group Click on project links in headers to navigate to project notes Hover over project links with Ctrl to preview project notes Collapsed State Persistence# Collapsed/expanded state for each group is preserved across sessions. Creating Multiple Views# You can create multiple .base files for different task perspectives: Duplicate an existing .base file in TaskNotes/Views/ Rename it (e.g., High Priority.base) Edit the YAML configuration for that view Open the file to see the customized view Example: Context-Specific View# # Work Tasks views: - type: tasknotesTaskList name: \"Work Context\" filters: and: - note.contexts.contains(\"work\") groupBy: property: note.priority direction: DESC order: - note.status - note.priority - note.due Migrating from v3 Saved Views# TaskNotes v3 stored filter configurations in plugin settings. These saved views are not automatically migrated to v4. To recreate a v3 saved view: Create a new .base file in TaskNotes/Views/ Translate your v3 filter conditions to Bases YAML syntax Configure sorting and grouping through YAML Save the file The v3 FilterBar UI component no longer exists - all configuration is done through YAML editing. Task Actions# The Task List View provides interaction with tasks through clicking and context menus: Click on a task: Opens the task for editing or navigates to the task note (behavior configured in Settings -> TaskNotes -> General in click-action controls) Right-click on a task: Opens a context menu with actions: Mark as complete Change priority Change status Edit dates Delete task And more Context menu availability depends on your TaskNotes settings and task properties. Virtual Scrolling# The Task List View automatically enables virtual scrolling when displaying 100 or more items (tasks + group headers). Virtual scrolling provides: Approximately 90% memory reduction for large lists Elimination of UI lag when scrolling through hundreds of tasks Smooth performance with unlimited task counts Virtual scrolling activates automatically and requires no configuration. When active, only visible tasks are rendered to the DOM, with off-screen tasks rendered on-demand as you scroll. Further Reading# Default Base Templates - Complete templates for all TaskNotes views Bases Plugin Documentation - Official Obsidian documentation for Bases syntax and features Kanban View - Alternative board-based task visualization Calendar Views - Time-based task visualization Views Overview - All available TaskNotes views"},{"title":"TaskNotes Webhooks","url":"/obsidian/webhooks/","description":"TaskNotes webhooks send HTTP POST requests when selected events occur.","product":"obsidian","text":"TaskNotes webhooks send HTTP POST requests when selected events occur. Prerequisites# Enable HTTP API in Settings -> TaskNotes -> Integrations -> HTTP API. Create at least one webhook (settings UI or API). Subscribe it to one or more events. Event Types# Task events: task.created task.updated task.deleted task.completed task.archived task.unarchived Time events: time.started time.stopped Pomodoro events: pomodoro.started pomodoro.completed pomodoro.interrupted Recurring events: recurring.instance.completed recurring.instance.skipped Completing a materialized occurrence note emits recurring.instance.completed with the reconciled parent task plus the completed occurrence and date in the event data. Skipping virtual recurring instances emits recurring.instance.skipped; materialized occurrence skip currently reconciles the parent and occurrence note without emitting a separate skip webhook. Reminder events: reminder.triggered Payload Shape# All webhook payloads use the same top-level envelope: { \"event\": \"task.created\", \"timestamp\": \"2026-02-21T10:30:00.000Z\", \"vault\": { \"name\": \"My Vault\", \"path\": \"/path/to/vault\" }, \"data\": {} } data is event-specific. Register and Manage Webhooks via API# Create# POST /api/webhooks Required fields: url (string) events (non-empty array) Optional fields: id secret (auto-generated if omitted) active (default true) transformFile corsHeaders (default true) Example: curl -X POST http://localhost:8080/api/webhooks \\ -H \"Content-Type: application/json\" \\ -d '{ \"url\": \"https://example.com/tasknotes\", \"events\": [\"task.completed\", \"task.created\"], \"transformFile\": \"TaskNotes/webhooks/slack.json\" }' List# GET /api/webhooks Returns registered hooks. Secrets are not returned. Delete# DELETE /api/webhooks/:id Delivery History# GET /api/webhooks/deliveries Returns last 100 in-memory deliveries. Delivery Behavior# Current implementation behavior: Webhook processing is asynchronous (fire-and-forget from task operation). Each delivery starts with one attempt. Failed deliveries retry with exponential backoff: 1s, 2s, 4s. Maximum retries: 3 retries after initial attempt (up to 4 attempts total). If cumulative failureCount for a webhook exceeds 10, webhook is auto-disabled. No explicit request timeout is set in delivery fetch. Because retries and duplicates are possible, handlers should be idempotent. Signature Verification# When corsHeaders is enabled (default), delivery includes: X-TaskNotes-Event X-TaskNotes-Signature X-TaskNotes-Delivery-ID Signature is HMAC-SHA256 over JSON.stringify(payload) using webhook secret. Node.js example: const crypto = require(\"crypto\"); function verifyWebhook(payload, signature, secret) { const expected = crypto .createHmac(\"sha256\", secret) .update(JSON.stringify(payload)) .digest(\"hex\"); return signature === expected; } Payload Transformations# A webhook can specify transformFile pointing to a file in your vault. Supported file types: .json: event template map with variable interpolation If transform execution fails, TaskNotes falls back to original payload. JavaScript transform files are no longer supported. JSON Transform Files# Structure: { \"task.completed\": { \"text\": \"Task completed: ${data.task.title}\", \"vault\": \"${vault.name}\" }, \"default\": { \"text\": \"TaskNotes event: ${event}\" } } Rules: Matching order: exact event key, then default. Variables use ${path.to.value}. Missing variables are left unchanged. CORS and Headers# Webhook delivery requests are outbound server-side requests from TaskNotes. corsHeaders behavior: true (default): sends TaskNotes custom headers including signature. false: only sends Content-Type: application/json. Disable custom headers for endpoints that reject non-standard headers. Testing# Local Test Server# Use repository script: node test-webhook.js Optional custom port: node test-webhook.js 8080 Default server values: URL: http://localhost:3000/webhook Test secret: test-secret-key-for-tasknotes-webhooks External Inspection# For quick inspection, use a request-bin tool such as webhook.site. Troubleshooting# No deliveries# Confirm HTTP API is enabled. Confirm webhook is active. Confirm event is subscribed. Signature mismatch# Confirm secret matches webhook config. Verify your verifier hashes the exact JSON body. Verify hex digest comparison. Webhook disabled automatically# If failures continue and failureCount exceeds 10, webhook is disabled. Fix endpoint availability or response handling. Re-enable webhook in TaskNotes settings, or recreate it via POST /api/webhooks. Transform errors# Confirm transformFile exists in vault. Confirm the file is a .json transform template. Check Obsidian console logs for transform exceptions."},{"title":"Workflows","url":"/obsidian/workflows/","description":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit toge...","product":"obsidian","text":"This page describes practical ways to combine TaskNotes features into repeatable workflows. The goal is to show how recurring tasks, projects, filtering, and scheduling fit together in everyday use. Habit Tracking with Recurring Tasks# Habit tracking in TaskNotes is built on recurring task notes. You can create a recurring task from natural language (for example, \"Exercise daily\" or \"Gym every Monday and Wednesday\") or configure recurrence explicitly in the task modal. The modal recurrence controls support frequency, interval, weekday selection, and end conditions. Once a task has a recurrence rule, its edit modal shows a recurrence calendar. That calendar is where you mark completion per occurrence. Completion history is stored in complete_instances, so a recurring task can remain open while still recording daily/weekly completion behavior. title: Morning Exercise recurrence: \"FREQ=DAILY\" scheduled: \"07:00\" complete_instances: - \"2025-01-01\" - \"2025-01-02\" - \"2025-01-04\" Use Calendar and Agenda views to review upcoming occurrences, and use recurring-task filters when you want a habit-only planning view. For richer recurring work, such as a weekly review or maintenance visit, right-click the recurrence in a task card, calendar view, or the edit modal's completion calendar and choose Open or create occurrence note. The occurrence note inherits planning metadata such as scheduled time, due offset, projects, tags, reminders, details, and time estimate, then keeps its own checklist, completion state, and time entries while the parent recurring task keeps the long-term rule. On the calendar, the note-backed occurrence replaces the matching virtual parent occurrence; dragging it reschedules that note without rewriting the recurrence pattern. Project-Centered Planning# Projects in TaskNotes can be plain text values or wikilinks to project notes. Wikilinks are usually the better long-term option because they connect task execution to project context, backlinks, and graph navigation. title: \"Research competitors\" projects: [\"[[Market Research]]\", \"[[Q1 Strategy]]\"] During task creation, use the project picker to search and assign one or more projects. In day-to-day planning, open Task List or Kanban, then filter on note.projects contains [[Project Name]] to isolate one initiative. Save that filter as a Bases saved view if you revisit it regularly. When work spans initiatives, assign multiple projects and combine with contexts or tags for secondary organization. title: \"Prepare presentation slides\" projects: [\"[[Q4 Planning]]\"] contexts: [\"computer\", \"office\"] tags: [\"review\"] Execution Workflow (Daily)# A typical daily flow is to start in Task List for prioritization, move to Calendar for schedule placement, and finish in Agenda for near-term sequencing. This keeps backlog management, time allocation, and short-horizon execution in one system. If you use timeboxing, drag-select on calendar timeline views and create timeblocks directly from the context menu. If you use Pomodoro, run sessions against active tasks so completion and timing data stay attached to task notes. Maintenance Workflow (Weekly)# A weekly review usually includes three steps: clean up completed/archived tasks, verify recurring-task completion patterns, and rebalance project filters/views. If calendar integrations are enabled, this is also a good point to refresh subscriptions and confirm sync health. For teams or complex personal systems, keep project notes as source-of-truth documents and use TaskNotes views as execution dashboards derived from those notes."},{"title":"TaskNotes privacy overview","url":"/privacy/","description":"How the TaskNotes app and Obsidian plugin store data and when optional services are involved.","product":"shared","text":"Last updated: August 6, 2026 TaskNotes products are built around portable Markdown records. The storage and network boundaries depend on the client and collection you choose. TaskNotes app# The TaskNotes app opens every collection through mdbase and requires a connection to read or change it. A hosted collection stores the authoritative Markdown with the hosted provider. A computer collection keeps the authoritative Markdown on that computer. TaskNotes reaches it through an end-to-end encrypted relay that cannot read record contents; the computer must remain reachable and run mdbase Connect. TaskNotes keeps only a temporary in-memory session cache. It does not retain a separate offline collection after the app or page closes. Reminder notifications for mdbase collections require explicit permission and use content-free event payloads. Task content is refreshed through the authorized collection connection. Obsidian plugin# The plugin keeps task and note content in the local Obsidian vault. Plugin settings live in Obsidian's plugin configuration. Network access occurs only for enabled features that require it, including release checks, calendar providers, ICS subscriptions, webhooks, and remotely loaded API documentation assets. Analytics# TaskNotes does not include a product telemetry or analytics pipeline. Services you choose to connect may keep their own operational, account, security, or billing records under their respective policies. Removal# Removing a client does not necessarily remove its authoritative collection. Use the hosted provider's controls for a hosted collection, or manage the Markdown folder on the computer that owns a computer collection. Back up records before removing an authoritative copy. Questions and source code# Use the relevant TaskNotes GitHub repository to report a privacy problem or inspect the implementation: TaskNotes app TaskNotes Obsidian plugin"}] diff --git a/public/sitemap.xml b/public/sitemap.xml index 9156c9e..756b546 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -172,6 +172,10 @@ https://tasknotes.dev/obsidian/releases/4.10.2/ https://tasknotes.dev/obsidian/releases/4.11.0/ https://tasknotes.dev/obsidian/releases/4.11.1/ + https://tasknotes.dev/obsidian/releases/4.12.0/ + https://tasknotes.dev/obsidian/releases/4.12.1/ + https://tasknotes.dev/obsidian/releases/4.12.2/ + https://tasknotes.dev/obsidian/releases/4.12.3/ https://tasknotes.dev/obsidian/releases/4.2.0/ https://tasknotes.dev/obsidian/releases/4.2.1/ https://tasknotes.dev/obsidian/releases/4.3.0/ diff --git a/tests/content-ownership.test.mjs b/tests/content-ownership.test.mjs index 77feb73..82022c9 100644 --- a/tests/content-ownership.test.mjs +++ b/tests/content-ownership.test.mjs @@ -1,4 +1,5 @@ import assert from "node:assert/strict"; +import { existsSync } from "node:fs"; import { access, readFile, readdir } from "node:fs/promises"; import path from "node:path"; import test from "node:test"; @@ -108,14 +109,16 @@ test("generated snapshot retains source ownership", () => { test("every available source attribution resolves to its owning repository", async () => { const siteRoot = fileURLToPath(new URL("../", import.meta.url)); + const productRoot = (environmentName, repository) => { + if (process.env[environmentName]) return process.env[environmentName]; + const staged = path.join(siteRoot, ".sources", repository); + return existsSync(staged) ? staged : path.resolve(siteRoot, "..", repository); + }; const roots = { "tasknotes.dev": siteRoot, - tasknotes: - process.env.TASKNOTES_PLUGIN_ROOT || path.resolve(siteRoot, "../tasknotes"), - "tasknotes-app": - process.env.TASKNOTES_APP_ROOT || path.resolve(siteRoot, "../tasknotes-app"), - "tasknotes-spec": - process.env.TASKNOTES_SPEC_ROOT || path.resolve(siteRoot, "../tasknotes-spec"), + tasknotes: productRoot("TASKNOTES_PLUGIN_ROOT", "tasknotes"), + "tasknotes-app": productRoot("TASKNOTES_APP_ROOT", "tasknotes-app"), + "tasknotes-spec": productRoot("TASKNOTES_SPEC_ROOT", "tasknotes-spec"), }; const availableOwners = new Set(["tasknotes.dev"]); for (const [owner, directory] of Object.entries(roots)) {