A local-first, AI-native Git and GitHub review desktop app.
Differ is a focused desktop surface for reviewing local changes and GitHub PRs, leaving comments, extracting high-quality context, and handing that context to AI coding agents like Codex, Cursor, or Claude Code.
- Electron (desktop shell)
- React + Tailwind + Radix primitives (renderer)
- SQLite via
better-sqlite3(local storage) - Native
gitCLI through a typed IPC bridge (the renderer never spawns commands directly) - GitHub REST API via
@octokit/rest
npm install
npm run devnpm run dev starts the Vite renderer on http://localhost:5173 and an Electron process pointed at it.
npm run build
npm startnpm run build produces dist/electron/*.js (main + preload) and dist/renderer/* (the React app). npm start launches Electron against the built output.
Differ supports the GitHub OAuth Device Flow so users can sign in with one click and browse / clone their personal, private, and organization repositories.
Because Differ is open source, the client_id for the OAuth App is not hardcoded — each build supplies its own. To enable OAuth sign-in:
-
Visit https://github.com/settings/developers → New OAuth App
-
Fill in any homepage/callback URL (callback isn't used for device flow).
-
After creating the app, open its settings and enable Device Flow.
-
Copy the Client ID.
-
Copy
.env.exampleto.env(gitignored) and paste the Client ID:cp .env.example .env # then edit .env and set: # DIFFER_GITHUB_OAUTH_CLIENT_ID=Iv1.xxxxxxxxxxxxxxxx # optional — override the requested scopes (default: repo read:org read:user) # DIFFER_GITHUB_OAUTH_SCOPES=repo read:org read:user
The Electron main process loads
.envautomatically at startup.
The Client ID is public information by design — it's safe to ship in built artifacts. If DIFFER_GITHUB_OAUTH_CLIENT_ID is unset, the "Sign in with GitHub" button is disabled and users can still sign in by pasting a personal access token.