┌─ [ 01 ]  ·  a desktop git client for people who live in many repos

Workspaces of repos. Worksets of work.

Two orthogonal ideas. Workspaces are durable groupings of repos — "these are Platform," "these are Payments" — the lens you use to fetch, status, and reset across a whole bucket at once. Worksets are tickets you can resume across repos, pinned to a feature branch — start, ship, archive, reset. Both run as plain git commands in the repos you already have, never inside .git.

over·git  — a client that sits over your git repos, never inside .git. Stop using it anytime; your repos behave the same in any other tool.

  • macOS
  • windows
  • linux
  • Electron · React · TypeScript
overgit

api-gateway

~/payments/api-gateway

⎇ feature/rate-limit ▾ +34 −5 3 files Fetch Pull Push ⌘P Abandon…
✦ Review with AI

changes 3

  • Amiddleware/rateLimit.ts
  • Mroutes/login.ts
  • A__tests__/rateLimit.spec.ts

committing as you <you@example.com> · system git config

feat: add rate limiter to /api/login
✦ Suggest with claude Commit 3 ⌘↵
A middleware/rateLimit.ts +22 −0
@@ new file @@+ import { bucket } from "./bucket";++ export const loginLimiter = bucket({+   cap: 10,+   per: "60s",+   key: (req) => req.ip + ":" + req.body.username,+ }); @@ routes/login.ts @@+ import { loginLimiter } from "../middleware/rateLimit";- router.post("/api/login", login);+ router.post("/api/login", loginLimiter, login);

Two stacks of grouping. Workspaces above, worksets below.

[ 02 ]  ·  inside the window

Built for the day your work spans four repos.

GitHub Desktop, Tower, and Fork are all one-repo-at-a-time. If your work spans services + shared libs + infra, you end up scripting your own "checkout feature/x everywhere" flow. Overgit fills that gap with two orthogonal ideas — workspaces for durable groupings, worksets for tickets — without ever writing inside .git.

01

Workspaces — durable groupings of repos

A workspace is an identity-bearing bucket: "these repos are Platform," "these are Payments." It's the sidebar's collapsible section and the target for bulk actions across the whole group. Permanent. A repo can live in many workspaces — small shared libs are the common case.

02

Worksets — tickets you can resume across repos

A workset is a transient unit of in-flight work: "ship the auth migration across api-gateway, billing-svc, and ledger-core this week." Bound to a feature branch. Sits above the workspace list in the sidebar, waiting for you to pick up where you left off. Archive when shipped. Reset when done.

03

Overlay, not metadata

Overgit never writes inside .git. No manifest, no .overgit folder, no synthetic root, no special config. Workspaces and worksets live in overgit's settings file, not in your repos. Stop using overgit any time and your repos behave the same in any other tool.

04

Workspace-wide actions

Fetch every repo in a workspace. Status every repo. Reset every repo to its default branch — fan-out fetch → switch → hard-reset to origin/<default> across the whole group. Workspace-wide PR list via gh pr list --json merged into one view.

05

Workset spin-up

Pick the repos the ticket touches. Sync each to its default → pull → create the feature branch — all in one workflow. Per-repo outcomes if any of them fail. Stop scripting for d in */; do git checkout ….

06

Workset archive — done means done, not gone

Shipped the ticket? Archive the workset. It vanishes from the active sidebar into a collapsed "Archived" section. The repos on disk are unchanged — overgit just stops surfacing the grouping. Reactivate any time. Three weeks later, when oncall asks "how did we ship that?", it's right there.

07

Workset reset — clean teardown

One action fans out fetch → switch back to origin/<default> → hard-reset → delete the workset's bound branch across every member. Cleans up the whole feature in one shot. Same surface as workspace reset, scoped to just the repos the workset touched.

08

Smart reset safety

Both reset flows detect repos with commits not on origin/<default> and stop before the hard-reset would erase them. You get a [force reset (lose N)] / [skip] choice per repo, with the commit count visible. Never a silent disaster.

09

Workset-wide commit & push

Type a message once, commit every dirty member, push every branch — per-repo outcomes if any of them fail. Same surface for fetch-all and "open PRs everywhere" via gh, scoped to the workset.

10

Branch picker, with brains

⌘B opens a searchable popover. Local + remote branches grouped, ↑↓/Enter, inline create-branch with optional sync-and-pull, per-branch cherry-pick with commit-list multi-select.

11

Command palette

⌘K opens a context-aware palette: switch / create branches, jump to repos, workspaces, and worksets, search files, run repo actions (stage all, fetch, pull, push, AI review).

12

AI review & suggest

Detects claude, codex, and gemini. Pipes diffs into the chosen CLI in non-interactive mode. Suggest drafts a conventional-commit message from the staged diff and drops it into the commit input.

13

Per-repo tabs & branch graph

Changes / History / Files / Graph / Stash. Multi-select with checkboxes, bulk action bar (Stage / Stash / Discard). File editor sandboxed to registered repos with hljs syntax highlighting. Per-lane colored branch graph with ref labels.

14

Keyboard first · your CLI auth

⌘K palette · ⌘B branches · ⌘N new branch · ⌘1–4 tabs · ⌘R refresh · ⌘\ sidebar · ⌘, settings. Whatever auth your claude, codex, gemini, and gh already have is the auth Overgit uses. Nothing leaves your machine via Overgit.

[ 03 ]  ·  what a workspace looks like

Group the repos once. Act on all of them.

A workspace is a durable bucket of repos you treat as one. Aggregate health at a glance — who's dirty, who's ahead, who's behind — then fetch all, status all, or reset all in a single action. Click any row to drop straight into that repo.

payments-platform workspace

4 repos in this workspace. Aggregate health below; click any row to open the repo.

Reset all Fetch all Edit Remove

1 dirty  ·  0 ahead  ·  0 behind

repo branch dirty ahead behind
api-gateway~/payments/api-gateway main 2 · ·
billing-svc~/payments/billing-svc main · · ·
ledger-core~/payments/ledger-core main · · ·
infra~/payments/infra main · · ·

one bucket · every repo · one action

[ 04 ]  ·  the workset lifecycle

Spin up. Ship. Reset everything.

A workset is a ticket pinned to a feature branch and the repos that branch touches. Create it once — overgit branches across every member in one move. Commit and push together. Open every PR with gh. When the work ships, one action fetches, switches back to origin/<default>, hard-resets every member, and deletes the bound branch — with per-repo safety checks for unmerged commits. The repos never know they're related. Overgit knows.

⎇ feature/rate-limit 4 repos · CLIs: gh
⚠ Pick up where you left off 2 of 4 repos drifted off this branch. Resume to checkout feature/rate-limit across them.
Resume
Branch2 / 4 on feature/rate-limit
Commitbranch first
Pushcommit first
Archive
repos 4 all loaded
dirty 0 all clean
ahead / behind 0 / 0 vs upstream
branch spread 2 branches 2 of 4 off feature/rate-limit

status  ·  one branch is the goal — sync the stragglers

  • api-gateway ~/payments/api-gateway feature/rate-limit
  • billing-svc ~/payments/billing-svc feature/rate-limit
  • ledger-core ~/payments/ledger-core main Sync to feature/rate-limit
  • infra ~/payments/infra main Sync to feature/rate-limit

one branch is the goal · resume the stragglers · then ship together

↺  one click later ·  Reset workset to default payments-platform · feature/rate-limit · 4 repos
  • api-gateway on main · clean fetched · switched · reset to origin/main · deleted feature/rate-limit
  • billing-svc on main · clean fetched · switched · reset to origin/main · deleted feature/rate-limit
  • ledger-core already on main nothing to reset · deleted feature/rate-limit
  • infra 2 unmerged commits hard-reset would erase 2 local commits not on origin/main · [force reset (lose 2)] · [skip]

Smart safety: any repo with commits not on origin/<default> stops and asks. The other repos still complete. You get per-repo outcomes, never a silent disaster.

[ 05 ]  ·  why overgit exists

Move across repos, own none of them.

Overgit optimizes for the day your work spans four repos at once — when juggling them by hand is the thing slowing you down. Workspaces and worksets are UI groupings, not files on disk: every action is a plain git command run in the repo's own directory, so you keep moving without inventing a meta-format that something else has to understand. If you uninstall overgit tomorrow, your repos forget it ever existed.

It's built for the realistic case — your work spans services and shared libs and infra, your teammates use whatever client they like, and the only thing the repos agree on is git. Overgit sits over the top, coordinates, and stays out of the way.

Sibling project of overcli. Written & maintained by Lionel Farr and Owen Farr. Open-source — contributors, issues, and PRs welcome.

[ 06 ]  ·  grab a build

Unsigned, honest, and real.

Overgit is in beta. Builds are unsigned — no Apple Developer ID, no SmartScreen badge. Right-click is the trust ceremony. If that bothers you, the source is right there; build it yourself.

macOS arm64 + x64 .dmg  ·  .zip ~ 120 MB [download]
Windows x64 + arm64 NSIS installer ~ 110 MB [download]
🐧 Linux x64 + arm64 .AppImage  ·  .deb ~ 130 MB [download]