Git Assistant
A system-tray Git assistant for Windows. It writes commit messages, reviews
staged files, audits repositories and answers to an MCP client — using whichever
model you point it at, local or hosted.
Python 3.13, PyQt6, uv. Nothing leaves the machine unless you configure a
hosted provider, and no key is ever written to a settings file.
uv sync
uv run git-assistant
The tray icon opens the window. Its right-click menu is three items — Git
Assistant, About, Exit — because everything else belongs in the window.
Every tab that acts on a repository picks one from the same list: Recently
Used at the top, most recent first, and All below it in alphabetical order
with each repository's submodules folded away until you open them. A repository you
have just used appears in both — All means all, so nothing ever moves out of the
place you expect to find it.
Above the tabs, on every one of them, sits the bar that says what the active
repository is configured with: Commit as (the identity the next commit will
carry), Active Settings (which of the three settings files is in force) and
Active Repository (which repository, and which branch, the tabs work on).
Top right is the theme picker: follow the system, light, dark, or pink.
What it does, tab by tab
Clone & Create
| |
|---|
| Clone | A URL or a folder, where to put it, and how much history: by default a shallow copy holding the latest commit of every branch, or deeper, or all of it. Git's progress shows as it works; Cancel stops it and removes what was downloaded. |
| Create | A new repository in a folder of your choosing, starting on the branch you name. |
| Starter files | An empty README.md; a .gitignore for the languages you tick — the same list as Code Review, from GitHub's gitignore collection; a .gitattributes saying which files get LF, CRLF or native line endings; an MIT or Apache 2.0 LICENSE. Each is previewed before it is written, into a new repository or the one selected. |
A repository cloned or created here joins the list and is selected. Nothing
already in a repository is overwritten without asking: a README never, a license
only when you confirm, and .gitignore and .gitattributes are added to rather
than rewritten. Nothing is staged or committed.
Commit
| |
|---|
| History | The repository's commits as a graph, as Git Extensions draws them: branches, remote branches and tags labelled on their commits, the author's initials, how long ago, the hash. Above them, what is not committed yet — the working directory and the index — drawn down to HEAD. Select a commit for its whole message, its parents and children to click through, and the branches and tags it is part of; the author's other commits are highlighted. All branches off shows the checked-out branch alone. |
| Generate | Writes a Conventional Commits message for what is staged. Prices the run and asks before spending anything. The message and its template sit under the diff sent to the model. |
| Copy / Commit / Push | Take the message, commit with it, publish it. The message is editable first. |
| Prompt template | Which of your named templates this repository is described with. |
| AI Provider | Which backend answers, switchable without leaving the tab. |
| Staged files | Every file in the prompt, and a Why column saying what happened to each — ignored: *.pdf, binary, too large, fully sent. Select one to see its diff, with anything the model did not see marked in red. Right-click a file the noise filter dropped to send it anyway — its first 200 lines, remembered for this repository. |
| View LLM calls | The exact prompt sent and the exact reply, per call — including every call of a map-reduce run. |
| Previous runs | Messages already generated for this repository, newest first, pinnable, reopenable. |
More: commit messages · large diffs
Branches & Tags
| |
|---|
| New Branch | The name exactly as typed. Slashes are kept, so feature/login is one branch. |
| New Branch from patterns | A naming convention — dev/rem/{user}/{name} and friends — with the full name shown before it is created. {user} comes from your saved identities. |
| Create branch | Creates it from the current commit and switches to it. Refuses names git would, and says which existing branch is in the way. |
| Switch / Push / Delete | On the selected branch. A delete git refuses has to be confirmed before it is forced. |
| Fetch | With this repository's own depth, prune and tag settings. |
| New version | Proposes the next tag — major, minor, patch or custom — from the tags already there. |
| Create tag / Push tag / Delete tag | Annotated when you give it a message, lightweight when you do not. |
More: branches and tags
Compare
| |
|---|
| Repository / Compare with | The active repository on the left, and any other on the list on the right. Choosing what to compare with changes nothing else. |
| Submodules | Every submodule of either repository, nested ones too, in a row beside the same one on the other side: its commit, the tag on that commit, when it was committed, and its message. Paired by path — or by where they are fetched from, when two projects keep a library in different places. |
| Compare | The commits checked out, or the ones each repository's HEAD records. A submodule checked out somewhere other than what is recorded shows both. |
| Only differences | Hides the submodules both sides have at the same commit. Right-click a row to copy its commit hash. |
Audit
Four read-only audits of the selected repository. Git measures; the provider
writes the prose, and any figure it invents is rejected before the report shows.
| |
|---|
| Size | Where the .git bytes went, what is reclaimable without rewriting history, and which paths dominate every version ever committed. |
| Configuration | What the repository carries with it: LFS coverage, line endings decided in .gitattributes rather than per machine, and a dozen more. |
| Consistency | Branches nobody has touched for months, and which of them are safe to delete. |
| Metrics | Lines in everything the repository tracks, by file type. .gitignore is respected and binaries are skipped. |
| Run | Runs everything ticked, side by side, never exceeding the provider's parallel limit. |
| Compare | What changed between two recorded runs — which checks were fixed or regressed, which measurements moved. |
| Previous runs | Every run, stamped with the commit it describes. |
More: audits
Code Review
| |
|---|
| Review | Checks the marked files against the rules for their language. One call per file, run in parallel. |
| Rules profile | Which rules apply to which language at which version. Remembered per repository. |
| Mark all / Mark none | Everything staged starts marked; unmark what you do not want checked. |
| A window before it runs | Every marked file with its language, its version and the rules that will be checked, beside the token estimate. |
| Profiles tab | Edit a profile: a row per language, a version dropdown, and the rule sets it draws on. Tick a whole set, or individual rules within it. |
| New… / Delete | Start a profile of your own, copied from the one open, or remove one. Default Rules is read-only and cannot be deleted — it is generated from the shipped rules, so copy it and edit the copy. |
| Add / Remove rule set | A language can be checked against several sets at once — its own shipped rules, another language's, and any table of yours. |
| Rule Sets tab | Every set there is: the built-in one per language, and your own imported tables. Shows each rule and, for the built-in ones, the language versions it applies to. |
| Languages tab | The languages a review recognises, the file types that reach each, and how many built-in rules apply at each version. |
| Use LLM-as-a-Judge | Off by default. Has a second, stronger model score the reviewer's answers out of 10 — shown the exact prompt each file was reviewed with and the exact answer that came back. Roughly doubles the calls. |
| Leaderboard tab | Which models are actually any good at reviewing, and how long they take — mean score out of 10 and time per file, per reviewed model and judge. Scores from different judges are kept apart, because they are not the same measurement. |
| Share with the repository | Writes the profile into the working tree so whoever clones it is reviewed against the same standard. |
| Import / Export spreadsheet | .xlsx in and out — the header is looked for rather than assumed. |
| Import / Export JSON | Move tables between machines. An import never overwrites a table you already have. |
| Open rules folder, Reset to shipped | The per-language rule files are yours to edit; Reset puts the ones this build shipped with back. |
| Previous reviews | Every run per repository. A stored review still reads after its rules are edited or deleted. |
More: code review
Connection & Model
| |
|---|
| Providers | LM Studio, Claude, OpenAI, Azure AI Foundry, Litellm Proxy, Ollama, Lemonade Server, and two agent CLIs. The form reshapes around the one selected. |
| API key | Stored in the Windows Credential Manager, never in a settings file. The field says whether one is stored, never what it is. |
| Test connection & list models | One round trip, and the model list from it. |
| Model / Temperature | Kept per provider and per model. |
| Code Review Judge | Which model scores a code review, with its own model and temperature — the reviewer is usually something small and local, the judge the opposite. |
| Context window / Parallel requests | What a run may use, with the resulting split shown live. |
| Set up LM Studio for me… | Installs LM Studio, turns on its server, downloads a model and configures it. Names every step first and skips what is already done. |
| Usage | Lifetime totals per provider, per model and per feature, and the last few hundred calls behind them. |
More: providers
Repositories & Settings
| |
|---|
| Add repo… | One repository. |
| Add folder (scan for repos)… | Every repository under a folder, submodules nested under their parent. |
| Auto-watch | Tick a scanned folder and newly cloned repositories are added on their own. |
| Rescan / Remove selected | Keep the list honest. |
| Mark added repositories as safe | Adding a folder lists it in git's safe.directory — one D:/folder/* line for everything in it — and adding a repository lists it and its submodules. Git then works in repositories another account owns, such as on a drive two machines share. On by default. |
| Mark listed repos as safe… | The same lines for everything already listed, shown before they are written. |
| Editing | Which of the three settings files to show — not which one applies. |
| Create / Save / Reload / Reset / Remove | Edit the file in place, with the JSON coloured. Saving your changes forks them to your own copy rather than editing a file a team shares. |
| Compare & merge… | Any two settings files side by side, key by key, taking either. |
More: settings files
Identities
| |
|---|
| Add / Remove selected | The identities you commit as: name, email, optional signing key. |
| Import… / Export… | The list is its own file, made to be carried between machines. |
| Commit as (above the tabs) | Switches the active repository's identity, and says whether it is set here or inherited. |
More: identities
MCP Server
Offers the repositories, audits and commit-message generation to an MCP client
over stdio.
| |
|---|
| Test server | Starts it and reports what it answered. |
| Register / Remove | Claude Desktop, Claude Code, VS Code's GitHub Copilot, Antigravity. Each is a merge that leaves every other setting alone. |
| Copy command / Copy JSON | For a client that is not on the list. |
| Allow write operations | Off by default. The flag lives in the registered command, not in a file the server re-reads. |
More: MCP server, including the tool list.
Template
| |
|---|
| New / Duplicate / Rename / Delete | Your named prompt templates. Each repository picks one. |
| Default | The prompt that is always offered, whatever a repository ships. |
| Reset to default text | Back to the prompt this build ships with. |
| Import… / Export… | JSON, one template or many. |
More: commit messages
Advanced
| |
|---|
| Diff source | Staged changes, or everything uncommitted. |
| Output reserve | How much of the context window is kept for the answer. |
| Subject / body limits | Reported, not enforced. |
| Ignore globs | Files that never reach the model. Always obeyed; the exceptions are made one file at a time, by right-clicking it in Staged files. |
| Lines per un-ignored file | How much of such a file is sent once you have asked for it. 200, which for a document is the title and the table of contents. 0 for all of it. |
| Langfuse | Send every call to your own instance, prompt and reply included. Off by default. |
| Shipped settings | Check the factory copy against its checksum, and restore from it. |
| Update source | A readout: where updates come from and why they are or are not available. |
More: tracing · settings files
Documentation
| |
|---|
| Install and update | Running it, first-time setup, how updates work |
| Providers | Every backend, API keys, agent CLIs, temperature, usage |
| Commit messages | Templates, length rules, what happens when one comes back too long |
| Large diffs | What happens when a diff does not fit the context window |
| Branches and tags | Naming patterns, what git will accept, fetching, versioning |
| Audits | What each audit measures and how runs are compared |
| Code review | Rules, profiles, versions, sharing a standard |
| Identities | Committer identities, signing keys, and why pushing is not committing |
| Settings files | The three files, what is in each, and how to edit them |
| MCP server | Tools, registration, and the write gate |
| Tracing | Langfuse |
| Building | Distributables, why there is no autostart, antivirus |
| Development | Working on it |
Licence
See LICENSE.