o1xhack275 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 available through Obsidian Community Plugins. If you installed an earlier beta through BRAT, use the migration steps below to stop BRAT updates and continue with the community version.
#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.Install Sync Todoist from Obsidian's built-in Community Plugins browser.
If you previously installed Sync Todoist through BRAT, migrate to the community version without deleting the plugin folder.
o1xhack/obsidian-sync-todoist from BRAT's beta plugin list. This stops BRAT from updating it; it does not need to uninstall the plugin from your vault.sync-todoist, Obsidian may already show it as Installed.Do not uninstall Sync Todoist from Installed plugins unless you intentionally want a clean reinstall.
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 |
📅 2026-01-28 15:00 |
Floating due time | Todoist local wall-clock due time |
due:2026-01-28 |
Due date | Todoist due date |
due:2026-01-28 15:00 |
Floating due time | Todoist local wall-clock due time |
<!-- todoist-due:{...} --> |
Protected due metadata | Preserves fixed-time and recurring Todoist rules |
🔺 |
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 |
Sync Todoist supports the structured due shapes exposed by Todoist API v1:
📅 2026-06-01 or due:2026-06-01.📅 2026-06-01 15:00 or due:2026-06-01 15:00.Markdown due editing is intentionally structured. Natural-language recurrence editing such as every Friday at 15:00 or tomorrow at 5pm is not parsed from Markdown in this release; edit those recurrence rules in Todoist.
These Todoist fields are intentionally preserved but not fully synchronized yet:
| Todoist feature | Current behavior | Recommended handling |
|---|---|---|
| Duration | Preserved in Todoist when Sync Todoist updates other fields, but not shown, created, edited, or synced from Markdown. | Set and edit duration in Todoist. Sync Todoist will omit duration and duration_unit so existing values are not cleared. |
| Sections / boards | Preserved in Todoist when other fields sync, but not shown, created, edited, or synced from Markdown. New Markdown tasks can target a project, not a project section. | Move tasks between sections in Todoist. Use 📁 ProjectName only for project routing. |
| Natural-language recurrence editing | Not parsed from Markdown. Recurring tasks are displayed as the current occurrence and protected with hidden metadata. | Edit recurrence rules in Todoist. Complete the task from Obsidian to advance the current occurrence. |
| Fixed-time timezone editing | Displayed and protected, but not edited from Markdown because a plain Markdown date/time cannot represent timezone semantics safely. | Edit fixed-time and timezone-specific due rules in Todoist. |
| Daily Note generated block edits | Generated rows are completion-focused. Title, due, project, label, and priority edits inside the marker block are not pushed to Todoist. | Edit task details in Todoist or in ordinary synced task lines outside the generated Daily Note block. |
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.[[Project#Heading]] or ![[clip#frame]], stay in the task title and are not treated as Todoist labels.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. |
| Version | Current release | Shows the current version and build time. Click the version to view update notes. |
| 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 incomplete recurring tasks | On | Controls whether active recurring tasks due today appear in the Daily Note block. |
| Completed tasks | Do not show completed tasks |
Controls whether Daily Note keeps no completed tasks, completed tasks due today, or all tasks completed today. |
| Include completed recurring tasks | Off | Sub-option shown when completed tasks are visible. 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. |
| Build info | Current build | Shows plugin version, build number, and build date at the bottom of General settings. |
| 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. |
| Clean up past Daily Notes | Preview and apply cleanup for stale generated rows in past Daily Notes. |
| Backfill past Daily Notes | Preview and write managed marker blocks for past Daily Notes without changing Todoist tasks. |
| 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 and CHANGELOG.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.