Most engineering teams already run two trackers. In Stack Overflow's 2025 survey, 81.1% of respondents used GitHub and 46.4% used Jira, and the activity on the GitHub side is enormous: developers merged an average of 43.2 million pull requests a month there in 2025. Bugs get filed as issues because that is where the code is; plans live in the project tool because that is where the priorities are. Syncing the two is the obvious fix, and the obvious implementation has a bug that shows up on the first edit.
1. The Loop Every Two-Way Sync Has to Break
A task edit pushes to GitHub. GitHub fires a webhook. Applying the webhook changes the task. The change looks like a local edit, so it pushes to GitHub again. Timestamps and last-edited-by flags race, so they do not reliably stop it. What does is a hash: Kavanah projects both sides onto the same canonical shape, hashes it, and records the hash of the last state both sides agreed on. An incoming change whose hash matches is its own echo and is dropped.
2. Canonicalise Before You Compare
The hash only works if an untouched issue hashes the same on both sides. GitHub sends null for an empty body where a task stores an empty string, and line endings differ. Collapse those before hashing, or every sync looks like a real change and the loop guard does nothing.
3. Sync Fewer Fields Than You Want To
Kavanah's Issues sync carries title, body and open or closed state. Labels, assignees, milestones and comments are left alone on purpose, because each needs its own identity mapping (a GitHub login is not a project-tool user) and its own conflict rules. Three fields with an unambiguous meaning on both sides beat ten fields that drift.
4. Opt In Per Repository
A sync that creates and edits tasks automatically, and writes to your GitHub repository, should never switch itself on. In Kavanah it is enabled per repository and is off by default, and disabling it stops outbound writes immediately, even for tasks that are already linked. A GitHub outage never fails a person's edit in Kavanah: the push is retried on the next change.
5. Pull Requests Link, They Do Not Duplicate
Pull requests are a different object. Kavanah syncs them as pull requests, linked to a task when the title or a commit message says fixes #123, task 123 or TASK-123, and never turns them into extra tasks. The task then carries its PR's state, so the question of where a piece of work is gets answered from the code rather than from a status meeting.
Two trackers are fine if one of them is keeping the other honest. For the full list of what to require from a tool that sits next to your code, see our project management software for tech companies page.



