← All notes

Note 04 · Tech · 7 min read

Shipping a game under 40 MB

Pocket Orchard is 38.2 MB on iOS and 31.7 MB on Android. That's smaller than most photos apps' updates. We didn't get there by accident; we set a budget before writing a line of code and treated it like a hard deadline.

Why size matters

Store data is blunt: every additional 6 MB of download size lowers install conversion by around 1%. On metered connections in Brazil, India and Indonesia — where a lot of our players are — that effect is much stronger. And a small game is a game people don't delete when their storage fills up.

The budget

Pocket Orchard asset budget vs. actual (iOS)
CategoryBudgetShipped
Engine & code18 MB16.9 MB
Art8 MB6.4 MB
Audio10 MB9.8 MB
Fonts & localisation4 MB5.1 MB

Vector everything

Every tree, fruit and leaf in Pocket Orchard is a vector shape rendered at runtime, then cached as a texture sized for the device. One set of source files covers every screen from a 4.7-inch iPhone SE to a 13-inch iPad, and the whole art folder compresses to under 7 MB.

Audio: the hard part

Our cello soundtrack was the biggest risk. Instead of shipping finished tracks, we recorded 212 short phrases and wrote a small sequencer that arranges them live, layered with procedurally generated wind and birdsong. Players hear music that never quite repeats — and it's a fraction of the size of four looping songs.

A budget turns "can we make it smaller?" into "what are we willing to give up?" That's a much more useful question.

Small habits that add up

  • Subset fonts to only the glyphs each language needs.
  • Strip unused engine modules — physics, video playback and networking were all removed.
  • Run a size report on every build in CI, and fail the build if any category exceeds its budget by more than 5%.

The fonts went over budget, and we let them. Supporting Japanese and Korean properly was worth 1.1 MB. Budgets are there to force decisions, not to win arguments.