RORK LABJP
IOS27 — iOS 27 and iPadOS 27 land on September 14. For apps assembled with no-code or AI tooling, the week a new OS ships is when the ground moves mostDUO — Apple's first foldable, the iPhone Duo, starts at $1,999. A new screen shape is also the first place a generated layout tends to breakSPLIT — Standard Rork produces React Native through Expo. Rork Max generates native Swift. Neither will adapt to a folding screen at the same pace, or fail in the same waySUBMIT — Automated submission absorbs every change Apple makes to the process. An article praising the convenience owes its readers that caveatRATING — Answering the age rating questionnaire became mandatory in September. Apps built without code are no exceptionSILICON — The A20 Pro in the iPhone 18 Pro is reported to be the first high-volume smartphone processor built on TSMC's 2nm nodeIOS27 — iOS 27 and iPadOS 27 land on September 14. For apps assembled with no-code or AI tooling, the week a new OS ships is when the ground moves mostDUO — Apple's first foldable, the iPhone Duo, starts at $1,999. A new screen shape is also the first place a generated layout tends to breakSPLIT — Standard Rork produces React Native through Expo. Rork Max generates native Swift. Neither will adapt to a folding screen at the same pace, or fail in the same waySUBMIT — Automated submission absorbs every change Apple makes to the process. An article praising the convenience owes its readers that caveatRATING — Answering the age rating questionnaire became mandatory in September. Apps built without code are no exceptionSILICON — The A20 Pro in the iPhone 18 Pro is reported to be the first high-volume smartphone processor built on TSMC's 2nm node
Articles/App Dev
App Dev/2026-06-09Advanced

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-sizewallpaper-appasset-deliveryExpo205performance11

Premium Article

The first build of my wallpaper app shipped at about 16MB. Then I started adding new wallpapers every season, and six months later the bundle had crossed 90MB. Long before I hit the App Store's cellular download limit, a different problem showed up: the first launch got visibly slower, and reviews started mentioning that the app "felt heavy" — people were reacting to the size shown on the store page.

I have been building wallpaper apps on my own for a long time, and right now I run six of them in parallel. Every one of them lives on the same tension: the urge to add more images versus the need to keep the binary light. Each time I add a new season's wallpapers, I come back to that same trade-off. Here I want to share how I resolved it in the architecture, with the code I actually run and the before/after numbers.

Why size suddenly becomes a problem for wallpaper apps

In a typical productivity app, images are just the icon and a few illustrations. In a wallpaper app, the images are the product. A single high-resolution wallpaper (1290×2796 for an iPhone 15 Pro Max, in Display P3) can exceed 10MB uncompressed. Bundle a hundred of those and the binary alone approaches 1GB.

When size grows, the pain shows up in three places. First, store conversion: the App Store product page shows the download size, and without Wi-Fi that number makes people hesitate. On one app, the version that dropped the binary from 90MB to 28MB saw install completion (store view to completed install) improve by about 14%. Second, first launch: a large bundle of images raises build time and runtime memory, especially when you stuff an asset catalog full on iOS. Third, update agility: pushing a 30MB+ re-download to every user just to add five wallpapers is far too heavy. Wallpapers are content; they update on a different rhythm than code.

Where to draw the bundled/remote line

"Just make everything remote" would be easy to say, but then the grid is blank on first launch and the experience falls apart. I draw the line on two axes.

The first is contribution to the launch experience. Anything on the very first screen — the onboarding background, the handful of thumbnails visible in the first grid — gets bundled, because a network wait there leads straight to drop-off. The second is update frequency: seasonal collections and new drops go remote, while things that never change (the logo, placeholders) stay bundled.

In practice, my split looks like this:

  • App icon, splash, UI icons: bundled (a few hundred KB)
  • Only the thumbnails of the first 6–8 wallpapers visible in the opening grid (not full resolution): bundled
  • Full-resolution wallpapers, extra collections, seasonal sets: all remote

With just this policy, the only thing bundled is thumbnails and UI assets, and the binary shrinks dramatically. On a real app I cut the IPA from 90MB to 28MB — about a 69% reduction.

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 rule for splitting bundled vs remote assets along two axes: launch experience and update cadence
A manifest-plus-prefetch implementation that cut the IPA by over 60% without slowing first paint
HEIC/WebP, Display P3 and downsampling steps that reduced per-image transfer to one third
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 $15 for lifetime access
View Membership →

Related Articles

App Dev2026-08-05
A JSON File 19% Smaller That Ships Only 3% Smaller — Measuring Catalog Payloads Against gzip
Five payload formats measured on a 20,000-item wallpaper catalog. Key shortening saves just 3.2% after gzip, while a columnar layout cuts 26.8%. Real numbers for Brotli, paging, and JSON.parse time.
App Dev2026-09-10
Your First EAS Workflow in a Rork Repo, and the Alert That Goes Missing Exactly When You Need It
Putting two files into .eas/workflows in a repo exported from Rork, and why a notification wired with needs stays silent on exactly the nights it fails — with the output of a small local checker I actually ran.
App Dev2026-09-02
Leave image out of eas.json and an SDK bump moves your Xcode and pnpm too
If eas.json has no image field, your builds run on the auto alias. Move one SDK alias and Xcode, Node.js, pnpm and fastlane all change together. Here is how to read the image name out of your last green build and decide whether to pin it before Xcode 27 lands.
📚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