A local GitHub client that's really good at diffs. GitHub is only used to know which PRs are open — everything else happens with your local tooling:
ghlists open PRs and PR metadata (you must be logged in:gh auth status)gitfetchesrefs/pull/N/headinto your local clone and computes the diff against the merge-base — no GitHub diff API involved
pnpm install
pnpm devOpen the app, paste the path to a local clone (e.g. ~/code/my-repo), and
you get the list of open PRs. Click one for a side-by-side, syntax-highlighted
diff. Recent repos are remembered.
From a repo's PR list, switch to local branches to review a branch against
the default branch before it's ever pushed. You get the same diff view, file
map, and claude guidance tools (reviewability, risk heatmap, guided tour, ask
yourself) as a PR — the diff is just git diff <base>...<branch> computed
locally, so no GitHub round-trip is involved.
Comments left on a branch are stored locally (under ~/.jdiff). When
you're ready, open a pull request from the branch page: jDiff pushes the
branch, runs gh pr create, and posts every draft comment onto the new PR as
inline review comments in one shot, then drops you on the PR page.
A small dependency-free CLI opens jDiff pages in the browser — handy to expose to an LLM/agent so it can pull up a change for you:
jdiff pr 123 # open the PR diff page for PR #123
jdiff branch my-feature # review a local branch (against the default base)
jdiff branch my-feature main # …against an explicit base
jdiff open # open the repo's PR list
jdiff pr 123 --print # print the URL only (no browser) — machine-readableThe repo is resolved from the current git working tree (override with
--repo/-C). The server base URL defaults to https://jdiff.local:7443 and is
overridable with JDIFF_URL. After pnpm install the jdiff bin is on the
package; npm link (or pnpm link --global) puts it on your PATH.
server/api/prs.get.ts—gh pr listin the repo's directoryserver/api/diff.get.ts—git fetch origin +refs/pull/N/head:refs/jdiff/pr-Nthengit diff origin/<base>...refs/jdiff/pr-N, parsed withparse-diffand highlighted server-side withshikiserver/utils/target.ts— resolves a review "target" (a PR?number=or a local branch?branch=&base=) into the git range, head ref, and store key every shared route uses, so PRs and branches run through the same machineryserver/api/branch-*.ts— local-branch endpoints: list branches, store/list/ delete draft comments, and create a PR from a branch flushing its commentsbin/jdiff.mjs— the CLI