Markdoist is an Obsidian plugin that lets you manage Todoist tasks in plain text.
Write tasks as normal Markdown checkboxes, sync them to Todoist, and pull changes back into your notes.
This plugin uses a local-first sync strategy: tasks are cached locally, edits are queued locally, and then synced to Todoist in the background.
#todoist to a Markdown task line.[todoist_id:...] to bind the line to Todoist.Mark any Markdown checkbox line with your sync tag (default: #todoist):
- [ ] Buy milk #todoist
- [x] Pay rent #todoist
After syncing, the plugin appends an ID marker:
- [ ] Buy milk #todoist [todoist_id:123456789]
Notes:
[todoist_id:local-...] until they are created on Todoist.[todoist_id:...] from the note and leave a normal Markdown task.Add a due date in YYYY-MM-DD format:
- [ ] Submit report 🗓 2026-01-16 #todoist
Accepted calendar markers: 🗓, 🗓️, 📅.
Add a project tag using the project name without spaces (case-insensitive):
- [ ] Fix bug #todoist #Work
- [ ] Buy groceries #todoist #Personal
New tasks will be created in Default Project if set; otherwise they go to Inbox.
Create a code block like this:
filter: #ObsidianTest
limit: 10
name: My Tasks
filter: is a Todoist filter expression.limit: (optional) limits the maximum number of tasks displayed.filter: blocks, the plugin fetches the latest results from Todoist during refresh (and caches them locally).Open Obsidian → Settings → Community plugins → Markdoist.
Todoist API Token: from Todoist Settings → Integrations.Default Project: default destination for new tasks (empty = Inbox).Sync Tag: tag that marks Markdown lines for syncing.Codeblock auto refresh (seconds): how often code blocks refresh themselves (0 = disable).Auto sync interval (seconds): background sync interval (0 = disable).Sync now: flush pending local changes and refresh tasks.Sync status: quick overview of queue / cache / last sync.Todoist Sync API: connectivity test.Use Sync API: use Todoist Sync API for incremental sync.Filter cache retention (days): how long cached filter results are kept (0 = disable age-based pruning).Max cached filters: maximum number of cached filter result sets (LRU).Maintenance (advanced): cache/queue cleanup utilities.Debug logging: enable verbose logs in the developer console.main.js, manifest.json, styles.css into:<your vault>/.obsidian/plugins/markdoist/
Clone this repo into <your vault>/.obsidian/plugins/markdoist/, then run:
npm install
npm run build
MIT