I’ve been looking at the various ways to manage my tasks with Obsidian. I’ve been using a very simple task management format of e.g. a “project per file” with a mix of - [ ]
tasks, headings, notes etc. This especially works well with coding projects that have a mix of ideas, resource material, features, bugs etc. I can also easily use search or DataView on those tasks.
For work I’ve been using Todoist because it helps me prioritize tasks, assign dates, sync to my calendar, get an easy overview etc. It’s also very easy to use the Quick Add modal or quickly prioritize or move tasks to a project from the inbox (especially with todoist-shortcuts).
@jamiebrynes7 did some fantastic work on materializing Todoist in Obsidian and it works great. But I’ve been thinking about integrating Todoist in another way: using the Todoist sync API v8 to synchronize Todoist and create a separate Markdown file for each project or task. Keeping them in sync using Todoist-specific frontmatter (corresponding with id’s etc. from JSON from the Sync API).
Here’s how it would work (simplified):
- Initial sync will mean creating a Markdown file for each Todoist project and task writing Todoist variables (e.g.
id
,project_id
,due_date
) to frontmatter - The sync script watches for changes in local files or gets an update from the Todoist sync API if something changed remotely
- When issueing an update on Todoist, the frontmatter of the corresponding Markdown file (based on
id
) will change. - When updating a Markdown file it will trigger an update to the specific
id
in the frontmatter on Todoist.
This approach would mean that you could use the (synchronized) Markdown files in Obsidian with e.g. Dataview. When changing anything (e.g. completing a task) it would sync back to Todoist.
I’m thinking of using Python as I’ve already been working on updating/rewriting this (old) plugin which builds two-way sync for Todoist and Google Calendar using an SQLite database as intermediary. SQLite as intermediary could be replaced with e.g. python-watchdog and files.
I don’t see yet how I could make this could work using an internal Obsidian plugin, but that may be me lack of knowledge of Typescript / Javascript and writing plugins compared to Python. Also there’s no official sync API Typescript implementation (there is one for the REST api), although there are some bits and pieces out there that could probably be used (like this). I also have no idea how efficient a sync API could/would run inside Obsidian, although Obsidian probably providers good mechanisms to get updates on (local) changes; remote changes could be more intensive (don’t know JS/TS well enough for that)
I’ve seen that there’s also TaskboneHQ.com which seems pretty interesting, but is only one-way sync and use a proprietary/private remote API (which is fine, but not what I’d like in the long run). I couldn’t find the author Dominik Schlund (@schlundd) on the forums?
Let me know if you have any ideas suggestions for this approach. I’ll keep working for now on the two-way Google Calendar sync but want to explore this idea further.
Some (already) known caveats (there might be many):
- This is definitely not for everyone. E.g. you need to be able to run a Python script doing the syncing in the background.
- Looking for file changes can be resource intensive and not always efficient. E.g. because there’s no “previous state” (unless you add something like a previous-state file or db) you’ll have assume that everything in a changed file would be the “wanted state” and upload it all, which might lead to sync conflicts if something on the other end also changed at the same time
- Todoist descriptions can’t be longer than 500 characters, so you can’t easily sync full notes. I think it’s best to not use descriptions in Todoist at all for the content, but rather leave all content in the Markdown file and write a link to the Obsidian file in the description.