Our mobile app has to connect to Plane Cloud (always latest), self-hosted instances that can lag by weeks/months, and some fully air‑gapped deployments with no outbound internet.
We ended up making the app assume nothing about the server: after login it does a single "instance discovery" call to fetch metadata (including backend version + deployment flags), then routes everything through a small compatibility engine:
- hard minimum supported backend version (blocked below it) - a central feature registry (feature → minimum backend version) - version-aware API behavior (pick endpoints/request shapes based on what the server supports)
Air‑gapped support mostly became "use the same mechanism, but enforce no external network calls/telemetry."
Would love feedback / other patterns folks have used for mobile + self-hosted version skew.