Why we put Protomaps and MapLibre inside the app — instead of using Apple Maps
The first version of Skyty’s prototype used Apple MapKit. Looked great. Stopped working the moment the iPhone went into airplane mode. I tested it on a 90-minute hop ZRH–LIS, and the gray squares appeared somewhere over the Pyrenees. Threw out the prototype, restarted on a Sunday, rebuilt the map stack from scratch around two open-source projects: Protomaps and MapLibre. Here’s why.
Apple MapKit’s catch
MapKit is Apple’s map SDK — the one that powers Apple Maps. As an iOS developer, it’s almost free to integrate, the rendering is gorgeous, and gestures feel native because they are native.
The problem: Apple’s terms forbid caching MapKit tiles for offline use. If your network is down, MapKit shows you whatever it happens to have in its short-term cache, and after that, gray squares. There’s no offline API. It’s a deliberate product decision — Apple Maps is meant to be a connected experience.
For a tool whose entire pitch is “works without WiFi,” this was a non-starter.
What we needed instead
Three properties:
- The whole map in one file, redistributable, that we could ship inside the App Store binary.
- A renderer that runs locally without phoning home.
- No API keys, no per-load fees, because we don’t want to operate a billing relationship with map providers for every user.
Protomaps: the whole world in one file
Protomaps is an open-source format called PMTiles. The clever part: instead of millions of individual tile files (the traditional way), the entire planet’s vector tile pyramid lives inside one file with a tiny header that tells you where each tile starts. Random-access reads are O(1).
The full Protomaps build of OpenStreetMap weighs in at ~120 GB (zoom 0–15). For Skyty we extract just zoom 0–6 — enough detail for cruise altitude — which compresses to ~46 MB. That fits inside the App Store binary. No download.
License: CC0 for the tile schemas and styles, ODbL (OpenStreetMap) for the data. We attribute OSM in the app and we’re done.
MapLibre Native: GPU rendering, locally
MapLibre is the open-source fork of Mapbox GL Native, created when Mapbox went closed-source in 2020. It runs on iOS, Android, and embedded systems. It reads vector tiles, renders them on the GPU, and supports the same style spec (JSON) that Mapbox uses.
For Skyty we point it at our local PMTiles file via a custom URL scheme (pmtiles://world.pmtiles), then resolve that to the on-device path at runtime. From MapLibre’s perspective, it’s just another tile source.
License: BSD-3-Clause. Free in every sense.
Why not just use Mapbox?
Mapbox is excellent, and we considered it. The deal-breakers:
- It’s commercial — needs an API key per user.
- The pricing kicks in around 50 000 map loads per month, which a popular app would hit in a week.
- It still expects a network connection by default; the offline SDK exists but adds significant complexity and licensing constraints.
Protomaps + MapLibre give us the same rendering quality with none of the operational baggage.
What we gave up
- Pretty satellite imagery out of the box. OpenStreetMap is vector data; for satellite views we ship a separate raster tile pack as an optional download.
- Apple’s seamless integration with Look Around, search, and 3D buildings. None of this works offline anyway, so we don’t miss it for our use case.
- Some development convenience. Apple’s docs are pristine; MapLibre Native iOS docs are less polished. Worth it.
The aviation-dark theme
Out of the box, Protomaps ships several styles. None of them quite matched the cockpit-display vibe we wanted, so we forked one and rebuilt it. The result is aviation-dark — a dark base, glowing country borders, soft-blue cities, gold rivers, and minimal road clutter at low zooms. It’s the default in Skyty.
If you’d like to see the style file, it’s in the app bundle as aviation-dark.json. Open it in any text editor — it’s just JSON.
The bigger picture
Choosing Protomaps + MapLibre let us promise something nobody else credibly promises in this category: the map will always work, every time, forever, with no recurring cost or dependency on us staying in business. Even if Skyty disappears tomorrow, your installed copy keeps showing the world.
That felt like the right trade.