The resolver field only needs to find the working URL — the Jellyseerr version requirement is irrelevant there and only polluted the UI.
- jellyseerrProbe: validate reachability + that it's a jellyseerr (no version gate, no version-too-low outcome).
- Drop the version-too-low reason from the whole resolver stack (types, resolve, hook, status text, i18n).
- Min version 2.0.0 stays enforced in JellyseerrApi.test() at login: now writes an error log + toast, and uses numeric isVersionBelow (fixes the "2.10.0" < "2.0.0" string-compare bug).
Type a loose address (media.example.com, https://…, host:port) and the app finds the working, canonical URL.
- utils/serverUrl: generic candidate generator (https-first, port/path preserved, no Jellyfin-specific ports), parallel-probe resolver, numeric semver compare, and a Jellyseerr probe (/api/v1/status, min 2.0.0).
- useServerUrlResolver: idle -> resolving -> ok | error state machine with cancellation.
- ServerUrlField: shared input that auto-resolves on blur, inline status chip (tap to re-test) + resolved URL, persists the canonical URL.
- Jellyseerr settings adopt the field and log in with the resolved URL. Probe contract makes Streamystats/Jellyfin/Merlin a drop-in follow-up.