Cramming the entire world into 46 megabytes

· Kim Engels

The thing that makes Skyty unusual is also the thing that’s hardest to believe: every device that downloads the app gets a full vector world map. No follow-up download. The whole planet is in the App Store binary.

When I first explained this to a friend who works in mapping, she didn’t believe me until I sent her the file. Forty-six megabytes. The entire world. She asked, how. Three tricks.

Trick 1: vector instead of raster

A satellite image of Earth at street-level zoom is roughly 70 terabytes. A vector representation of the same thing — here is a road, here is a coastline, here is a polygon called Italy — is about 120 gigabytes for the entire OpenStreetMap database, all detail levels included.

Vectors win because they describe geometry, not pixels. The same coastline polygon is sharp at every zoom level; the renderer fills in the details on the GPU as you zoom. There’s no resolution to choose.

For Skyty, vectors also mean we can re-style them. Aviation Dark, Aviation Light, Topographic — same data, different paint.

Trick 2: pmtiles

Traditional vector tile sources store one file per tile. At zoom 6, the world is about 4 000 tiles; at zoom 14, it’s tens of millions. Even with sparse tiles for ocean, a tile-per-file scheme creates massive directory listings and a lot of wasted disk overhead.

Protomaps introduced a format called PMTiles: a single file containing a header that maps every tile coordinate to a byte offset and length within the file. Reading tile (z=6, x=22, y=15) is a single seek + read of a few KB. No directories, no metadata duplication, no overhead per tile.

This is a big deal for two reasons:

Trick 3: prune the zoom levels

The full Protomaps OSM build runs zoom 0 to zoom 15. That’s where you get the street-level detail. But on a long-haul flight at FL370, you’re never going to zoom in to street level. The view from a plane window is zoom 5 to 7.

So we ship Skyty with zoom 0–6 only. That’s enough to see continents, country borders, ocean labels, major rivers and cities — exactly what you’d care about at cruise altitude. The rest of the zoom pyramid would be dead weight.

The numbers:

Zoom rangeWhat you can seeApprox. size
0–4Continents, oceans, country shapes~10 MB
0–6Above + major cities, country borders~46 MB
0–10Above + regional roads, smaller cities~3.4 GB
0–14Above + streets, building footprints~120 GB

We pick 0–6 as the sweet spot for the bundled map and offer 0–10 as an optional download for people who want more detail when their plane descends.

What we throw away (and why it doesn’t matter at altitude)

By dropping these, we get a map that is faster to render, easier to read, and small enough to ship.

What it looks like on disk

Inside the Skyty app bundle, you’ll find:

Resources/
├── world.pmtiles          ~46 MB
├── aviation-dark.json     ~25 KB (style)
├── aviation-light.json    ~25 KB
├── cities.json            ~5 KB (87 cities for geocoding)
├── airports.json          ~2 MB (full IATA/ICAO)
└── fonts/                 ~3 MB (Noto Sans for labels)

Total: ~52 MB before compression. The App Store applies its own compression on top.

Why this matters

The whole point of an offline-first app is that you never have to decide whether you want offline. It’s just on, always, by default. Bundling the map removes one of the biggest mental loads of “downloading map regions before a trip” — the kind of pre-flight ritual that’s easy to forget exactly when you need it most.

Forty-six megabytes is small enough to download over cellular without thinking. Once it’s installed, that’s it forever.