Todoist Vault Sync

pending

by Michael Jauk

Syncs Todoist projects and tasks to markdown files in your vault.

β˜… 1 starsUpdated 18d agoMITDiscovered via Obsidian Unofficial Plugins
View on GitHub

Todoist Vault Sync

"Buy Me A Coffee"

An Obsidian community plugin that syncs your Todoist projects and tasks to real markdown files in your vault.

Obsidian Version License Min Obsidian

Unlike query-based plugins, this writes actual .md files so they:

  • Work offline once synced
  • Appear in search results and backlinks
  • Are queryable with Dataview
  • Are indexed by Smart Connections alongside your notes
  • Sync seamlessly across any vault sync solution (iCloud, Obsidian Sync, Syncthing, Dropbox, git β€” your choice)

πŸš€ Features

  • πŸ“ One file per project β€” each Todoist project becomes a dedicated .md file
  • πŸ—‚οΈ Sections as headings β€” sections become ## headings; unsectioned tasks go under ## Inbox
  • πŸ”€ Subtask nesting β€” subtasks rendered as indented nested list items
  • 🏷️ Rich metadata badges β€” due date, priority, recurrence, and labels shown inline below each task
  • πŸ“ Task descriptions β€” rendered as collapsible callout blocks
  • πŸ”— Task deep links β€” wrap task titles in links that open directly in Todoist
  • ↔️ Bidirectional sync β€” check a task in Obsidian β†’ it closes in Todoist on next sync
  • ⏱️ Configurable sync interval β€” default 15 min, plus a manual "Sync now" command
  • πŸ”„ Status bar indicator β€” live sync status with colored dot (green/pulsing/red); click to trigger manual sync
  • πŸ” Ribbon sync icon β€” quick-access refresh icon in the left ribbon
  • πŸ” Project filter β€” whitelist specific projects or sync everything
  • ✏️ Filename prefix/suffix β€” avoid collisions with other notes in your vault
  • βœ… Completed tasks β€” five modes: hide, show inline, archive section, archive file, or archive folder; configurable fetch strategy (lookback, incremental, or full history)
  • πŸ“‹ Rich frontmatter β€” project URL, color, tags, favorites, shared status, and custom YAML fields

πŸ“¦ Installation

From Community Plugins (recommended)

  1. Open Obsidian β†’ Settings β†’ Community plugins β†’ Browse
  2. Search for Todoist Vault Sync
  3. Install and enable

Manual

  1. Download main.js, manifest.json, and styles.css from the latest release
  2. Copy all three files into <vault>/.obsidian/plugins/todoist-vault-sync/
  3. Enable the plugin in Settings β†’ Community plugins

βš™οΈ Setup

  1. Get your API token: Todoist β†’ Settings β†’ Integrations β†’ Developer β†’ API token
  2. Open plugin settings β†’ paste token β†’ configure sync folder and interval
  3. Run Todoist Vault Sync: Sync now from the command palette for an immediate sync

Security: Your API token is stored unencrypted in your vault's plugin data directory (.obsidian/plugins/todoist-vault-sync/data.json). Protect your vault accordingly.


πŸ› οΈ Settings

Connection

SettingDefaultDescription
API Tokenβ€”Your Todoist API token

Sync

SettingDefaultDescription
Sync FoldertasksVault folder for task files (created automatically)
Filename Prefix(empty)Prepended to every synced filename, e.g. πŸ“‹ β†’ πŸ“‹ Work.md
Filename Suffix(empty)Appended before .md, e.g. tasks β†’ Work tasks.md
Sync Interval15 minBackground polling interval (minimum 1)
Project Filter(all)Comma-separated project names or IDs to include; empty = all. Project IDs are stable across renames.

Output

SettingDefaultDescription
Completed tasks modehideHow to handle completed tasks β€” see below
Completed fetch modelookbackWhich completed tasks to fetch β€” lookback (N days back), incremental (delta since last sync, cached per project), all (full history up to 2 years, chunked)
Lookback window30Days to look back when fetch mode is lookback (max 89 β€” Todoist API limit). Also used as the bootstrap window for incremental mode.
Archive file suffix ArchiveSuffix added to archive filenames when mode is archive-file (e.g. Work Archive.md)
Archive folder namearchiveSubfolder inside the sync folder used when mode is archive-folder
Show metadata badgesonShow due date, priority, recurrence, and labels below each task
Show task descriptionsonRender task descriptions as collapsible callouts
Task deep linksoffWrap task titles in links that open the task in Todoist
Bidirectional syncoffChecking a checkbox in Obsidian closes the task in Todoist on next sync

Completed tasks mode options:

ModeBehaviour
hideCompleted tasks are not shown
inlineCompleted tasks appear as - [x] in each section alongside active tasks
archive-sectionCompleted tasks are appended under a ## Completed heading at the bottom of the file
archive-fileCompleted tasks are written to a separate <Project> Archive.md file in the same folder
archive-folderCompleted tasks are written to a separate file inside a dedicated archive subfolder

Frontmatter

SettingDefaultDescription
Include project URLonAdd todoist_url to frontmatter
Include project coloronAdd todoist_color to frontmatter
Include tagsonAdd tags: [todoist] to frontmatter
Include is_favoriteoffAdd todoist_is_favorite to frontmatter
Include is_sharedoffAdd todoist_is_shared to frontmatter
Custom fields(empty)Raw YAML lines appended to frontmatter, one per line

πŸ“„ File Format

Each synced project file looks like this:

---
todoist_project_id: "123456"
todoist_url: "https://todoist.com/app/project/123456"
todoist_color: "blue"
tags:
  - todoist
---

# Project Name

## Section Name

- [ ] Task content <!-- id:abc123 due:2026-03-15 p1 -->
  `πŸ“… Mar 15` `πŸ”΄ p1`

- [ ] Recurring task <!-- id:def456 recur:every day -->
  `πŸ“… Mar 16` `πŸ” every day`

## Inbox

- [ ] Unsectioned task <!-- id:ghi789 p2 -->
  `🟠 p2`
  - [ ] Subtask <!-- id:jkl012 -->

Priority Mapping

Todoist's API uses an inverted priority scale (4 = highest). The plugin converts to human-readable labels:

Todoist priorityLabelBadge
4p1 (urgent)πŸ”΄ p1
3p2🟠 p2
2p3🟑 p3
1p4 (default)(no badge)

↔️ Bidirectional Sync

Enable Bidirectional sync in settings. On the next sync cycle, any task you check in Obsidian will be closed in Todoist, and any task you uncheck (when Completed tasks mode is not hide) will be reopened.

Note: Only checkbox state is synced back to Todoist. Task content, due dates, and priorities are not written back β€” Todoist is the source of truth for task content.

Note: Reopening a task by unchecking it only works when Completed tasks mode is not hide β€” otherwise completed tasks aren't present in the file.


πŸ‘©β€πŸ’» Development

git clone https://github.com/michaeljauk/obsidian-todoist-vault
cd obsidian-todoist-vault
bun install

bun run build        # production build β†’ main.js
bun run dev          # watch mode
bun run typecheck    # tsc --noEmit
bun run lint         # eslint
bun run format       # prettier
bun test             # unit tests (renderer.ts)

To test in a vault, copy (or symlink) main.js, manifest.json, and styles.css into:

<your-vault>/.obsidian/plugins/todoist-vault-sync/

Then reload plugins in Obsidian (Settings β†’ Community plugins β†’ reload).

See docs/contributing.md for how to add new settings or render features.


🀝 Contributing

Contributions are welcome! Open an issue or submit a pull request on GitHub.


πŸ“ License

This project is licensed under the MIT License β€” see the LICENSE file for details.


Made with ❀️ by Michael Jauk

Not officially affiliated with Todoist or Obsidian. Desktop only (Obsidian mobile is not supported).

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.