bastiaanschonhage1k downloadsBidirectional task sync with Todoist. Subtasks, import, projects, labels, and inline query blocks. Created with the help of AI; fully validated and tested by human.
Created with the help of AI; fully validated and tested by human.
With this plugin it is possible to create Todoist tasks from Obsidian and keep them in sync bidirectionally.
Its usage is very simple after the plugin has been connected to your Todoist account.
When you add the #todoist tag to a task (or checkbox item) it will automatically be created on Todoist and from that moment onward, the Todoist and Obsidian task will be synced.
p1, p2, p3 or p4 in a task to set its priority, just like in Todoisttoday, tomorrow, dd/mm, dd/mm/yy or dd/mm/yyyy to set the due date🔺, 📅 2026-10-01), so today stays pinned to the day you wrote itSee Shorthand Priorities and Dates for details.
#todoist parent are synced as subtasks automatically — no tag needed on each child📁 ProjectName metadata, bidirectional label sync via #hashtagssyncist code blocks (e.g., filter: today)p1–p4 for priority and today, tomorrow or dd/mm for the due date — no emoji picker neededrequestUrl — no external SDKsmain.js and manifest.json from the latest releasesyncist-todoist-sync in your vault's .obsidian/plugins/ directorymain.js and manifest.json into that foldernpm install and npm run buildTestVault folder in Obsidian (the plugin is symlinked)#todoist)p1–p4, today, tomorrow and dd/mm[/yy[yy]] (default: on)Add the #todoist tag to any task:
- [ ] Buy groceries #todoist
- [ ] Meeting with team #todoist 📅 2026-01-28 ⏫
- [ ] Call the dentist p1 tomorrow #todoist
After sync, the task will have a Todoist ID:
- [ ] Buy groceries #todoist <!-- todoist-id:8765432109 -->
Instead of the emojis you can type the priority and due date as plain words anywhere in the task:
- [ ] Call the dentist p1 tomorrow #todoist
- [ ] Renew passport p2 15/11 #todoist
| Shorthand | Meaning |
|---|---|
p1 / p2 / p3 / p4 |
Priority, same as in Todoist (p1 is highest, p4 is none) |
today, tomorrow |
Due today / tomorrow |
dd/mm |
Next occurrence of that date (e.g. 15/11; a date already passed this year means next year) |
dd/mm/yy, dd/mm/yyyy |
Exact date (e.g. 15/11/27, 15/11/2027) |
On the next sync the shorthand is sent to Todoist and rewritten in your note to the emoji format, e.g. the first task becomes:
- [ ] Call the dentist #todoist 🔺 📅 2026-10-01 <!-- todoist-id:8765432109 -->
This pins relative dates like today, so they don't change on later syncs. To change a priority or date later, just type a new shorthand at the end of the line — it overrides the existing emoji.
While you type, the shorthand that will be converted is highlighted in green in the editor; hover it to see what it means (e.g. Syncist: Due 2026-11-15).
The last one on the line wins. Only the last priority and the last date on a line count, whether shorthand or emoji. Earlier words stay part of the title:
- [ ] Plan p2 roadmap today p1 tomorrow #todoist
becomes the task "Plan p2 roadmap today" with priority p1, due tomorrow. After the sync the 🔺 📅 emojis come last on the line, so the p2 and today left in the title are not picked up again. For the same reason, shorthand typed before an existing emoji is ignored — type it at the end.
Things to know:
mp3, #p1 or today's are not recognized, and neither are invalid dates like 31/02dd/mm)Buy 1/2 kg would be read as a due date (the green highlight shows this). Turn off Shorthand priorities and dates in settings if that is a problemp4 is written as 🔽, so a pN word left in the title is not read as the priority laterIndent tasks beneath a #todoist-tagged parent. Subtasks inherit the sync tag automatically — you do not need to add #todoist to each one:
- [ ] Buy groceries #todoist <!-- todoist-id:111 -->
- [ ] Milk <!-- todoist-id:222 -->
- [ ] Bread <!-- todoist-id:333 -->
- [ ] Eggs
parentId)Use the command "Import task from Todoist" to search for any open Todoist task and insert it at your cursor:
Ctrl/Cmd + P)Assign a project to a task using the 📁 emoji:
- [ ] Design review #todoist #design #urgent 📁 WorkProject 📅 2026-03-05 <!-- todoist-id:123 -->
📁 ProjectName sets the Todoist project for the task (overrides the default project)#hashtags (other than the sync tag) are synced as Todoist labels, bidirectionallyEmbed a live, interactive task list in any note using a syncist code block:
```syncist
filter: today
```
The block renders as a styled task list with checkboxes, priorities, projects, and due dates. You can complete or reopen tasks directly from the rendered block.
Supported filters (uses Todoist filter syntax):
| Filter | Description |
|---|---|
filter: today |
Tasks due today |
filter: overdue |
Overdue tasks |
filter: today | overdue |
Combined filters |
filter: #ProjectName |
Tasks in a project |
filter: @label |
Tasks with a label |
filter: p1 |
High priority tasks |
Each query block includes a refresh button and shows when it was last updated.
| Emoji | Shorthand | Meaning | Todoist Mapping |
|---|---|---|---|
| 📅 YYYY-MM-DD | today, tomorrow, dd/mm, dd/mm/yy, dd/mm/yyyy |
Due date | Task due date |
| 🔺 | p1 |
Highest priority | p1 |
| ⏫ | p2 |
High priority | p2 |
| 🔼 | p3 |
Medium priority | p3 |
| 🔽 or none | p4 |
Low / no priority | p4 |
| 📁 | — | Project | Task project |
This plugin connects directly to the Todoist API v1 (via Obsidian's built-in requestUrl) to sync tasks. There are no external SDK dependencies. Your Todoist API token is stored locally in Obsidian's plugin data and is only used to communicate with Todoist's servers (api.todoist.com).
To build the plugin from source:
npm install
npm run build
To lint:
npm run lint
Created with the help of AI; fully validated and tested by human.
Claude in Cursor IDEContext7 MCP for up-to-date Todoist and Obsidian documentationrequestUrlIf you like this plugin, please give it a star on GitHub and in Obsidian!