Todoist DeepSync
unlistedby ajmastra
Sync Todoist tasks into Obsidian with full subtask hierarchy, inline code blocks, and checkable completion.
Todoist DeepSync
Obsidian plugin that syncs tasks from Todoist into your notes with full subtask hierarchy, inline code blocks, and checkable completion. Inspired by the Sync with Todoist plugin, with modifications and features tailored to my own workflow (including full subtask rendering, hierarchical project/section picker, and compact task creation).
Features
- Authenticate with the Todoist Sync API using your API token (stored in plugin settings).
- Fetch tasks from projects, sections, or filters.
- Render tasks inline via a
```todoist ```code block with an optional query. - Full subtask support: parent/child relationships from Todoist's
parent_id, indented hierarchy, and collapsible subtask groups. - Task display: content, due date (formatted as
MM/DD/YY @ h:mm AM/PM), and priority (e.g.!…!!!). - Complete/uncomplete tasks from the note; changes are sent to the Todoist API.
- Create tasks via a compact modal with icon-based options (project, section, priority, due date, subtask).
- Auto-refresh on a configurable interval.
- Manual refresh button in each task block.
Setup
-
Install the plugin
Copymain.js,manifest.json, andstyles.css(if present) into your vault's.obsidian/plugins/todoist-deepsync/folder. -
Enable the plugin
Open Obsidian Settings → Community plugins → enable Todoist DeepSync. -
Add your Todoist API token
In Settings → Todoist DeepSync, paste your Todoist API token and save. -
Use in a note
Add a code block with thetodoistlanguage and an optional query:```todoist filter:today ```Query syntax: You can use
filter:...,project:123,section:456, or a plain line (filter string or numeric project id). Bothkey: valueandkey valuework (e.g.filter:todayorfilter today).
Filtering examples
By date (Todoist filter string):
```todoist
today
```
```todoist
tomorrow
```
```todoist
overdue
```
```todoist
filter: "today | overdue"
```
By project or section (use IDs from Todoist):
```todoist
project:2234567890
```
```todoist
section:2234567891
```
Or with a space: project 2234567890 or just the number 2234567890 for a project.
By label or project name (Todoist filter):
```todoist
@Work
```
```todoist
#ProjectName
```
Combined filters (and / or / not):
```todoist
today & @urgent
```
```todoist
overdue | today
```
```todoist
today & !subtask
```
Empty block: Leave the block content empty to use the default filter from plugin settings.
Development
This project uses:
- TypeScript for type safety
- ESLint 9 (flat config) for code linting
- Prettier for code formatting
- GitHub Actions for CI/CD
Before committing, run npm run check to ensure code quality. The CI pipeline will automatically:
- Type check the code
- Run linting
- Check formatting
- Build the project
- Run tests and upload coverage to Codecov
Codecov: To enable coverage uploads in CI, add a CODECOV_TOKEN secret in the repo settings (Settings → Secrets and variables → Actions). The token can be obtained from the Codecov dashboard for this repository.
Note: This project uses ESLint 9 with the flat config format (eslint.config.mjs). The minimatch vulnerability is mitigated via npm overrides in package.json. The ajv vulnerability in ESLint's dependencies is a dev-only dependency and requires specific conditions ($data option) that ESLint doesn't use, so it poses minimal risk.
Lock file: package-lock.json is committed to ensure reproducible builds and enable CI/CD caching.
Tech stack
- TypeScript, Obsidian Plugin API, Todoist Sync API (v1).
- Bundling: esbuild (single
main.js). - Note: Uses Todoist Sync API (
/api/v1/sync) instead of REST API v2, as REST v2 endpoints return 410 Gone.
Credits
This plugin was inspired by Sync with Todoist by jamiebrynes7. I wanted the same kind of Todoist-in-Obsidian experience but with my own modifications (subtask hierarchy, filters, and UI preferences), so I built Todoist DeepSync. Thank you to the original author and contributors for the inspiration.
License
MIT
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.