Repository navigation
ThinkWatch v1.0.2
Images
ghcr.io/thinkwatchproject/think-watch-server:1.0.2ghcr.io/thinkwatchproject/think-watch-web:1.0.2
Helm
helm install think-watch ./think-watch-1.0.2.tgz \
--namespace thinkwatch --create-namespaceThe shared gateway layer moves out into its own repository, and OIDC
learns to accept an ID token whose aud carries more than the client
ID. Mostly a fix release otherwise — the deploy and auth items below are
the ones worth reading before you upgrade.
Added
OIDC_ADDITIONAL_TRUSTED_AUDIENCES— a comma-separated allowlist
of extra ID-token audiences to trust. Some IdPs put something besides
the client ID inaud; Zitadel includes the parent project ID, and
openidconnect's stock verifier rejects every non-client-ID audience,
so login failed outright. Leave it unset and verification is
byte-for-byte what it was. Set, it widens exactly one check: the extra
audiences on a multi-audience token are matched against this list as
exact strings — no wildcards, no prefixes. The client ID must still
appear inaudregardless. Documented in.env.example. Thanks to
@DaniW42 for the report and the patch (#12).- Automatic upstream protocol detection — the gateway learns an
upstream's dialect and relearns it when the upstream changes, instead
of relying on a static guess. Protocol is now a property of the route. - Reverse-proxy identification — the server recognizes its own
reverse proxy, which is what makes the dashboard WebSocket and the API
docs work behind nginx.
Changed
azpis validated whenever it is present, per OIDC Core 3.1.3.7
step 5, which has no audience-count precondition. Previously it was
only checked when a multi-audience token made it mandatory, so a
single-audience token naming this client withazppointing at a
different client was accepted — the IdP stating plainly that the
token was authorized for somebody else. This can reject a token that
1.0.1 accepted. If your IdP setsazpto something other than your
client ID, logins will start failing and the message will say so;
that is the IdP to fix, not this setting.- The shared gateway layer now comes from
ThinkWatch-Core
as a git dependency rather than living in this tree. Six crates —
types, protocol, provider, resilience, crypto, and the JSON secret
envelope — are one implementation shared with the desktop edition
instead of two copies drifting apart. No runtime or API change; it
affects you only if you build from source, where the build now needs
network access to resolve that dependency. The published images are
unaffected. - Stored secrets are redacted on read and decrypted on use. Provider
credentials no longer travel in plaintext through code paths that
merely display or list them.
Fixed
- Deploy — nginx broke the API docs three separate ways; the
dashboard WebSocket wasn't proxied; the prod stack's healthchecks were
wrong; and the dev stack could overwrite production's ClickHouse
credentials. The last one is the reason to read this list. - Auth — the console logged itself out after every token refresh.
Rate-limit counters could be created without an expiry and sit in
Redis forever. - Models — the gateway no longer offers models the upstream refuses,
no longer imports models it won't serve, and reports every dialect
that was refused rather than only the last. Providerbase_url
trailing slashes are normalized. - Analytics — spend is attributed to a person, not a UUID.
- Audit — a syslog forwarder formatting fix that had CI red on
clippy 1.98 (#11, thanks @DaniW42). Two more instances of the same
lint, plus aresult_large_errfalse positive in the MCP lifecycle
stages, measured rather than boxed: theOkvariant is 296 bytes
against theErr's 152, so boxing saves nothing and adds an
allocation. - UI — the brand mark stays inside the collapsed sidebar rail.
Contributing
CONTRIBUTING.md and a PR template now state the branch contract that
had only lived in docs/operations/release.md: routine work targets
dev, and main is the release line. A workflow comments on PRs opened
against main from anything other than dev or a hotfix/* branch,
because GitHub pre-fills the base with the default branch and walks
contributors into it.
Added
- (nothing yet)
Changed
- (nothing yet)
Fixed
- (nothing yet)
Removed
- (nothing yet)
Security
- (nothing yet)