releases.json reference
Describe every OTA release, so users (and reviewers) can see what changed.
releases.json is an optional second file you publish next to policy.json. It lists your OTA
releases with user-facing notes. Upwell matches the running update against it to power
<UpdatedSheet />, <WhatsNew /> and useUpdateHistory().
{
"$schema": "https://upwell.run/schemas/releases.schema.json",
"schemaVersion": 1,
"releases": [
{
"id": "0b9e6a3c-5a7f-4b36-9a84-1c4f3f1e2d77",
"platforms": ["ios", "android"],
"runtimeVersion": "3.4.0",
"kind": "fix",
"notes": "Fixed a crash at checkout on iOS 27.",
"publishedAt": "2026-10-21T10:00:00Z"
},
{
"id": "6f1d2c55-9d0e-4a59-8f3b-7a2e8c4b1a90",
"platforms": ["ios", "android"],
"runtimeVersion": "3.4.0",
"kind": "content",
"notes": "Updated the Diwali offers banner.",
"publishedAt": "2026-10-19T08:30:00Z"
}
]
}Pass it to the provider:
<UpwellProvider
policy="https://example.com/upwell/policy.json"
releases="https://example.com/upwell/releases.json"
ota={expoUpdatesAdapter()}
>Release fields
Prop
Type
Kinds
kind | Use it for |
|---|---|
fix | Bug fixes, performance, crash fixes |
content | Copy, images, configuration, seasonal content |
feature | New functionality. Use this honestly: new features belong in a store submission with Review Notes that describe them |
How matching works
- Current release. The adapter reports every id the running update is known by (update id and EAS
group id). The first entry for this platform with a matching id is
current. - History. Every entry for this platform and the running runtime, newest first.
- Just updated. On a launch where the running update id differs from the last one the user saw,
and it has an entry,
justUpdatedis set and<UpdatedSheet />shows its notes once. The first launch of a fresh install never shows the sheet, and neither does an update without an entry.
A failed or invalid releases.json fetch falls back to the last valid copy, like the policy.
See Transparent OTA for the full workflow with EAS Update.