Beautiful git viewer in your browser β like GitHub, but local and instant.
No tokens. No accounts. No internet. Justgit-diffand a browser tab.
$ git diff HEAD~3
diff --git a/src/api/users.py b/src/api/users.py
index 3f2a1b8..9c4d72e 100644
--- a/src/api/users.py
+++ b/src/api/users.py
@@ -142,6 +142,9 @@ class UserService:
...
Raw git diff in a terminal is painful β no syntax colors that actually help, no side-by-side view, no file navigation, no history, no blame. You have to mentally parse it line by line.
git-diff opens a GitHub-quality interface in your browser β right now, from any repo, with no setup.
pip install git-diffThat's it. No npm, no node, no extra deps.
# Open viewer for the current repo
cd /path/to/your/project
git-diff
# Specify a repo path
git-diff --path /path/to/repo
# Use a custom port
git-diff --port 8080
# Bind to all interfaces (share on LAN)
git-diff --host 0.0.0.0
# Don't auto-open browser (print URL only)
git-diff --no-browser
# Show 5 lines of context in diffs
git-diff --context 5
# Print version
git-diff --versionA browser tab opens automatically at http://127.0.0.1:7433.
- Line-by-line diff with line numbers, color-coded
+additions /-deletions - Hunk headers showing function/class context (
@@ ... @@ def my_function) - File status badges β Added, Modified, Deleted, Renamed (with similarity %)
- Collapsible files β click any file header to expand/collapse
- Binary file detection
- Support for thousands of changed files in a single view
- Total commits, contributors, files, branches, tags, repo size
- Commit activity heatmap (last 90 days, GitHub-style calendar)
- Language breakdown β files and percentage by extension with color chart
- Browse all commits with author, date, relative time ("3 hours ago")
- Click any commit to see its full diff instantly
- Merge commit detection
- Parent commit links (click to navigate)
- Ref decoration β branch labels, HEAD pointer, tags
- Search and filter commits in the sidebar
- Compare any branch vs branch, tag vs tag, SHA vs SHA, or any mix
- Shows all commits in the range + full file diff
- One-click "Diff vs current" button on every branch in the branches panel
- Keyboard shortcut:
Ctrl/Cmd + K
- Staged and Unstaged changes clearly separated
- Click any file in sidebar to jump to its specific diff
- Real-time (refresh to update)
- Browse all tracked files
- View file content with syntax-aware line numbers
- File history β all commits that touched a file
- Blame view β who wrote which line, with commit hash and date
- Filter by filename in sidebar
- Ranked leaderboard by commit count
- Visual progress bars
- Email address, commit count
- All local and remote branches
- Tags with dates and annotation messages
- "Diff vs current" button on every branch
- View all stashed changes
- Click to see full diff for any stash entry
| Theme | Description |
|---|---|
| π Dark | GitHub dark β easy on the eyes |
| βοΈ Light | GitHub light β clean and crisp |
| β« AMOLED | True black β perfect for OLED screens |
Themes are persisted in localStorage β your preference sticks across sessions.
| Shortcut | Action |
|---|---|
Esc |
Return to overview |
Ctrl/Cmd + R |
Refresh repository data |
Ctrl/Cmd + K |
Open Compare view |
Ctrl/Cmd + \ |
Toggle sidebar |
git-diff is a single Python package with zero runtime dependencies. It:
- Detects your git repository root (walks up from CWD)
- Collects all data by running
gitsubprocess commands - Starts a tiny HTTP server using Python's built-in
http.server - Serves a single-page web app with full UI
- Opens your browser automatically
- Exposes a
/api/*REST endpoint for on-demand data
Everything runs 100% locally. No data leaves your machine.
git-diff exposes these endpoints (accessible at http://127.0.0.1:7433):
| Endpoint | Description |
|---|---|
GET / |
The web UI |
GET /api/data |
Full initial data bundle (repo info, commits, diffs, etc.) |
GET /api/commit?hash=<sha> |
Commit diff + detail for a specific SHA |
GET /api/commits?branch=&limit=&offset=&search=&author= |
Paginated commit history |
GET /api/staged[?context=N] |
Current staged diff |
GET /api/unstaged[?context=N] |
Current unstaged diff |
GET /api/range-diff?base=<ref>&compare=<ref> |
Diff between any two refs |
GET /api/file?path=<path>[&ref=<ref>] |
File content at a ref |
GET /api/file-log?path=<path>[&limit=N] |
Commit history for a file |
GET /api/blame?path=<path>[&ref=<ref>] |
Blame for a file |
GET /api/stash?ref=<stash-ref> |
Stash diff |
GET /api/activity[?days=N] |
Commit activity by day |
GET /api/langs |
Language statistics |
GET /api/refresh |
Re-collect all data |
GET /api/git?cmd=<git-args> |
Safe read-only git passthrough |
git-diff internally uses these git operations to collect data:
git rev-parse β detect repo root, resolve refs
git log β commit history, activity stats, file history
git show β commit detail, file content at ref
git diff β staged, unstaged, commit diffs
git status β working tree status
git blame β line-level authorship
git stash list/show β stash entries and diffs
git branch β local and remote branches
git for-each-ref β tags with metadata
git shortlog β contributor stats
git ls-tree β tracked file listing
git remote β remote URLs
git rev-list β commit counts
| Platform | Status |
|---|---|
| macOS (10.14+) | β Fully supported |
| Linux (Ubuntu, Debian, Fedora, Archβ¦) | β Fully supported |
| Windows 10/11 | β Fully supported |
| Python 3.8 β 3.13 | β Tested via CI |
# Clone the repo
git clone https://github.com/ankit-chaubey/git-diff.git
cd git-diff
# Install in editable mode
pip install -e .
# Run on itself β great for testing!
git-diffgit-diff/
βββ git_diff/
β βββ __init__.py Package metadata (version, author)
β βββ __main__.py python -m git_diff support
β βββ cli.py Argument parsing, startup banner
β βββ git_data.py All git data collection (subprocess calls)
β βββ server.py HTTP server + REST API endpoints
β βββ templates/
β βββ index.html Full single-page web app (HTML + CSS + JS)
βββ .github/
β βββ workflows/
β βββ publish.yml PyPI trusted publisher (OIDC)
β βββ ci.yml CI: test on 3 OS Γ 5 Python versions
βββ pyproject.toml PEP 517 build config
βββ README.md
βββ CHANGELOG.md
βββ LICENSE MIT
See CHANGELOG.md.
MIT Β© 2024-Persent Ankit Chaubey
Ankit Chaubey
π§ ankitchaubey.dev@gmail.com
π github.com/ankit-chaubey
Made with β€οΈ because raw git diff in terminal hurts.