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
- 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
- Diff overview bar — 1-column change map with 4 density modes (
oto cycle: line, quadrant, sextant, braille) - Gradient colors — size and modification 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)
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) |
d |
Cycle diff mode (full → gutter → unified) |
D |
Cycle diff mode reverse |
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–6 |
Toggle individual columns |
tab |
Switch focus between tree and preview |
ctrl+p |
Command palette (spaced paths, gradient toggle) |
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)
├── 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
└── 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 — 23 ADRs covering all design choices
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
gamr-0.1.11.tar.gz
(193.9 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
gamr-0.1.11-py3-none-any.whl
(48.3 kB
view details)
File details
Details for the file gamr-0.1.11.tar.gz.
File metadata
- Download URL: gamr-0.1.11.tar.gz
- Upload date:
- Size: 193.9 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9f3c235b91149cf64985529f698a401498d991b594f73566f6e53154681675b
|
|
| MD5 |
d2c12657b296f1917bdd8e4c2d4172b7
|
|
| BLAKE2b-256 |
abc48ea04f3b8e9d27da4dca121e575e19d18af16ffafc24f348624b13396cca
|
File details
Details for the file gamr-0.1.11-py3-none-any.whl.
File metadata
- Download URL: gamr-0.1.11-py3-none-any.whl
- Upload date:
- Size: 48.3 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1077683b85491ae0ae0cb403bfdde493fb13df581a1bc24e69944de9267500e1
|
|
| MD5 |
77acd4ddb1fd903a9a4a91e68f4c27bc
|
|
| BLAKE2b-256 |
969b1dd05d8d68183e65679eff6e54f55aa3f98e3b5d78e1a21eea387db3e66a
|