Skip to content

The Git card

An agent that works unattended produces a diff you did not write. Reviewing that diff is the job, and it is the job you most want to do from the couch.

The Git card shows the workspace’s repository: changed files, the diff for the selected file, history and branches. On the Mac it is a narrow column with the diff beside it; the column carries the whole way from a change to a merged pull request.

Reviewper-file diff with additions and deletions highlighted
Stage / unstageper file, or the whole group
Commitwith a message you type in the card
Push / pullpush to the tracked remote, pull fast-forward only; sync does both, force push with lease after a rebase
Pull requestcreate it from the card, follow its checks, merge it with the method you choose, or let GitHub auto-merge when the checks pass; request reviews and comment from the card
Commit messagethe host’s agent drafts it from the diff when you click the sparkle; which agent and model answer is set in Host Settings, Agents, Background tasks
Update from basemerge the base branch into yours when it moved on
Undo last commitsoft reset, changes stay in your tree
Discard changesrestore a tracked file, or delete an untracked one
Brancheslist and switch, including tracking a remote branch
Historyrecent commits

From top to bottom the column reads as the state of your branch:

  • Create PR, or PR #n with its state once one exists: checks running, ready to merge, changes requested, merged. Clicking it opens the pull request’s checks, merge and conversation beside the column.
  • Branch → base with how many commits wait to be pushed and how far the base has moved on, and a link to the branch on GitHub.
  • The commit message and one action button that shows the most likely next step: stage everything, commit, push, create the pull request. Every other action sits in its menu, greyed out with a reason when the state does not allow it. Nothing is locked: you can keep editing after the pull request exists, and the button follows.
  • Changes, Staged and Committed on branch. The first two hold the working tree, with stage, unstage and discard on each row. The third, folded by default, lists what the branch already carries against its base, as files or as commits; a click shows that diff.

Merging happens only in the pull request’s checks view, with GitHub’s own verdict: the merge button opens when GitHub reports the branch as mergeable, asks first while checks are still running, and stays closed when a check failed.

The history shows the commit graph: lanes for branches and merges, pills for the branches and tags that point at a commit, HEAD marked. A commit unfolds its files, and a click on one shows that commit’s change beside the list.

The action button’s menu carries the remote actions: push, pull (fast-forward only), sync (pull then push), fetch, force push with lease after a rebase, update from the base, and rebase onto the base. A rebase that would stop on conflicts is undone at once; update from the base merges instead, and the conflicts can be handed to an agent.

Everything runs git on the host, in the repository, as you. There is no Offsite-specific git state and nothing to clean up if you stop using the card.

The card is built to be readable at phone width: file list first, then the diff for the file you pick, with line numbers and hunk headers in the muted colour and additions and deletions in their own palette.

The card offers to run git init. A workspace does not have to be a repository — if it is not, the card has nothing to show until you initialise one.

Actions map to exactly these commands, run in the repository root:

ActionCommand
stagegit add -- <paths>
unstagegit restore --staged -- <paths>
discard trackedgit restore --worktree -- <paths>
delete untrackedgit clean -f -d -- <paths>
commitgit commit -m <message>
undo last commitgit reset --soft HEAD~1
switch branchgit switch <branch>, or git switch --track origin/<branch> when only a remote exists
pullgit pull --ff-only
pushgit push
  • Pull is fast-forward only: a merge that needs a decision should not happen behind a tap on a phone.
  • Undo requires HEAD to have a parent; on a repository with a single commit it refuses rather than doing something surprising.
  • Branch names starting with - are rejected, and every path is passed after --, so a filename can never be read as a flag.
  • The workspace root is resolved to the repository root, so a workspace pointing at a subfolder still shows the whole repository.
  • Anything beyond review, stage, commit, push and switching branches is a sentence to the agent in the next card — it has the repository open anyway.