
One TUI. Every forge. Full review.¶
A terminal-native code review inbox for developers who work across GitHub and GitLab.
Your team uses GitHub. Another uses GitLab. You live in the terminal. tongs gives you a single review inbox across forges, with syntax-highlighted diffs and inline comments, right where you already work.
lazygit is great for git operations. tongs picks up where it stops -- at code review.
Multi-forge inbox¶
GitHub PRs and GitLab MRs in one view, auto-detected from your git remotes. Three tabs let you triage everything you need to review.
Inbox ─────────────────────────────────────────────────────────
[My Reviews] My MRs All Open
GL platform/auth-service !482 Fix OAuth token refresh ● CI passed 3 comments
GH andre-motta/tongs #127 Add pipeline retry action ● CI passed 1 comment
GL platform/api-gateway !901 Rate limiter middleware ◌ CI running 0 comments
GH infra/helm-charts #44 Bump ingress controller ● CI passed 5 comments
GL ml/training-pipeline !223 Fix GPU memory leak ✗ CI failed 2 comments
Zero configuration. tongs scans ~/git, reads your git remotes, and populates
the inbox. Auth tokens come from your existing gh and glab CLI logins.
# ~/.config/tongs/config.toml (optional -- defaults work out of the box)
[general]
scan_root = "~/git"
scan_depth = 5
Real diffs in the terminal¶
Split-pane viewer with a file tree, syntax highlighting across 500+ languages, and word-level diff highlighting that shows exactly what changed.
Diff ──────────────────────────────────────────────────────────
src/
├─ M auth.py │ @@ -42,7 +42,9 @@ def validate_token(token: str):
├─ M config.py │ if token.expired:
├─ A middleware.py │ - return None
└─ D legacy.py │ + logger.warning("Token expired for %s", token.sub)
│ + raise TokenExpiredError(token.sub)
│ +
│ claims = decode_jwt(token.raw)
│ return claims
Context folding collapses unchanged sections. Markdown files get a rendered preview toggle with M.
Inline comments and suggestions¶
Select lines, write comments, and post suggested changes without leaving the terminal.
Comment ───────────────────────────────────────────────────────
src/auth.py:44
> This should also revoke the refresh token to prevent reuse.
> Consider calling `revoke_refresh(token.jti)` here.
[Ctrl+S] Submit [F2] External editor [F3] Suggest change [Esc] Cancel
Discussion threads render inline in the diff gutter. Reply and resolve from the
keyboard. Suggested changes open your $EDITOR with the selected code -- edit
it, and tongs posts a suggestion block using the forge's native syntax.
Pipeline drill-down¶
Browse pipelines, drill into jobs grouped by stage, read full ANSI-rendered logs. Cancel or retry directly from the TUI.
Pipeline #18204 ── passed ─────────────────────────────────────
Stage: build
● build-linux passed 2m 14s
● build-macos passed 3m 01s
Stage: test
● unit-tests passed 1m 42s
● integration passed 4m 33s
Stage: deploy
◌ staging running 0m 45s
[Enter] View log [R] Retry [C] Cancel [o] Open in browser
Built for the keyboard¶
Every action is reachable from the keyboard. A few highlights:
| Key | Action |
|---|---|
| Ctrl+P | Command palette (fuzzy search across all actions) |
| 1 - 5 | Switch MR detail tabs |
| C | Comment on current line or selection |
| F3 | Suggest changes (opens $EDITOR) |
| A+Shift | Approve (double-press to confirm) |
| M+Shift | Merge (double-press to confirm) |
| J / K | Navigate everywhere |
Extensible by design¶
tongs has a plugin system based on Python entry points. Install a plugin package and it shows up in the command palette automatically. The built-in MCP server is itself a plugin, so AI assistants can query your merge requests without any extra wiring.
Disable or enable plugins in your config:
[plugins.mcp]
enabled = false
tongs is for you if¶
- You review code across both GitHub and GitLab
- You want diffs, inline comments, and approvals in your terminal
- You manage many repos and want a single inbox
- You prefer keyboard-driven workflows over browser tabs
Comparison¶
| Feature | tongs | gh-dash | GitHub/GitLab web |
|---|---|---|---|
| GitHub + GitLab | Yes | GitHub only | One at a time |
| Terminal-native diffs | Yes | No | No |
| Inline comments | Yes | No | Yes |
| Discussion threads | Yes | No | Yes |
| Suggested changes | Yes | No | Yes |
| Pipeline / CI drill-down | Yes | No | Yes |
| Approve / Merge | Yes | No | Yes |
| Command palette | Yes | No | N/A |
| Plugin system | Yes | No | No |
| MCP server (AI integration) | Yes | No | No |
| Rate limit auto-retry | Yes | No | N/A |
| Zero config auth | Yes | Yes | N/A |
| Self-hosted forges | Yes | Yes | N/A |
PyPI -- GitHub -- License (MIT)