Download Latest Version GitDesktop_0.12.2_x64_en-US.msi (20.3 MB) Google Add to Preferred Sources
Home / v0.2.0
Name Modified Size InfoDownloads / Week
Parent folder
latest.json 2026-07-14 128.1 kB
GitDesktop_universal.app.tar.gz.sig 2026-07-14 408 Bytes
GitDesktop_universal.app.tar.gz 2026-07-14 33.1 MB
GitDesktop_0.2.0_universal.dmg 2026-07-14 32.3 MB
GitDesktop_0.2.0_x64-setup.exe.sig 2026-07-14 420 Bytes
GitDesktop_0.2.0_x64-setup.exe 2026-07-14 11.9 MB
GitDesktop_0.2.0_x64_en-US.msi.sig 2026-07-14 420 Bytes
GitDesktop_0.2.0_x64_en-US.msi 2026-07-14 17.1 MB
GitDesktop_0.2.0_amd64.AppImage.sig 2026-07-14 424 Bytes
GitDesktop-0.2.0-1.x86_64.rpm.sig 2026-07-14 420 Bytes
GitDesktop_0.2.0_amd64.AppImage 2026-07-14 94.4 MB
GitDesktop-0.2.0-1.x86_64.rpm 2026-07-14 18.7 MB
GitDesktop_0.2.0_amd64.deb.sig 2026-07-14 416 Bytes
GitDesktop_0.2.0_amd64.deb 2026-07-14 18.7 MB
GitDesktop v0.2.0 source code.tar.gz 2026-07-14 5.4 MB
GitDesktop v0.2.0 source code.zip 2026-07-14 6.0 MB
README.md 2026-07-14 119.9 kB
Totals: 17 Items   238.0 MB 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.Dockerfile that starts FROM 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 the write:pullrequest:bitbucket and write:pipeline:bitbucket token 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 as origin, 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 local origin remote 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.yml defines 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 as gh, 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 as origin, 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 — sign glab in 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-host glab credentials.
  • 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 #N identifier (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 just localhost. 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 and localhost are 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 with git 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 through gh, 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 the gh auth refresh scope 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 to gh.
  • Auto-fetch (background sync). GitDesktop now keeps the open repo's view of its remote current on its own: an opt-out periodic background git 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 tagged mcp-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.json or 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 stdio and 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 an npx-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 your gh sign-in lacks the delete_repo scope and shows the exact gh auth refresh command 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.yml to 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 your gh token's OAuth scopes, groundwork for features that prompt for the exact gh 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/completions endpoint 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/skills store (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 @file mentions.
  • 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, so pnpm 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 (not git 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 get jira_* tools to list and read the linked project's issues, plus comment, close/reopen, create, and assign behind the --allow-remote-write opt-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 new update_jira_issue tool (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 a jira_log_work MCP tool and original/remaining-estimate parameters on update_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-write it 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 authenticated gh identity, 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-write tools 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 (GitHub gh, GitLab glab, 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-write opt-in, off by default.
  • AI generation recipes over MCP. GitDesktop's MCP server exposes three ungated generate_commit_message, generate_pr_description, and generate_branch_name tools 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-write flag. A further --allow-destructive flag (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 install gitdesktop into a client's global user config — available in every project, no per-repo .mcp.json — alongside the existing project .mcp.json write. 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 --repo so 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_logs tool that returns a single CI job's complete log by job id (from a run's jobs[].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-write opt-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 gitdesktop to PATH." Use GitDesktop as an MCP server (Settings → MCP servers) now has a Command-line launcher with an Add to PATH button, so the bare gitdesktop 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 symlinks gitdesktop into ~/.local/bin on 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-write flag. These make real writes to the repo's forge under your authenticated identity (GitHub gh, GitLab glab, or a stored Bitbucket token), and are kept distinct from the local-PR --allow-write tools: 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 (GitHub gh, GitLab glab, or a stored Bitbucket token), and still gated behind the same --allow-remote-write opt-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) its gitdesktop entry into your repo's .mcp.json for 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-write so 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 with git fsck for orphaned/dangling stashes — uncommitted work a git stash saved but that has since fallen out of git 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-correct suggestion block 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 upstream remote, 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 git each 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_comments tool 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. Pass include_diff_hunk: false to drop the hunks entirely when you only need the threads' structure.
  • MCP approve_pull_request and request_changes now 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 through gh pr review, so approving and requesting changes on a PR work across GitHub, GitLab, and Bitbucket. (GitHub's request_changes requires a non-empty body; the error surfaces if it's omitted, and withdrawing a requested-changes review stays unsupported on GitHub, as gh can't do it.)
  • MCP: cap or widen PR/issue lists. The MCP server's list_pull_requests and list_issues tools take an optional limit — 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_request now requires --allow-git-write in 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, and get_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 — so C++ becomes c and React_Native becomes react-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 had node_modules installed — 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 whose origin points 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 PATH after the app started are now found without a restart. Windows never pushes a PATH change into an already-running program, so a CLI you installed (or added to PATH) 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 system PATH straight 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 a copilot.bat wrapper on your PATH ahead of the real copilot.exe — and Windows won't let an app pass a multi-line prompt to a batch file. GitDesktop now prefers a real .exe over a .cmd/.bat shim found earlier on PATH when 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 — so git 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 launching node instead 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 an upstream remote, 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 your origin remote. Single-remote repositories are unaffected.
  • On a fork with an upstream remote, 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 / copilot reliably. 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-mcp copy 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's list_branches tool 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 (how node_modules is 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 without dangerouslySetInnerHTML, 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; an opencode slot 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.

Source: README.md, updated 2026-07-14