48 Commits

Author SHA1 Message Date
DIYgod 2688ed9730 fix(ota): skip iOS store update prompts where Folo is off the App Store
The store version comes from the US storefront, so devices in China
mainland, where Folo was pulled from the App Store, would be asked to
install every new release from a page that says the app is unavailable.
Use the request country as a stand-in for the storefront and answer
none for iOS there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 08:06:14 +08:00
DIYgod 5ae31d8b43 fix(ota): refuse the sync endpoint when no sync token is set
The sync endpoint compared the request header with the configured token,
so on a deployment without the secret both were undefined and any request
could start a sync, spending the GitHub token's rate limit and writing
R2 and KV. Refuse requests unless a token is configured and sent, and
compare it in constant time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:17:40 +08:00
DIYgod 105d0e6f3d feat(ota): add a download link for the Intel Mac installer
The macOS download link always picked the Apple Silicon DMG, so Intel
Mac users had no link to the x64 installer that every release already
ships. Add /download/desktop/macos/dmg-x64.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:17:09 +08:00
DIYgod b3ef755e10 fix(ota): stream archive mirroring and skip mirrored releases
Every cron sync since 2026-09-23 exceeded the Worker memory limit. The
GitHub release list changes whenever download counts do, so each run
downloaded and fully decompressed every OTA archive on the first page
(a 58 MB desktop archive plus five mobile ones) into memory again.

- Skip releases whose stored record already matches, and only rewrite
  the record when just the metadata changed; latest pointers are still
  reconciled.
- Stream the archive through the zstd decompressor and tar extractor
  with backpressure and upload each verified file as it is extracted,
  so memory stays bounded by the largest referenced file. The download
  is cancelled as soon as extraction fails.
- Sync each release independently so one broken release no longer
  blocks the others; failures still fail the run and keep the stored
  ETag so the next run retries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 00:04:33 +08:00
DIYgod e33fc2d16b fix(ota): serve the newest published Android APK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 00:04:33 +08:00
DIYgod 2f392594d5 chore(deps): refresh dependencies and verify affected app flows 2026-09-22 16:20:40 +08:00
DIYgod 1158281f59 chore(deps): update frontend dependencies (#5038)
* chore(deps): update frontend dependencies

* fix(ci): format OTA verification commands
2026-07-10 22:36:12 +08:00
DIYgod b28d7a0154 fix(download): route direct downloads through ota 2026-05-29 14:23:35 +08:00
DIYgod a577dee7dc fix(ota): include Expo config in manifests 2026-05-13 11:27:23 +08:00
DIYgod a3577c4c4c fix(ota): restore desktop binary manifest updates 2026-04-15 11:38:38 +08:00
DIYgod 5bf010e804 fix(ota): harden store sync and observability 2026-04-15 11:20:31 +08:00
DIYgod 3705fa0893 fix: backfill github version badges 2026-04-13 10:04:20 +08:00
DIYgod cebce6d9c8 fix: backfill github version badges 2026-04-13 09:54:46 +08:00
DIYgod 7d592abda7 feat: expose ota version badges 2026-04-13 09:45:55 +08:00
DIYgod ca3fa9ffc3 feat: expose ota version badges 2026-04-13 09:43:21 +08:00
DIYgod 32c6ec3217 feat: cache storefront versions for ota policy 2026-04-12 22:21:20 +08:00
DIYgod 51efb5d5a5 fix(release): repair ota and desktop update flows 2026-04-12 16:04:15 +08:00
DIYgod 33c8bb98b6 feat(ota): unify desktop updates with ota service 2026-04-12 15:39:13 +08:00
DIYgod d16cf6af99 fix(ota): sign manifests and pin runtime version 2026-04-11 19:45:11 +08:00
DIYgod 8f5649e1fd feat(release): drive mobile release mode from config files 2026-04-11 16:22:05 +08:00
DIYgod 8174350207 chore(ota): persist production cloudflare bindings 2026-04-11 10:35:34 +08:00
DIYgod f9dd5a83ee feat(ota): add GitHub release-based OTA delivery 2026-04-11 10:07:03 +08:00
DIYgod a12feec4e1 fix(ota): support private GitHub release assets 2026-04-11 10:02:23 +08:00
DIYgod 05a789129a fix(ota): emit expo-compatible update identifiers 2026-04-10 23:56:48 +08:00
DIYgod dc0d5c2cda docs(ota): add rollout and rollback runbook 2026-04-10 22:24:37 +08:00
DIYgod 508b42a530 fix(ota): dedupe concurrent sync passes 2026-04-10 20:27:03 +08:00
DIYgod 7b90330032 feat(ota): add sync orchestration routes 2026-04-10 20:19:22 +08:00
DIYgod 1370249815 fix(ota): verify manifest pointer version 2026-04-10 20:10:31 +08:00
DIYgod 0b35a62dda fix(ota): validate route semver inputs 2026-04-10 20:07:23 +08:00
DIYgod af2abf0991 fix(ota): harden manifest and policy routes 2026-04-10 20:03:12 +08:00
DIYgod 54f5bf7c0e feat(ota): serve manifests assets and policy 2026-04-10 19:54:15 +08:00
DIYgod 3ef0e1b494 fix(ota): verify mirrored asset hashes 2026-04-10 19:47:21 +08:00
DIYgod f176051cd0 fix(ota): stream mirrored archive extraction 2026-04-10 19:41:48 +08:00
DIYgod 8a06a0f821 feat(ota): mirror release payloads into R2 2026-04-10 19:30:29 +08:00
DIYgod 6d11a09c86 fix(ota): return GitHub release etags 2026-04-10 19:19:08 +08:00
DIYgod 0e741caba9 feat(ota): fetch OTA releases from GitHub 2026-04-10 19:13:55 +08:00
DIYgod ac1964e0f7 fix(ota): enforce min binary store policy 2026-04-10 19:09:22 +08:00
DIYgod c7d0fd1eeb feat(ota): add kv helpers and policy logic 2026-04-10 19:03:46 +08:00
DIYgod acf0ace77c fix(ota): reject empty platform payloads 2026-04-10 18:59:59 +08:00
DIYgod fb0ba03f2e fix(ota): tighten release compatibility checks 2026-04-10 18:57:07 +08:00
DIYgod 7be0afa80d test(ota): cover incompatible newer release selection 2026-04-10 18:52:56 +08:00
DIYgod 862e0e0bc9 feat(ota): add release selection primitives 2026-04-10 18:50:50 +08:00
DIYgod ee2831deca fix(ota): use dev env for local wrangler 2026-04-10 18:45:46 +08:00
DIYgod a0916f7695 fix(ota): require at least one platform 2026-04-10 18:40:25 +08:00
DIYgod dc3d0c50e2 fix(ota): tighten scaffold schema and dev config 2026-04-10 18:37:03 +08:00
DIYgod 4658fd013d fix(ota): use standard worker types 2026-04-10 18:31:05 +08:00
DIYgod 03945a5765 fix(ota): align scaffold with task spec 2026-04-10 18:26:05 +08:00
DIYgod 6430561dc1 feat(ota): scaffold Cloudflare worker app 2026-04-10 18:18:38 +08:00