RORK LABJP
RORK-MAX — Rork Max builds native Swift apps ($200/mo) for iPhone, iPad, Watch, TV, Vision Pro, and iMessage, with AR/LiDAR and Live ActivitiesCLOUD-MAC — Rork Max compiles natively on a cloud Mac fleet, so you publish to the App Store in two clicks with no Xcode and no MacEXPO — The original Rork generates production iOS/Android apps from a description via Expo (React Native); free to start, paid from $25/moWWDC — WWDC 2026 unveils iOS 27 for iPhone 11 and later, with photos 70% faster and AirDrop 80% faster; it ships this fall with iPhone 18 ProANDROID17 — Android 17 is expected stable in June; mandatory large-screen resizability makes foldable and tablet support a baseline for appsSIRI-INTENTS — iOS 27's Siri is rebuilt on Gemini, making native apps with solid App Intents integration worth revisiting in your designRORK-MAX — Rork Max builds native Swift apps ($200/mo) for iPhone, iPad, Watch, TV, Vision Pro, and iMessage, with AR/LiDAR and Live ActivitiesCLOUD-MAC — Rork Max compiles natively on a cloud Mac fleet, so you publish to the App Store in two clicks with no Xcode and no MacEXPO — The original Rork generates production iOS/Android apps from a description via Expo (React Native); free to start, paid from $25/moWWDC — WWDC 2026 unveils iOS 27 for iPhone 11 and later, with photos 70% faster and AirDrop 80% faster; it ships this fall with iPhone 18 ProANDROID17 — Android 17 is expected stable in June; mandatory large-screen resizability makes foldable and tablet support a baseline for appsSIRI-INTENTS — iOS 27's Siri is rebuilt on Gemini, making native apps with solid App Intents integration worth revisiting in your design
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-deliveryExpo77performance12

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'm Masaki Hirokawa, an artist and indie developer. I have been building iOS and Android apps on my own since 2014, mostly wallpaper, relaxation and mindfulness apps, and they have added up to roughly 50 million downloads. I currently run six wallpaper apps in parallel, and every one of them lives on the same tension: the urge to add more images versus the need to keep the binary light. This article is how I resolved that tension in the architecture, shown 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
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-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-05-11
Slow Images in My Rork Wallpaper App: Switching to expo-image and What Actually Changed
A hands-on account of switching from React Native's default Image component to expo-image in a Rork-generated wallpaper app — with code examples, blur hash setup, and observable performance improvements.
App Dev2026-03-15
Building Your First AI Companion App with React Native
Learn how to build a simple AI chat companion app using Expo and React Native. Connect to Claude or OpenAI and create your own Replika-like experience.
📚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 →