Repository navigation
Releases
git-cowork 0.6.0
Added
- Workspaces: keep a set of repositories together and see them as a tree
(folders › repositories › worktrees) on the left of a tab. Clicking a
repository or worktree shows it in that same tab, so one tab can hold a
whole project. Each tab can show its own workspace, and the next launch
reopens it with the repository that was shown. - File › Scan Folder… (⌥⌘O) finds the git repositories in a folder and makes a
workspace of them. It looks one folder level deep by default; change the
default in Settings › Workspaces, or the depth for one scan in its sheet.
Scan Folder Again adds repositories that appeared since. - File › Open Workspace, a Workspaces list on the welcome screen, and
View › Show/Hide Workspace (⌃⌘P). - The workspace tree shows, next to each repository and worktree, its
uncommitted changes and commits to push (↑) and pull (↓), like the
worktrees in the sidebar. - Pull a branch from its menu in the graph, also one that isn't checked out:
right-click its badge (or the remote branch's badge further up) and choose
"Pull ". The branch moves up to its remote branch without a
checkout, so your working copy isn't touched. When both have new commits it
offers to check the branch out, where you pick merge or rebase. The same
"Pull" is in the sidebar's branch menu.
Changed
- The sidebar, the inspector and the workspace tree keep the widths you drag
them to: in every tab, at the next launch, and when a workspace tab shows
another repository. - A window showing a repository is at least as wide as its panels need
together, so the commit list in the middle always keeps its room. In a
narrow window a workspace's tree gives way first. - The reset entry in a commit's menu reads like GitKraken's: "Reset
to this commit", with Soft (keep all changes), Mixed (keep working copy but
reset index) and Hard (discard all changes). - Much less work while files keep changing. Files git ignores (build output,
dependencies, logs) no longer make the app read the repository: a build used
to start git several times a second for as long as it ran, now it starts it
once. While an agent or a script keeps editing tracked files, changes show
about once a second instead of after every write, and less often when the
app or the tab is in the background. A single save still shows right away. - The history no longer reloads all its rows each time the number of changed
files changes, only the "// WIP" row is redrawn. A branch list you were
hovering over stays open while files change.
Fixed
- The count on Pull, Push and the inbox bell showed "…" from 10 on. It now
shows "9+"; the exact number is in the tooltip. - A window on a worktree that lives inside the main repository's folder (such
as.claude/worktrees/…) didn't notice changes to its own files until you
switched back to the app. - The app's background
git statuscould make a commit orgit addrunning
at the same moment (in a terminal, by an agent) fail with "Unable to create
index.lock". It no longer takes that lock. - A push the server declined for another reason than branch protection (a
GitLab push rule such as signed commits, a GitHub ruleset, a pre-receive
hook) was reported as " is protected on the server". It now says
the server refused the push and shows the server's own reason.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.5.4
Added
- In a linked worktree, a small ✕ before the worktree name in the toolbar
leaves it and switches the tab back to the main worktree (like GitKraken). - A branch checked out in a linked worktree shows a worktree icon in its
history badge, next to the checked-out, local and remote icons.
Changed
- A tab that stays behind another tab for five minutes takes down its views,
which are most of a tab's memory. The repository stays loaded, so fetching,
watching and notifications go on, and a commit message you were writing, the
selection and the filter are kept. Selecting the tab shows it again at once.
With ten tabs open the app needs about a third less memory when idle.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.5.3
Added
- Drag a repository tab sideways to move it. The other tabs step aside while
you drag, the tab you are on stays selected, and the next launch reopens the
tabs in the new order.
Changed
- Dragging a tab no longer moves the window; drag the empty space next to the
tabs for that. A tab in a window in the background reacts to the first click. - At launch the tab that was in front opens first and right away; the other
repositories join as tabs behind it, in their order, without windows
popping up one after another. A background tab loads its repository when you
first select it, so a launch with many tabs no longer loads all of them at
once and the app stays responsive. - A worktree's tab shows the repository name in full and cuts the worktree
folder first.
Fixed
- The app no longer stops running git commands after a while. With many
commands at once (many repositories loading at launch), every worker thread
ended up waiting for another one, so from then on actions never finished,
deleting a remote branch waited forever and quitting hung. Each command now
waits on a thread of its own. - Commands that talk to a server can't hang forever: an HTTPS transfer that
stalls for a minute fails, and fetch, pull and push stop after 10 minutes
(ls-remote after 1). Clone has no limit. - Push on a branch that follows a remote branch with another name (git
refused with "The upstream branch of your current branch does not match")
asks where to push: to that remote branch, or to a new one of the same name
that the branch follows from now on. - The list that expands from a row's branch badges covers the row's "+N", so
it no longer peeks out next to it.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.5.2
Added
- The repositories open when git-cowork quits open again at the next launch,
as tabs in the same order with the same one in front. It no longer depends
on macOS's "Close windows when quitting an app" setting. Turn it off in
Settings › Reopen repositories at launch. Folders passed on the command line
open after them, in front. - Click a stash in the sidebar to see what's in it: its message, when and on
which branch it was made, and its files, including the new (untracked) ones
it took along. Click a file for its diff. Pop, Apply and Delete are in the
panel too. - The search field finds commits by content, across every branch and the whole
history, not only the commits that are loaded:file:namefor commits that
changed a file whose path contains the text,change:textfor commits that
added or removed that text (git log -S). Both ignore case, take quotes for
values with spaces (change:"old name"), and combine with plain words. - When a search finds nothing, the list says so, and what the search looked at.
- Ignore for new files in Changes: right-click a file to ignore it, every file
of its type, or its folder. Right-click a folder or several files to ignore
those. It adds lines to.gitignore(creating it if needed), which then
shows under Changes like any other edit. - Remotes can be managed in the sidebar: + on Remote adds another one (a fork,
the repository you forked from) and fetches it. Right-click a remote to
fetch just that one, rename it, change its URL, copy the URL, open it on its
host, or remove it. Removing asks first and says how many local branches
follow it.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.5.1
Added
- Discarding changes can be undone: Edit > Undo (⌘Z) brings them back,
including new and deleted files, while staged changes stay untouched.
A snapshot is saved before discarding; nothing is added to the stash list.
Once those files are edited again, Undo refuses instead of overwriting the
new edits. - A short "Committed · Undo" hint after anything Edit > Undo can take back
(commit, amend, reset, checkout, branch delete, discard). - Reverting or cherry-picking a merge commit asks once and uses the side it
was merged into (-m 1), instead of git's "is a merge but no -m option".
Changed
- The search field in the toolbar searches what the window shows: commits in
History, tasks on the Board, reviews in Reviews (by title, branch or ID).
The Board's second search field is gone. - The commit message in the commit panel is plain text instead of a box that
looked like a field. The empty task panel shows the New Task shortcut as a
keycap.
Fixed
- A task without a linked branch cut off the left and right edges of its
panel: its three branch buttons now wrap. - Short names no longer get cut in the review header and the commit panel's
"uncommitted files" strip.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.5.0
Added
- Hovering a commit's branch and tag badges in the graph, when names are cut
or some are behind "+N", shows all of them at full length in a list over the
rows below. Click it to select the commit; right-click for the commit's menu. - Remove a worktree from the graph: a branch checked out in another worktree,
and another worktree's "// WIP" row, offer Open Worktree, Open Worktree in
New Tab and Remove Worktree… in their right-click menu. - Remove Worktree… in the sidebar also works for the worktree the tab shows:
the tab then switches to the main worktree (or closes, when the main
worktree is already open in another tab). The main worktree is never removed. - Removing a worktree runs in the background: its row shows "Removing…" right
away in every tab of the repository, and the rest of the app stays usable
while git deletes the folder. - A Fetch button in the toolbar, next to Pull: fetches all remotes
(git fetch --all --prune) without merging anything. - The first commit without a git name and email asks for them once (for all
repositories or this one) and then commits. - A repository without commits shows Create Initial Commit (adds a README.md
if there is none). - Stage All and Commit when nothing is staged yet.
- A banner when HEAD isn't on a branch, with Create Branch Here….
- Cloning into a folder that already holds the repository offers to open it;
another folder of that name gets a-2suffix. Start Task in New Worktree
does the same for its folder.
Changed
- Repository tabs sit in their own row at the top of the window, next to the
traffic lights, like GitKraken's, and are always shown, even with one
repository open. Each tab shows the repository (and the folder of a linked
worktree); click to switch, × or middle-click to close, + for a new tab.
Before, the tabs could be missing altogether. - The repository menu in the toolbar lists only repositories (this one and
recent ones), like GitKraken. Worktrees get their own picker between
repository and branch, shown when a repository has more than one: switch,
open one in a new tab, or add one. - Checking out a branch that another worktree has checked out (double-click
or Checkout in the graph, a task's or review's Checkout, Start Task) opens
that worktree instead of showing an alert: its tab comes to the front, or
this window switches to it. Changes in this worktree stay where they are. - The history scrolls to the checked-out branch when it opens and after a
checkout, instead of always starting at the newest commit. With no changes
to commit, the commit panel opens on that branch's commit too. - Pull no longer stops with git's "divergent branches" error. It
fast-forwards when only the remote moved, and when both sides have new
commits it asks: Merge or Rebase. Uncommitted changes are put aside and
back. A pull.rebase or pull.ff you set in git config is still followed,
and Pull ▾ keeps its explicit variants. - Double-clicking a remote branch checks out its local branch and brings it
up to date the same way (a new tracking branch if there is none). - The checked-out commit stands out in the history: its row has a stronger
band in its lane color that reaches under the badges, and its branch badge
is bold with a light ring. - Failed git actions are explained in plain words with buttons for the next
step, instead of git's raw output in an alert. git's own output is still
there under Details, shown like a terminal (prompt, errors in red, hints
dimmed), with Copy and the command log. Among them:- Push rejected because the remote moved: Pull, Then Push, or Force Push…,
which always asks first and says what it overwrites. - Uncommitted changes in the way of a switch: Stash & Switch, or Bring
Changes Along (to the branch's own remote branch, that's the default). - Pull or merge with no upstream, a deleted upstream, a protected branch,
a stale lease, no write access, a new SSH host key, signed out, offline.
- Push rejected because the remote moved: Pull, Then Push, or Force Push…,
- Conflicts from a merge, rebase, cherry-pick, revert or stash open Changes
instead of an alert; a stash applied with conflicts is kept and Changes
offers to delete it once everything is resolved. - Merge, rebase and all Pull variants put uncommitted changes aside and back
(--autostash) instead of refusing. - Deleting a local branch always asks, says how many commits exist only on
it, and offers to delete its remote branch too. Deleting a remote branch
that is already gone cleans up the leftover entry instead of failing. - Pushing a branch without an upstream asks where to (remote and name, like
GitKraken); a repository without a remote asks for one. - A second git action waits for the running one instead of being refused.
- Sheets (new branch, tag, rename, stash, task, review request, create pull
request) stay open with the error inline when something fails, and say
when a branch or tag name is taken.
Fixed
- A short tag or branch name like
v1in a narrow Branch / Tag column no
longer folds into "+1" when it fits. - After removing a worktree, its "// WIP" row could stay in the graph.
- Settings scroll when they are taller than the window, and the window can be
made taller. Before, the lower sections could not be reached on smaller screens. - In a graph with more lanes than fit, a branch's line ran beside its commits:
the nodes were moved to the column's edge, their lines weren't. Lines now
move with them. - Check for Updates could freeze the app: its message could open off screen
while still blocking every window, so nothing could be clicked and the app
could not even be quit. Its messages now open as a sheet on the front window. GitCowork /path/to/repofrom a terminal could open the welcome screen
instead of the folder: the first window often appeared before the command
line was read, and nothing told it there was a folder to open.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.4.0
Added
- Push any local branch from its right-click menu in the sidebar or the graph
without checking it out, also when another worktree has it open. - Settings › Language: follow macOS, or always English or German.
- Several accounts on one server, like personal and work on github.com. A
repository uses the account you pick in its status bar (saved as
git config cowork.<host>.account), else the one named in its URL, else the
one added first. Cloning from an account's list keeps using that account. - Pull/merge requests and CI, with an account for the host (GitHub, GitLab,
Gitea, Forgejo): open requests in the sidebar,#12on their branches in
the graph, CI passed/failed/running on branches and commits, the checks
that failed in the commit panel with links to their logs, and Create Pull
Request from the app. All worktree tabs of a repository share one lookup,
and nothing is asked while the app is in the background.
Changed
- Tokens in the Keychain are stored per account instead of per server. Existing
ones move over by themselves.
Fixed
- Two quick edits on the board could leave an older version of a task on screen
until the next change. What was saved was always right.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.3.0
Added
- Settings › Appearance: follow macOS, or always light or dark.
- Homebrew:
brew install --cask michael-smao/tap/git-cowork, updates with
brew upgrade. For Homebrew installs the app shows that command instead of
updating itself.
Changed
- Release notes, README and INSTALL say clearly not to download the zip in a
browser, and how to replace a copy macOS blocked. - The app and
git coworkalways sync tasks with the same remote:
git config cowork.remotein the repository (the app saves its pick there).
The app-wide "Sync remote" setting is gone. git cowork new Fix login bugworks without quotes; unknown options and
extra words are errors instead of being ignored;--to annafinds a
teammate by handle;approve/changeshonor--json.- Start Task in the app and
git cowork startpick the same branch and run
the same git command (a pushed branch is tracked, a new one tracks nothing).
Fixed
- install.sh keeps the old app if anything fails or is interrupted while
replacing it, and says what to do when the app folder isn't writable. - The in-app updater passes install.sh only the environment it needs, and
gives up after 10 minutes. - Branch names in shared tasks and reviews are checked before git sees them.
- Saving a renewed token no longer risks losing the old one.
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded
in a browser. It's there for the install line and the in-app updater.
With Homebrew: brew install --cask michael-smao/tap/git-cowork
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.2.0
Coming from 0.1.0? Update once by hand with the one-line install (or
make update); 0.1.0 doesn't have the in-app updater yet.
Added
git coworkcommand-line tool for people and agents: list, create, edit,
start (optionally in a new worktree) and comment on tasks; request, list and
approve reviews; inbox;--jsonoutput. Installed with the app (one-line
install ormake install).- One-line install without Xcode:
curl -fsSL …/install.sh | bashdownloads
the newest release, checks its checksum and installs the app and
git cowork. Releases now include the app as a zip. - Updates from inside the app: a daily check (Settings › Updates) shows
"Update to x.y.z" in the status bar; one click installs it and restarts.
Also git-cowork › Check for Updates….
Install or update
Install or update with one line in Terminal (Apple Silicon, macOS 14+):
curl -fsSL https://raw.githubusercontent.com/michael-smao/git-cowork/main/install.sh | bashPlease don't download the zip below by hand: macOS blocks apps downloaded in a browser. It's there for the install line and the in-app updater. Got the message that Apple can't check the app? Run the line above; it replaces the blocked copy.
Or click "Update" when git-cowork tells you about this version. Built from
source? Run make update in your git-cowork folder. More in
INSTALL.md.
git-cowork 0.1.0
First public release.
Git client
- Tabs for repositories and worktrees; repository and branch pickers.
- Commit graph with lane colors, author initials, branch badges and a
// WIProw for every worktree with uncommitted changes. - Sidebar with local and remote branches, worktrees (live uncommitted and
ahead/behind counts), stashes and tags. - Changes panel with staging per file or hunk, discard, commit and amend.
- Diff in hunk or split view with intra-line highlights.
- Pull, push, fetch, branch, stash, merge and rebase with conflict handling.
- Background fetch of every open repository every 5 minutes while the app is
in front (Settings › Git › Fetch automatically). It never asks for
credentials and pauses after a failed sign-in. - Links to create pull/merge requests on GitHub, GitLab, Gitea and Forgejo.
- Settings > Accounts: sign in to GitHub or GitLab in the browser, or add an
access token (also for Gitea and Forgejo), and HTTPS push and pull work
without setting up git. Tokens are kept in the Keychain and used only by
git-cowork; git in the terminal and SSH remotes are unchanged. - Clone from your repos: with an account signed in, the Clone sheet lists
your repositories and your organizations' or groups' (newest activity
first), with a filter. Pick one to fill in its HTTPS URL, or double-click
to clone it right away. - Settings > Accounts > Create SSH Key: makes an ed25519 key in
~/.ssh/git-cowork_<host>, keeps its random passphrase in the Keychain and
adds it to your GitHub or GitLab account. git-cowork then uses it for SSH
remotes on that host;~/.ssh/configisn't changed (SSH Host Entry shows a
block to copy if the terminal should use the key too). Signing in now also
asks for GitHub'swrite:public_keyand GitLab'sapiscope; older
sign-ins are asked to sign in again before adding a key. - Command log (⌘J) showing every git command the app runs.
- Undo (⌘Z) for the last commit, amend, reset, checkout or branch delete,
run as plain git commands; not offered once you've pushed. - The app's own git calls ignore a repository's
core.fsmonitorsetting,
so opening a repo can't start a program named in its config. - English and German. The app follows your Mac's language; pick one for
git-cowork alone in System Settings › General › Language & Region › Applications. - If a macOS update removed Apple's developer tools (and with them git),
the app says so at launch and offers to install them.
Cowork
- Shared task board (Backlog, To Do, In Progress, In Review, Done) with
assignees, labels, linked branches and comments. - Review requests with reviewers, verdicts and comments.
- Inbox and macOS notifications for assignments, reviews and @mentions.
- Everything stored on
refs/cowork/mainand synced with plain git.
Install or update
New install: see INSTALL.md. Needs an Apple Silicon Mac, macOS 14+ and the Xcode Command Line Tools with Swift 6.
git clone https://github.com/michael-smao/git-cowork.git && cd git-cowork && make installAlready installed: run make update in your git-cowork folder.