Projects 2026 live
todo-harvest
Sync tasks between Vikunja, Plane, Jira, Microsoft To Do and Notion through one local state file - pull from all five in one schema, push back to the two that take it.
Python

Work is in Jira, the team board is in Plane, the family list is in Microsoft To Do, notes with checkboxes are in Notion, and the self-hosted Vikunja was supposed to replace them all. It never does. todo-harvest pulls every one into one file in one schema — id, title, status, priority, dates, tags, category, url, with the service's own payload kept under raw — resolves conflicts by timestamp, and pushes the result back to the two services that accept writes.
Nothing polls and nothing runs in the background. pull, push and sync do exactly what they say; inspect and export never touch the network. A SQLite mapping assigns one stable local id to each task on first sight and remembers which id it has on each service, so a task created by a push is recognised on the next pull. status_map, priority_map and Notion field_map handle instances with their own vocabulary.
Local state is the source of truth: a pull never overwrites a newer local edit, and a push never invents a task on a service that has no mapping unless you set a default project. Python, one config.yaml with the tokens, git-ignored.