Jacob’s Tech Tavern

Jacob’s Tech Tavern

App Size 101: Drop 40% in an afternoon

Fix the 5 most common low-hanging fruit

Jacob Bartlett's avatar
Jacob Bartlett
Sep 09, 2026
∙ Paid

When I start a new job, I like to quickly make a name for myself as the “app size” guy.

This means proactively investigating the app bundle, proposing steps to make it slimmer, and implementing them in our next release. I do this for a few reasons:

  • It’s easy.

  • It’s quick.

  • It’s fun.

  • Hopefully, nobody else thought to do it yet *if it’s a startup.

  • It’s visible and comprehensible to non-technical stakeholders.

    • Especially if your work impacts install rate.

Today I’m showing you a new, free, open-source, fully private, in-browser tool to help you optimise your own app bundle. I’ll explain how it works, and along the journey we’ll go through a real-life worked example: how I optimised Granola’s iOS app size by ~40% in my first week.

By the end, you’ll have a clear to-do list to optimise your own app and look like a total genius in the process.


Sponsored Link

Recently shipped an app? Enter it in Shipaton 2026

Recently launched a mobile app? Put it in the spotlight at Shipaton 2026 — RevenueCat’s global hackathon for builders who ship real apps to real stores. Compete for over $1M in prizes and show the world what you built. Entries close September 30.


Contents

  • OpenBundle

    • How it works

  • The Low-Hanging Fruit

    • Before & After

    • Duplication

    • Asset Sizing

    • Binary Symbols

      • Stripping binary symbols

      • Symbol metadata

    • Dynamic vs Static Frameworks

    • Swift Optimisation Modes

  • Automation & Regressions

  • How to spy on your competitors

  • Last Orders 🍺


This post is so full of knowledge that your email client can and will cut it down to size. Read on my website for the best experience.

Read on my website


OpenBundle

OpenBundle is a cool new tool that analyses your app bundle and gives you recommendations for the most impactful ways you can optimise your app size.

It’s open source, lives entirely in your browser, works fully offline, and has no backend, so your privacy is guaranteed.

View OpenBundle

How it works

An .ipa is basically a .zip file containing your app: code, frameworks, and resources. OpenBundle runs in your browser (running CPython via Pyodide) to expand the archive into a temporary filesystem, and processes every file to record their:

  • path in the bundle

  • size (zip-compressed and uncompressed)

  • SHA-256 hash

Mach-O files, containing compiled Swift code, are parsed to read segments & sections, symbol tables, load commands, dyld export tries, linked libraries, run paths, build versions, encryption states, code signatures and entitlements.

Asset catalogues are parsed (using Rust tooling in WebAssembly), exposing asset names, dimensions, scales, encodings, opacity, sizes and image payloads. Browser image decoders can then lazily display previews, content hashes and real compression measurements.

OpenBundle now reconstructs the bundle’s directory hierarchy: Compiled code and assets are summed up to compute their parent folder’s size, and laid out in a hierarchical treemap: area represents data size.

If you think Elon couldn’t get any worse, he built a bloody React Native app

The rest of this article takes you through a real-life worked example of optimising an app bundle, which I implemented in my first week at Granola.


The Low-Hanging Fruit 🍒

Here’s your actual motivation: I wasn’t exaggerating above; between waxing lyrical about someday migrating away from SwiftUI and re-architecting our app modules, I did try to actually contribute something concrete in my first week at Granola.

Let’s look at some bundle-size X-rays. There are 2 numbers we care about:

Install size is how much disk space the thinned variant of your app takes up (before documents or data). Download size is the minimum amount of over-the-air network data required to install.

Before

80.9 MB install
48.4 MB download

3.5 hours of work later…

After

58.8 MB install (27% less)
28.1 MB download (42% less)

I achieved this through 5 straightforward fixes: low-hanging fruit that can apply to nearly every app:

  • Handling duplication

  • Optimising asset sizing

  • Removing binary symbols and symbol metadata

  • Choosing between dynamic and static

  • (if needed) picking your Swift optimisation modes

This article has been in the works for years, I’m sure you can wait another month to read the whole thing. If not, please pay me money. Or don’t. I can wait a month too:

Get 30 day free trial

You get your money’s worth, I promise:

⚓️ Access my full library of 50+ paywalled articles
🚀
Read free articles a month before anyone else
🧵 Master concurrency with my full course and advanced training
🧑‍🚀 Get a free copy of my new eBook, “Land your iOS Tech Job”
❤️‍🩹 Support independent, sometimes funny, tech writing

User's avatar

Continue reading this post for free, courtesy of Jacob Bartlett.

Or purchase a paid subscription.
© 2026 Jacob Bartlett · Privacy ∙ Terms ∙ Collection notice
Start your SubstackGet the app
Substack is the home for great culture