Repository navigation
Releases
ThinkWatch Core 0.92.0
Multi-turn reasoning history is now encoded for the selected upstream's request capabilities. Native thinking blocks, ordering, signatures and source identity survive protocol conversion. Explicit upstream and model settings select reasoning_content, reasoning, native content blocks or omitted history. Incompatible signed histories are rejected before sending.
Automatic mode can learn from precise structured HTTP 400/422 validation errors that reject an assistant history field. It omits only that rejected unsigned field, re-encodes from the original request, reapplies outbound redaction and retries once. It does not guess another format or negotiate from ambiguous errors, SSE errors or timeouts. Request-schema repairs share one budget across providers and existing effort, cache-breakpoint and sealed-history recovery paths.
Only accepted adjustments are cached. Observations are isolated by upstream, resolved credentials, model, API and tool/thinking mode, expire after 24 hours and reset on configuration reload or restart. Learning and expiry are managed internally and require no additional UI or user configuration. Existing advanced upstream/model overrides remain authoritative and survive ordinary provider and model-spec edits. Required and signed history are excluded from automatic omission.
The control-plane protocol remains 58. The request-store schema remains 28; no database migration is required. This addresses the reproduced multi-turn field rejection in ThinkWatch Lite #407. The original streaming-delay report still needs reporter confirmation or a complete capture.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.92.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.92.0An installation made with the script switches to 0.92.0 with:
sudo twcore upgrade --version 0.92.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
Full Changelog: v0.91.0...v0.92.0
ThinkWatch Core 0.91.0
Model aliases can now optionally hide their mapped original names from client model lists. Enable hide_originals: true on an alias, or use the matching setting in ThinkWatch Lite. Existing aliases keep showing both names by default.
The shared discovery policy covers OpenAI and Anthropic model lists, Gemini model lists and the native Codex catalog. It applies after existing protocol, availability and gateway-key permissions. Original names remain callable and single-model lookups keep working with their existing permissions and routing. Administrative inventories, upstream targets and request history remain complete.
Changes take effect through configuration hot reload. Clients may cache their model pickers and need a list refresh. Shared targets reappear only after the last effective hiding alias is disabled or removed. Alias edits, renames and configuration packs preserve the setting; older clients that omit it while editing keep the stored value.
The control-plane protocol remains 58 and the request-store schema remains 28. No database migration is required. The extended alias object format requires this Core version or later.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.91.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.91.0An installation made with the script switches to 0.91.0 with:
sudo twcore upgrade --version 0.91.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
Full Changelog: v0.90.0...v0.91.0
ThinkWatch Core 0.90.0
Core now serves a native Codex model catalog at GET /codex/models?client_version=<major.minor.patch>. Changes to upstream models, aliases, enabled ranges, manual capabilities and gateway-key permissions appear on the next catalog request through the existing hot reload path. The standard OpenAI /v1/models response stays unchanged.
The catalog uses the same authentication, allowed source addresses and model permissions as inference. Version-matched upstream definitions retain their native instructions and tools when available. Ordinary upstreams use a conservative coding profile; aliases and routing candidates expose only capabilities they can support. Gateway credentials are never forwarded to upstream model endpoints.
Upstream metadata has a bounded cache and fetch deadline. Live model names and permissions are rebuilt on every request, including conditional requests. Catalog responses are limited to 1 MiB and support private caching with ETags. Codex can retain its own picker cache, so changes appear when the client refreshes its catalog or restarts; the gateway does not push updates into an already open picker.
ThinkWatch Lite 2026.11.7 configures remote discovery during Codex adoption. The initial connection updates client configuration once and requires a client restart. Subsequent model changes do not rewrite the client configuration. See the setup and cache guide for manual connections and profile behavior.
The control-plane protocol remains 58 and the request-store schema remains 28. Existing configuration, request history and usage history are preserved. No configuration or database migration is required.
Bundled SQLite is upgraded through rusqlite 0.41 to fix RUSTSEC-2026-0459 (CVE-2026-119375). The database format and request-store schema stay unchanged. Building the storage and Core binary crates now requires Rust 1.89 or later; shared client crates retain their existing declared minimum.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.90.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.90.0An installation made with the script switches to 0.90.0 with:
sudo twcore upgrade --version 0.90.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
Full Changelog: v0.89.2...v0.90.0
ThinkWatch Core 0.89.2
This release improves credential detection, native system proxy support and compatibility with Mistral responses.
- Reduce credential false positives in source code and pool logs. Comma-separated values require a quoted credential field name, unquoted recovery phrases stop at code delimiters, and Rust numeric types and short numeric lookup keys are excluded. Explicit credentials and quoted secret values remain covered.
- Preserve structural array indices in security hit paths while continuing to mask request-derived field names.
- Upstreams configured to use the system proxy can now read native macOS and Windows proxy settings. Applying or reloading configuration rebuilds those clients to refresh the settings. Direct and explicitly configured proxy modes retain their own routing behavior.
- Accept both string and typed array content in streaming and non-streaming Chat responses, including Mistral text and thinking chunks. Text is forwarded incrementally, and thinking stays separate from visible text.
- Restore placeholders split across array text fragments or transitions between string and array content before response format conversion. Thinking content and signatures remain untouched.
The Mistral changes fix reproduced content-loss cases; they do not establish the cause of every delay or truncation reported in Lite issue #407. System proxy settings are refreshed when configuration is applied or reloaded, rather than watched continuously.
The control-plane protocol and request-store schema are unchanged. No configuration or database migration is required.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.89.2:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.89.2An installation made with the script switches to 0.89.2 with:
sudo twcore upgrade --version 0.89.2 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
Full Changelog: v0.89.1...v0.89.2
ThinkWatch Core 0.89.1
ChatGPT account quotas now load automatically at startup and when accounts are added, so Lite's overview and menu bar can display remaining quota without first opening the Upstreams page.
Quota updates prefer the headers returned by real traffic. Background queries only fill a cold cache, refresh quota that has not been updated for 15 minutes, or check a window after its reported reset time. Manual refresh remains immediate. Concurrent readers share in-flight queries, with at most four account queries running at once; failed queries back off and preserve the last known quota.
Disabled accounts and accounts that need to sign in again are excluded from automatic queries. No configuration changes are required. Updating an already open Lite overview also requires the accompanying Lite event-subscription fix.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.89.1:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.89.1An installation made with the script switches to 0.89.1 with:
sudo twcore upgrade --version 0.89.1 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
Full Changelog: v0.89.0...v0.89.1
ThinkWatch Core 0.89.0
Core now adjusts execution capacity to traffic without requiring runtime settings. A small permanent I/O scheduler handles connections while CPU execution threads grow on demand and retire after ten idle seconds. Parsing, redaction, rewriting, decompression and plugins share CPU admission sized from available parallelism and memory, allowing a sufficiently provisioned 80-core server to run 80 CPU jobs concurrently. Concurrent small-body scans can expand too.
Release binaries use mimalloc to reduce allocation fragmentation and retained free pages. Linux builds disable transparent huge pages for the Core process where the kernel permits it, and Linux containers use their cgroup memory limits when sizing resources. Plugin sandbox threads retain their dedicated stacks and now start individually on demand and retire when idle.
Incoming bodies share a byte budget with headroom for parsing and copies. When that budget is occupied, new requests receive a retryable 429 with Retry-After. Reservations remain attached to buffered data until its final reference is released, and decompression reserves space as output grows. The 256 MiB per-request limit remains in place; the buffering budget is not a hard limit on total process RSS.
Existing configurations remain valid and no YAML changes are needed. CPU and memory ceilings are selected at startup; thread creation, admission and idle reclamation happen automatically during operation. Startup logs report the selected capacity, body budget, idle timeout and allocator. The control-plane protocol and request-store schema are unchanged.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.89.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.89.0An installation made with the script switches to 0.89.0 with:
sudo twcore upgrade --version 0.89.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
Full Changelog: v0.88.0...v0.89.0
ThinkWatch Core 0.88.0
This release expands outbound privacy filtering to UUIDs, wallet secrets, trading credentials and blockchain account identifiers. The built-in catalog grows from 120 to 131 rules, with 102 enabled by default.
Upgrade notes
- The control-plane protocol stays at 58 and the request-store schema stays at 28. Existing configurations remain valid.
- The 11 new rules default to placeholder replacement. In
observemode they only record findings; inenforcemode they replace matching text unless a rule has been disabled or set to record only. - UUIDs include ordinary order and trace IDs, and compact 32-character hexadecimal values also include MD5-shaped identifiers. The raw 64-character hex rule covers both wallet private keys and indistinguishable transaction hashes. Existing installations using
enforcewill therefore hide more identifiers after upgrading.
Wallet material. Adds raw EVM/TRON private-key shapes, verified Solana Ed25519 keypairs in Base58 or pasted byte-array form, Sui Bech32 private keys, Stellar secret seeds and XRP family seeds. Expands BIP32 / SLIP-0132 extended private keys to all ten supported versions and validates their private payloads. Existing BIP39 recovery-phrase, WIF and PEM rules remain available.
Trading credentials. Named fields and authentication headers protect opaque keys, secrets, passphrases, signing memos, OTPs and signatures used by major exchanges, Polymarket CLOB/Builder/Relayer and predict.fun. These rules use context rather than assuming a fixed key length or alphabet. Short and symbol-first passphrases, numeric credentials, escaped JSON fields, recovery arrays, YAML recovery blocks, keystores and known RPC URL credentials are covered.
Account privacy and reporting. Blockchain addresses and extended public keys have a separate privacy rule. UUIDs, raw hashes and public accounts do not by themselves trigger credential-exfiltration blocking. Findings for wallet secrets and the new credential-field rules are fully masked. Saved-secret priority, per-rule actions, exceptions, reversible and streamed restoration, and scan-cache equivalence are preserved.
Filtering keeps the existing protocol and JSON boundaries. Keypair arrays are protected when pasted as text; actual JSON numeric values and protocol metadata retain their existing treatment. Coverage and limits are listed in the blockchain redaction reference.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.88.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.88.0An installation made with the script switches to 0.88.0 with:
sudo twcore upgrade --version 0.88.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
- feat(redact): cover UUIDs and blockchain credentials by @fylorn in #390
- chore(release): prepare 0.88.0 by @fylorn in #391
Full Changelog: v0.87.1...v0.88.0
ThinkWatch Core 0.87.1
This release keeps upstreams with insufficient credits or exhausted quota out of later requests, including when an upstream returns its error inside an HTTP 200 event stream.
Upgrade notes
- The control-plane protocol version stays at 58; ThinkWatch Lite releases that include 0.87.0 also connect to 0.87.1.
- The request store's schema stays at 28; nothing is cleared.
- Existing configurations are unchanged. No new message codes.
Insufficient credits (#379). JSON error fields are decoded before balance failures are classified, so escaped insufficient-credit messages trigger failover and pause the affected upstream. Credit mentions in echoed requests or metadata do not turn a client error into a balance failure.
Errors inside streamed answers. An upstream that returns HTTP 200 followed by an SSE error and a clean end of stream is no longer recorded as a success before its error is inspected. Balance and quota failures pause the upstream, server and authentication failures use the existing circuit breaker, and rate limits pause the upstream without adding a success or failure sample. A final error frame is recognized even without a trailing blank line. The original error still reaches the client, and an answer that has already delivered content is never replayed.
Watcher tests. Filesystem integration tests no longer assume that writes finish within one debounce window or that a quiet event channel means descriptor handover has completed. Exact event batching and descriptor leak checks remain covered. Production watcher behavior is unchanged.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.87.1:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.87.1An installation made with the script switches to 0.87.1 with:
sudo twcore upgrade --version 0.87.1 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
- test(watch): remove filesystem timing assumptions by @fylorn in #388
- fix(gateway): classify terminal SSE faults before recording health by @fylorn in #387
- chore(release): prepare 0.87.1 by @fylorn in #389
Full Changelog: v0.87.0...v0.87.1
ThinkWatch Core 0.87.0
This release lets an upstream set a minimum generation speed: a streamed answer that keeps generating below it is ended with a retryable error, so the client sends the request again.
Upgrade notes
- The control-plane protocol version goes from 57 to 58.
- The request store's schema is unchanged (28); nothing is cleared.
- New configuration key
providers[].min_speed; existing configurations are valid as they are. - New message codes:
config.min_speed_range,gw.upstream.too_slow.
Minimum generation speed. Some self-hosted servers occasionally drop to a few tokens per second partway through an answer and recover when the request is sent again. Neither the idle timeout nor failover covers this: content is still arriving, and it has already reached the client.
providers[].min_speed: { tokens_per_sec, window_secs }turns it on for one upstream:tokens_per_secfrom 1 to 1000,window_secsfrom 5 to 120 (20 when left out). Unset means off.- From the first token on, a streamed answer (SSE or Bedrock eventstream) is judged once a second on its average speed over the last
window_secsseconds, estimated the same way as the live speed. - Pauses are not judged: nothing is decided while no content has arrived for over a second, and silences of 5 seconds or more (a quarter of the window when it is under 20 seconds) are taken out of the window and left to the idle timeout. Reasoning that arrives as a summary (Anthropic, Gemini, Bedrock, the Responses reasoning summary) is not judged either; raw reasoning such as Chat
reasoning_contentis. Judging stops once the answer has ended. - Non-streamed answers, WebSocket turns and Gemini streams requested without
alt=sseare not judged. - Below the minimum, the answer ends with a 503 error in the client's format (Anthropic
overloaded_error, Responsesserver_error, GeminiUNAVAILABLE) and the upstream connection is dropped. Claude Code and Codex resend the request on their own. - The request fails with
gw.upstream.too_slow, keeps the measured speed (also onRequestFailed.tokens_per_sec) and the usage generated so far. The upstream records one failure and the conversation stops sticking to it for that turn, so a resent request prefers another candidate. Upstream checkup and/token-ratemedians leave out failed requests. ProviderViewandProviderInputcarrymin_speed; config packs, sharing and sync carry it with the upstream. One-click repair dropsmin_speedwhen the rate is out of range and resetswindow_secsto 20 when the window is.
Gemini live speed. The streamed output count no longer includes hidden reasoning (thoughtsTokenCount), which made the live speed read 0 until the text estimate caught up.
Security. The plugin sandbox's Wasmtime is updated to 49.0.5 for RUSTSEC-2026-0422, RUSTSEC-2026-0423 and RUSTSEC-2026-0424.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.87.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.87.0An installation made with the script switches to 0.87.0 with:
sudo twcore upgrade --version 0.87.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
- End streamed answers that generate below an upstream's minimum speed by @fylorn in #384
- Minimum speed: judge only visible, flowing generation by @fylorn in #385
- 0.87.0: minimum generation speed per upstream; Wasmtime 49.0.5 by @fylorn in #386
Full Changelog: v0.86.0...v0.87.0
ThinkWatch Core 0.86.0
This release lets a falsely matched value be excepted from outbound redaction without turning its rule off, adds per-rule hit counts for the security log, and stops rescanning conversation history that has not changed.
Upgrade notes
- The control-plane protocol version goes from 56 to 57.
- The request store's schema is unchanged (28); nothing is cleared. An index for the hit counts is added on first start.
- New configuration key
security.redact.exceptions; existing configurations are valid as they are. - New message codes:
config.redact_exception_duplicate,config.redact_exception_hash_bad,config.redact_exceptions_too_many,security.exception_forgotten,security.exception_not_exceptable,security.exception_saved_secret,security.exception_value_empty,security.exceptions_full,security.unknown_event.
Exceptions. A value listed as an exception is neither replaced nor recorded by any redaction rule, in observe and replace mode alike. The rule keeps working for every other value.
security.redact.exceptionsholds up to 500 entries{ sha256, masked, rule, added_at }: the SHA-256 of the value (lowercase hex), the masked form shown when it was added, the rule that first recognised it, and when. The value itself is never written anywhere. The configuration manual notes that a hash of a short value such as a phone number can be guessed, the same way the file already holds upstream keys in plain text.- Credentials saved in ThinkWatch (
thinkwatch-saved-secret) cannot be excepted; such entries are ignored. GET /security/exceptions,POST /security/exceptions(a value, hashed at once),POST /security/events/{id}/exception(from a security-log row) andDELETE /security/exceptions/{sha256}. Adding a value that is already listed returns the existing entry; a full list answers 409.- Adding from the log works for the latest 20,000 redaction rows while the core is running: their value hashes are kept in memory only, never in the request store, and are gone after a restart. Log views carry
exceptableandexceptedfor those rows. A finding made of two overlapping matches is not exceptable, since no single value stands behind it. - The trial marks an excepted value with
exceptedinstead of reporting a hit.
Hit counts per rule. GET /security/counts?guard=&since_ms= returns [{ rule, custom, count }], the sum of the log rows' counts for one guard since a time, from an index rather than by reading the log.
History is not rescanned. Clients send the whole conversation every turn. The gateway now keeps the redaction scan results of unchanged history (rule ids and positions only, never values) in memory, keyed by the rules in force, and scans only what is new. Results are identical to a full scan; rules that look at neighbouring text (field names, context words) bypass the cache. On a 200-turn chat, scanning a turn takes 0.25 to 0.46 of the time it took before, and a request is never slower than without the cache.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.86.0:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.86.0An installation made with the script switches to 0.86.0 with:
sudo twcore upgrade --version 0.86.0 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
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 Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
Full Changelog: v0.85.0...v0.86.0