RORK LABJP
CLOUD — Rork Max compiles Swift on a cloud Mac fleet and streams the simulator to your browser, so no Xcode or Mac is requiredSIM — The streamed simulator runs at 60fps and accepts real touch input in the browser, letting you feel the app without a deviceNATIVE — You get native capabilities like AR and LiDAR scanning, Metal-backed 3D rendering, and on-device inference with Core MLWIDGET — Home Screen widgets, Dynamic Island, Live Activities, Siri Intents, HealthKit, NFC, and App Clips are all in reachARR — Rork Max reached $1.5M ARR within three days of its February 2026 launch, a fair signal of demand for native generationIOS27 — The iOS 27 public beta arrived in mid-July, so now is the time to check generated apps ahead of the autumn releaseCLOUD — Rork Max compiles Swift on a cloud Mac fleet and streams the simulator to your browser, so no Xcode or Mac is requiredSIM — The streamed simulator runs at 60fps and accepts real touch input in the browser, letting you feel the app without a deviceNATIVE — You get native capabilities like AR and LiDAR scanning, Metal-backed 3D rendering, and on-device inference with Core MLWIDGET — Home Screen widgets, Dynamic Island, Live Activities, Siri Intents, HealthKit, NFC, and App Clips are all in reachARR — Rork Max reached $1.5M ARR within three days of its February 2026 launch, a fair signal of demand for native generationIOS27 — The iOS 27 public beta arrived in mid-July, so now is the time to check generated apps ahead of the autumn release
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-deliveryExpo150performance10

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 $10 for lifetime access
View Membership →

Related Articles

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.
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-07-07
Laying Out Variable-Height Images in Two Columns: A Masonry Wallpaper Gallery in a Rork Expo App
From why numColumns cannot pack variable-aspect images cleanly, to a dependency-free column-balancing algorithm, to keeping virtualization with FlashList masonry and a pragmatic no-dependency fallback, building a wallpaper gallery with real code.
📚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 →