Skip to content

Release v0.49.0#561

Merged
jordandrako merged 8 commits into
mainfrom
release/v0.49.0
Jun 1, 2026
Merged

Release v0.49.0#561
jordandrako merged 8 commits into
mainfrom
release/v0.49.0

Conversation

@jordandrako
Copy link
Copy Markdown
Member

Summary

  • Release v0.49.0 (was 0.48.1)
  • Bumps VERSION and stamps CHANGELOG.md

Changelog

[0.49.0] - 2026-06-01

Added

  • Self-hosted over-the-air (OTA) app updates. The native mobile app now downloads the web bundle that matches the backend it's connected to, so the frontend and backend stay in sync without reinstalling the APK for every release — no paid live-update service required. Each server build ships the matching Capacitor bundle; on launch and when returning to the foreground the app checks the server version and, if it differs, downloads the bundle and prompts "Reload now" (with a "Later" option). A failed update automatically rolls back to the previous bundle. When a release changes native code (not just web assets), the app detects that its installed shell is too old and asks you to update from the store/APK instead. Releases that only change web assets no longer rebuild the APK — they update entirely over the air.

Post-merge

Tag v0.49.0 will be created automatically, triggering Docker build + GitHub Release.

Merge main back into dev after v0.48.1
Serve the matching Capacitor web bundle from the backend so the native
app stays in sync with whatever server it connects to, replacing the
need to reinstall the APK every release (and avoiding paid live-update
services like Capgo/Capawesome cloud).

Backend:
- New /api/v1/native/bundle/{manifest,download} endpoints serving the
  bundle zipped into the image at /app/ota, with a sha256 checksum.
- MIN_NATIVE_VERSION file (read like VERSION) gates web bundles that
  need a newer native shell than the installed APK/IPA.

Native:
- @capgo/capacitor-updater (manual/self-hosted mode) downloads the
  bundle and prompts Reload Now / Later; notifyAppReady() arms the
  failed-boot auto-rollback. The native-compat gate compares
  current().native to minNativeVersion (no custom native plugin).

Release/CI:
- promote.sh auto-bumps MIN_NATIVE_VERSION when the native shell
  changes (capacitor config, android/ios, or @capacitor/@Capgo deps).
- docker-publish.yml skips the Android build for web-only releases;
  they ship Docker-only and update over the air.

Also fixes the root .dockerignore to exclude node_modules/dist so
local image builds don't overlay host modules.
- native.py: use NativeMessages.OTA_BUNDLE_NOT_AVAILABLE constant instead
  of inline HTTPException detail strings; assert it in tests; map the code
  in errors.json (en/es/fr).
- useNativeUpdate: set handledVersionRef in the native-required branch so
  the 'App update required' dialog doesn't re-fire on every foreground.
- docker-publish.yml: release job now also requires
  needs.build-android.result != 'failure', so a broken native build is a
  hard failure rather than a publish with misleading OTA messaging.
If CapacitorUpdater.set() throws (e.g. the OS evicted the downloaded
bundle), leave the reload dialog open so the user can retry instead of
silently hiding it with no reload.
Filter CapacitorUpdater.list() to status 'success' so a retained
error/partial bundle isn't reused (which would make set() throw and,
since we'd keep finding it, never re-download — leaving the user stuck
on that version).
Self-hosted OTA live updates for the native app
@jordandrako jordandrako requested a review from LeeJMorel as a code owner June 1, 2026 16:02
@jordandrako jordandrako added the release PR Creates a release label Jun 1, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Jun 1, 2026

PR has a label that disables reviews.

@jordandrako jordandrako merged commit 09b5203 into main Jun 1, 2026
3 checks passed
@jordandrako jordandrako deleted the release/v0.49.0 branch June 1, 2026 16:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release PR Creates a release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant