macOS desktop application to manage your Git repositories with a modern interface and powerful tools.
git-manager is a desktop application built with Tauri v2 + React (Vite), offering:
- π² Git Tree visualizer β interactive multi-branch commit graph
- π€ Commit generation β AI-written commit messages, local-first (Ollama) or via a configured provider
- π Rollback / Revert β safe undo with preview
- π§ Fixup & Autosquash β guided history cleanup
- πΏ Worktree management β visual multi-worktree management
- β»οΈ Interactive rebase β drag & drop actions
- π¦ Stash β stash management with messages
- π i18n β interface in French and English
- π Local-first β no telemetry; the only outbound calls are to the AI provider you configure and to GitHub
| Layer | Technology |
|---|---|
| Desktop runtime | Tauri v2 |
| Frontend | React 18 + Vite + TypeScript |
| UI Components | shadcn/ui + Tailwind CSS |
| Backend | Rust + git2 crate (libgit2) |
| State management | Zustand |
| Internationalization | react-i18next (FR / EN) |
| LLM (AI commit) | Ollama, or any OpenAI-compatible server |
| Remote auth | SSH + HTTPS (token) |
| Monorepo | pnpm workspaces + Turborepo |
git-manager/
βββ apps/
β βββ desktop/ # Main Tauri application
β β βββ src-tauri/ # Rust backend
β β β βββ src/
β β β βββ commands/ # Thin Tauri IPC commands, one file per domain
β β β β # (repo, log, branch, commit, remote, stash, rollback,
β β β β # fixup, rebase, interactive_rebase, cherry_pick, bisect,
β β β β # blame, conflict, patch, worktree, submodule, undo,
β β β β # github, pr_template, ai, agent, tasks, terminal,
β β β β # activity_log, ssh, themes)
β β β βββ services/ # git2 business logic, called from commands/
β β β β # (git_diff, git_commit, git_repo, git_graph, β¦)
β β β βββ error.rs # Unified AppError β JSON string
β β β βββ models.rs # serde structs mirroring TypeScript types
β β β βββ utils.rs # Shared helpers (short_oid, get_git_signature)
β β β βββ state.rs # AppState (open repos, cancellation flag)
β β β βββ lib.rs # Builder + invoke_handler registration
β β βββ src/ # React frontend
β β βββ app/ # Pages (dashboard, repo, settings, pull-requests)
β β βββ components/ # Feature components, render-only (logic lives in hooks/)
β β βββ hooks/ # Business-logic + data-fetching hooks (SWR + legacy React Query)
β β βββ api/ # api/*.api.ts β domain-grouped service layer over lib/tauri.ts
β β βββ lib/ # tauri.ts (typed invoke wrappers), appEventBus.ts
β β βββ stores/ # Zustand stores (repoUI, repoData, settings, undoHistory, game)
β βββ landing-page/ # Public landing page (Vite), deployed to GitHub Pages
β βββ docs/ # Documentation site (VitePress), one page per @doc scenario
β βββ e2e/ # WebdriverIO + Cucumber e2e suite (drives the real app)
βββ packages/
β βββ git-types/ # Shared TypeScript interfaces (DTOs)
β βββ ai/ # AI presets, providers and per-feature descriptors
β βββ mascot/ # Octopus mascot as a shared <git-mascot> web component
β βββ i18n/ # react-i18next setup + EN/FR locale files
β βββ ui/ # shadcn/ui base components
β βββ components/ # Shared presentational React components
β βββ editor/ # Monaco integration: diff/merge + single-pane editors
β βββ theme/ # Design tokens + APCA contrast gates
β βββ storybook-a11y/ # Shared Storybook accessibility setup
β βββ config/ # Shared Oxlint + Tailwind + tsconfig
βββ tools/
β βββ git-fixtures/ # Scripted fixture repos (dev tabs + e2e scenarios)
βββ docs/
β βββ README.md # This file
β βββ screenshots/ # Auto-captured app screenshots (e2e @screenshots)
β βββ ai/ # The AI system: one page per feature + a shared overview
β βββ architecture/ # Architecture refactor plans, audits + execution tracking
β βββ integrations/ # Third-party setup (GitHub OAuth app + scopes)
β βββ docs-site/ # Plans for the documentation site itself (apps/docs)
βββ CLAUDE.md # Architecture/IPC conventions β authoritative
βββ package.json # Root package (global scripts)
βββ pnpm-workspace.yaml
βββ turbo.json
- macOS 13+ (Ventura minimum recommended)
- Node.js 20+
- pnpm 9+
- Rust 1.77+ (
rustup install stable) - Tauri CLI v2 (
cargo install tauri-cli) - An AI provider (optional, only for the AI features) β Ollama running locally is the default; see "AI provider configuration" below
# Clone the repository
git clone https://github.com/Tlahey/git-manager.git
cd git-manager
# Install dependencies
pnpm install
# Run in development (launches the native desktop application)
pnpm dev
# Build the application (generates the desktop binary)
pnpm buildImportant
The application relies on a Rust backend via Tauri and therefore cannot be launched in a regular web browser. The pnpm dev command will launch the desktop application window directly.
AI features (commit message, file grouping, PR description, branch/change explanation, daily summary β see the AI docs) are optional. The default provider is a
local Ollama at http://localhost:11434. The only other entry is a generic OpenAI-compatible
preset you point at any server speaking the OpenAI API (LM Studio, vLLM, MLX, OpenAI itselfβ¦) β
see AI_PRESETS in packages/ai. Provider, URL, API key, model
and timeout are configured in Settings β AI; the model list is read from the provider's
/v1/models endpoint when the URL is validated. Temperature and prompts are not configurable β
they are owned per feature inside packages/ai.
The app checks the provider at startup. If AI is enabled but nothing answers, a warning banner appears under the tab bar (and a status pill in the footer); clicking either opens Settings β AI.
To use the local default:
# Install and start Ollama
brew install ollama
ollama serve
# Download a model (recommended)
ollama pull llama3.2
# or for commits only
ollama pull qwen2.5-coder:7b| Document | Description |
|---|---|
| CLAUDE.md | Authoritative architecture, IPC boundary and layering rules |
| Documentation site | The user-facing manual β one page per feature, generated from the @doc e2e scenarios |
| Issue tracker | Remaining work. There is no roadmap file: see the note below |
| AI system | How every AI feature works β shared runtime + one page per feature |
| Architecture refactors | Five refactor audits and their execution records (July 2026) β all complete |
| GitHub OAuth | The OAuth app, device flow and token scopes behind the GitHub integration |
| Doc site content plan | Which page of the documentation site comes next, and the scenario that proves it |
A document that nothing forces to change with the code stops being true. Every entry above has a forcing function: the doc site is regenerated from the e2e scenarios, CLAUDE.md is what a PR is reviewed against, the refactor records describe work that is finished and cannot drift. Three things were removed on 2026-07-31 for failing that test:
ROADMAP.mdβ an inventory of what had shipped. Its last revision claimed 133 Tauri commands when there were 157, credited fetch/pull/push with an HTTPS auth path that was never wired, and listed as "not started" a feature that had partly shipped. Its open items became issues #234β#237.specs/archive/β the original 2026-07-03 per-feature design docs, written before the features existed and never updated. Six warnings scattered across the docs existed purely to tell readers not to trust them.specs/β two accurate specs describing invariants worth protecting. They went because their content belonged one level down: the module doc comment is the copy you cannot refactor past without reading.auto-fetch.mdwas already reproduced almost verbatim inuseAutoFetch.ts's own header; what onlygraph-column-layout.mdcarried moved intobuild_graph_nodesanduseGitGraphNodes.
Where invariant-shaped rationale goes now: the module doc comment, beside the code it protects β as
git_rebase.rs,ai_provider.rsandai_commit_scan.rsalready do. If an invariant spans layers, state it once where it is enforced and point at that from the other side.
Everything removed stays in git history: git show 9381c80:docs/ROADMAP.md,
git show 9381c80:docs/specs/ to list the specs.
MIT