Appearance
Production state
What is actually live, per surface, right now. Derived from targets[] and builds[] across every release, so it cannot drift from the records it summarises.
This page is not decoration: check:release parses the build numbers below and uses them for two safety rules — the compatibility floor and the kill-switch interlock. Keep the table format intact.
Live now
| Surface | Live version | Build | Since | Release |
|---|---|---|---|---|
| Supabase Prod | — | — | — | — |
| Web PWA (Cloudflare) | — | — | — | — |
| Android (Play) | — | — | — | — |
| iOS (App Store) | — | — | — | — |
Nothing has shipped through this system yet. 26.0.1 will be the first release recorded here.
Why build numbers may differ across platforms
They will, and it is not a defect. Both stores require a new build number for every resubmission, so if one platform is rejected and the other approved, the numbers desynchronise permanently even when the code is byte-identical.
Release 26.0.1
B1 android 26000100 commit a1b2c3d → approved
B2 ios 26000100 commit a1b2c3d → rejected
B3 ios 26000101 commit a1b2c3d → approved ← same commit, no functional deltaUsers still see 26.0.1 on every surface; only the internal integer differs. The build ledger in each release's 01-change-log.md records the mapping and the reason, and the gate proves a "no functional delta" claim by comparing commit SHAs rather than trusting it.
The compatibility floor
min_live_app_build = min(build) across live store platformsComputed from the table above, using the oldest still-supported build — a staged rollout means the previous build is still live. Any contracting change (dropping a column, function or Edge Function; narrowing a type; changing a response shape) must declare requires_min_app_build, and check:release fails if it exceeds the floor.
This is the enforceable form of CLAUDE.md's "multiple app versions are live simultaneously, so expand-contract is structural". It is what stops a later release removing something a store-stranded surface still depends on.
Kill-switch interlock
app_release_policy is per platform, which is exactly what makes divergence survivable — and also what makes one catastrophic mistake possible:
Never raise a platform's minimum above its live build
If iOS is stranded on 26000000 and its min_supported_version_code is set to 26000100, every iOS user is blocked with no update available to them. check:release cross-checks any min_supported_version_code change against this table and refuses it.
Open divergences
A surface not on the current release's version, with an owner and the release that will close it. An open divergence with no target release is how "iOS is a bit behind" quietly becomes permanent.
| Surface | Live | Expected | Age | Owner | Closes in |
|---|---|---|---|---|---|
| — | — | — | — | — | — |