o1xhack20 downloadsBidirectional task sync with Todoist. Subtasks, import, projects, labels, inline query blocks, and completed-task queries.
Sync Todoist keeps Obsidian Markdown tasks and Todoist tasks in sync, while preserving local notes, nested outlines, project metadata, labels, query blocks, and Daily Note planning.
Language: English · 简体中文
Sync Todoist is currently recommended through BRAT while community-plugin submission is being prepared.
minAppVersion, bundled built-in modules, and typed settings persistence.#todoist to an Obsidian checkbox and it becomes a Todoist task.sync-todoist query blocks for filtered task lists.requestUrl() API, not a Node-only SDK.Use BRAT while Sync Todoist is pending review for the Obsidian Community Plugins directory.
https://github.com/o1xhack/obsidian-sync-todoist.Sync Todoist is not yet listed in the Obsidian Community Plugins directory. After approval, install it from Settings -> Community plugins -> Browse.
main.js, manifest.json, and styles.css from the latest release..obsidian/plugins/sync-todoist/ in your vault.git clone https://github.com/o1xhack/obsidian-sync-todoist.git
cd obsidian-sync-todoist
npm install
npm run build
Then copy main.js, manifest.json, and styles.css into .obsidian/plugins/sync-todoist/.
#todoist to a Markdown checkbox.- [ ] Buy groceries #todoist
After sync, Sync Todoist stores the Todoist task ID in an HTML comment:
- [ ] Buy groceries #todoist <!-- todoist-id:8765432109 -->
Sync Todoist reads and writes plain Markdown task lines. The todoist-id comment is the stable link between an Obsidian line and a Todoist task.
| Marker | Meaning | Todoist mapping |
|---|---|---|
#todoist |
Sync marker | Marks a top-level task for sync |
<!-- todoist-id:... --> |
Task identity | Keeps future syncs attached to the same Todoist task |
📅 2026-01-28 |
Due date | Todoist due date |
due:2026-01-28 |
Due date | Todoist due date |
🔺 |
Urgent priority | Priority 4 |
⏫ |
High priority | Priority 3 |
🔼 |
Medium priority | Priority 2 |
🔽 |
Normal priority | Priority 1 |
📁 Work |
Project | Todoist project named Work |
#label |
Label | Todoist label, except the sync tag |
Indented Markdown tasks under a synced parent become Todoist subtasks. Child lines do not need #todoist; they inherit sync from the parent outline.
- [ ] Plan launch #todoist 📁 Work #marketing 📅 2026-06-01
- [ ] Draft announcement
- [ ] Review screenshots
- [ ] Publish release notes
How inheritance works:
parentId.📁 ProjectName to route a task to a Todoist project.Embed a live Todoist task list in any note:
```sync-todoist
filter: today | overdue
```
Query blocks use Todoist filter syntax, render checkboxes, include a refresh button, and show the last updated time. The original syncist code block language is still accepted as a migration alias.
include_completed adds a second completed-task lookup and merges those results with the active tasks returned by filter. It does not automatically mean "completed today."
| Option | Description |
|---|---|
filter: today |
Active tasks matching a Todoist filter. |
include_completed: true |
Merge matching completed tasks into active results. |
completed_by: due_date |
Search completed tasks by Todoist due date. |
completed_by: completion_date |
Search completed tasks by completion time. |
completed_since: 30d |
Start of completed-task window: 30d, 6w, 3m, today, yesterday, or YYYY-MM-DD. |
completed_until: today |
End of completed-task window: today, now, or YYYY-MM-DD. |
completed_range: today |
One bounded range: today, yesterday, YYYY-MM-DD, 30d, 6w, or 3m. |
If completed_by is omitted, Sync Todoist infers a default:
today, overdue, or due before... default to due_date.@writing or #Work default to completion_date.Examples:
```sync-todoist
filter: today
include_completed: true
completed_by: due_date
completed_range: today
```
Shows active tasks due today and completed tasks whose due date is today.
```sync-todoist
filter: @writing
include_completed: true
completed_by: completion_date
completed_range: today
```
Shows active @writing tasks and @writing tasks completed today.
Sync Todoist can write today's matching Todoist tasks into today's Obsidian Daily Note. Enable Obsidian's core Daily notes plugin first, then open Settings -> Sync Todoist -> Daily Note.
Daily Note controls:
Default marker block:
%% sync-todoist:daily:start %%
- [ ] Review launch tasks #todoist 📁 Work 🔺 📅 2026-05-13 <!-- todoist-id:123456 -->
%% sync-todoist:daily:end %%
Important behavior:
Completed and recurring behavior:
| Setting | Default | Description |
|---|---|---|
| Interface language | English | Settings UI language. Supports English and Simplified Chinese. |
| Todoist API token | empty | Required token used to call Todoist's API. Stored locally in Obsidian plugin data. |
| Sync tag | #todoist |
Markdown tag that marks top-level tasks for sync. |
| Default project | Inbox | Todoist project for new tasks unless the task has 📁 ProjectName. |
| Sync interval | 5 minutes |
Auto-sync frequency. Set to 0 to disable automatic sync. |
| Conflict resolution | Todoist wins |
Behavior when both Obsidian and Todoist changed the same task. |
| Daily Note filters | All | Optional project, label, and priority filters for today's Daily Note block. |
| Daily Note primary sort | Time first |
Sort Daily Note tasks by time then priority, or by priority then time. |
| Include completed tasks | Off | Keep Todoist tasks completed today in the Daily Note block. |
| Include completed recurring tasks | Off | Sub-option shown only when completed tasks are enabled. Uses activity log fallback. |
| Manual sync notices | On | Show short Sync Todoist: completion notices for manual sync actions. |
| Automatic sync notices | On | Show scheduled sync notices on desktop and mobile, including zero-change summaries. |
| Command | What it does |
|---|---|
| Create task from current line | Converts the current Markdown task into a synced Todoist task. |
| Import task from todoist | Searches open Todoist tasks and inserts the selected task, including subtasks, at the cursor. |
| Sync now | Runs a manual sync. |
| Sync today's daily note | Refreshes today's managed Daily Note task block. |
| Open settings | Opens the Sync Todoist settings tab. |
npm install
npm run lint
npm run build
npx tsc --noEmit
npm test
Use test/TEST_SPEC_v2.0.0.md for manual QA against a test vault and Todoist account.
Release tags must exactly match manifest.json version, and every public release must attach main.js, manifest.json, and styles.css. See RELEASE.md.
obsidian-sync-todoist but the plugin ID is sync-todoist?The GitHub repository keeps the descriptive Obsidian-focused name. The Obsidian plugin ID is sync-todoist because Obsidian plugin IDs must not include obsidian.
It is stored locally in Obsidian's plugin data file for your vault. The runtime data.json file is intentionally gitignored.
No. Sync Todoist talks directly to Todoist API v1 through Obsidian's requestUrl() API for desktop and mobile compatibility.
Issues and PRs are welcome. Before opening a PR, run:
npm run lint
npm run build
npx tsc --noEmit
npm test
For behavior changes, also walk through the relevant sections of test/TEST_SPEC_v2.0.0.md.
Sync Todoist is based on Syncist by Bastiaan Schönhage, used under the MIT License. This repository keeps the upstream history, copyright notice, and license text intact while adding the independent Sync Todoist release line, sync-todoist plugin ID, subtasks, import, projects, labels, query blocks, Daily Notes, and completed-task support.
MIT - see LICENSE.