RORK LABJP
RAISE — Rork raised $15M. The money is pointed at shortening the distance between a solo developer and a shipped appENGINE — Rork Max runs on Claude Code paired with Opus 4.6. Much of its edge on complex app logic and reasoning is attributed to that pairingCLOUDMAC — The Swift it generates is compiled on a cloud Mac fleet, so you can go from prompt to on-device testing to App Store submission without installing XcodeAR — Rork Max supports ARKit and LiDAR scanning natively, putting 3D object placement and spatial computing apps within reachTRACTION — The Rork Max announcement drew more than 8 million views on X, and the company reports its annual revenue doubled within two weeksTRAFFIC — Rork reports over 743,000 monthly visits with 85% growth, a sign that prompt-to-app tools are settling in as a prototyping entry pointRAISE — Rork raised $15M. The money is pointed at shortening the distance between a solo developer and a shipped appENGINE — Rork Max runs on Claude Code paired with Opus 4.6. Much of its edge on complex app logic and reasoning is attributed to that pairingCLOUDMAC — The Swift it generates is compiled on a cloud Mac fleet, so you can go from prompt to on-device testing to App Store submission without installing XcodeAR — Rork Max supports ARKit and LiDAR scanning natively, putting 3D object placement and spatial computing apps within reachTRACTION — The Rork Max announcement drew more than 8 million views on X, and the company reports its annual revenue doubled within two weeksTRAFFIC — Rork reports over 743,000 monthly visits with 85% growth, a sign that prompt-to-app tools are settling in as a prototyping entry point
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 app22versioningExpo155operations7

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-07-14
Long-Press Context Menus for a Gallery Item in a Rork Expo App
Long-pressing a wallpaper card does nothing, yet iOS users expect a preview and a menu. From why Pressable alone falls short, to a native context menu with zeego, resolving the scroll-vs-long-press conflict, wiring up save and share, and a custom overlay fallback for Android — all with working code.
App Dev2026-08-03
When 1.10.0 Gets Locked Out: Measuring Four Version Comparison Approaches for Forced Updates
A remote-config gate for minimum supported version, rebuilt after measuring four version comparison approaches. Includes the cases where localeCompare reports equality, the fail-open boundary, and the incident caused by gating on a build still in review.
App Dev2026-07-16
Placing Native Ads in a Masonry Wallpaper Grid: Designing the Lifetime of an Ad Cell
One native ad in a masonry gallery pushed memory from 180 MB to 420 MB over twenty minutes of scrolling. Here is why cell recycling and ad object lifetime never line up, the pool-based implementation that fixed it, and how I picked the insertion interval from measured numbers.
📚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 →