Daily Task Tree Rollover

unlisted

by Lucas Louzada

Rolls over open daily note tasks while preserving markdown hierarchy.

Updated 26d ago0BSD
View on GitHub

Daily Task Tree Rollover

Daily Task Tree Rollover is an Obsidian plugin that rolls open tasks forward from the previous valid Daily Note to the latest valid Daily Note while preserving Markdown hierarchy.

It does not depend on the currently open note, cursor, tab, or editor. The plugin scans the vault, finds the two most recent valid Daily Notes, and operates on that pair.

What it does

The plugin:

  • Lists Markdown files inside your configured Daily Notes folder.
  • Identifies valid Daily Notes by filename using your configured date format.
  • Sorts those notes by date.
  • Uses the penultimate valid note as the source.
  • Uses the latest valid note as the destination.
  • Extracts open tasks from the source while preserving headings, parent bullets, parent tasks, and child details.
  • Writes the result into a managed section in the destination.
  • Can optionally update the source note, keeping completed work and removing rolled-over open tasks.

Managed section markers

The plugin uses markers to know which part of a note it is allowed to edit:

<!-- task-tree:start -->

<!-- task-tree:end -->

Destination behavior:

  • If the destination note is empty, the plugin creates the full marked block.
  • If the destination note already has markers, only the content between markers is replaced.
  • If the destination note has content but no markers, the plugin aborts for safety.

Source behavior:

  • If the source note has markers, only the content between markers is used.
  • If the source note has no markers, the whole file is used as the source.

Commands

Rollover latest daily note pair

Copies open tasks from the penultimate Daily Note to the latest Daily Note.

This command updates the source note only when Update previous note by default is enabled.

Rollover latest daily note pair and update source

Copies open tasks to the latest Daily Note and always updates the source note afterward.

Updating the source means the previous Daily Note keeps completed tasks and removes open tasks that were rolled forward.

Dry run: copy rollover result to clipboard

Calculates the rollover result and copies it to the clipboard.

This command does not modify any notes.

Settings

SettingDefaultDescription
Daily notes folderDailyFolder where Daily Notes are stored. Leave empty to use the vault root.
Daily note date formatYYYY-MM-DDDate format used by Daily Note filenames.
Start marker<!-- task-tree:start -->Start of the managed section.
End marker<!-- task-tree:end -->End of the managed section.
Update previous note by defaultfalseMakes the normal rollover command update the source note.
Require latest daily note to be todaytrueAborts if the latest valid Daily Note is not dated today.
Auto rollover when a daily note is createdfalseRuns rollover automatically when a new latest Daily Note is created.
Auto rollover delay1000Delay in milliseconds before auto rollover runs.

Markdown parsing rules

The parser is intentionally simple and line-based. It recognizes:

  • Headings like ### Heading and #### Subheading.
  • Normal bullets like - item.
  • Nested bullets by indentation.
  • Open tasks like - [ ] task.
  • Completed tasks like - [x] task and - [X] task.
  • Child lines and notes under tasks or bullets.

Rollover examples

Open task under a completed parent

Source:

- [x] modo manutencao ✅ 2026-07-08
	- [ ] organizar database

Destination receives:

- [x] modo manutencao ✅ 2026-07-08
	- [ ] organizar database

The completed parent is kept because it provides context for the open subtask.

When updating the source, the previous note keeps:

- [x] modo manutencao ✅ 2026-07-08

Completed task with notes

Source:

- [x] home ✅ 2026-07-08
	- pendencia 1
	- pendencia 2

When updating the source, the previous note keeps:

- [x] home ✅ 2026-07-08
	- pendencia 1
	- pendencia 2

Completed tasks keep their child notes in the source.

Auto rollover

Auto rollover is disabled by default.

When enabled, the plugin listens for new files created in the vault. If the created file is a valid Daily Note, the plugin waits for the configured delay and runs rollover only if that file is the latest valid Daily Note.

The automatic run uses the same source update behavior as the normal command: it updates the source only when Update previous note by default is enabled.

Safety notes

  • The plugin never uses the active editor or cursor.
  • The destination note is not overwritten when it has existing content without markers.
  • All note changes are made through Obsidian's vault APIs.
  • The plugin works locally and does not make network requests.

Development

Install dependencies:

npm install

Run a development build in watch mode:

npm run dev

Create a production build:

npm run build

Run linting:

npm run lint

Release artifacts expected by Obsidian are:

  • manifest.json
  • main.js
  • styles.css, when present

Manual testing

  1. Create two valid Daily Notes in the configured folder, for example Daily/2026-07-08.md and Daily/2026-07-09.md.
  2. Add open and completed tasks to the older note.
  3. Leave the latest note empty, or add the managed markers.
  4. Run Rollover latest daily note pair from the command palette.
  5. Confirm that open tasks appear in the latest note with their hierarchy preserved.
  6. Run Rollover latest daily note pair and update source to verify that the source keeps completed tasks and removes rolled-over open tasks.
  7. Add content without markers to the destination and confirm that the plugin aborts instead of overwriting it.

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.