Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8d7a359
fix google oauth external browser launch
callumalpass Aug 16, 2026
8e1476c
Clear contexts and blockedBy on empty-array updates (#2221)
tgrosinger Aug 21, 2026
dbfcd31
perf: don't block onload on Bases registration
tgrosinger Aug 2, 2026
b4bed61
docs: credit Bases startup improvement
callumalpass Aug 23, 2026
b329204
perf: don't block onload on Bases registration (#2187)
tgrosinger Aug 23, 2026
8133f75
Merge remote-tracking branch 'origin/main'
callumalpass Aug 23, 2026
1da981a
Fix provider calendar source names on event cards (#2192)
martin-forge Aug 23, 2026
e611b0e
Fix raw HTML in Google Calendar event descriptions (#2193)
martin-forge Aug 23, 2026
66b4a3b
Fix moved recurring occurrences rescheduling their original date (#2191)
martin-forge Aug 23, 2026
75c7e03
Merge remote-tracking branch 'origin/main'
callumalpass Aug 23, 2026
6b0f4ab
Fix templated occurrence filename title detection (#2248)
raphaelfaouakhiri Aug 23, 2026
1213c00
Fix Google Calendar export for tasks added while Obsidian is closed (…
raphaelfaouakhiri Aug 23, 2026
5aefce0
Fix recurring skip occurrence date handling (#2146)
renatomen Aug 23, 2026
dda092d
Merge remote-tracking branch 'origin/main'
callumalpass Aug 23, 2026
829f9b3
fix Google Calendar metadata mutation reliability (#2250)
callumalpass Aug 23, 2026
ddc50d3
fix completion-anchored occurrence note dates (#2232)
callumalpass Aug 23, 2026
8bb5d79
fix inline task link aliases (#2247)
callumalpass Aug 23, 2026
14e2788
fix duplicate overdue Agenda rows (#2231)
callumalpass Aug 23, 2026
7db63f9
improve large time entry editor performance (#2206)
callumalpass Aug 23, 2026
acde337
fix mobile embedded Task List spacing (#2239)
callumalpass Aug 23, 2026
78218a1
fix Relationships widget overlap and lifecycle (#2238)
callumalpass Aug 23, 2026
ab3449e
release 4.12.4
callumalpass Aug 23, 2026
04ac4fd
fix settings tab strip clipping Integrations tab (#2222)
callumalpass Aug 25, 2026
b29a29e
fix reading mode card scroll churn and swimlane sort order
callumalpass Aug 26, 2026
2d0f180
release 4.12.5
callumalpass Aug 26, 2026
8b8e3df
Add web and iOS links to README
callumalpass Aug 29, 2026
0f974c8
Mark standalone TaskNotes apps as beta
callumalpass Aug 29, 2026
fe11e8f
Add explicit completion-date controls (#2147)
renatomen Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

A task management plugin where each task is a separate Markdown note, and all views are powered by [Obsidian Bases](https://help.obsidian.md/bases).

> [!NOTE]
> **TaskNotes is also available in Beta on the web and iPhone.** [Open TaskNotes on the web](https://app.tasknotes.dev/) or [download it from the App Store](https://apps.apple.com/app/tasknotes/id6797168033).

<img src="https://github.com/callumalpass/tasknotes/blob/main/media/2025-12-07T15-43-26.png?raw=true" />

## Overview
Expand Down
2 changes: 2 additions & 0 deletions docs/HTTP_API.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,8 @@ Update task with partial payload.

Configured TaskNotes user fields can be updated either by their frontmatter property key or via `customProperties`.

Sending an empty array for `contexts` or `blockedBy` clears the corresponding frontmatter field.

```bash
curl -X PUT "http://localhost:8080/api/tasks/TaskNotes%2FTasks%2FReview%20docs.md" \
-H "Content-Type: application/json" \
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/feature-completion-date-actions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/settings-complete-skip-submenu.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 4 additions & 2 deletions docs/code-mapping.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,15 @@
},
{
"id": "task-management",
"description": "Task CRUD, filtering, status, priority, and auto-archiving",
"description": "Task CRUD, filtering, status, priority, completion menu, and auto-archiving",
"source": [
"src/services/TaskService.ts",
"src/services/FilterService.ts",
"src/services/StatusManager.ts",
"src/services/PriorityManager.ts",
"src/services/AutoArchiveService.ts"
"src/services/AutoArchiveService.ts",
"src/components/TaskContextMenu.ts",
"src/ui/completionDateResolver.ts"
],
"docs": ["docs/features/task-management.md"]
},
Expand Down
6 changes: 6 additions & 0 deletions docs/features/recurring-tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,8 @@ Materialized occurrence notes keep `occurrence_date` as their identity. If you d

Each occurrence can be completed or skipped independently (task cards, calendar menus, task edit modal completion calendar).

When you complete an occurrence from the context menu, you can choose which date it is recorded against — today, the occurrence's scheduled date, its due date, or a date you pick (see [Completing Tasks](task-management.md#completing-tasks)). Completion-anchored recurrences resolve *on schedule* to the newly scheduled date, an explicit re-anchor.

Completed instances are stored in:

```yaml
Expand All @@ -225,6 +227,10 @@ When completion changes, `scheduled` updates to the next uncompleted instance. I

This means completion history and next-action planning stay synchronized automatically, without manually advancing recurring tasks.

### Rescheduling clears later instances

When you change a recurring task's scheduled date (from the context menu or the scheduled-date field), TaskNotes restarts the timeline from the new date: it clears every completed and skipped instance dated **on or after** that date, while keeping older instances as history. This reactivates occurrences you had completed or skipped off-schedule so they can be acted on again. Because clearing is destructive, TaskNotes asks you to confirm first — listing the dates that will be cleared — and cancelling leaves both the schedule and the recorded instances untouched.

## Flexible Scheduling

TaskNotes intentionally allows off-pattern scheduling so recurring tasks can absorb real-world disruptions without rewriting the entire recurrence rule.
Expand Down
19 changes: 19 additions & 0 deletions docs/features/task-management.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,25 @@ These settings let you align task files with existing vault conventions (for exa
For configuration details, see [Task Defaults](../settings/task-defaults.md).
For template variables, see [Template Variables Reference](template-variables.md).

## Completing Tasks

You can record a task's completion — and choose the date it is recorded against — directly from the task context menu, without opening the task. Four actions are offered:

- **Completed today** — records today's date.
- **Completed on schedule** — records the task's scheduled date (for a recurring task, the scheduled date of the occurrence you clicked).
- **Completed on due date** — records the due date.
- **Completed on (pick date)** — opens a date picker and records the date you choose.

An action is disabled when the date it needs is not set — for example *Completed on schedule* on a task with no scheduled date — rather than silently falling back to another date. Recurring tasks also get a **Skip instance** action alongside these.

By default the actions are grouped under a single **Mark complete or skip** entry (**Mark complete** for non-recurring tasks). To show them directly in the menu instead — set off by dividers — turn off **Settings → Appearance & UI → Task cards → Group complete and skip actions in a submenu**.

![Completion actions grouped under a submenu (default)](../assets/feature-completion-date-actions.png)

With the submenu grouping turned off, the same actions appear directly in the menu:

![Completion actions shown flat in the menu](../assets/feature-completion-date-actions-flat.png)

## 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.
Expand Down
2 changes: 2 additions & 0 deletions docs/releases.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Welcome to the TaskNotes release notes. Here you can find detailed information a

### Version 4.x (Current)

- [4.12.5](releases/4.12.5.md)
- [4.12.4](releases/4.12.4.md)
- [4.12.3](releases/4.12.3.md)
- [4.12.2](releases/4.12.2.md)
- [4.12.1](releases/4.12.1.md)
Expand Down
63 changes: 63 additions & 0 deletions docs/releases/4.12.4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# TaskNotes 4.12.4

> [!info] TaskNotes v5 beta
>
> [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.
>
> 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.
>
> 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.
>
> 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).

## Changed

- (#2187) Improved TaskNotes startup performance by allowing Bases registration to finish asynchronously. Thanks to @tgrosinger for the contribution.

## Fixed

- (#2232) Opening an occurrence note from a completion-anchored recurring task now
uses the task's scheduled occurrence date instead of defaulting to today. Thanks
to @chmac for reporting this.
- (#2247) Creating a new inline task now removes nested wikilink and Markdown-link
markup from the inserted task link's display text. Thanks to @bgk0018 for
reporting this.
- (#2231) Fixed Agenda views with `showOverdueOnToday` showing the same task twice
when both its scheduled and due dates were overdue. Thanks to @takashit16833 for
reporting this.
- (#2206) The time entry editor now opens much faster for tasks with many tracked
sessions by delaying the heavier description editor setup until a description
field is focused. Thanks to @Sapere-Kyle for reporting this.
- (#2239) Fixed Task List Bases embedded in mobile notes leaving a large blank gap
after the final task card. Thanks to @same774 for reporting this and @prethrive
for sharing a workaround.
- (#2238) The Relationships widget now stays below long Live Preview Dataview
tables and no longer appears twice after switching to Reading mode. Thanks to
@Romek1769 for reporting this.
- (#2250) Hardened Google Calendar task metadata updates: duplicate Google
Calendar fields are now repaired atomically without replacing concurrent task
edits, and synchronization finishing after a disconnect no longer writes stale
event metadata. Thanks to @3zra47 for reporting the corrupted task data that
prompted this review.
- (#2229) Google Calendar OAuth authorization now opens in the system browser
instead of Obsidian's Web Viewer, avoiding Google's 401 malformed-request
page in the in-app browser. Thanks to @prethrive for reporting this and
confirming the workaround.
- Skipping a recurring task instance from Task List or Kanban now records the
task's occurrence date instead of the view's current date. Thanks to
@renatomen for the contribution.
- (#2130) Tasks added by external sync while Obsidian is closed are now exported
to Google Calendar after TaskNotes starts. Thanks to @seththepeacock for
reporting this and @raphaelfaouakhiri for the contribution.
- (#2246) Fixed materialized recurring occurrences hiding occurrence-template filename suffixes in TaskNotes views. Thanks to @raphaelfaouakhiri for reporting and fixing this issue.
- (#2221) Fixed `PUT /api/tasks/:id` ignoring empty arrays for `contexts` and `blockedBy`: sending `{"contexts": []}` or `{"blockedBy": []}` now clears the corresponding frontmatter field instead of silently leaving the previous value in place. The deletion pass previously fired only on a literal `undefined`, which JSON cannot express, so HTTP clients had no way to clear these fields. Thanks to @tgrosinger for the contribution.
- (#2191) Completing or skipping a recurring occurrence that was moved earlier
than its original date no longer schedules that original date again. Thanks to
@martin-forge for the contribution.
- (#2193) Google Calendar event descriptions written with formatting now read as
plain text in event details, copied text, and generated notes, instead of
showing raw HTML tags. Paragraph breaks, list structure, and link addresses are
kept. Thanks to @martin-forge for the contribution.
- (#2192) Agenda and list cards for Google and Microsoft calendar events now
show the name of the calendar the event belongs to, instead of the generic
"Calendar" label. Thanks to @martin-forge for the contribution.
7 changes: 7 additions & 0 deletions docs/releases/4.12.5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# TaskNotes 4.12.5

## Fixed

- (#2255) Notes with an in-note task card no longer jump while scrolling in reading mode. The card is now restored only after scrolling settles instead of being re-injected every frame against Obsidian's virtualised reading view. Thanks to @logicelf for the detailed diagnosis.
- (#2256) Kanban swimlane order now follows the view's sort configuration again: with a formula or property sort applied, the swimlane holding the top-sorted task floats to the top of the board as it did before the swimlane ordering option was introduced. Thanks to @tsweezy for reporting this.
- (#2222) The TaskNotes settings tab bar now wraps to a second line instead of clipping the Integrations tab beside the documentation link on narrow settings panes. Thanks to @nextstitch and @YongcaiHuang for reporting this.
6 changes: 6 additions & 0 deletions docs/releases/unreleased.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,9 @@ When a change has user-facing documentation, include a canonical tasknotes.dev l
```

-->

## Added

- (#2147) Added context-menu actions for recording task completion today, on the scheduled date, on the due date, or on a chosen date. The actions can be grouped in a submenu from Appearance settings. See [Completing Tasks](https://tasknotes.dev/features/task-management/#completing-tasks).
- Rescheduling a recurring task can reactivate affected completed or skipped instances after confirmation. See [Recurring Tasks](https://tasknotes.dev/features/recurring-tasks/).
- Thanks to @renatomen for the contribution.
4 changes: 4 additions & 0 deletions docs/settings/appearance.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ These settings control the visual appearance of the plugin, including the calend

Use **Default visible properties** to decide what metadata appears on task cards without opening each task. This is the primary control for card density.

Use **Group complete and skip actions in a submenu** to control how the completion actions are laid out in the task context menu. When on (the default), the *Completed today / on schedule / on due date / on (pick date)* actions — and *Skip instance* for recurring tasks — are nested under a single **Mark complete or skip** entry. Turn it off to show them directly in the menu, set off by dividers.

![Group complete and skip actions in a submenu](../assets/settings-complete-skip-submenu.png)

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
Expand Down
18 changes: 18 additions & 0 deletions i18n.manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,8 @@
"settings.appearance.taskCards.description": "4554f6f0816fa0c30fb2d11d11b7a4e0e9a610de",
"settings.appearance.taskCards.defaultVisibleProperties.name": "0aa5efd8c0508868b5a726a4f3890fc3efb71d26",
"settings.appearance.taskCards.defaultVisibleProperties.description": "1673317e8fda5fc944e0458b5e51563c048e2dcd",
"settings.appearance.taskCards.completionSubmenu.name": "599d4040155ef8e0e7e6c70cdd3cb24583b2302f",
"settings.appearance.taskCards.completionSubmenu.description": "edc8f49c252f25483a01c4675be3e296ba2623c9",
"settings.appearance.taskCards.propertyGroups.coreProperties": "acae0b9efe790c7be9c7a70dd1db4826a9eef7f7",
"settings.appearance.taskCards.propertyGroups.organization": "9da72239ddeee345a6b025c468d9817c49cae014",
"settings.appearance.taskCards.propertyGroups.customProperties": "07daf13a314add9a92c0f8e5564d81ce72e4937c",
Expand Down Expand Up @@ -1846,6 +1848,22 @@
"contextMenus.task.markIncomplete": "8d0d3b84c6c7d795e205c345054f9335ae222c21",
"contextMenus.task.skipInstance": "ebb18d68bb33bb3188ca558e22656fa8f4cb7e95",
"contextMenus.task.unskipInstance": "f58b99fdb842bddf12fa964f933eb1d9bd54843e",
"contextMenus.task.completion.submenu": "54a51295b3ea49320049e2c7a225326711e0a571",
"contextMenus.task.completion.submenuCompleteOnly": "0c018491b96aadfff5ebeb45434a2945bdd12741",
"contextMenus.task.completion.completeToday": "f86a2e78fa25078c77c8b36a58c7adabfdc0b725",
"contextMenus.task.completion.completeAsScheduled": "5816ce12a13d6c586d600d2a38ca8fd669bfac38",
"contextMenus.task.completion.completeOnDue": "d915b497e5849ebf0a27d1ed54173a355fe96232",
"contextMenus.task.completion.completeOnPicked": "9c2baea91e78091a5c390492c920218cc2a66146",
"contextMenus.task.completion.markIncomplete": "3ae756e7c4063158572bde2513eeebd18a7ffb62",
"contextMenus.task.completion.noScheduledDate": "b26b6e02e0a284a7ae4d1326db014438a8d8f860",
"contextMenus.task.completion.noDueDate": "7fd1fe06f971d95e436f7ee5b7c3ce4390e66ddb",
"contextMenus.task.completion.noPickedDate": "d4ee6469f6d100f64fd1e5f328c800c1ee3f2788",
"contextMenus.task.completion.noCompletedStatus": "17a5c4be21c3ae7b7320d3ee28ca1cb611221530",
"contextMenus.task.completion.pickDateTitle": "b7bb83924b90b81af703aedc3bb16bdc4c239ec5",
"contextMenus.task.completion.completeFailure": "2bd697dbae7139872c337782e64b31b0f78b4a25",
"contextMenus.task.completion.clearInstancesConfirmTitle": "a819ff5087a10bfd7d0300249ce038f90e818702",
"contextMenus.task.completion.clearInstancesConfirmMessage": "2220d4a9ab7e1b7f1224c48a64a310d0ea2caecc",
"contextMenus.task.completion.clearInstancesConfirmButton": "3bdcd7189cfa14996da1fdf37761df828a182d7e",
"contextMenus.task.quickReminders.atTime": "87270e0d6c46f3d0c3510c6c2a2f1e31e8b0ab60",
"contextMenus.task.quickReminders.fiveMinutes": "c777f20872b577e3164c1b6d3f4f50d70faa8e93",
"contextMenus.task.quickReminders.fifteenMinutes": "4bba5a72574fef683d773d45198acbf9a56d8961",
Expand Down
Loading