RORK LABJP
FUNDING — Rork raises $15M, drawing fresh attention to its mobile-first no-code AI positioningMAX-NATIVE — Rork Max reaches native territory React Native can't: AR/LiDAR, Metal 3D, widgets, Dynamic Island, Live Activities, HealthKit, and on-device Core MLMOBILE-FIRST — While Bolt and Lovable focus on web apps, Rork builds mobile apps — production-ready from a plain-language descriptionWWDC — WWDC26 wraps with AI becoming a core OS capability; the iOS 27 generation raises the value of widgets and Live ActivitiesPRICING — Free to start, paid plans from $25/mo, Rork Max at $200/mo — ship fast on Expo, then go native with Max where it pays offALL-APPLE — Rork Max generates pure Swift covering iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageFUNDING — Rork raises $15M, drawing fresh attention to its mobile-first no-code AI positioningMAX-NATIVE — Rork Max reaches native territory React Native can't: AR/LiDAR, Metal 3D, widgets, Dynamic Island, Live Activities, HealthKit, and on-device Core MLMOBILE-FIRST — While Bolt and Lovable focus on web apps, Rork builds mobile apps — production-ready from a plain-language descriptionWWDC — WWDC26 wraps with AI becoming a core OS capability; the iOS 27 generation raises the value of widgets and Live ActivitiesPRICING — Free to start, paid plans from $25/mo, Rork Max at $200/mo — ship fast on Expo, then go native with Max where it pays offALL-APPLE — Rork Max generates pure Swift covering iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessage
Articles/App Dev
App Dev/2026-06-13Advanced

Shipping Wallpaper Packs Without an App Review — Versioning and Delta Delivery for Remote Assets Across Six Apps

Re-submitting your app every time you add ten wallpapers grinds operations to a halt. Here is a manifest-based versioning scheme with delta downloads, cache invalidation, and rollback — with the implementation and measured transfer savings from running six apps in parallel.

asset deliverywallpaper app20versioningExpo65operations6

Premium Article

Bumping a build, swapping screenshots, and waiting two days for review — just to add ten seasonal wallpapers. That loop worked right after launch. But once I was running six wallpaper apps in parallel, it became a hard bottleneck. While one app sat in review, images piled up for three others, and I kept pushing the whole batch to "next week."

Adding content has nothing to do with app code. The behavior does not change when there are more images. So I moved content delivery outside of app review entirely. What follows is the remote asset pack system I rebuilt, along with the code I run and the transfer numbers I measured before and after the switch.

Why I stopped bundling assets

The first design bundled images inside the app. That guarantees offline display and a fast cold start. The cost is that every new image requires a full re-submission, and the IPA keeps growing. Crossing 90MB after six months was the breaking point.

I narrowed the decision to two axes. The first is update frequency: content swapped several times a week goes remote, while UI assets fixed at release stay bundled. The second is first-run experience: the handful of images guaranteed to appear on launch (the default cover, onboarding art) stay bundled, and everything else is fetched remotely. That line let me fix the bundled set at about twenty images.

A manifest-first approach — what to deliver, what to delete

The center of remote delivery is not the images but the manifest. On launch the app fetches the manifest first, then retrieves images according to its instructions. The schema looks like this.

{
  "packVersion": 142,
  "minAppVersion": "3.2.0",
  "generatedAt": "2026-06-13T02:00:00Z",
  "categories": [
    {
      "id": "seasonal-rainy",
      "title": { "ja": "雨の季節", "en": "Rainy Season" },
      "items": [
        {
          "id": "rainy-0142",
          "hash": "b7f3c1a9",
          "w": 1290, "h": 2796,
          "url": "https://cdn.example.com/packs/rainy-0142.heic",
          "thumb": "https://cdn.example.com/thumbs/rainy-0142.webp",
          "addedIn": 142
        }
      ]
    }
  ]
}

The key fields are hash and addedIn. The hash is a short fingerprint derived from the image content, and we only refetch when it changes. The addedIn value records the pack version where an image first appeared, which drives delta computation. The minAppVersion is a safety valve that keeps a newer image format (a live wallpaper added later, say) from reaching older apps.

The manifest itself lives at the CDN edge with Cache-Control: max-age=300 — five minutes. I keep it short so that pulling a single bad image propagates to every device within five minutes at most. Image bodies never change once published, so they get max-age=31536000, immutable for a one-year cache.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A concrete manifest schema that decouples content packs from App Store review so delivery becomes instant
A delta-download implementation that cut transfer per update by 88% on average by avoiding full refetches
Version-pinning and a rollback procedure that reverts a broken pack in 30 seconds across all six apps
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

App Dev2026-06-09
Keeping a wallpaper app's binary small: moving images out of the bundle
Wallpaper apps bloat every time you add images. Here is where I draw the line between bundled and remote assets, how I keep first paint fast with prefetching, and the format work that cut transfer size to a third — with real numbers.
App Dev2026-06-03
Unifying Onboarding Across Six Wallpaper Apps: What One Month of First-Day Retention Showed Me
I folded the onboarding flows of six wallpaper apps scaffolded with Rork into a single config-driven component and watched first-day retention and push opt-in for a month. Here is an honest, operational note on what moved and what didn't.
App Dev2026-06-01
Why Wallpapers Look Dull on Device: Notes on Display P3
The same wallpaper looked dull once it was set on the device. The culprit was a mix-up between wide-gamut Display P3 and sRGB. Here are the steps and the commands I used to sort out color across six wallpaper apps.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →