tongs 1.0.4
Released 2026-10-10. This patch release fixes review submissions that could get stuck after the forge rejected them, merge requests that GitLab reports as having “1000+” changes, and several terminal keys that most terminals never delivered. Release tags now publish only after the release passes its checks. Nothing in your configuration or drafts changes, and older versions of tongs can still open your drafts.
Install
Section titled “Install”pipx install tongs==1.0.4pip install tongs==1.0.4 and uv tool install tongs==1.0.4 work the same
way. To upgrade an existing installation, run pipx upgrade tongs, or
uv tool upgrade tongs, or pip install --upgrade tongs. If you use the
per-user desktop app, install the matching desktop release after the core:
tongs desktop updateReview drafts
Section titled “Review drafts”- A paused submission can return to editing. When the forge rejects a step of a submission, for example GitHub refusing to let you approve your own pull request, or GitLab answering with a 400 error, tongs pauses the submission. Until now the only way forward was to resume, which sent the same rejected step again, and the draft stayed locked until you restarted tongs. Both apps now let you return the draft to editing. If nothing reached the forge, the attempt is cancelled and the whole draft is editable again. If some steps were confirmed, they stay on the forge and only the remaining text comes back. (#300, #390)
- Drafts that stayed marked as out of date are usable again. Whether a draft is out of date is now worked out against the merge request’s current revision each time it is read, instead of being stored once. (#300)
- Interrupting the start of a submission, or a retry, can no longer leave the draft locked. A “retry remaining” that fails its first check goes back to the unknown-outcome choices instead of pausing. (#300)
The terminal app
Section titled “The terminal app”- The submit dialog says why a submission paused. The dialog and the draft
bar show the forge’s reason, and offer
rto resume only when resuming can help. Press2twice to return the draft to editing, the same confirmation as for an unknown outcome. (#307) Escapeandqno longer leave the screen while a submission or a draft change is in progress, so the write is not abandoned halfway. Leaving a pipeline job view still works.Ctrl+Qstill quits at any time; if a submission is in progress, its outcome is recorded as unknown, so check the forge before you retry it. (#307)- A failed reload after a submission error no longer closes the app. (#307)
Shift+Nmoves to the previous file in the diff viewer. It was bound to a key most terminals never send. (#323)- Cycling to the next recovered review draft of a merge request is now
Ctrl+Ninstead ofAlt+], which most terminals and tmux never delivered. The footer shows it when a merge request has more than one draft. (#323) ?shows or hides the keybindings panel instead of a short hint, and the command palette also lists the built-in commands, such as changing the theme. (#323)Ctrl+Ycopies the merge request URL through the terminal, so it also works over SSH in terminals that support clipboard access. (#323)
The desktop app (beta)
Section titled “The desktop app (beta)”- The Your review drawer offers Return draft to editing next to Resume confirmed attempt for a paused submission. (#300)
- A paused submission stays listed for recovery when you close and reopen the review drawer, and the drawer reloads the draft after a submission fails to start. (#300)
Forges
Section titled “Forges”- GitLab merge requests whose change count GitLab reports as “1000+” open in both apps. They used to fail to load. Showing that such a diff is incomplete is planned separately. (#297, #386)
- When GitHub rejects an approval for a reason other than approving your own pull request, tongs shows GitHub’s message instead of saying you cannot approve your own pull request. (#343, #350)
Release and packaging
Section titled “Release and packaging”- Tags publish only from a checked release. A version tag now publishes to
PyPI and the GitHub Release only when its commit is on
main, its release notes exist, and continuous integration passed onmainfor that commit. (#320) - The desktop archive builder uses the current Fedora 44 builds of
expatand Python 3.12, after Fedora replaced the ones it had pinned, and its build evidence keeps the builder’s full installed package list. (#340, #351, #388)
Continuous integration
Section titled “Continuous integration”- Each pull request runs the checks for the files it changes, and every test runs in exactly one job. A change that is hard to classify still runs everything. (#354)
- The test suite keeps the tests that a realistic code change can break, and new tests cover the diff parser, the scanner, the forge clients, the MCP server, the desktop installer and the packaging checks. (#348, #368 to #378)
- Lint covers every Python script and repository Markdown file that CI checks. (#302)
Release assets
Section titled “Release assets”The GitHub Release
carries the same set of assets as 1.0.3, for version 1.0.4: the per-user
archive with its release manifest and Sigstore attestation, the unsigned Fedora
44 RPMs with their source-built companion packages, the archive SBOM with its
attestation, and SHA256SUMS. Install the RPMs together with
dnf install ./*.rpm.
Known issues
Section titled “Known issues”Known issues lists the defects known in 1.0.4, with the issue and milestone for each fix.
Thanks to @rd4398 for the terminal key fixes, their first contribution to tongs, and to @tayfuryldz for the approval message fix and most of the new tests.