Skip to content
tongsv1.1.0
GitHub
docsprojectv1.0.5

tongs 1.0.5

Released 2026-10-10. This is a larger patch release. It corrects CI status, merged state and unresolved thread counts read from GitHub and GitLab, sends fewer forge requests and reports rate limits clearly, keeps review lists fresh after you act on them, makes two-press confirmations expire, loads the All Open tab in parallel, and keeps tongs desktop install working as releases accumulate. Some fixes change what you see, such as CI icons and unresolved counts; each one is described below. Nothing in your configuration or drafts changes.

Terminal window
pipx install tongs==1.0.5

pip install tongs==1.0.5 and uv tool install tongs==1.0.5 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, upgrade the core first and then install the matching desktop release, because the desktop app and the core exchange new optional fields in this release:

Terminal window
tongs desktop update
  • CI rows that showed ? now show a result. On GitHub, skipped and neutral checks no longer hide the outcome: they count as passing, so a pull request whose other checks passed shows success, and one with a failed check shows failure. A commit whose checks were all skipped shows as skipped. startup_failure counts as failed and stale as pending. Check runs are read past the first 100. Because fewer rows are unknown, sorting the inbox by CI (s) places these rows among the passing and failing ones, so the order you see changes. (#295, #398)
  • GitLab pipelines that are still cancelling show as running, and pipelines waiting for an external callback show as pending. (#295)
  • GitHub review search reads up to 1,000 results. It used to stop silently at 100. It now follows pages up to GitHub’s 1,000-result limit, which can use more requests on a large search, and says when it could read only part of the results. A host that returned only part of its results gets its own warning instead of being reported as skipped. (#295, #399)
  • The Pipelines tab of a GitHub pull request lists only runs for its head commit. Retry and Cancel act only on those runs, not on every run whose branch name matches. pull_request_target runs, which GitHub starts on the base commit, are no longer listed for the pull request. (#296, #399)
  • Each forge host has its own request limit. max_parallel in [concurrency] (8 by default) now limits the requests sent to each forge host at once, counting list, CI, GraphQL and job log requests, in the terminal app, the desktop app and tongs-mcp. Lists are read 100 items at a time instead of 20, so a large inbox needs fewer requests. (#304, #398)
  • Rate limits are reported as rate limits. A 403 with rate-limit headers or Retry-After, and any 429, are now recognized as a rate limit. A read waits up to 60 seconds and retries once; a longer wait fails at once with the time to retry. (#304)
  • Rate-limited writes fail at once with the retry time. A write, such as a review submission, an approval or a merge, is never resent after a rate limit. A rate-limited review submission now reports the rate limit instead of an unknown outcome. (#304)
  • A slow keyring or token command no longer freezes the app. Token lookup runs in the background. A failed sign-in is now remembered for up to 60 seconds for that host, so tongs does not ask again on every request. Until then, or until you press Refresh, a fixed token is not tried; Refresh tries it again once the failure is a few seconds old. (#304, #309)
  • GitHub pull requests that were merged show as merged instead of closed, and tongs-mcp list_mrs accepts state=merged. (#294, #399)
  • Unresolved counts include only threads that can be resolved. GitLab thread resolution is read per note, and single comments that are not part of a resolvable discussion are no longer counted. GitHub resolution is read from the pull request’s review threads, so resolved threads no longer look unresolved. Your counts can drop after upgrading. (#294)
  • GitHub comments on removed lines show on the old side of the diff, and outdated comments keep their original line. Threads on the old side of a renamed file show on the right lines in the desktop diff, and two threads on one line of such a file get distinct “1 of 2” labels. (#294)
  • Both apps say when the forge cut the file list short. When GitLab reports “1000+” changes, or GitHub reports more than 3,000 files, a banner above the diff says the list is incomplete and points you to the forge. (#297, #399)
  • A GitLab file that was renamed and had its mode changed no longer shows as “Rename only”. (#297)
  • Refresh reads from the forge. Ctrl+R in the inbox now skips the local cache and stores the new list in its place, so a merged merge request never shows as open after you refresh. A list read that started before an approval, merge, close or CI action is never cached, and retrying or cancelling a pipeline reads that repository’s list again. A refresh keeps cached diffs. The inbox guide has the details. (#309, #400)
  • Two-press confirmations expire. The second press must come within 5 seconds and on the same item; a later press starts over. Switching tabs or refreshing cancels a pending confirmation. This covers approve, unapprove, merge, close, pipeline retry and cancel, resolving a thread in both diff layouts and the discussion list, and the choices in the review submit dialog. (#298, #400)
  • The All Open tab loads repositories in parallel. Repositories are read up to max_parallel at a time instead of one after another, and rows appear as each repository finishes, with a line such as “Loading 37 of 112 repositories”. The highlighted row stays on its merge request while rows arrive. (#293, #400)
  • A failing repository no longer hides the rest of the All Open tab. Warnings name the repository, and failures that affect a whole host are grouped into one line with a count. If every repository fails, the status says that the rows on screen are earlier results. (#293)
  • Refresh reviews reads from the forge, the same as Ctrl+R in the terminal app, and tries a failed sign-in again once the failure is a few seconds old. (#309)
  • The header says “Updates are available” only when the app needs to resynchronize, not after every review or pipeline change. When the local service has stopped, it reads “Local service not running. Quit and reopen Tongs.” (#325, #394)
  • If the first repository discovery fails, the inbox shows the error and a Retry button instead of waiting forever. (#325)
  • When a view fails, its error message offers Try again, which reloads the view in place. (#325)
  • A service that does not start in time reports “The desktop service did not start in time.” instead of a message about a timed-out change. (#325)
  • Installing no longer depends on how many releases exist. tongs desktop install and tongs desktop update ask GitHub for the one release that matches your tongs version, instead of listing every release, which stopped working once about 30 releases had been published. tongs 1.0.4 and older still list releases, so tongs desktop update run from 1.0.4 is still subject to that limit until tongs 1.0.5 is installed. Upgrade the core first. (#299, #393)
  • When GitHub’s anonymous rate limit is reached, the installer says so and names the time to retry, in your local time zone. (#299)
  • A ~/.local/share/applications folder that is a symlink to a folder you own works, as dotfile managers such as GNU Stow and chezmoi set it up. (#299)
  • Staging folders left behind by an interrupted install are removed by the next install, update, repair or uninstall. (#299)
  • Troubleshooting explains each installer download message and what to do about a symlinked menu folder. (#299)
  • The release builds and the Fedora 44 check install their Python dependencies from hash-locked files, so a replaced package fails the build instead of being installed. (#340, #399)

The GitHub Release carries the same set of assets as 1.0.4, for version 1.0.5: 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 lists the defects known in 1.0.5, with the issue and milestone for each fix.