Skip to content

ThinkWatch Lite 2026.9.25

Choose a tag to compare

@github-actions github-actions released this 29 Sep 17:06
· 77 commits to main since this release
bcbc499

Upgrade notes:

  • The bundled core is now 0.56.0, which speaks control-plane protocol 30. A remote server has to run core 0.56.0 too: this version does not connect to 0.55.x, and 2026.9.24 and earlier do not connect to 0.56.0.
  • Request history is kept.
  • Strategy groups no longer have the sticky-session switch. A configuration in which it was turned off contains session_affinity: false under that group; core 0.56.0 refuses such a configuration and the app starts in safe mode, naming the line. Delete the line.

Failover:

  • An upstream can answer, open a stream and then report an error before sending anything, such as Anthropic's overloaded_error or a response.failed when a ChatGPT account's usage limit is reached. The client used to receive that error. A streamed answer is now held until its first content arrives, and an error before that point sends the request to the next upstream of the route. What was received while waiting is passed on unchanged.
  • Upstreams that reject the credential (401, 403), report no balance (402) or do not have the model (404) now send the request to the next upstream as well. A 400 or 422 does so only when the upstream says the balance or quota is used up or the model is unavailable; other client errors still go straight back. When no upstream is left, the last upstream's own error reaches the client.
  • How long a failing upstream is paused depends on the reason it gives: an insufficient balance pauses it for 30 minutes, a used-up quota until the reset time the upstream names (1 hour when it names none), a rate limit for the wait it asks for (at most 1 hour). Failures without a stated reason pause it after 3 in a row, for 1 minute, doubling with each further pause up to 10 minutes.
  • Settings › Failover sets all of these, including how long to wait for a streamed answer's first content (15 seconds).

Prompt cache across a conversation:

  • A conversation now stays with the upstream that answered it, including one that took over after a failover: always within a turn, and in later turns while its prompt cache is still warm. Load-balance groups spread only new conversations.
  • The routing decision made at the start of a turn holds until the turn ends, so a rule on input size or images no longer switches upstreams halfway through an agent's work.
  • The request details' Routing tab says when a request kept its turn's route or stayed with the upstream that answered before.

Import links: a relay or vendor can hand out a link, thinkwatch://import?… or https://thinkwat.ch/import#…, that pre-fills a new upstream with a name, base URL, protocol, API key and model list. The app shows the settings and the host that will receive requests and the key, and writes nothing and contacts nothing until Create is chosen. A link only adds one upstream: it cannot change existing upstreams, headers, proxies, pricing or routes, and a key that refers to an environment variable is rejected. The parameters and a link builder are in Import links.

Token counts: Claude Code asks for a token count on every turn, which only an upstream in Anthropic's format can answer. Routed to an upstream of another format, or to a relay that does not implement it, the count used to fail; the gateway now answers with its own estimate, sends nothing to that upstream, and shows it in the attempt chain as estimated locally.

Reasoning after a switch of account: reasoning that one account produced is sealed for that account, and another account or key refuses a request that carries it back. After a failover between accounts such a request is now sent again without it, and later turns of the conversation leave it out from the start.

Downloads

Platform File
macOS, Apple silicon ThinkWatch-Lite-2026.9.25-arm64.dmg
Windows, x64 ThinkWatch-Lite-2026.9.25-x64-setup.exe
Windows, ARM64 ThinkWatch-Lite-2026.9.25-arm64-setup.exe
Linux, x86_64 ThinkWatch-Lite-2026.9.25-x86_64.AppImage
Linux, aarch64 ThinkWatch-Lite-2026.9.25-aarch64.AppImage

Each file is published with a .sha256 file beside it. latest.json is the manifest for in-app updates, and install.sh is the Linux install script.

On macOS, Homebrew installs the same disk image:

brew install --cask thinkwatchproject/tap/thinkwatch-lite

On Linux, the install script downloads the AppImage for the machine's architecture, checks its SHA-256 and installs it as ~/Applications/ThinkWatch-Lite.AppImage:

curl -fsSL https://github.com/ThinkWatchProject/ThinkWatch-Lite/releases/latest/download/install.sh | sh

Both commands install the latest release. First-launch steps for each platform, such as removing the quarantine attribute from a copy downloaded on macOS, are described in the README.

Verifying a download

A .sha256 file holds the SHA-256 of the file followed by its name. With both files in the current directory, on macOS:

shasum -a 256 -c ThinkWatch-Lite-2026.9.25-arm64.dmg.sha256

On Linux:

sha256sum -c ThinkWatch-Lite-2026.9.25-x86_64.AppImage.sha256

On Windows, in PowerShell, the following prints True when the installer matches:

(Get-FileHash .\ThinkWatch-Lite-2026.9.25-x64-setup.exe).Hash -eq (Get-Content .\ThinkWatch-Lite-2026.9.25-x64-setup.exe.sha256).Split()[0]

The Homebrew cask and the Linux install script check the SHA-256 themselves.

What's Changed

  • Import links: pre-fill a new upstream from thinkwatch://import by @fylorn in #252
  • Use core v0.56.0: failover settings, conversation continuity, local token counts by @fylorn in #253
  • chore: 2026.9.25 by @fylorn in #254

Full Changelog: v2026.9.24...v2026.9.25