Goal this serves — Shipping fixes to donors' phones without waiting on store review
Why this matters
The mobile app handles the donation flow, including transaction signing. If a release contains a defect on that path — and this repository has already shipped one that made the donate screen unusable — there is currently no way to respond quickly. A fix waits on store review, and in the meantime every user has a broken app with no way to roll back.
There is also no crash reporting, so a defect that does not produce a support message is simply invisible.
Evidence
mobile/eas.json now defines development, preview and production build profiles, which is the prerequisite for this work and is in place.
What does not exist: no expo-updates configuration, so no over-the-air delivery; no runtimeVersion policy, so no way to express which native binary an update is compatible with; no staged rollout, so a release is all-or-nothing; and no crash or error reporting integration anywhere in the mobile tree.
The consequence is concrete: the donate screen defects fixed recently would have reached every user and stayed there until a new store submission was reviewed.
Why this is hard
Runtime version compatibility is the trap. An over-the-air bundle that assumes native modules not present in the installed binary crashes on launch, and a crash on launch cannot be fixed over the air — the recovery channel is exactly what breaks. The policy must make that impossible by construction.
Rollback needs to be instant and tested. A rollback path first exercised during an incident is not a rollback path.
Staged rollout needs a signal. Releasing to a small percentage only helps if something detects that the cohort is failing, which requires crash reporting and a defined abort threshold.
Reports must not leak keys. The app handles secret keys and signed envelopes; a crash reporter that captures state indiscriminately is a serious hazard, so scrubbing has to be structural.
Store policy applies. Over-the-air updates are permitted within limits that the rollout process must respect.
Suggested approach
Adopt over-the-air updates with a runtime version policy that makes an incompatible bundle impossible to deliver rather than merely unlikely.
Add crash and error reporting with structural scrubbing of key material, verified by test.
Define staged rollout with an explicit abort threshold driven by the crash signal, and rehearse rollback before relying on it.
Acceptance criteria
Scope
Roughly 5,000–7,000 lines, including tests.
Relevant files
mobile/eas.json
mobile/app.json
mobile/app/_layout.tsx
.github/workflows/mobile.yml
Why this matters
The mobile app handles the donation flow, including transaction signing. If a release contains a defect on that path — and this repository has already shipped one that made the donate screen unusable — there is currently no way to respond quickly. A fix waits on store review, and in the meantime every user has a broken app with no way to roll back.
There is also no crash reporting, so a defect that does not produce a support message is simply invisible.
Evidence
mobile/eas.jsonnow defines development, preview and production build profiles, which is the prerequisite for this work and is in place.What does not exist: no
expo-updatesconfiguration, so no over-the-air delivery; noruntimeVersionpolicy, so no way to express which native binary an update is compatible with; no staged rollout, so a release is all-or-nothing; and no crash or error reporting integration anywhere in the mobile tree.The consequence is concrete: the donate screen defects fixed recently would have reached every user and stayed there until a new store submission was reviewed.
Why this is hard
Runtime version compatibility is the trap. An over-the-air bundle that assumes native modules not present in the installed binary crashes on launch, and a crash on launch cannot be fixed over the air — the recovery channel is exactly what breaks. The policy must make that impossible by construction.
Rollback needs to be instant and tested. A rollback path first exercised during an incident is not a rollback path.
Staged rollout needs a signal. Releasing to a small percentage only helps if something detects that the cohort is failing, which requires crash reporting and a defined abort threshold.
Reports must not leak keys. The app handles secret keys and signed envelopes; a crash reporter that captures state indiscriminately is a serious hazard, so scrubbing has to be structural.
Store policy applies. Over-the-air updates are permitted within limits that the rollout process must respect.
Suggested approach
Adopt over-the-air updates with a runtime version policy that makes an incompatible bundle impossible to deliver rather than merely unlikely.
Add crash and error reporting with structural scrubbing of key material, verified by test.
Define staged rollout with an explicit abort threshold driven by the crash signal, and rehearse rollback before relying on it.
Acceptance criteria
Scope
Roughly 5,000–7,000 lines, including tests.
Relevant files
mobile/eas.jsonmobile/app.jsonmobile/app/_layout.tsx.github/workflows/mobile.yml