This release adds a small toolbar popup for pinning a preferred instance, closes several fallback state-machine gaps found in a multi-model external audit, and cleans up CI and documentation drift.
New: preferred instance. Click the toolbar icon on a Nitter page to keep landing there on future redirects. Useful because per-instance display settings and capabilities (RSS, NSFW support) don't follow you across an automatic switch, and the automatic ranking has no way to know about either. Only biases a fresh redirect; normal fallback still applies if the preferred instance goes down, and the preference stays set for whenever it recovers.
Fallback and detection fixes:
- A watchdog timeout no longer conflates a slow-but-alive instance with a dead one - once the first response byte arrives, the timeout extends instead of yanking the user away mid-load.
- Page-failure detection is now tri-state (pass/confirmed-fail/unrecognized) instead of binary. An unrecognized page template still falls back for that navigation but never demotes the instance fleet-wide, so a real Nitter template change can't get every instance judged broken at once. A tripwire logs a warning if that happens anyway.
- Total fallback time for one navigation is now bounded by elapsed time (~45s), not just instance count, so a large fleet can't leave a navigation hanging for minutes.
- The status API's size guard now holds even for a chunked-encoding response with no Content-Length header.
- A link clicked from inside an already-loaded Nitter page is now tracked for fallback too - previously only the initial X/Twitter redirect was watched.
- Fixes from a 5-model external audit: seed instances are filtered against actual manifest permissions at runtime, domain casing/trailing dots from the status API are normalized, ranking recomputes correctly even when a status refresh fails, onErrorOccurred only marks an instance broken on genuine network failures, the redirect-loop breaker no longer false-trips on rapid legitimate clicks, a startup race that could drop a freshly-learned health entry is fixed, HTTP 408 is now a hard failure, /i/lists paths are allowed through, and the terminal "every instance failed" page now shows instead of silently stranding the user.
xcancel.com dropped from the seed list and permissions - confirmed suspended by the service operator and no longer tracked by the health API.
CI: fixed a Node 20 pin that GitHub's runners were silently substituting for Node 24 (Node 20 has been end-of-life since March 2026), fixed the test script's use of a Node 21+ glob feature that never worked on Node 20, bumped actions/checkout and actions/setup-node to current versions, and added Dependabot for github-actions and npm.