Gamr
Git-aware Agent Monitor & Review — a TUI for reviewing AI agent work with live watching, fuzzy search, and diff preview.
Features
- Live file watching — tree updates automatically when files change (watchdog + polling fallback)
- Git integration — pure Python via Dulwich, no git binary required
- File status indicators (Modified, Added, Deleted, Untracked, Staged)
- Deleted files shown with strikethrough styling
- Three diff modes: full file diff, gutter markers, unified diff (
d/Dto cycle) - Blame data (last author, last modified) loaded in background
- Bulk blame via single log walk with tree diffing (fast on large repos)
- Worktree support (linked worktrees and bare-repo layouts)
- Respects
.gitignorerules
- Three view modes — tree, flat filenames, flat relative paths (
vto cycle) - Column sorting — click any column header to sort asc/desc/none
- Fuzzy search — fzf-like filename filtering with RapidFuzz
- Git status filtering —
gto toggle showing only modified files - Syntax-highlighted preview — Monokai theme, scrollable, line numbers
- Copy file references — double-click or drag lines to copy
path:lineto clipboard - Full file diff — syntax highlighting with inline +/- markers and colored backgrounds
- Side-by-side diff — modal popup (
s) showing old/new files aligned with syntax highlighting, character-level change highlighting, and live refresh - Diff overview bar — 1-column change map with 4 density modes (
oto cycle: line, quadrant, sextant, braille) - Gradient colors — size, modification time, and git blame time columns colored by relative magnitude
- File icons — loads from
~/.config/lsd/icons.yamlif present - Resizable split pane — drag the divider between tree and preview
- Desktop-style navigation — ←/→ to collapse/expand folders, ← on file collapses parent
- State persistence — view mode, columns, collapsed dirs, selection, filters saved between sessions
- Preferences file —
~/.config/gamr/preferences.tomlfor user defaults (e.g., diff mode cycle) - Graceful degradation — works on non-git directories (hides git UI)
- Keyboard shortcuts help —
?shows all keybindings in a popup - Toolbar status indicators — clickable view mode, diff mode, overview, follow, blame, file count
Install
Requires Python 3.11+.
uv sync
uv run gamr [path]
Keybindings
| Key | Action |
|---|---|
↑/↓ |
Navigate files |
j/k |
Navigate files (tree) or scroll (preview) |
→ |
Expand directory |
← |
Collapse directory (or parent if on file) |
space |
Toggle expand/collapse (tree) or page down (preview) |
v |
Cycle view mode (tree → flat name → flat path) |
V |
Cycle view mode reverse |
d |
Cycle diff mode (full → gutter → unified) |
D |
Cycle diff mode reverse |
s |
Side-by-side diff popup |
J/n |
Jump to next diff hunk (preview) |
K/N |
Jump to previous diff hunk (preview) |
o |
Cycle diff overview style |
g |
Toggle git modified filter |
f |
Toggle follow mode (auto-select last changed file) |
ctrl+f |
Focus search input |
b |
Toggle blame columns (last author, git time) |
1–7 |
Toggle individual columns |
O |
Open file in default app |
tab |
Switch focus between tree and preview |
ctrl+p |
Command palette (spaced paths, gradient toggle) |
? |
Show keyboard shortcuts help |
q |
Quit (saves state) |
Column headers are clickable to sort (ascending → descending → none).
Architecture
src/gamr/
├── app.py # Textual app, keybindings, orchestration
├── commands.py # Command palette provider
├── models.py # FileEntry, GitStatus, DiffMode, etc.
├── state.py # Persistent state management
├── preferences.py # User preferences (~/.config/gamr/preferences.toml)
├── preview.py # PreviewController — preview orchestration and scroll state
├── gamr.tcss # Stylesheet
├── services/
│ ├── diff_parser.py # Unified diff parsing into DiffData
│ ├── file_scanner.py # Watchdog + polling fallback + git state watcher
│ ├── file_index.py # Merges scanner + git into FileEntry list
│ ├── git_provider.py # GitProvider ABC + Dulwich implementation
│ ├── filter.py # Fuzzy and status filtering
│ └── icons.py # lsd icons.yaml loader
└── widgets/
├── file_tree_table.py # DataTable with tree semantics
├── tree_data.py # Tree building and sorting logic
├── toolbar.py # Toolbar (logo + search input)
├── preview_pane.py # Syntax highlighting + diff view
├── side_by_side.py # Side-by-side diff modal
├── help.py # Keyboard shortcuts help modal
└── split.py # Resizable horizontal split
Dependencies
- Textual — TUI framework
- Dulwich — pure Python git (no compiled deps)
- watchdog — filesystem events
- RapidFuzz — fuzzy string matching
Tests
uv run pytest
Documentation
- UI Design Rules — all interaction behaviors and edge cases
- Architecture Decision Records — 29 ADRs covering all design choices
Metadata
Release files for gamr 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| gamr-0.4.0.tar.gz | 7.6 MB | Without provenance | Details for gamr-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| gamr-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for gamr-0.4.0-py3-none-any.whl |
Total release size: 7.7 MB
Release files / gamr-0.4.0.tar.gz
| Download URL | gamr-0.4.0.tar.gz |
|---|---|
| Size | 7.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
703dda11b1a251f891018a0270171b6ab4d64097897c0178375886c0e694d07c
|
|
BLAKE2b-256 checksum How to use checksums |
4cea6610421e7f4d5036f9dd851812bff096e7266ec54d1948ca1e64733bc7ea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / gamr-0.4.0-py3-none-any.whl
| Download URL | gamr-0.4.0-py3-none-any.whl |
|---|---|
| Size | 76.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c963afb136cdd7fb22eecbf21533c61a3d8fdf4250756550fefe681ca39807f3
|
|
BLAKE2b-256 checksum How to use checksums |
742acb7b42872d75717478b3c6d054724d36f05d5bce2941c459b31d3ae33b54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for gamr 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.