Projects 2026 live
git-remote-tasks
Makes Jira, Vikunja, Microsoft To Do and Notion work as git remotes. Fetch brings each task in as a file, push sends your edits back, and diff, log, blame and bisect work on tasks.
Python

git-remote-tasks turns a task tracker into a git remote, using git's remote helper mechanism. A remote helper is any executable named git-remote-<scheme> on the PATH. When a URL has that scheme, git starts the helper and speaks a line protocol with it over stdin and stdout.
Mine is a single Python file that uses only the standard library. Through symlinks it answers to four names: git-remote-jira, git-remote-vikunja, git-remote-mstodo and git-remote-notion. Under each name it translates between that tracker's REST API and git's object model.
Once the remote is set up, git fetch jira-work pulls every issue into tasks/ as a file, one YAML or Org-mode file per task. Edit one in your editor, commit, run git push jira-work main, and the issue changes on Jira.
Every sync is a real commit on top of the previous one. So git diff main jira-work/main shows what changed on the tracker, git log -- tasks/ serves as the audit trail, and git bisect can walk through every sync. The first fetch takes a full snapshot, and later ones fetch only what changed since. The since token is recorded only after the tip has advanced, so an interrupted import never loses data.
On push, each edited file becomes one upsert and each removed file one delete. A file carrying an id from another source is refused rather than duplicated. If anything fails, git push exits with a non-zero code. Credentials live in .git/config under [tasks-remote "<name>"], never in the URL.