gitnolo
Autonomous git for coding agents. gitnolo watches Claude Code, Kiro, Antigravity and other CLI agents across every repository on your machine. The moment an agent finishes a task, it splits the work into up to 15 focused commits, pushes a branch, opens a pull request, merges it, and files issues for problems the agent reported but did not fix.
Community edition: works on public GitHub and GitLab repositories only.
▄██ ✻ Welcome to gitnolo
▄█▀██ Autonomous git for coding agents
██ ▀█▄
▄█▀ ██▄ repo my-app on main
▄█▀ ██▄ agents 2 working · 1 waiting
▄▄ ██ ██ ▄▄▄ commits up to 15 per change
▀▀█▄▄█▀ ██▄▄█▀▀ github auto PR + merge
████▄▄ ▄▄███▀
▄█▀ ▀▀▀████▀▀▀▀ ██▄
▀▀ ███
Install
pip install gitnolo && gitnolo
Or with the installer script:
curl -fsSL https://festomanolo.com/gitnolo/install.sh | sh && gitnolo
gitnolo doctor
This needs macOS or Linux (on Windows, use WSL), Python 3.9+ and git. The installer
creates a private environment in ~/.gitnolo/app and links gitnolo into
~/.local/bin. To uninstall: rm -rf ~/.gitnolo/app ~/.local/bin/gitnolo.
GitHub access is taken from GITHUB_TOKEN, gh auth token, or the credential
git push already uses. To set a token explicitly: gitnolo config set github_token <token>.
GitLab (gitlab.com or self-hosted via GITNOLO_GITLAB_HOSTS=git.example.com) uses
GITLAB_TOKEN, glab, or gitnolo config set gitlab_token <token>.
Use
gitnolo watch -y # live dashboard; commits, PRs and merges when agents finish
gitnolo commit # do it now for the current repo
gitnolo agents --live # which agent is doing what, where
What it knows about your agents
gitnolo reads each agent's own session log, not just the process list. For every session it knows whether the agent is:
- working
- waiting for your approval
- finished
- interrupted by you
- out of usage, along with the reset time
- failing on network, server or login errors
- stuck in a loop
- closed mid-task
Commits happen only when a task has really finished, no other agent is still working in that repo, and the files have stopped changing. Work from an agent that stopped early goes to a draft PR and is never merged until the agent completes.
Commits
- Up to 15 per change. Commits are split from file groups down to individual lines, written in about a second, and verified against your files byte for byte. A small change gets fewer commits; there are never empty ones.
- Messages name what changed. Each message is a Conventional Commit naming the
functions and classes it touches, for example
feat(api): add fetchUser(). - Never touches your files. Your working tree is untouched while agents keep editing.
- Skips secrets.
.env, keys and certificates are never committed.
Terminal git client
Run gitnolo and pick with the arrow keys; no commands to remember.
gitnolo graph interactive color-coded commit graph with per-commit actions
gitnolo ops stage, commit, push, pull, switch, merge, tag, stash
gitnolo conflict side-by-side 3-way merge editor (ours | base | theirs), AI merge
gitnolo rebase reorder (space + arrows), squash, fixup, reword, drop
gitnolo explain X AI explains a commit, a file's history, or FILE:START-END
GitLens in the terminal
gitnolo blame FILE[:START-END] gitnolo history FILE[:START-END]
gitnolo graph gitnolo compare main feature/x
gitnolo branches gitnolo contributors
gitnolo hotspots gitnolo search QUERY --mode code
gitnolo show REV gitnolo timeline
gitnolo insights gitnolo stash | worktree | conflict | pr
Supervise an agent
gitnolo supervise claude
gitnolo auto-approves the agent's confirmation prompts. Destructive commands such as
rm -rf ~, force pushes and DROP TABLE are never auto-approved; it alerts you
instead.
Optional AI
gitnolo works fully offline: commit messages and issue detection are rule-based and instant. For AI-written PR summaries and issue filtering, add a free OpenRouter key:
gitnolo config set openrouter_api_key sk-or-...
gitnolo ai --test
A built-in guard stays below OpenRouter's free-tier limits and falls back to the
rules when it reaches them. A local Ollama model also works:
gitnolo config set ai_provider ollama.
Configuration
gitnolo config shows every setting, and gitnolo config set <key> <value> changes
one, for example auto_merge false or settle_seconds 5.
Made by
festomanolo · github.com/festomanolo · festomanolo.com
Notes
- Commits are written with
git fast-import: hooks do not run and commits are not signed. gitnolo watch --plainprints a line log instead of the dashboard, for running it as a background service.
MIT License · Made by Festo K. Magembe · festomanolo.com/gitnolo
Uninstall
curl -fsSL https://festomanolo.com/gitnolo/uninstall.sh | sh
Add -s -- --purge after sh to also delete settings and sign-in.
Metadata
Release files for gitnolo 0.6.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 | |
|---|---|---|---|
| gitnolo-0.6.0.tar.gz | 139.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gitnolo-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 282.0 kB
Release files / gitnolo-0.6.0.tar.gz
| Download URL | gitnolo-0.6.0.tar.gz |
|---|---|
| Size | 139.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
297775559f158fa0793a4fac06740afc34fb66f9ecd4f3ed56c538b53fcbc2d5
|
|
BLAKE2b-256 checksum How to use checksums |
ff1828b2da11a44c599bd35d517eec5ac35b7beba2aec9f6f70baf620a1aa2e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.8
|
Release files / gitnolo-0.6.0-py3-none-any.whl
| Download URL | gitnolo-0.6.0-py3-none-any.whl |
|---|---|
| Size | 142.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a4be9146265fdfdbe8c0de67537c8c90153a30142f5a4ee4912601d894df84d6
|
|
BLAKE2b-256 checksum How to use checksums |
e49e5d1257f123556bde19ceaedc235399ea81d14a126e6f06a78435132ddb47
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.8
|