GitDesktop v0.2.0
Added
-
Per-repo custom agent container image. A repository can now add extra tools to its
containerized agent sessions — e.g. Playwright for browser tests — by committing a
.gitdesktop/agent.Dockerfilethat startsFROM gitdesktop-agent:latest. GitDesktop
builds it into a per-repo image (layered on the managed agent base) and runs that repo's
container sessions and Test shell in it. Manage it under Settings → AI → Agent session
isolation: a status line shows whether the custom image is built, Review & build
shows the Dockerfile and asks you to confirm before building (the build runs the file's
commands, so it never happens automatically — the guard for a cloned repo you don't fully
trust), and Add custom tools… scaffolds a starter Dockerfile for you to edit and commit. -
Bitbucket Cloud (read). Connect Bitbucket in Settings → Accounts with an
Atlassian API token (created at id.atlassian.com, used with your Atlassian
account email; stored in your OS keychain), then browse & clone your Bitbucket
repositories and read pull requests (diffs, comments, build statuses) and watch
Pipelines with step logs — all in the same panels as GitHub and GitLab. Bitbucket
has retired its native issue tracker (issues now live in Jira), so issues aren't shown
for Bitbucket repositories. -
Bitbucket Cloud pull request & Pipeline actions. Beyond reading, you can now act on
Bitbucket Cloud from GitDesktop: comment, decline, merge (merge commit,
squash, or fast-forward, with an optional delete-source-branch), edit, create
(drafts included), and approve/unapprove pull requests, plus rerun, trigger
(with variables), and stop Pipelines. Add thewrite:pullrequest:bitbucketand
write:pipeline:bitbuckettoken scopes in Settings → Accounts to enable them.
Reopening a declined PR isn't available — a Bitbucket platform limit. -
Bitbucket Cloud PR reviews & drafts. Bitbucket pull requests gain the rest of the
review flow: request changes as a true toggle (click again to revoke — unlike
GitLab, Bitbucket's revoke works on every plan; approving also clears it), a
reviewers picker that lists your workspace members (minus the PR author, whom
Bitbucket won't accept as a reviewer), and a both-ways draft toggle — mark a draft
ready for review or convert a ready PR back to draft. -
Bitbucket Cloud publish, Insights & repository settings. Three more Bitbucket
surfaces come online. Publish a local repo — a repo with no remote can be published
to Bitbucket from the sync bar's Publish repository… (or the not-ready panel): pick a
workspace, give it a name (which becomes the URL slug), optionally a description,
website, and public/private, and GitDesktop creates the repo, adds it asorigin, and
pushes the current branch. Insights now works on Bitbucket repos — the local-git
charts, a Pipelines duration and success-rate chart, and a More on Bitbucket card
that links out to Commits, Branches, and Pipelines (the GitHub-only community, traffic,
and dependencies cards stay hidden). And repository settings (for a repo you admin)
manage a Bitbucket repo end to end: General (description, website, language, fork
policy, default branch), Default reviewers (from your workspace members), Branch
restrictions (prevent pushes / force-pushes / deletion, restrict merges, require
approvals / passing builds / resolved tasks, by glob pattern), pipeline Variables
(secured supported, with an enable-Pipelines toggle) and Schedules (cron, enable /
disable, delete), Webhooks (create / edit / delete with an event checklist — Bitbucket
has no delivery-log API, so there's no deliveries view), and a Danger zone (rename,
which updates your localoriginremote automatically; change visibility; transfer via a
link out to Bitbucket; and delete — Bitbucket has no archive). -
Bitbucket Cloud PR tasks, custom pipelines, deployments & create-time reviewers. Four
more Bitbucket surfaces. A Bitbucket pull request now has a Tasks checklist in its
conversation view — add, edit, resolve/unresolve, and delete tasks, with a completion
progress bar, an "N open tasks" chip in the PR header that jumps to the list, and
comment-attached tasks that link back to their comment (read-only once the PR is closed or
merged). The Run pipeline dialog gains a Pipeline picker on Bitbucket repos whose
bitbucket-pipelines.ymldefines custom pipelines (pipelines.custom.*) — run the
branch's Default pipeline or a named custom one, with the same variables. Repository
settings → Pipelines → Deployments lists the repo's deployment environments
(read-only, with tier and not-yet-used / admin-only hints and a Manage on Bitbucket…
link out), and the Insights More on Bitbucket card gains a Deployments link.
Finally, the Create pull request dialog lets you pick reviewers up front (an empty
selection keeps Bitbucket's default reviewers). -
GitLab time tracking. Track time on a GitLab issue or merge request without
leaving the app: set an estimate (e.g.3h) and log spent time (e.g.
45m, or subtract with-15m), with a progress bar and an "over" note when
spent exceeds the estimate. Issues show it in the side rail; merge requests show
a compact clock summary in the header that opens the same controls in a popover. -
GitLab related issues. Link a GitLab issue to other issues in the project
right from its side rail — pick one from the inline search, open a linked issue,
or unlink it. Read-only once the issue is closed. -
Play manual GitLab jobs. A manual pipeline job — one that waits for a manual
trigger — now shows a Run job button in the pipeline detail view that plays
it, so you don't have to switch to GitLab to start it. -
GitLab auto-merge. Arm merge-when-pipeline-succeeds from the merge request
view while a pipeline is running — the merge menu offers auto-merge (merge or
squash) variants, and once armed the footer shows an "Auto-merge enabled"
indicator you can cancel in place. GitLab merges it for you when the pipeline
passes. -
PR notifications & remote pr-sync on GitLab and Bitbucket. The background PR
poller — OS notifications for pull requests opened, merged, or closed, and the
remote pr-sync automation that re-reviews an open remote PR when its head
advances — now works on GitLab and Bitbucket repositories, not just GitHub. (Check
and review-decision notifications stay GitHub-only for now: GitLab and Bitbucket
don't report a check rollup or approval state in the list responses the poll uses.) -
Copy the branch name or HEAD SHA. The repository menu (and command palette)
gained two clipboard actions alongside "copy the repo path": Copy branch name
copies the current branch, and Copy HEAD SHA copies the full commit SHA of
HEAD— each with a quick confirmation toast. Each disables when its value
isn't available: Copy branch name on a detached HEAD, and Copy HEAD SHA in a
fresh repo with no commits yet. -
GitLab, in the same panels. GitDesktop now speaks GitLab as well as GitHub,
through the GitLab CLI (glab) — same delegated-auth model asgh, no tokens stored.
Point the app at a GitLab repo (or browse and clone your GitLab projects from the
GitLab tab in the clone dialog) and the Pull Requests panel lists its merge
requests right alongside any local PRs — open and closed/merged, searchable and
filterable. Open one for the description, comments, commits, and a syntax-highlighted
diff (plus an "Open on GitLab" link) — and comment on a GitLab MR,
close / reopen it, edit its title and description, approve / unapprove it
(a GitLab reviewer action, with the
approval count shown inline), request changes (the blocking reviewer state — the app
adds you as a reviewer if needed and posts your drafted comment alongside; approving
clears it), react with emoji on the description and comments (GitLab's award
emoji, the same reaction bar as GitHub), merge it (merge or squash, optionally deleting the
source branch — guarded so it never merges a head you didn't see), and edit its labels
and assignees. The AI Review tab works on GitLab MRs too — run a code review or
security audit of the MR diff and post it as a comment.
You can also create a merge request right from the app (the New menu, the command
palette, or the Compare tab) — it pushes your branch and opens the MR, draft included, and
the Compare tab now spots an existing open MR from your branch and offers View
instead of a duplicate Create. The Issues panel speaks GitLab
too — its issues (open and closed) next to your local issues, and an issue view with the
description, comments, and a side rail of labels, assignees, and milestone — with GitLab
issue writes: comment, close / reopen, edit the title and description,
react with emoji, editing labels, assignees, and the milestone
right in that side rail, and creating issues (with labels, assignees, and a
milestone) from the same
dialog GitHub uses. Publishing a local issue or PR to GitLab works too. The
Actions panel covers GitLab CI pipelines — the run list, a branch CI badge, a
pipeline view with its jobs (status, durations, and per-job logs), plus the
actions: cancel a running pipeline, retry a failed or canceled one, and
run a fresh pipeline on any branch or tag with optional CI/CD variables. The
Tags panel manages GitLab releases too — alongside your local tags: read the
notes, the Latest badge, and asset links (open in browser), and publish, edit,
and delete releases, upload files as asset links, and remove them (GitLab has no
draft/pre-release toggles — it picks the latest release itself). The repository menu
speaks GitLab too — View on GitLab, star / unstar, a Fork on GitLab link,
and "Create issue on GitLab" — and you can publish a local repository to GitLab:
the publish dialog (and the sync bar's Publish button) now offers GitHub or GitLab
when both CLIs are signed in, creates the project, adds it asorigin, and pushes.
Insights rounds it out: the local-git charts always worked, and the CI card now
charts GitLab pipeline durations and success rate (the GitHub-only cards —
community, traffic, dependencies — hide, with GitLab's web-only analytics linked
instead). GitHub repositories are
completely unaffected. -
Self-managed GitLab. Everything above now works on your own GitLab instance,
not just gitlab.com — signglabin to the host (glab auth login --hostname …)
and GitDesktop recognizes repositories on it automatically, labels them
correctly ("View on GitLab"), and routes every read and write through your
per-hostglabcredentials. -
GitLab issue lock, move, and delete. The issue view's "More actions" menu now
works on GitLab: lock / unlock the conversation (GitLab locks without a
reason, so there's no reason submenu), move the issue to another project you
have access to (with project suggestions; the original closes with a "moved"
marker), duplicate it, and delete it (Owner-only, type-to-confirm). -
GitLab project settings. The repository-settings dialog now manages GitLab
projects end to end: General (description, topics — AI-generate works here
too — default branch, per-feature access levels with proper
everyone/members-only/disabled tri-states, merge method, squash policy, and the
merge checks), Members (add/re-role/remove by username, with inherited group
members shown read-only), Webhooks (create/edit/delete with per-event
triggers and a secret token, send a test event, and debug with the delivery
log — request/response payloads and one-click re-send), CI/CD
variables (add/edit/delete, protected and masked flags), and the Danger
zone (rename with path redirect, archive/unarchive, visibility, transfer to
another namespace, delete — Owner-only actions explain themselves when you're
a Maintainer). Gated by your actual GitLab role, straight from the repository
menu. -
GitLab protected branches. Manage protected branches from repository
settings: protect a branch or wildcard with per-rule push/merge access levels
and a force-push policy, toggle force push in place, and unprotect — rules
inherited from a group show read-only. -
GitLab issue due dates and confidential issues. Two GitLab-unique fields
in the issue view's side rail: a due date (type a date and press Enter or
pick from the calendar; one click clears it, and an open issue past its date
reads Past due) and a confidential toggle that hides the issue from
non-members. GitLab-only — the rail on GitHub repositories is unchanged. -
A browsable, persistent Agent sidebar. Several quality-of-life upgrades to the Agent list:
the activity log now survives a restart — reopening the app no longer drops a session's,
plan's, or research run's step-by-step tool log (the full interleaved transcript of reads,
edits, commands, and web is persisted, not just the flat prose). Every entry now carries a
GitHub-style#Nidentifier (a stable, global number) shown on its row, so an entry can point
at what it became — a research run shows the plan it turned into (Turned into plan #12), and a
plan shows the session that implemented it (Implemented · Ready to review #10). Each row also shows its
provider · model (e.g.Codex · gpt-5) for browsing by agent, and right-clicking a row
opens a context menu of its actions — Open, Resume/Keep/Discard a session, Save/Copy/Turn-into-Plan
a research report, jump from a plan to its session or file it as a local issue, and so on. -
See every step the agent takes — now with inline diffs. The agent surfaces (Delegate, Plan,
Research) show the agent's work as one step-by-step transcript — each file it reads, edits,
searches, command it runs, and page it fetches, interleaved with its narration in the order it
happened (the way Claude Code and the VS Code agent read). In a write session you can now
expand any edit step to see that file's diff inline — the file's cumulative change in the
session, syntax-highlighted, without leaving the conversation. (Read-only Plan and Research don't
edit, so their steps stay informational.) -
Research mode — Brainstorm & Deep research. A new read-only, web-enabled agent mode in the
Agent tab, sitting upstream of Plan. Brainstorm surveys the web and your repo and surfaces
several distinct directions with prior art; Deep research investigates one direction in depth
and streams a cited report — rendered right in the app, never bounced to an external editor.
The two are one switchable mode, not separate sessions: start in Brainstorm to widen your
options, then switch to Deep research from the follow-up composer to flesh out the direction
you chose — the whole conversation carries over (just like switching a model mid-session). When
you're happy, hand a report straight to Plan or save it as a local Markdown file (written
to.gitdesktop/research/for you to review and commit — never committed automatically). Keep
refining with follow-up messages; several runs go side by side. Read-only throughout: it searches
and reads, but can never write. Runs on any agent — Claude, Codex, GitHub Copilot, or
opencode — each using its own native web search and fetch (opencode's web search needs its Exa
integration enabled; web fetch always works). -
Custom & LAN AI servers, with an allowed-hosts list. You can now point GitDesktop at an
Ollama (or any OpenAI-compatible) server running on another machine on your network — not
justlocalhost. Set the server's URL under Settings → AI (now available for the review
model too, not only generation), then allow its host in the new Allowed hosts list — or
just click Allow host on the inline prompt that appears when you enter a URL that isn't
permitted yet. Built-in providers andlocalhostare always allowed; everything else must be
on your list, which is the gate the app enforces before every AI request — so a typo or a
compromised page can't quietly reach an arbitrary server. -
Advanced merge tooling. The Merge into current picker now predicts the merge before
you run it — a calm status line shows fast-forward, already up to date, clean merge, or
which files will conflict, computed in memory withgit merge-tree(it touches nothing). Two
options join it: Always create a merge commit (--no-ff), and an On conflict strategy —
Stop and let me resolve (default), Prefer current branch (-X ours), or Prefer incoming
branch (-X theirs) — that auto-resolves conflicting hunks in one side's favor, clearly
cautioned that the other side's conflicting changes are dropped (and the preview then reframes to
"N files auto-resolved"). Degrades quietly on older git. GitHub Desktop has none of this. -
Interactive rebase — "Edit history". A new Edit history… item in the History
context menu opens an editor over your unpushed commits where each commit gets a per-row
action — pick, reword, squash, fixup, edit, or drop — plus ↑/↓
reorder and inline message editing (reword loads the full original message and can regenerate
it with AI). A live "Result: N commits" footer shows what you'll end up with. Edit-free plans
run the atomic conflict-safe replay engine (any conflict rolls everything back untouched).
Choosing edit instead starts a real, resumable rebase that pauses at that commit so you
can amend its contents — the Changes banner reads "Rebase paused — amend… then Continue", you
amend with the normal stage/commit flow, and Continue/Abort finish it (conflicts on this path
are resolvable, not rolled back). It refuses a dirty tree, merge commits, or already-pushed
history. The quick Squash N commits… multi-select shortcut stays; the standalone Reorder
dialog is folded into the editor. GitHub Desktop has no equivalent. -
GitHub Enterprise support. GitDesktop no longer assumes
github.com— every GitHub
feature runs throughgh, which detects each repository's host from its remote, so an
Enterprise Server repo (github.acme.com) gets the same pull requests, issues, Actions, and
repository-settings features once you've signed in with
gh auth login --hostname your.github.example. Settings → Accounts now groups signed-in
accounts by host and switches the active account per host (a single-host user sees the same
flat list as before); author avatars, profile links, and thegh auth refreshscope hints all
resolve on the repo's actual host. Unlike GitHub Desktop, no separate Enterprise sign-in flow —
it follows whatever hosts you've added togh. -
Auto-fetch (background sync). GitDesktop now keeps the open repo's view of its remote
current on its own: an opt-out periodic backgroundgit fetch(Settings → General; on by
default, every 5 / 10 / 15 / 30 / 60 minutes) runs while the window is focused, plus once when
you return to the app or open a repo and it's been at least one interval. It's quiet — no
toasts, the Fetch button just spins, and its tooltip shows when the repo was last fetched. It
only updates remote-tracking refs, so the behind-count and incoming commits stay fresh without
ever pulling, merging, or touching your files — pushing and pulling stay manual. -
Conflict resolution, in-app. Selecting a conflicted file no longer shows an empty pane —
it opens a conflict editor: the file rendered with each conflict region called out as
Current (ours) over Incoming (theirs), with Accept current / Accept incoming /
Accept both on every region, or whole-file Accept all current / Accept all incoming and
Open in editor in the header. Resolve as granularly or as bluntly as you like; the file is
marked resolved automatically once the last conflict is gone. Works with AI off. -
AI conflict resolution. The same editor's Resolve with AI asks your model to merge a
file: it streams a proposal you review as a diff against your side (flip to the full
proposed file or the ours / theirs / base versions), then Accept & stage applies it —
nothing is written until you accept; Regenerate retries, Discard drops it. The conflict
banner's Resolve all with AI walks every conflicted file in turn. It uses your configured
Review model, so it runs on any provider including local Ollama and keyless Claude Code /
Codex agents, honors your AI ignore patterns, and is hidden entirely when AI features are off.
Unlike GitHub Desktop's Copilot-only equivalent, there's no subscription or sign-in lock-in. -
Worktree manager. A new Worktrees… dialog (repository ⋯ menu, or the command
palette) lists the repo's linked worktrees and lets you create one (a new branch
from any base, or an existing branch, checked out into its own folder), open one to
switch the active repository to it, rename one, lock / unlock one (with an optional
reason, to guard it from accidental removal — handy for a worktree on a removable or network
drive), and remove one safely (the branch is kept; a worktree with uncommitted changes
asks before force-removing). A Repair links action re-connects worktrees after you've
moved or renamed the repository folder. The branch
switcher is worktree-aware too: a branch already checked out in another worktree is
badged, and selecting it offers to open that worktree instead of failing. Worktrees let
you work on several branches at once without stashing or switching, and the ones AI agent
sessions use internally stay hidden and protected — you can't list, rename, or delete them
by accident. -
Use GitDesktop as an MCP server. GitDesktop can now be a Model Context Protocol
server, not just consume them. A new Use GitDesktop as an MCP server panel in
Settings → MCP servers shows a ready-to-paste config snippet that points any external
MCP client — Claude Desktop, Cursor, Claude Code — at this repo. The app runs as a
read-only stdio server (gitdesktop mcp --repo <path>) exposing ~20 git & GitHub tools
(status, log, diffs, blame, branches, file history/read, PRs, issues, CI logs), so an agent
can understand a repository without changing it. -
MCP servers for agent sessions (Claude, host). A new Settings → MCP servers
panel lets you register Model Context Protocol servers — local (stdio) or remote
(HTTP), with environment variables / headers and secrets kept in your OS keychain
— and a new MCP picker in the agent composer opts a session into the ones you
choose. A Claude session passes only the servers you picked, in strict mode, so a run
never inherits other MCP servers on your machine; with no servers registered, nothing
changes. Don't have any yet? Browse opens the official Model Context Protocol
registry right in the panel — search it and add a server in a click. Each result shows
signals to vet a server before adding it: GitHub stars and activity, weekly npm
installs, deprecation status, the source repo, and — expanded — exactly what it runs
or connects to and which secrets it needs. Browse has two sources you can toggle
between — the official registry and GitHub (repositories taggedmcp-server,
ranked by stars, with the same vetting signals; ones with a manifest add cleanly, others
arrive marked needs setup). Added servers still land disabled for review.
Already have servers set up? Import pulls them in from the open repo's
.mcp.jsonor your global Claude config — reviewed, started disabled, with any secret
values moved to your keychain (the source files aren't touched). Each server is scoped
Global or to a specific repo (import sets this from where it came from), so a repo's
servers only show up in that repo's sessions and the registry stays tidy. And a shared
global server can be tuned per repo — set it On, Optional (available but off
by default), or Off for the repo you're in, or leave it on Default to follow the
global setting. (design.) -
MCP servers for Codex (container sessions). Codex agent sessions can now use your
registered MCP servers too — in container isolation. (Host Codex can't approve MCP
tool calls non-interactively — an upstream limitation — but a container session bypasses
approvals safely because the container is the sandbox.) The composer's MCP picker
now appears for Codex and tells you to switch to container isolation if you're on host;
it offers local (stdio) servers (Codex's remote-MCP config can't carry the arbitrary
headers our HTTP servers use). Your picks are written into the session's sandboxed Codex
config — secrets stay in the OS keychain, never in the command line — and, because a
container's Codex home is clean, the session sees only the servers you picked. -
MCP servers for Copilot and opencode (host sessions). Your registered MCP servers
now work on GitHub Copilot and opencode host sessions too — alongside Claude on
the host and Codex in a container. The composer's MCP picker appears for both (local
stdioand remote HTTP servers), and your picks are handed to the CLI for that session
only — secrets stay in your OS keychain, never on the command line. Both CLIs approve the
servers' tools automatically, so a non-interactive run never stalls on a prompt; Copilot
and opencode layer your picks onto their own config, while Claude alone runs in strict,
only-these mode. -
MCP servers in container sessions, for every agent. Your registered MCP servers now
work in container isolation for Claude, Copilot, and opencode too — not
just Codex. Each session's picks are written into the agent's config inside the sandbox
(secrets stay in your OS keychain, never on the command line), so the servers run in the
container alongside the agent. A shared npm cache means annpx-based server is
downloaded once and reused across turns and sessions instead of re-fetching every run.
You pick servers from the composer the same way whether a session runs on the host or in
a container. (Tip: a Claude server takes a few seconds to connect inside a fresh
container, so the very first thing in a turn may not see it yet — it's there once the
agent gets going.) -
Change a session's MCP servers mid-conversation. The composer's MCP picker now
appears on an active session too, not just a new one — toggle servers on or off and the
new selection applies from your next turn (and survives a reload). -
MCP servers in best-of-N runs. The composer's MCP picker now appears in best-of-N
mode too — your selection is shared across every arm, so each agent attacks the task
with the same tools (a fair comparison). Each arm automatically drops any server its own
agent or isolation can't use. -
GitHub Pages config, in the app. A new Pages tab in repository settings: enable
Pages from a branch + folder or via GitHub Actions, see the live URL and build
status, change the source, set a custom domain, enforce HTTPS, and disable the
site. Part of the org/repo governance buildout. -
Branch rulesets, in the app. A new Rules tab in repository settings manages
GitHub's modern branch rulesets: list them, flip enforcement (Active / Evaluate /
Disabled) right from the list — including the reversible "disabled" soft-off that
keeps the ruleset instead of deleting it — and create or edit one with a focused editor
(target branches, require a PR with approvals / code-owner review / stale-dismissal,
require status checks, block force pushes, restrict deletions, require linear history,
require signed commits). Editing preserves any advanced rules the editor doesn't
surface, and org-level rulesets show read-only. Part of the org/repo governance
buildout (docs). -
Repository danger zone, in the app. The General tab of repository settings gained a
Danger zone: rename, archive / unarchive (reversible), change visibility
(public / private / internal), transfer ownership, and delete the repository.
The three irreversible actions (visibility, transfer, delete) are each behind a
type-the-owner/repo-name confirmation that spells out the consequences first. Deleting
detects when yourghsign-in lacks thedelete_reposcope and shows the exact
gh auth refreshcommand to run. Your local clone is never touched. Part of the
org/repo governance buildout (docs). -
Code security & analysis toggles, in the app. A new Security tab in repository
settings collects secret scanning (and its AI-detection and non-provider-pattern
sub-toggles), push protection, code scanning (CodeQL default setup), Dependabot alerts
and security updates, and private vulnerability reporting behind a save/discard bar
— flip what you want and save once (changes apply in the right dependency order). On
private repos it notes which features need GitHub Advanced Security. Dependabot
version updates — which GitHub only configures through.github/dependabot.yml— gets
a scaffold: pick your package ecosystems and schedule and it writes the file to your
working tree for you to commit (it won't overwrite an existing one). The remaining
API-less options (dependency graph, grouped security updates, self-hosted runners)
appear as "Manage on GitHub" links rather than dead toggles. -
Manage repo collaborators & invitations, in the app. A new Access tab in
repository settings lists your collaborators with their role, lets you invite
someone by username at any level (Read / Triage / Write / Maintain / Admin), change
a collaborator's role inline, and remove them — plus a pending invitations list
you can re-role or cancel. (Removing someone revokes only their direct access; team/org
access is managed at the org level, coming later.) Part of the org/repo governance
buildout (docs/github-governance-expansion.md). -
Edit the Sponsor button, in the app. A new Sponsor tab in repository settings
edits.github/FUNDING.yml— the file that powers your repo's Sponsor button —
with fields for GitHub Sponsors, Patreon, Open Collective, Ko-fi, Liberapay, Buy Me a
Coffee, Polar, Tidelift, and custom URLs. Saving writes.github/FUNDING.ymlto your
working tree — review and commit it like any other change to publish; one click removes
it. (GitHub has no API for the "Sponsorships" feature toggle, but it's on by default —
the file is what matters, which is why this is the right lever.) -
Manage GitHub secrets & variables, in the app. A new Secrets & variables tab
in repository settings lists and edits Actions, Dependabot, and Codespaces secrets
and Actions variables, at repository or environment scope. Secret values are
encrypted on your machine before they're sent (GitDesktop never handles the raw
encryption), and — as on GitHub — can't be read back, only replaced or removed; a
reused name updates the existing variable. Part of the broader org/repo governance
buildout (docs/github-governance-expansion.md). -
More GitHub repo settings, in the app. The repository-settings dialog gained a
template repository toggle, default squash/merge commit message pickers, and
an allow forking toggle (shown only on org-owned private repos, the one place
GitHub lets it change) — plus an "Only on GitHub" list that deep-links the five
settings GitHub exposes to no app (sponsor button, commenting on commits,
LFS-in-archives, per-push branch/tag limit, auto-close issues on merge), so they're
discoverable instead of silently missing. This is the first slice of a broader
org/repo governance plan (docs/github-governance-expansion.md);
the app can now also read yourghtoken's OAuth scopes, groundwork for features that
prompt for the exactgh auth refresh -s <scope>they need. -
More of your git config, editable in the app. Settings → Git gained two
controls that write straight to your global git config: line endings
(core.autocrlf) — with a note on the right choice per OS — and, when a repository
is open, a per-repository identity override (git config --local user.name/
user.email) so you can commit as a different author in just that repo without
touching your global identity. The override clears back to the global identity with
one click, and both apply immediately. They join the global identity and
default-branch fields already in that panel. -
Integrated terminal. Every agent session gained a built-in terminal — toggle it
with the terminal hotkey (Ctrl/⌘+J) or the Terminal button — so you can
run commands right inside GitDesktop instead of opening a separate window. It's a real
shell (a PTY) in a resizable bottom dock that keeps running while hidden, so a dev
server you start stays up. For a container session the terminal runs inside the
session's Docker/Podman container — clicking Terminal opens a small popover to
choose which dev-server port(s) to publish before it spins up (so a busy host port
doesn't kill the launch), where you can also reconnect to or stop a container
that's still running; for a host session it's a shell in the worktree. -
Run a task several ways at once (best-of-N). The Delegate composer gained a
Best-of-N button: run the same task across 2–5 arms, each with its own agent,
model, and effort — mix Claude, Codex, Copilot, and opencode so different providers
attack the problem from different angles. Each arm runs in its own worktree; review
them side by side and keep the best one with a single click (it discards the
rest). Because fanning out multiple agents costs real money, a confirmation first
shows an upfront estimate drawn from what your own recent sessions actually cost
(scaling with the arm count), and the ensemble's running total is shown while it
works. It's opt-in and never the default — best for open-ended tasks with several
good approaches. -
Plan a task before you build it. A new read-only Plan mode in the Agent
surface: describe a task (or start from an existing issue with the new Plan
button on any issue) and a repo-aware agent explores your actual code, then drafts
an agent-ready issue — problem, proposed approach, affected files, acceptance
criteria, and a verify plan — without changing anything. Cited file paths are
checked against your repo, so hallucinated references are flagged before you file.
The planning run's cost is shown when reported. If the plan left any decisions
open, they appear as an answerable panel (modeled on Claude Code's clarifying
questions): pick from the suggested answers or write your own, and Refine plan
continues the same planning conversation with your answers — the agent keeps its
exploration in context and refines incrementally instead of starting over. A
follow-up composer lets you keep chatting to revise the plan anytime, and the
whole thing persists across restarts — close the app and your plans (and their
conversation) are right where you left them, still resumable. (Plans are a read-only
agent conversation: read tools only, no worktree, never a write.) Review it, then
create a local or GitHub issue from it in one click. Plans live in the Agent
sidebar alongside your sessions and run several at once — start one, switch to
another, and come back; none are lost, and an OS notification tells you when each
one finishes (ready, awaiting your answers, or failed) unless you're watching it.
Reach it from the Agent tab's "Plan a task" mode, the command palette, or an issue's
Plan button. -
Hand a plan or issue straight to an agent. A finished plan gets an Implement
button that starts a write-capable session directly (a quick popover sets the
agent / model / effort first); any open local or GitHub issue gets Solve with
agent (it's a problem to investigate → diagnose → fix), which seeds the Delegate
composer to confirm. Either way the agent works in an isolated worktree, the way
every agent session does. Once a plan is being implemented it becomes a read-only
reference (its row tracks the session's live status), and it archives to its own
Archived tab once that session is accepted. Closes the loop from planning to a
working change. -
Bring any OpenAI-compatible provider. A new "OpenAI-compatible" provider lets
you point GitDesktop at any OpenAI-compatible/chat/completionsendpoint with your
own API key. One-click presets cover the Vercel AI Gateway (one key, many
models), Google Gemini, DeepSeek, Mistral, and Z.ai — or type any
base URL. Live model lists and "Test connection" work just like the built-in
providers. (A custom host outside the presets must be added to the app's network
allowlist.) -
Slash commands and skills in the agent composer. Type
/to pick a reusable
prompt or a skill. The menu pulls together built-in starters (/review,/test,
/fix,/explain,/refactor, plus/clear); custom commands you define under
Settings → Slash commands; and — tailored to the selected agent — its own
commands and Agent Skills, discovered from both the project and your home
directory, including the shared.agents/skillsstore (so your global skills
show up too), plus a curated set of the CLI's own built-in commands (like
/init). Type/to browse the whole list — it's scrollable, no narrowing
needed. Commands support$ARGUMENTS(and$1,$2…) and are expanded in-app
before reaching the agent; picking a skill nudges the agent to use it by name, so
the CLI loads the real skill (scripts, references and all) instead of pasting it in.
The menu is keyboard-driven, like@filementions. -
opencode joins the agent line-up. You can now drive agent sessions and AI
reviews with opencode alongside Claude Code, Codex, and
GitHub Copilot — pick it in the agent composer or as a review provider. opencode's
free hosted models need no API key, so it's a genuinely keyless option out of
the box (point it at your own provider for paid models too). Sessions run on the
host, confined to their throwaway worktree, and resume cleanly across turns and
app restarts like the other agents. -
The window remembers where you left it. GitDesktop now reopens at the size,
position, and maximized state from your last session, validated against your
current monitors so an unplugged display can't strand it off-screen. Settings →
About also gained a live readout of the window's current position, size, and
display, with a button to copy the coordinates. -
Watch an agent session work, live. The Changes tab now reflects the worktree's
uncommitted edits as the agent makes them, before each turn's checkpoint commit
— so you can follow along instead of waiting for the commit to land. -
Test a session's changes before you keep them. Every active session gained an
Open menu — open its worktree in your editor, a terminal, or the file manager and
run it for real before you Keep or Discard. The worktree is a full checkout on the
session's branch, isolated from your working tree. For a container session, whose
dependencies were installed for Linux, the live shell is the integrated terminal
(above) — a shell inside the same image with the worktree mounted, sopnpm install
and running it happen in the matching environment rather than failing against
host-incompatible deps; that's where you choose the dev-server ports to publish and
reconnect to or stop a still-running container. Keeping or discarding the session
shuts its test container down for you. -
Promote a kept session to a local PR. A kept agent session gained a Create
PR button (and command-palette action) that opens a local pull request from its
branch, prefilled and ready — a one-click hand-off from "agent finished" to review. -
See a session's pull-request and merge state on its row. Agent session and plan
rows now show a pull-request audit chip — PR open, PR closed, or Merged —
derived from the session branch's local and GitHub pull request, so you can tell at
a glance whether the agent's work actually landed. An implemented plan reads
"Implemented · Merged" once its session's PR is merged. Merge status is read from the
pull request itself (notgit merge-base), so it stays correct through squash and
rebase merges, including a local PR you've promoted to GitHub. -
opencode runs in the container sandbox too. opencode joins Claude and Codex as
a container-isolated agent (kernel-enforced filesystem confinement) — add it under
Settings → AI → agent image and rebuild. Its free hosted models need no key, so the
container runs keyless. -
Deeper opencode reviews. Turn on "Read repo files for context" for an opencode
review and it explores surrounding files (via opencode's read-only plan agent — it
can read but never write), not just the diff. -
GitHub Copilot runs in the container sandbox too. Copilot joins Claude, Codex,
and opencode as a container-isolated agent — add it under Settings → AI → agent
image and rebuild. Copilot has no credentials file to mount (its login lives in the
OS keychain), so its container authenticates from your GitHub CLI token (gh auth token), passed securely by environment — never written to disk or visible in the
container's arguments. -
Deeper Copilot reviews. "Read repo files for context" now works with Copilot
too: it reads surrounding files for context while a hard deny on the write and shell
tools keeps it strictly read-only, even when reviewing in your live repo. -
Global skills reach container sessions. A container-isolated agent session now
mounts your global skills (~/.agents/skills) read-only, so a skill invoked by name
resolves inside the container just as it does for a host session — previously only
skills committed to the repo were visible there. -
AI re-reviews build on GitLab bot findings. When you re-review a GitLab merge
request, GitDesktop now folds in what third-party AI reviewers (CodeRabbit, Copilot,
and the like) already flagged in the MR discussion — the same "build on external
reviews" context it has offered on GitHub — so the model doesn't re-report findings
another tool already raised. Bitbucket has no equivalent bot-review ecosystem, so it
stays out of this path. -
Provider-aware AI prompts. AI review, summary, and commit-message prompts now speak
the host's vocabulary — "merge request" on GitLab and Bitbucket, "pull request" on
GitHub — and use each platform's markdown flavor, and release-notes generation no
longer shells out to the GitHub CLI on a GitLab or Bitbucket repository. -
Agentic PR review. When your review model is a CLI agent (Claude Code, Copilot CLI,
or opencode), turn on Agentic review and GitDesktop attaches itself to the run as a
read-only MCP server: the reviewer pulls the full PR diff (past the prompt's truncation
budget), reads any file at any ref, runs blame and history, and reads the PR's existing
comments — reporting what it explores live in the status line. It's read-only end to end
(no write tools, no repo changes), and after a run whose diff outgrew the prompt budget
the panel nudges you to enable agentic review or switch to a CLI agent model for full
coverage. Codex reviews explore the repo natively but can't attach the GitDesktop tools. -
AI reviews are clearly machine-authored. Every AI-posted review now carries a
branded GitDesktop header and footer, and AI comments on a local PR show a "GitDesktop"
bot author with a robot avatar. On GitLab, add a project or group access token in
Settings → Accounts and AI reviews post as the real GitLab project bot instead of
your signed-in account. -
AI Generate proposes labels. The Generate button in the Create pull request
dialog now also suggests labels alongside the title and description, chosen only from
the repository's existing labels and added to your current selection (it never
invents a label). -
Apply suggested changes locally. Apply a reviewer's suggested change to
your working tree straight from the review thread on a GitHub PR — GitDesktop's
local answer to GitHub's Commit suggestion, which has no public API. The edit
is verified against the file first (refused if the code has drifted), keeps the
file's line endings and BOM, and is staged when the file had no other local
changes (otherwise applied unstaged, with a note). Disabled with a reason when
the thread is outdated or a branch other than the PR's head is checked out. -
Blame and file history from any file list — not just the Changes panel. Right-click a
file row in a commit's file list (in History, or a PR's Commits tab), in a pull request's
Files tab, or in a Compare / local-PR file list, and you now get View file history… and
Blame… — the same actions the Changes panel already had. On those surfaces Blame is
pinned at that commit or branch, so you see the file as of that revision. A new Blame
file… command in the palette opens a fuzzy picker of every tracked file (arrow-key
navigable) and blames the one you choose. -
Clean up stale branches in bulk. A new Clean up branches… action in the
branch switcher (and command palette) gathers stale local branches — merged into
the default branch, or with no commits in the last 30/60/90 days — and lets you
archive them (reversible) or delete them together after reviewing and
trimming the list. The current branch, the default branch, and protected
branches are never included. -
Collapse the Local and remote sections of the pull-request and issue lists.
Click a section header to fold that section away; the header keeps a count of the
hidden rows so nothing gets lost, and the choice is remembered across restarts. -
Comment on a PR's commits. A commit's detail view carries a whole-commit comment
thread plus line-anchored comments on its diff — create, edit, and delete your own,
applied optimistically — on GitHub, GitLab, and Bitbucket pull requests. -
Bitbucket PR reviewers who've acted now show as completed chips. On a Bitbucket
pull request, participants who have approved or requested changes now appear as
read-only completed-reviewer chips carrying their verdict, and drop off the
pending-request list so they no longer double-render as still-pending. -
GitLab MR reviewers who've acted now show as completed chips. On a GitLab merge
request, reviewers who have approved or requested changes now appear as read-only
completed-reviewer chips carrying their verdict, and drop off the pending-request list
so they no longer double-render as still-pending. -
See finished reviewers in the PR Reviewers section. The Reviewers rail now shows
reviewers who've already reviewed as read-only chips carrying their verdict — a check for
approved, an X for changes requested, a speech bubble for commented — so a completed
review (including Copilot's) stays visible after the reviewer drops off the
pending-request list. State is conveyed by icon shape plus the word, never color alone. -
Copy CI logs. Job logs and failed-step logs in the Actions panel, and the inline
log peek on a pull request's CI checks, now carry a copy button in the log's top-right
corner — grab the whole log with one click to paste into an issue, a chat, or an agent. -
Delete a remote-only branch from the switcher. Branches in the branch switcher's
Remote section now have a Delete on origin… action that deletes the branch on its
remote for everyone. It's a confirmed, server-side delete that can't be undone from the
app, and protected branch names are blocked from it. -
Edit and delete your own comments on GitLab merge requests and issues, and
on Bitbucket pull requests — including comments inside inline review threads —
the same inline editor and delete confirmation that GitHub comments already had,
now wired to each provider's native commands. -
Fork repos are marked in the repository lists. A repo that's a fork on its provider
now shows a fork glyph beside the public/private badge in both the repo switcher and the
welcome screen's Repositories list. The glyph carries a "Fork of <owner/repo>" label
(or just "Fork" when the upstream isn't known), so its meaning isn't conveyed by shape
alone. Like the visibility badge, it resolves in the background and clears if the remote
goes away. -
Edit GitHub PR assignees. Assignee editing on an open pull request now works on
GitHub too, reaching parity with GitLab merge requests — pick assignees from the
same rail affordance in the PR view. -
Commit-author avatars in History. The History log, commit detail, and
file-history views now show each author's avatar — derived from GitHub or
Gravatar, falling back to their initials. -
Commit comments from the History tab. Open any pushed commit in History and
comment on it straight away — a whole-commit thread plus line-anchored
comments (click or drag line numbers to anchor them) — on GitHub, GitLab, and
Bitbucket. An unpushed commit shows a push hint, and local-only repos are
unchanged. -
Agentic review now works with API review models. Beyond the CLI agents, turning on
Agentic review with an HTTP/API model (Anthropic, OpenAI, OpenAI-compatible,
OpenRouter, or Ollama) gives it a native read-only tool loop: it pulls the full PR diff
past the prompt budget, reads any file at any ref, searches the repo, and runs history
— reporting what it explores live in the status line. There's no review workspace
to prepare, so these reviews start instantly, and it's read-only end to end. Each tool
step is an extra model call (slower and pricier), and small local models that can't do
tool calling fail with a clear message to turn agentic off or pick another model. -
Inline review comments. Line-anchored review comments — from Copilot,
CodeRabbit, or humans — on GitHub PRs, GitLab MRs, and Bitbucket PRs now render
in the app: grouped by file in the Conversation tab and anchored at their exact
line in the Files diff (unified or split), with reply-in-thread and
resolve/unresolve. GitHub threads show the anchored code excerpt they were left
on, reviewer suggestions render as labeled change diffs, and any thread can be
copied as Markdown (line range, excerpt, and every reply). Resolved threads
collapse behind a per-file expander, and outdated ones are flagged.
Previously they were invisible (GitHub) or shown as context-free flat
comments (GitLab/Bitbucket). -
Jira issues now show agile fields — story points (in the list and the detail),
sprint, a clickable epic / parent, components, and fix versions —
discovered automatically per site, with nothing to configure. -
Jira issue writes. Create, comment on, close/reopen (following the project's own
workflow, with the real resulting status named in the confirmation), and assign Jira issues right
from the Issues tab of a linked Jira Cloud project. Each action is gated on your Jira
permissions — anything your token and role can't do stays hidden. -
Linked Jira Cloud projects. Connect a Jira site and project to any repository and
browse its issues (status, type, priority, assignee, labels, Markdown description, and
comments) from the Issues tab, with View-in-Jira link-outs. Bitbucket repos get a
one-click path, since Bitbucket's native issue tracker retires 2026-08-20. Read-only for
now; connect with an Atlassian API token (or reuse an existing Bitbucket credential). -
Jira issue links, promote-to-Jira, and agent access. The linked project's issue keys
(e.g.PROJ-123) are now spotted in the current branch name, a commit's message, and a PR's
title/description, and surfaced as a compact "referenced Jira issues" row that jumps to the
issue in the Issues tab. A local issue can be promoted to Jira (alongside GitHub or GitLab
when both are available) — its comments carry over and the local one closes with a back-link.
And agents connected through GitDesktop's MCP server getjira_*tools to list and read the
linked project's issues, plus comment, close/reopen, create, and assign behind the
--allow-remote-writeopt-in. The status chip in the Jira issue view is now also a menu
(when your permissions allow transitions) for moving an issue to any of its workflow's
available statuses, alongside the existing close/reopen quick action. -
Edit more of a Jira issue. Set or clear a due date, change the priority, edit
the labels, and edit or delete your own comments — all from the Issues tab of a
linked Jira Cloud project, and each control gated on your Jira permissions so anything your
token and role can't do stays hidden. Agents reach the same edits through the MCP server's
newupdate_jira_issuetool (due date, priority, labels) under the--allow-remote-write
opt-in. -
Jira time tracking. On a linked Jira Cloud project that has time tracking enabled, the
issue view now shows the original estimate, remaining, and time spent with a progress bar.
Log work with Jira's duration grammar (2d 4h 30m) and an optional note, set or clear the
original and remaining estimates, and edit or delete your own worklog entries — the full
history is a "View all in Jira" link away. Agents get ajira_log_workMCP tool and
original/remaining-estimate parameters onupdate_jira_issue, both behind
--allow-remote-write. -
Resolve local-PR merge conflicts without touching your working tree. When a local
pull-request merge hits conflicts, GitDesktop now runs the merge in an isolated,
hidden worktree — your branch and working tree stay exactly as they were, so you never
need a clean tree (unless you're merging into the branch you're currently on). The PR
view opens a dedicated resolve surface with the conflicted files and the in-app conflict
editor (per-region accept + AI resolution), then Finish merge (commit + mark the PR
merged) or Abort (throw the merge away). The PR also pre-shows whether a merge will
conflict before you start. -
Local PR activity feed. A local PR's Conversation is now a date-sorted activity feed
too: it opens with a created marker, interleaves the branch's pushed commits (grouped,
each short SHA clickable to that commit's detail) with your comments, and ends with a
merged or closed marker once the PR reaches that state. -
GitHub Discussions tools for GitDesktop's MCP server. When run as an MCP server
against a GitHub repo, an agent can now browse discussions: list categories, list
discussions, and read a full thread with its nested replies (always-on reads). With
--allow-remote-writeit can also create a discussion in a category, comment on
one, mark/unmark a reply as the answer, and close or reopen a discussion — under
your authenticatedghidentity, with a Posted by GitDesktop footer on posted
comments. Discussions are a GitHub feature, so these tools return an actionable error on a
GitLab or Bitbucket remote. -
Full PR/issue forge-write surface for GitDesktop's MCP server. The
--allow-remote-writetools now go well beyond commenting: an agent can create, merge,
update, and close/reopen a pull request, toggle its draft state, request reviewers, edit
labels, set assignees (on issues and PRs), approve or withdraw approval, reply to and
resolve review threads, rerun/cancel/dispatch CI, and create or update releases — all
under your authenticated forge identity (GitHubgh, GitLabglab, or a stored Bitbucket
token). New read tools round it out: list labels, milestones, and releases, get a release,
list assignable users, and fetch a PR's full timeline. It stays gated behind the same
--allow-remote-writeopt-in, off by default. -
AI generation recipes over MCP. GitDesktop's MCP server exposes three ungated
generate_commit_message,generate_pr_description, andgenerate_branch_nametools that
hand a connected agent the same fully assembled context and prompt the in-app AI features
build — the staged or branch diff with GitDesktop's low-value-file budgeting, recent commit
subjects as a style reference, your repo and global instructions, and.aiignore
filtering. The tools don't call a model themselves; the agent completes the returned prompt
with its own inference, so you can trigger GitDesktop's generation from any MCP client. -
Local-git write tools for GitDesktop's MCP server. Run as an MCP server, GitDesktop
can now let a connected agent mutate the bound repo's working tree, index, and refs —
stage/unstage, commit (and undo the last commit), create/checkout/rename branches,
push/pull/fetch, stash push/pop/apply, merge, rebase, revert, cherry-pick, and tags —
behind a new--allow-git-writeflag. A further--allow-destructiveflag (required on
top of--allow-git-write) unlocks the irreversible operations: delete branch, discard
changes, reset, force-push (with lease), delete a remote branch, drop a stash, and delete a
tag. Two new read tools — list stashes and preview a merge's outcome — stay ungated. Both
flags are off by default, and agent-session branches (gd/session/*) are refused by the
branch-mutating tools so an in-flight agent session can never be broken. -
See and manage your global MCP install per client. In Settings → MCP servers →
Use GitDesktop as an MCP server, the Install globally section now shows a live row for
Claude Code and Copilot: whether GitDesktop is installed in that client's user
config, and whether it points at the current launcher or an older install (with a
one-click Reinstall to switch it over). Each installed client gets a Remove button
that takes the entry back out via the client's own CLI. -
One-click global MCP install (Claude Code / Copilot). Use GitDesktop as an MCP
server (Settings → MCP servers) can now installgitdesktopinto a client's global
user config — available in every project, no per-repo.mcp.json— alongside the
existing project.mcp.jsonwrite. Claude Code and Copilot each get a one-click
button that runs the client's own CLI (claude mcp add-json … -s user/
copilot mcp add …), using a project-aware--reposo the single global entry follows
whatever repo the client opens. The read-only/local-write/remote-write toggles carry over,
and an existing entry is replaced only after you confirm. -
See which permission tier your global MCP install runs. In Settings → MCP servers →
Use GitDesktop as an MCP server, each Install globally row (Claude Code / Copilot) now
reads out the installed entry's permission tier — e.g. Installed (local + remote writes),
or Installed (read-only). When the installed permissions no longer match the checkboxes
you've selected, the row switches to a warning and offers Reinstall to apply them, so a
stale global entry can't keep running old flags unnoticed. -
MCP: fetch a CI job's full log. GitDesktop's built-in MCP server gains a
workflow_job_logstool that returns a single CI job's complete log by job id (from a
run'sjobs[].id) — the whole job's output, not just its failed steps — so an agent can
drill from a run's jobs into any one job's logs (GitHub Actions and GitLab CI). -
Local-issue tools for GitDesktop's MCP server. Alongside the existing local-PR tools,
the--allow-writeopt-in now also lets a connected agent create a local issue, comment on
one, and set its status — GitDesktop's own app-data issue records for the bound repo,
nothing pushed to a forge. New ungated read tools list and get local issues (and list/get
local PRs), so an agent can read the app's local review artifacts without any write opt-in. -
One-click "add
gitdesktopto PATH." Use GitDesktop as an MCP server (Settings →
MCP servers) now has a Command-line launcher with an Add to PATH button, so the
baregitdesktop mcp …command resolves in any terminal without a hardcoded path or
GITDESKTOP_BIN. It appends the app to your user PATH on Windows (no admin — open a new
terminal afterward) or symlinksgitdesktopinto~/.local/binon macOS/Linux, shows
whether it's already on your PATH, and Remove reverses exactly what it added. -
AI generation recipes are now also MCP prompts. GitDesktop's MCP server exposes its
commit-message, PR-description, and branch-name generation recipes as native MCP prompts
(commit-message,pr-description,branch-name) — the slash-command-like primitive many
clients surface — alongside the existing recipe tools. Each assembles the same fully
prepared context and prompt the in-app AI feature builds and hands it to the client's own
model to complete. The prompts are read-only and always available, with no opt-in flag. -
Cross-forge PR/issue/CI tools for GitDesktop's MCP server. When run as an MCP
server, GitDesktop's pull-request, issue, and CI tools now work across GitHub,
GitLab, and Bitbucket — routed through the forge abstraction, they dispatch by the
repo's remote (Bitbucket covers PRs and pipelines; Bitbucket issues come later via
Jira). And a new set of remote-write tools can create and comment on issues,
close/reopen them, and comment on pull requests, gated behind a separate
--allow-remote-writeflag. These make real writes to the repo's forge under your
authenticated identity (GitHubgh, GitLabglab, or a stored Bitbucket token), and
are kept distinct from the local-PR--allow-writetools: enabling one never grants
the other, and read-only remains the default. PR comments an agent posts carry a
Posted by GitDesktop attribution footer, and a read tool returns a pull request's
full comment set — the conversation, review summaries, and file:line review threads —
so an agent can read a review before replying to it. -
More forge-write tools for GitDesktop's MCP server. The
--allow-remote-write
surface now lets an agent start a new file:line review thread on a pull request
(not just reply to an existing one), request changes or withdraw a change
request, edit an issue's title/body and set its milestone, and add or remove
reactions on an issue or pull request (or one of its comments) — all under your
authenticated forge identity (GitHubgh, GitLabglab, or a stored Bitbucket token),
and still gated behind the same--allow-remote-writeopt-in, off by default. -
Write GitDesktop's MCP config straight into
.mcp.json. The Use GitDesktop
as an MCP server panel now writes (and merges) itsgitdesktopentry into your
repo's.mcp.jsonfor you, preserving any other servers — no more copy-paste.
A Shareable entry toggle switches between machine-specific absolute paths and
portable${GITDESKTOP_BIN}/${CLAUDE_PROJECT_DIR}paths a teammate can commit,
and an Allow write tools toggle adds--allow-writeso agents can create,
comment on, approve, and set the status of this repo's local PRs — kept off by
default, leaving the server read-only. -
MCP server write tiers as checkboxes. The Use GitDesktop as an MCP server
panel now has toggles for all four write tiers — Allow write tools, Allow
remote write, Allow git writes (--allow-git-write, recoverable repo
mutations: stage/commit, branches, push/pull, stash, merge/rebase, tags), and
Allow destructive git writes (--allow-destructive, only enabled once git
writes are on: discard, reset, force-push, force deletions). Each toggle threads
its flag into the copyable snippet, the Write to .mcp.json action, and both
global installs, so you no longer hand-edit the config to grant a tier. -
Multi-line comment ranges. Drag across a range of lines in a diff and the
comment now lands as a true multi-line anchor on GitHub and GitLab —
across one-off review comments, pending-review drafts, and GitLab commit
comments — and clicking the + on any line of the drag reopens the same
range. Where a provider's API is single-line only (Bitbucket comments, and
GitHub/Bitbucket commit comments), the composer says so and anchors at the
last line rather than silently collapsing the range. -
Activity & notifications inbox. The header activity control is now a persistent bell:
alongside in-progress work (AI reviews, with Cancel) it keeps a history of terminal
events — a finished review, checks passing/failing, a PR approved / changes-requested /
commented / merged, a review requested from you, a completed CI run, or a finished agent,
research, or plan run. Each entry click-navigates to its source, unread items carry a badge, and the
list survives an app restart, so a review that finishes while you're away is never a
missed click. Open it with the command palette (Activity & notifications), clear items
or mark all read, and arrow-key through the list. Which events appear follows your
Settings → Notifications choices. (New-comment / new-review / review-requested
detection is GitHub-only for now.) -
Operation journal & interrupted-op recovery. GitDesktop now records the risky
compound operations it runs — local PR merges, cherry-picks, history edits, and
interactive rebases — each with the exact branch and commit it started from. If one is
interrupted by a crash or restart, a calm recovery notice appears above the Changes
list naming what was interrupted and the state it began from; it only informs (the
git-native Continue/Abort stay in the conflict bar). Browse the full log any time via the
Operation history command or the branch ⋮ menu. -
PR activity feed. A pull request's Conversation is now a single date-sorted activity
feed that interleaves reviews, comments, pushed commits, and events — on GitHub,
GitLab MRs, and Bitbucket PRs alike. A run of pushes collapses into a "pushed N
commits" row that expands to the commits, and each commit's short SHA is clickable — it
jumps to that commit's detail. GitHub shows the full event set (force-push, label
add/remove, review request, ready-for-review, convert-to-draft, close, reopen, merge,
rename); GitLab MRs add label add/remove, close/reopen/merge, and approval events
(approved / changes-requested / approval-withdrawn), with no force-push or draft events;
Bitbucket PRs add merge/close and approved / changes-requested, with no labels or
review-requests. An approval or changes-request that predates a later push is flagged
stale · N commits since. -
CI checks rollup with inline logs. A pull request's checks now fold into a rollup
summary — ✓ passed · ✕ failed · ● pending, each count with its own icon and word — that
auto-expands whenever something failed and lists the checks failures-first. This now
covers GitHub PRs, GitLab MRs (from the MR's pipeline jobs), and Bitbucket PRs
(from the PR head commit's build statuses). A failing GitHub Actions or GitLab
pipeline job peeks its job log inline, without leaving the PR, with an "Open full run"
link; external checks and Bitbucket build statuses (which expose no fetchable logs)
link straight out. -
PR commit detail. The Commits tab of a pull request is now navigable — arrow
through the rows and open any commit for its own detail view. A remote commit shows
its full message body and per-file diffs with a copy-SHA control; a local PR's commit
opens the full history commit detail. Works on GitHub, GitLab, and Bitbucket PRs. -
Labels & assignees when creating a PR/MR. The Create pull request dialog now has
Labels and Assignees pickers for GitHub and GitLab — set them up front instead
of after the PR/MR is open. (Bitbucket PRs have no labels or assignees, so it still
shows only its reviewers picker.) -
AI Generate when editing a PR/MR. The Edit dialog now offers the same Generate
button as the create flow, so you can write or regenerate an existing pull request's (or
merge request's) title and description with AI — including for PRs from forks, whose head
branch isn't checked out locally. -
Request reviewers on GitHub and GitLab pull/merge requests. The reviewers picker —
previously Bitbucket-only — now works on GitHub and GitLab too: request a review from a
collaborator (GitHub) or project member (GitLab) right from the PR/MR view, and see who's
currently requested, each shown with their avatar. (GitLab's free tier keeps only one
reviewer per merge request; if it drops the rest, GitDesktop tells you rather than
reporting a silent success.) -
Promote a worktree branch to your main workspace. From the Worktrees dialog (or the
command palette), bring the branch you've been working on in a linked worktree into your
main checkout in one step — it frees the branch, stashes any uncommitted work in the main
workspace so the checkout can't be blocked, and checks the branch out there. The branch
switcher also lets you jump straight to the main workspace (or any other worktree) instead
of routing through a checked-out branch, and reminds you when a checkout will land in a
linked worktree rather than the main one. -
Rebase a branch onto a different base. A new Change base… action in the
branch switcher (and command palette) fixes the "I branched off the wrong branch"
case: pick the branch you meant to base on plus the one you actually based on, and
GitDesktop replays only your branch's own commits onto the new base — leaving the
wrong base's commits behind. A moving-commits preview shows exactly what will move
before you run it, guards against a dirty tree, warns when the branch is already
pushed, and routes any conflicts into the usual resolve flow. -
Recover lost work — restore orphaned stashes without the CLI. A new Recover lost
work… action (in the branch ⋮ menu and the command palette) opens a Recoverable tab
in the stashes dialog that scans your repository withgit fsckfor orphaned/dangling
stashes — uncommitted work agit stashsaved but that has since fallen out ofgit stash list(dropped, or abandoned by an interrupted operation). Preview each one's files and
diff, then Restore to working tree re-applies it non-destructively (it applies the
stash, never dropping or committing), so you can recover work you thought was gone. -
Remove a worktree from the branch menu. A branch that's checked out in another
worktree now has a Remove worktree… action in its right-click menu in the branch
switcher, so you don't have to open the worktree manager to free it. The branch stays,
and its Delete… action un-disables once the worktree is gone. -
The Rename branch dialog can now suggest a name from your in-progress changes with AI — the same ✧ Generate from changes action the New branch dialog has.
-
Repo switcher and welcome list rows now show identity badges at a glance: a GitHub, GitLab, or Bitbucket logo for the forge the repo lives on (a cloud icon for a remote on an unrecognized host, a folder for a local-only repo), and a trailing lock (private), buildings (internal), or globe (public) for its visibility.
-
Compose a review, line by line. Click a line number (or drag across a range) in a
pull request's Files diff to open an inline composer: post a single comment right away,
or Start a review to batch drafts — which persist to disk per PR and survive a
restart. Pending drafts show at their anchors with edit and delete, a bar tracks the
count, and Submit review… posts the whole batch with a verdict (Comment, Approve,
or Request changes — offered where the provider allows, and Request changes needs a
summary). The composer can also insert a provider-correctsuggestionblock pre-filled
with the selected code, and reviewer suggestions now apply to your working tree on
GitLab and Bitbucket too, not just GitHub. -
Update a branch from its own upstream without switching to it. When a branch is
behind the remote it tracks, its right-click menu in the branch switcher now offers
Update from origin/… — fast-forwarding it (or merging in place if it's the current
branch) without leaving the branch you're on. Made for the "just merged a PR, bring the
default branch current before I switch back" flow: the default branch's row shows how far
behind its upstream it is after a fetch, and Update default branch from its remote is
available from the command palette. -
Update a fork from its upstream. When a repo has an
upstreamremote, the Pull menu
(and the command palette) gain Update from upstream: it fetches upstream, resolves its
default branch, and brings your current branch up to date — fast-forwarding silently when it
can, creating a merge commit when the histories have cleanly diverged, and routing conflicts
to the usual conflict editor. It never pushes for you; the Push button lights up on its own
once you're ahead.
Changed
- One unified "Publish repository…" control. The sync bar and the hosted-feature
empty states (Pull Requests, Issues, Discussions, Actions) now share a single publish
affordance: a plain button when one provider can publish a local-only repo, or a menu
to pick between GitHub, GitLab, and Bitbucket when more than one is ready — no more
stacked per-provider buttons. In those empty states, publishing now takes precedence
over the GitHub CLI setup steps whenever another provider can already publish the repo. - Empty states now teach their surface and offer the next action. Compare's
detached-HEAD and no-other-branches states explain what's needed and offer Switch
branch / New branch; Actions' empty runs list explains where runs come from
(provider-aware) with a Run workflow/pipeline button, and its branch-scoped empty
offers Show all branches; History's filtered no-match adds a Clear filter button;
and the Tags, PR Tasks, and Discussions empty states got clearer, more helpful copy. - Automations redesigned around a lifecycle grid. Automations (Settings → Automations,
and per-repo from a repository's ⋯ menu) are now grouped by moment — On commit, On pull
request opened, and On new commits to a reviewed PR — with AI code review and security
audit as toggles under each, so duplicate or conflicting rules are no longer possible. Each
enabled action can be scoped with branch conditions (include/exclude globs, plus a
Source / Target / Either match for PR events) and a "Try a branch" preview. Both the global
and per-repo surfaces now edit behind Save / Discard rather than saving on every toggle,
and the per-repo dialog shows the effective settings, badges overridden cells, can enable an
action that's globally off, and offers "Reset to global defaults". Your existing automations
are migrated automatically on first launch, with any duplicate rules merged and noted once. - Faster startup. The app now boots from a much smaller core bundle — agent sessions, diff rendering, the git-hooks editor, and the AI provider SDKs each load on first use instead of on launch.
- Codex model suggestions. The model picker for the Codex (CLI) provider —
in AI review, agent sessions, and plans — now suggests real model ids
(gpt-5.5,gpt-5.4-mini) instead of showing an empty list. Pick one, type your
own, or leave it blank to keep using your Codex account's default (still the
default when you switch to Codex, since the right model depends on your plan). - Collaborator and member avatars in Repository Settings now use the standard
avatar component, showing a letter fallback when a user has no picture instead
of a blank circle. - Copying a PR review's markdown now includes its file-anchored review threads —
the diff excerpt, every comment, and any suggested changes — so AI and bot
reviews (Copilot, CodeRabbit) paste complete instead of losing their findings. - Syntax highlighting holds up in large files. Diffs keep their syntax colors
much further into big files — an edit deep in a long file (past ~2,000 lines) no
longer silently drops all highlighting, and the size limit before a diff falls
back to plain text is now tuned per highlighter (400 KB for highlight.js,
150 KB for Shiki languages like Rust and TSX, up from a flat 100 KB). - Calmer error toasts. Long git and forge errors now show a single
humanized summary line with a Details action that opens a dialog with the
full, selectable text and a Copy button; short errors are unchanged and keep
their Copy action. - Forge views feel snappier. Repeated origin-remote lookups from the many forge queries a pull-request or merge-request view fires are now served from a short-lived in-memory cache instead of re-shelling out to
giteach time — noticeably fewer process spawns on Windows. - Provider avatars for assignees and authors. The assignee picker now shows each user's
photo (like the reviewers picker), and author avatars on pull/merge requests, issues, and
comments now use the person's real GitLab or Bitbucket profile photo instead of falling back
to their initial. (GitHub already showed avatars, derived from the username.) - The History tab stays smooth with thousands of loaded commits — rows now
render only as they scroll into view. - The Jira issue view now puts type, assignee, reporter, dates, agile fields, labels, and
time tracking in a right-hand side panel like the GitHub and GitLab issue views, so the
header stays compact and the description and comments get the freed space. - The MCP
list_pull_request_commentstool now caps each review thread's diff
hunk to its last few lines, so a comment on a brand-new file no longer drags
the whole file into the response. Passinclude_diff_hunk: falseto drop the
hunks entirely when you only need the threads' structure. - MCP
approve_pull_requestandrequest_changesnow work on GitHub. Both forge write
tools previously dead-ended on GitHub repos with a "goes through the Review menu" error;
they now route the GitHub arm throughgh pr review, so approving and requesting changes on
a PR work across GitHub, GitLab, and Bitbucket. (GitHub'srequest_changesrequires a
non-empty body; the error surfaces if it's omitted, and withdrawing a requested-changes
review stays unsupported on GitHub, asghcan't do it.) - MCP: cap or widen PR/issue lists. The MCP server's
list_pull_requestsand
list_issuestools take an optionallimit— omit it for the provider's default page
(GitHub ~30; GitLab and Bitbucket a full page), or pass one to raise or lower how many an
agent pulls back in a call. - MCP
create_pull_requestnow requires--allow-git-writein addition to
--allow-remote-write. Opening a pull request pushes the head branch to origin first — a
local-git write — so it now correctly demands the git-write tier as well, honoring the
rule that enabling one capability tier never grants another. - MCP: PR/issue text is flagged as untrusted to connected agents. The built-in MCP
server's read tools that return third-party prose —list_pull_requests,
get_pull_request,list_pull_request_comments,list_issues, andget_issue— now
prepend a note marking the titles, bodies, and comments as data to analyze, never as
instructions to follow, so an agent pulling a PR's comments in is less exposed to prompt
injection from an attacker-authored comment. Defense-in-depth: forge writes remain gated
behind--allow-remote-write. - Snappier UI after issue, pull-request, and Jira actions: closing, editing,
commenting, and changing labels/priority/due-date now refresh just the item
you touched instead of refetching the whole repository's data. - Notifications now always show which repository they're for and, for new-pull-request
notifications, the author with their avatar; the Activity & notifications panel is
slightly wider to fit. - Research → Plan → Implement handoffs now carry forward what the prior stage
already examined (files, searches, web sources), so the next agent starts from
that grounding instead of re-exploring from zero. - Create-PR branch picker. The branch dropdown now widens to fit the longest branch name (up to a limit) instead of clipping to the field width, and each option shows a chip when that branch is checked out in another worktree or is archived.
- Pull request rows now show when each PR was opened, matching the issue list —
#12 · author · 3 hours ago · head → base. Local pull request rows show their age
too. Each row also gains a small CI indicator a moment after the list loads — on
GitHub and GitLab, and on Bitbucket wherever a PR reports build statuses: a check for
passing, a cross for failing, and a clock for checks still running (rows with no
checks show none). Each icon has a distinct shape and a hover label, so the signal
never relies on color alone. - Archived branches no longer clutter the create-PR branch pickers. When opening a
pull request (GitHub/GitLab or a local PR), the base and compare dropdowns now hide
branches you've archived, matching the branch switcher. A branch that's still a seeded
default (your current branch, say) stays selectable even when archived. - Local-PR record actions moved off the footer. A local PR's footer is now just the
merge decision; Archive / Unarchive and Delete moved to a right-click menu on
the PR's list row (Delete still confirms, and never touches the branches). Both are also
in the command palette as Archive pull request and Delete pull request, acting
on the selected local PR. - AI review factors in its own prior comments. When you re-review a pull request, the AI
review now reads the comments GitDesktop has already posted on it — past reviews and any
agent follow-ups (a refutation, or a "fixed in<sha>" reply) — and treats a finding it
already resolved or refuted as settled instead of raising it cold again, unless the current
diff still shows the problem. Works on GitHub PRs and GitLab MRs (remote PRs only). - Smoother rendering across major surfaces — the changes list, staging diff,
settings, sync controls, conflict view, and history editor were silently
opted out of React Compiler optimization; they now compile and re-render less. - AI-generated repo descriptions are less terse. The Generate button for a
repository's About description now aims for a fuller single line (roughly 200–325
characters) that says what the project does and what makes it stand out, instead
of the old ~140-character cap that often produced a thin one-liner. GitHub's About
field already accepts up to 350 characters, so the result still fits. Long READMEs
are now condensed to keep their features and highlights breadth — dropping install
and development boilerplate — instead of being blindly cut off at 6,000 characters,
so the model sees what the project actually does rather than just its opening. - Repository settings: friendlier Description and Topics fields. In Settings →
General, the Description is now a multi-line box so a long "About" wraps
instead of clipping mid-word (GitHub and GitLab; Bitbucket already did). Topics
are now removable chips with an inline add-box: type a topic and press Enter or
comma to add it. On GitHub, each token is normalized to a valid topic as you add it and
the chip shows exactly what will be saved — soC++becomescandReact_Native
becomesreact-native, and pasted or space-separated text lands as clean chips instead
of being silently mangled on save; the field caps at 20 with a live count. On
GitLab, topics keep their case and spaces, so "React Native" stays one topic. Chips are
fully keyboard-navigable — arrow between them, remove the focused one with Enter or its
✕, and Backspace in an empty add-box removes the last one. - "Turn into a Plan" now distills the research session into a clean plan brief (via
one extra turn that forks the conversation, so it never disturbs the research
session itself) instead of handing the plan the raw multi-turn transcript — with
automatic fallback to the full report if distillation fails or is cancelled.
Distillation is currently available for Claude; other agents fall back to the full
report. - AI code review now has to trace its data-flow claims: a statement like "X arrives as
parameter Y, sliced to N" must point at a real call site or be left out — fewer fabricated
parameter and slicing claims in review findings. - AI PR reviews verify before flagging. The review now checks the typed contract
before reporting a possible null/undefined issue — a field the types declare
non-optional (or that every code path visibly sets) is no longer flagged — and it
omits a finding relayed from another AI reviewer when it cannot verify that finding
against the diff, rather than passing it along with a "could not verify" hedge. - Review comments read in context. On a GitHub PR, each review's line comments now
appear inline under that review in the Conversation timeline (grouped by file),
instead of being pooled in one block at the bottom — so you follow a review right where
it lands. Standalone line comments, and every thread on GitLab and Bitbucket (which
don't tie comments to a review), still gather in a by-file block below, retitled Other
line comments when some already appear inline above. Reply, resolve, apply-suggestion,
and keyboard navigation work the same in both places. - Repo-aware AI review starts faster: the PR head is no longer pre-fetched when its objects
are already present locally. - The app starts leaner: diff syntax-highlighting grammars and the session
terminal now load on first use instead of at startup, and markdown code
blocks highlight all languages — the rarer ones load their highlighter on
first use. - Dialogs are a little wider by default, and long branch names now wrap instead of overflowing — applied once in the shared dialog component, so every dialog (create/rename branch, the merge/rebase picker, and the rest) benefits.
Fixed
-
Deleting a worktree with installed dependencies now works on Windows. Removing an
agent-session (or manually created) worktree that hadnode_modulesinstalled — where
pnpm links packages through junctions/symlinks — used to fail with
"failed to delete '…': Invalid argument", leaving the worktree half-removed. GitDesktop
now finishes the removal itself (correctly deleting those links) when git's own delete
trips on the reparse points, and if a file is still locked by another program it says so
plainly instead of showing git's cryptic error. -
Checking out a remote-only branch that lives on more than one remote now works.
Clicking a remote branch in the branch switcher used to fail with "matched multiple
remote tracking branches" when the same branch name existed on two or more remotes.
The switcher now creates the local branch tracking exactly the remote shown on that
row, so the checkout matches what the row promised. -
Windows local-path repositories are no longer mislabeled with a bogus owner or host.
A repository whoseoriginpoints at a local path (e.g.C:\path\to\repo) was
misread as a hosted remote, tagging it with a nonsensical owner and host. Local-path
remotes are now recognized as having neither. -
The review-model picker no longer changes your global default. Switching the provider
or model in a pull request's Review panel now applies to that review only — it no
longer overwrites the default review model in Settings → AI. The panel shows a small note
while a one-off model is in effect, and resets to your default for the next PR. -
Windows: tools added to
PATHafter the app started are now found without a restart.
Windows never pushes aPATHchange into an already-running program, so a CLI you
installed (or added toPATH) while GitDesktop was open —glab,gh, or an agent CLI —
used to read "Not found" in Settings → About until you fully relaunched the app. The
resolver now also reads your live user and systemPATHstraight from the registry, so
detection (and the Re-check button) picks up a freshly-installed tool immediately. -
Host GitHub Copilot sessions no longer fail with "batch file arguments are invalid"
on Windows. When the VS Code Copilot extension is installed, it puts acopilot.bat
wrapper on yourPATHahead of the realcopilot.exe— and Windows won't let an app
pass a multi-line prompt to a batch file. GitDesktop now prefers a real.exeover a
.cmd/.batshim found earlier onPATHwhen locating any agent CLI, so it launches
the actual Copilot binary. (CLIs that ship only a.cmd, like Codex, are unaffected.) -
Codex agent sessions no longer show a blank "No response." Codex delivers its whole
reply at the end of a turn (it doesn't stream it incrementally like the other CLIs), and
the session view was discarding that final message — so every Codex turn looked empty.
The message is now displayed. -
A finished plan or agent run on a background tab now notifies you. The OS
notification for a completed plan/session was suppressed whenever the window was
focused and that run was selected — but since plans and sessions live on the Agent
tab, a focused user reading another tab (Changes, Pull Requests, …) was wrongly
treated as "watching it" and got nothing. The notification now only stays quiet when
the Agent tab is the one actually on screen. A plan that finishes with clarifying
questions — a blocking handoff that idles until you answer — now always notifies,
even while you're looking right at it. -
The "default branch for new repositories" setting now updates git itself.
Settings → Git's default-branch field used to be a GitDesktop-only preference: it
changed what the app's Create repository dialog did, but never touched your global
git config — sogit config --global init.defaultBranch(and a command-line
git init) still used the old branch. The setting now reads from and writes to your
global git config (init.defaultBranch), with its own Save, the same as the Git
identity field beside it — so GitDesktop and the command line finally agree. -
Container agent sessions now actually run the agent. A container-isolated
session was launchingnodeinstead of the agent CLI inside the container (the CLI
name wasn't passed as the command), so Claude/Codex/opencode sessions failed to
start in container mode. They now run correctly. (Host sessions were unaffected.) -
AI reviews now show why they failed. A failed PR/local review used to revert
silently to the empty "Run a review…" placeholder with no explanation; it now
displays the actual error (and keeps any partial output that streamed first).
CLI-agent failures also no longer surface as a useless[object Object]. -
The co-author picker is fully keyboard-navigable. When adding a commit
co-author, ↑/↓ now move through the suggestions and Enter adds the highlighted
one (it's a proper combobox), instead of only being able to add the top match or
reach for the mouse. -
A couple of dead-ends now explain themselves. The repository Insights error
no longer prints a raw error string, and the Actions toolbar's "Run workflow" and
refresh buttons, when disabled, now say they need a GitHub CLI sign-in instead of
greying out silently. -
Stopping or timing out an agent session now terminates the CLI's entire
process tree, so helper processes (language workers, MCP servers, tool
subprocesses) can no longer keep running in the background — previously on
Windows only the top-level CLI was killed, leaving its children consuming
tokens and holding worktree file handles. -
A cancelled automated PR review no longer re-runs after a restart. Cancelling an
automatic re-review of new commits on a pull request now remembers that commit, so it isn't
reviewed again when you relaunch the app. A genuinely new commit still triggers a review as
before. -
Automations no longer fire twice when two app instances (for example a main
checkout and a linked worktree) watch the same repository — a run is now claimed
atomically across processes before any AI work, so only one instance posts the
review. -
Concurrent automation-settings saves no longer overwrite each other — the
global defaults and a repository's overrides are each re-derived from fresh
state when saved, so two overlapping saves can't drop one another's change. -
Review threads on busy pull requests no longer disappear: Bitbucket comment
pages and GitHub review-thread pages are now followed across multiple pages,
instead of stopping at the first 100 and silently dropping the rest. -
Blaming a very large file no longer freezes the app — the blame view now
virtualizes its rows and syntax-highlights only the lines currently on
screen, instead of rendering and highlighting every line at once. -
Bot authors like dependabot, renovate, and github-actions now show
their real avatars in PR, issue, and timeline surfaces and in History, instead
of falling back to an initial — GitHub serves no login-derived avatar for bot
accounts, so GitDesktop now resolves them through the GitHub API once and caches
the result. -
A branch whose remote was deleted now offers "Publish branch." After a PR
merge deletes the remote branch, the sync bar no longer shows stale Push/Pull
against the dead ref — it shows Publish branch, which recreates the remote
branch on push. Undo-commit is available again on such a branch, and amending
its tip no longer wrongly demands a force-push. -
Cherry-picking commits onto another branch no longer risks uncommitted work. Cherry-picking onto the branch you're currently on could, if it hit a conflict, discard your uncommitted changes during rollback — it now refuses up front on a dirty working tree with a clear "commit or stash your changes first" message. (Untracked files are still fine.)
-
Repository Access settings no longer offer the Triage, Maintain, or Admin
collaborator roles on a personal (user-owned) repository. GitHub silently keeps
collaborators at Write there — picking a higher role returned success but never
applied — so the picker now shows Read and Write only (organization repos keep the
full set), with a short note explaining why. -
Switching to the Compare tab no longer clears the commit selected in History —
each tab now keeps its own selection. -
A requested Copilot review now shows in a pull request's Reviewers. A pending GitHub Copilot (or other bot) review request is displayed as a read-only chip in the PR Reviewers section instead of being invisible. The chip is display-only — the reviewer picker never adds or removes a bot, so managing human reviewers can't drop a pending Copilot request.
-
Large file diffs no longer flash or re-render while loading. The diff now waits
for its syntax-highlighting inputs (the whole-file context reads and any
lazily-loaded language grammar) to settle and paints once, instead of showing a
brief hunk-only pass that restructured a moment later. -
On a fork, the Actions tab now shows your fork's workflow runs, not the upstream
repository's. When a fork has anupstreamremote, GitHub's CLI would resolve the
parent repository, so the Actions list, run details/logs, re-run/cancel, "Run workflow"
dispatch, and the run notifications could all target the original repo. Every Actions
operation is now pinned to youroriginremote. Single-remote repositories are
unaffected. -
On a fork with an
upstreamremote, repo administration now always targets
your fork (the origin remote) rather than the upstream parent. This covers
repo settings, webhooks, Pages, collaborators & invitations, insights, code
security, rulesets, secrets & variables, generated release notes, branch-
protection import, and — most importantly — repository rename, transfer, and
delete. -
The GitLab auto-merge status poll now pauses while the Pulls tab is hidden,
instead of quietly polling the server every 8–30 seconds in the background.
Switching back to the Pulls tab refreshes it immediately. -
Long branch names no longer overflow the repository header. A very long
current-branch name used to push the header wider than the window, adding
horizontal (and cascaded vertical) scrollbars and hiding the sync controls.
The branch name now truncates with an ellipsis — hover it to see the full
name — while the icons, detached badge, and Fetch/Pull/Publish controls stay
fully visible. The truncation order is deliberate: the branch name gives way
first, then the CI badge's workflow label, and the repository name last. -
Long repository names no longer overflow the header. A repository name
or alias longer than the trigger's width used to paint past its box over
neighboring controls. It now truncates cleanly with an ellipsis — hover it to
see the full name — and at narrow window widths the repository and branch
triggers shrink together instead of the branch giving way alone. -
Hidden tabs and unfocused windows no longer keep polling — Actions run and
workflow queries pause while their tab is hidden, and GitLab merge-state and
agent-session diff polling stops while the window is in the background. -
Arrow-key navigation on the custom slash-commands list (Settings) and the
submodules list — move between rows with the arrow keys and act on the
active row (edit a command, or initialize/update a submodule) with Enter. -
Pull request, issue, and discussion lists no longer stop silently at 30 or 50.
These lists used to cap at the underlying CLI's default page (30 pull requests and
issues, 50 discussions) with no indication more existed. They now load the first 100
and, when a full page comes back, offer a "Load 100 more" row at the bottom that pages
the rest in — with a "Showing first N" count so you always know where you stand. -
Long pull request, issue, and discussion lists no longer stretch the window with
empty space. A list taller than the viewport could spill its full height into the
page, adding an outer window scrollbar over a large empty void. Lists (and the detail
panels) now contain their own scrolling, so the window stays put and only the list
scrolls. -
The local pull-request dialog's branch picker no longer lists internal agent-session branches (
gd/session/*). -
Installing the MCP server globally now finds
claude/copilotreliably. The
global install resolves the client CLI the same way the rest of the app does — checking
the system PATH, known install locations, and (on Windows) the live registry PATH — so
it no longer reports the CLI as "not found" when it lives in a directory that was added
to PATH after GitDesktop started. -
MCP server no longer blocks installs or gets killed by updates (Windows). When you
use GitDesktop as an MCP server, the generated config now launches a dedicated
gitdesktop-mcpcopy of the app instead of the installed executable. Running MCP
servers no longer lock the installer out with a "Files in Use" dialog, and are no
longer silently terminated mid-session by a passive auto-update. Add to PATH now
points at this launcher and migrates any older install-folder entry automatically. -
The merge dialog no longer offers to delete a branch it can't. When merging a
pull/merge request, the "Delete branch on the remote after merging" option is now
hidden when the head is the repository's default branch (which every forge refuses
to delete) and disabled with a reason when a branch rule protects it — matching the
branch switcher. Applies to GitHub, GitLab, and Bitbucket, including GitLab auto-merge. -
Merge-confirm dialog: long branch names (e.g. Dependabot's) no longer overflow the delete-branch checkbox label or the dialog description — the text now wraps cleanly.
-
New branch dialog: a long base-branch name (e.g.
feature/ollama-cloud-provider-custom-endpoints) no longer overflows the dialog — the "Branches from …" description and the base-branch selector now stay within bounds and the name wraps cleanly. -
A UI polish sweep across the app: disabled buttons now explain why they're disabled on hover, bot authors like dependabot display properly on PR rows and headers, PR list fetch failures show an error with retry instead of looking empty, relative times no longer show "24 hours ago" next to "1 day ago", and keyboard navigation & screen-reader labels were added to several lists and icon buttons.
-
Creating a pull request with labels or assignees no longer records each one
twice on the PR's activity timeline (e.g. "added the documentation label"
appearing twice). Labels and assignees are now applied right after the PR is
created rather than during creation, which GitHub's CLI double-recorded. -
Very large pull requests now show their full diff and complete file list
instead of failing or stopping at 100 files. When GitHub refuses the whole-PR
diff (its 300-file limit) or caps the file list at 100, both are rebuilt from
the paginated files API so every changed file appears in the rail and renders
its hunks. -
Merging a GitHub pull request with Delete branch checked now removes only the
remote branch, matching GitLab and Bitbucket — your local branch and whatever you
have checked out are left untouched (it previously deleted the local branch too and
switched you to the default branch). -
Running automation AI reviews now appear in the header's activity indicator —
where they can be cancelled — instead of a persistent toast that floated over
the pull-request action bar. Toasts now announce only the result and can be
dismissed with a close button. -
PR detail no longer truncates commits, reviews, or conversation comments at 100.
A pull request with more than 100 commits, reviews, or conversation comments previously
showed only the first 100 as if that were the whole list (GitHub's GraphQL connections
cap there). The PR view now completes each list from the paginated REST API, matching how
the changed-files rail already worked. -
When promoting a local PR or issue, or creating a sub-issue, a failure that happens
after the remote object was already created now tells you what was created (with a View
link) and closes the dialog, instead of showing a generic error that invited creating a
duplicate. -
Removing the currently open repository while also moving it to the system trash
(Recycle Bin on Windows, Trash on macOS/Linux) now closes it first, so the move no longer
fails with a raw "Some operations were aborted" error. If the folder is still locked by
another program, the message now explains that an open editor, terminal, or file-explorer
window is likely holding it — and the repository stays listed so you can close them and retry. -
Switching between repositories no longer briefly shows the previous repository's
pull requests, issues, discussions, or other lists before the new repository's load.
The panels now drop straight to a loading state on a repo switch, while still keeping
their rows in place during in-repo navigation like "Load more" and Open/Closed tab
switches. -
Fixed a rare lost update in stored AI review history: when two changes to a
PR's reviews landed at nearly the same time — for example an automated review
finishing while you edit or delete another review's text — one change could
silently overwrite the other. Overlapping writes are now serialized so neither
is dropped. -
Review-thread expand/collapse in the Files diff now toggles correctly under
rapid clicks, and clipped file paths in the review-comments list show the full
path on hover. -
Internal agent-session branches (
gd/session/*) no longer show up in the
cherry-pick target, GitHub Pages source, or default-branch pickers, nor in the
MCP server'slist_branchestool or branch-name generation context. -
GitDesktop now enforces a single running instance: launching the app again focuses the existing window — restoring it from the tray if needed — instead of opening a duplicate whose automations could double-fire (e.g. two AI reviews posted on the same PR).
-
Review-thread replies no longer clutter the PR timeline. Replying to a
review thread on a GitHub PR used to leave a bare, context-free "commented"
card in the conversation timeline (GitHub auto-wraps the reply in an empty
review); it now renders as a compact "replied in a review thread" row with the
file and line, plus a jump-to-thread link. On Bitbucket, thread replies no
longer appear twice -- once in the timeline and once inside their thread. -
On a branch that hasn't been published yet, the History tab no longer marks
every commit as "not pushed" — it now compares against the remote and flags
only the commits actually made on the branch (the ones above where it forked
from the default branch). -
Deleting a branch that's checked out in another worktree now explains which worktree
holds it instead of failing with a raw git error, and the branch-cleanup dialog leaves
such branches out of its delete list (they can still be archived). -
Kept session worktrees no longer leak their folder on Windows. When a worktree
couldn't be removed because git's own recursive delete tripped over reparse-point
links (hownode_modulesis laid out on Windows), the folder was left behind on disk.
Removal now finishes the job itself once it confirms the worktree has no uncommitted
work — a worktree with real unsaved changes is still preserved and surfaced, never
silently discarded. -
Merging a local pull request into a base branch that's checked out in another worktree
now fast-forwards that worktree instead of refusing, keeping its working tree in sync
(and failing with a clear message if that worktree has uncommitted changes). -
Local pull requests, issues, review history, review drafts, branch rules, and
automation rules are now keyed by repository identity rather than checkout path, so
they're shared across all of a repo's worktrees — a PR created in one worktree now
shows up in the main checkout, and the MCP server's local-PR tools no longer report
"no local PRs found" when the server is bound to a worktree.
Changed
- The GitLab clone browser lists your most recently active projects first. The listing
is capped at 100 projects, so ordering by activity also means anything past the cap is
the least-recently-active — not an arbitrary hundred. - Sharper AI security reviews. The security-review prompt was rebuilt to cut false
positives and surface real, exploitable issues. Every finding must now spell out a
concrete exploit scenario (no attack path, no finding) and carries a confidence score,
reported against a severity-scaled bar — eager on critical-impact issues, strict on
low-severity ones. Each risk category now pins its own "not an issue" list right beside
it, the model must name the specific guard that makes a risky sink safe before
dismissing it, and an exclusion list tuned to this codebase tells it what not to flag —
e.g. memory-safety bugs in Rust, React XSS withoutdangerouslySetInnerHTML, missing
client-side auth checks, DoS/rate-limiting, outdated dependencies, and attacks that depend
on controlling environment variables or CLI flags. Prompt-injection (XPIA) is now a
first-class category, with a carve-out so GitDesktop's own intentional embedding of repo,
PR, and diff content into its AI prompts isn't mistaken for a vulnerability. Applies to
both the quick (diff-only) and repo-aware security reviews, on any provider. - Higher-signal AI code reviews. The general code-review prompt was tightened to
raise signal without narrowing its scope. Findings are now ordered by severity with
clear definitions for blocker, should-fix, and nit; the real ones must
cite the concrete case that triggers them (the input, state, or code path), not just
an assertion; and the reviewer is told to include a finding only when it's confident,
skip formatting a linter already handles, and never let nits crowd out the real
issues. It stays a broad review — correctness, edge cases, security smells,
performance, clarity, and tests — and runs on any provider, including local models. - A steadier, tidier agent composer. The task box (Delegate, Plan, and the
in-conversation reply) now docks to the bottom of its panel like a terminal: the
text grows upward so the action row and Send never drift as you type. The
run controls also stopped overflowing — the provider and model stay out for quick
access, and run mode, reasoning effort, and MCP servers fold into a single
Options popover (with a count + summary so you can still tell at a glance
what's set). Best-of-N, the Codex-on-host MCP hint, and changing effort/MCP
mid-session all work as before. - Calmer repository settings. The repository settings dialog moved from a wrapping
row of eight tabs to a vertical sidebar — grouped into Repository, Security,
Publishing, and Automation — matching the app's main Settings. The Danger zone is
now its own sidebar item instead of riding the bottom of the General tab, so delete /
transfer / visibility live behind a deliberate click rather than below your topics.
Arrow keys move between sections, and the panel crossfades as you switch (respecting
"reduce motion"). - The in-app user guide caught up with the app. The guide (press the Open user
guide shortcut, or the ? menu) was rewritten and expanded to cover everything
that's shipped — Agent sessions (plan, delegate, best-of-N, isolation), the
Issues, Discussions, Releases & tags, Insights, and Repository
settings surfaces, the full provider list, and more — with arrow-key navigation in
its section rail. Keyboard shortcuts shown in the guide now read from your actual
bindings (so they show ⌘ on macOS and reflect anything you've rebound), and when
Hide AI features is on the guide hides its AI sections and mentions too. - Keyboard-navigable section sidebars everywhere. The Settings, Repository settings,
and user-guide sidebars now share one component, so all three navigate the same way —
↑ / ↓ to move between sections with a visible focus ring (the Settings sidebar was
the last one missing this).
pick the image's Node version (default 24 LTS, or 22 / 20) and which agents
to install (Claude / Codex), and adds Rebuild — which pulls a fresh base image
and reinstalls the CLIs so newer releases are picked up. Previously the image was
built once with a fixed Node version and every agent baked in, with no way to
update it. A stale image (built for a different Node/agent selection) is flagged
for rebuild, and starting an agent the image wasn't built with now fails with a
clear message instead of a cryptic in-container error. - Subtle, calm transitions in a few spots. A handful of state changes now ease
in instead of popping: the Send/Stop, Generate/Cancel, and Review/Cancel buttons
when an AI task starts or stops; agent sessions sliding in and out of the list as
you start, keep, or delete them; the "jump to latest" button in an agent chat;
the ahead/behind badges in the toolbar; and a soft fade as the Changes list
replaces its loading placeholder. Everything respects your system "reduce motion"
setting (it falls back to a plain fade or no animation). - The mint brand color now lives in the app, as a restrained accent. Primary
actions (Open repository, Commit, Send a task…), the current selection in lists,
and keyboard focus rings are now GitDesktop's mint instead of flat gray — so the
one primary action and where the keyboard is focused are obvious at a glance on
every screen. The calm monochrome base is unchanged; mint only marks action,
selection, and focus. Under the hood, the status colors (added / modified /
deleted, success / warning / error, merged) are now driven by shared design
tokens, so they stay consistent across every view instead of drifting per-screen,
and the diff line-selection highlight uses the accent instead of a one-off blue.
Fixed
- Rust diffs no longer lose syntax highlighting partway down a file. A large
Rust diff could render the top of a file highlighted and everything past a
certain line as plain text — a quirk of the lightweight highlighter mis-reading
a character literal or lifetime and giving up on the rest of the file. Rust now
renders with the same VS Code-grade grammar already used for TypeScript, Vue,
and others, which highlights every line reliably.
Added
- GitHub Copilot CLI joins Claude Code and Codex as an agent. Pick GitHub
Copilot in the agent-session composer to delegate a task to it — keyless, via
your Copilot subscription. It runs worktree-confined on the host (its file edits
are limited to the worktree), and multi-turn follow-ups resume the same session.
Copilot is also available as a code-review provider, and it appears in Settings →
About alongside the other CLIs. (Container isolation and repo-aware review for
Copilot are coming next; anopencodeslot is recognized for a future release.) - Delegate a task to an AI agent, and iterate with it (agent sessions). A new
Agent tab lets you hand a coding task to an AI agent that writes the code for
you. It runs full-auto inside an isolated, throwaway git worktree — a separate
checkout, so your working tree, staged changes, and current branch are never
touched no matter what the agent does. For stronger confinement you can opt
into running each session inside an ephemeral Docker/Podman container
(Settings → AI), so the agent's filesystem writes are limited to the worktree
by the kernel — GitDesktop builds the small agent image for you. It's a
conversation: watch the agent
work as its narration streams into the conversation, then send follow-ups ("now
also handle the empty case", "undo that part") and it keeps going with full
context — each turn becomes a reviewable checkpoint commit. The composer stays
pinned while output streams (it grows as you type, then scrolls), Enter sends
and Shift+Enter adds a line, and a Latest button jumps you back to the
newest output if you've scrolled up. Press ↑/↓ to recall your previous
prompts (like a terminal), and any turn that came back empty or errored
offers Edit & resend to pull its prompt back into the composer and retry.
Type@to reference a repo file, and file paths the agent mentions are
clickable — they open in your editor. Flip
between the Conversation and a dedicated Changes view (the full diff so
far) right in the session. Pick the provider (Claude, Codex, or Copilot),
the model, and a reasoning-effort level for the session — model and
effort are changeable as you go (effort maps to each CLI's own mechanism, so it
applies where the provider supports it). Run
several sessions at once — each gets its own worktree and runs independently,
listed in the sidebar so you can start one, switch to another while it works
(arrow keys included), and come back. The sidebar groups sessions into
Active and Kept tabs (with counts) so finalized work doesn't crowd
what's ready to review, and a search box filters by task, branch, or any
message. An OS notification fires when a turn finishes — unless you're
already watching that session — so you can start one and step away. Sessions
are remembered across
restarts — close and reopen the app and your sessions are still there, ready
to keep iterating (a follow-up picks up right where it left off). When you're
happy, Keep the work — optionally squashing the per-turn commits into one —
and it lands on its own branch ready to open as a PR. Kept sessions stay in
the list, so you can come back later: Resume re-opens one and continues
the conversation right where it left off, or Delete removes it from the app
(the branch is preserved). Discard throws an in-progress session away
entirely (branch and all). New session, Keep, Resume, Delete, Discard, and the
view toggle are all in the command palette and keyboard-bindable. It
builds on the CLI agent you already have — Claude Code or Codex (pick
Release notes truncated — see the full changelog for the rest.