Todoistian
pendingby Pierre-Yves Gillier
Forked from Ultimate Todoist Sync
Synchronize vault's tasks with Todoist.
Obsidianist
Seamless bidirectional task synchronisation between Obsidian and Todoist.
Features
| Feature | Obsidian β Todoist | Todoist β Obsidian |
|---|---|---|
| Add task | β | π |
| Delete task | β | π |
| Modify task content | β | β |
| Modify due date | β | β |
| Modify labels / tags | β | π |
| Modify priority | β | π |
| Mark as completed | β | β |
| Mark as uncompleted | β | β |
| Task notes / comments | π | β |
| Modify project | π | π |
| Modify description | π | π |
Installation
Community plugins (recommended)
- Open Settings β Community plugins and disable Restricted mode.
- Click Browse, search for
Obsidianist, and click Install. - Enable the plugin under Installed plugins.
Manual
- Download the latest release from the Releases page.
- Copy
main.js,manifest.json, andstyles.cssinto.obsidian/plugins/obsidianist/inside your vault. - Enable the plugin in Settings β Community plugins.
Configuration
- Go to Settings β Obsidianist.
- Paste your Todoist API token (found at https://app.todoist.com/app/settings/integrations/developer) and click the send button to initialise.
- Choose a Default project β new tasks without an explicit project tag are sent here.
Available settings
| Setting | Default | Description |
|---|---|---|
| Todoist API token | β | Required. Your personal Todoist API token. |
| Automatic sync interval | 300 s | How often the background sync runs. Minimum 20 s. |
| Default project | Inbox | Target project for tasks with no project tag. |
| Full vault sync | Off | When enabled, #todoist is added to every task in the vault automatically. |
| Use Desktop URIs | On | Links open in the Todoist app (todoist://) instead of the browser. |
| Debug mode | Off | Prints verbose logs to the developer console. |
Usage
Task format
Mark any Markdown task with #todoist and it will be picked up on the next sync:
- [ ] My task #todoist
- [ ] Buy groceries π
2025-06-01 !!2 #work #todoist
- [ ] Child task #todoist
Syntax reference
| Token | Description | Example |
|---|---|---|
#todoist | Marks the line for sync. Required unless Full vault sync is on. | - [ ] task #todoist |
π
YYYY-MM-DD | Due date. Also accepts π, ποΈ, π. | - [ ] task π
2025-06-01 #todoist |
!!1 β !!4 | Priority. !!4 = urgent (red), !!1 = natural. Must have spaces on both sides. | - [ ] task !!4 #todoist |
#projectName | If the tag matches a project name exactly, the task is sent to that project. | - [ ] task #Work #todoist |
#tag | Any tag that does not match a project name becomes a Todoist label. | - [ ] task #tagA #tagB #todoist |
After a task is created, the plugin writes its Todoist ID and a deep-link back into the line:
- [ ] My task #todoist %%[todoist_id:: 123456789]%% [link](todoist://task?id=123456789)
Project assignment priority
- File-level default project (set via command, see below).
- Tag matching a project name (
#ProjectName). - Global default project from settings.
- Parent task's project (for indented child tasks).
Per-file default project
Open the command palette (Ctrl/Cmd + P) and run Obsidianist: Set default project for current file. A dropdown lets you pick a project; the selection is stored per-file and shown in the status bar.
Manual sync
In the plugin settings, click Sync to trigger an immediate synchronisation, or Check Database to scan for inconsistencies and unsynced tasks.
How sync works
Obsidian β Todoist
| Trigger | Action |
|---|---|
New #todoist line detected (editor change or file save) | Task created via Todoist REST API v2; ID written back into the line. |
| Cursor leaves a modified task line | Changed fields (content, due date, labels, priority) are sent as an update. |
Delete / Backspace removes a task ID from the file | Task deleted in Todoist. |
| Checkbox clicked | Task closed or reopened in Todoist. |
Todoist β Obsidian
Background sync (default every 5 min) fetches activity events originating outside Obsidian and applies them to vault files:
| Event | Action |
|---|---|
| Task completed | Checkbox set to [x] in the file. |
| Task uncompleted | Checkbox reset to [ ]. |
| Content updated | Task text replaced in the file. |
| Due date updated | Date token updated or removed. |
| Comment added | Note appended below the task line. |
| Project event | Project cache refreshed. |
Data storage
All data is persisted in Obsidian's plugin storage (loadData / saveData):
| Key | Contents |
|---|---|
todoistTasksData.tasks | Cached Task[] objects, each extended with a .path vault filepath. |
todoistTasksData.projects | Cached project list. |
todoistTasksData.events | Already-processed activity event IDs (deduplication). |
fileMetadata | Map of filepath β { todoistTasks, todoistCount, defaultProjectId? }. |
lastSyncTime | Timestamp used as dateFrom when fetching activity events. |
Development
npm install # install dependencies
npm run dev # watch mode (rebuilds on change)
npm run build # production build (runs tsc first)
npm run version # bump version in manifest.json and versions.json
No test suite exists currently.
Contributing
Pull requests are welcome. Please open an issue first to discuss significant changes.
License
Released under the GNU GPLv3 License.
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.