react-brain
Browse decisions
React & language foundations 3App architecture 10UI 13Platform & native 9Build, test, observe, secure 6AI in React apps 3stack composerdecision recordscensusstaleness bencharchitecturechangelogmethodologyroadmap

entriesui · verified 2026-07-16 · react + react-native

Maps & geolocation UI

reviewedconfidence: lowearly: 2/14 of this tier graded so far (0 overturned) — the public scorecard →

re-verified 3× — 2026-07-16 · 2026-07-13 · 2026-07-06 · changelog

recommendation

React Native → react-native-maps for platform-native basics (markers, regions); switch to MapLibre RN when you need custom vector styles or offline without per-load billing, or @rnmapbox/maps when you want Mapbox's full commercial stack. Web → react-map-gl on MapLibre GL JS (mapcn for ready-made shadcn-style components). Lightly vetted (confidence: low) — prototype clustering + offline on-device before committing.

  • basic platform-native map + a few markers (RN) → react-native-maps (expo-maps is the Expo-native successor but ALPHA — track it, don't ship it)
  • custom map styling / offline regions / no per-load billing → MapLibre (@maplibre/maplibre-react-native on RN, react-map-gl on web) + any tile source
  • turnkey commercial stack (style studio, navigation, support) and the pricing is acceptable → @rnmapbox/maps
  • large marker sets needing native clustering on New Arch → react-native-better-maps (1.0, one release old — prototype first)
  • shadcn-patterned web map UI fast → mapcn
  • web app committed to Google Maps (tiles, Places, Street View) → @vis.gl/react-google-maps

Low confidence — fast-moving or lightly-vetted domain: treat the pick as a vetted lead and prototype before committing.

Options & tradeoffs

the field considered — and why each one isn’t the default here

optiontradeoffevidence
react-native-maps (1.29)the long-standing RN default — Apple Maps on iOS / Google Maps on Android; simple markers/polylines; limited style customization, no programmatic offline-region API; Google Maps billing applies on Android (~$7/1k mobile map loads)806k/wk
expo-maps — ALPHAExpo's modern maps module (Apple Maps iOS / Google Maps Android, SDK-versioned); explicit alpha with frequent breaking changes, no Expo Go — watch, don't bet yet103k/wk
@rnmapbox/maps (10.x)Mapbox native SDK — custom vector/GL styles, offline region downloads, navigation stack; commercial usage pricing after the free tier
@maplibre/maplibre-react-native (11.x)open-source Mapbox-SDK fork — Mapbox-compatible GL styles + offline, works with ANY tile source, no token or per-load pricing; you source (or pay for) tiles yourself
react-native-better-maps (1.0, Nitro)NEW (2026-06) — MapKit + Google Maps on Nitro Modules, New-Arch-only (RN 0.78+); native marker clustering + POI taps; one release old
web: react-map-gl / react-leaflet / mapcnreact-map-gl (8.x) wraps MapLibre/Mapbox GL JS; react-leaflet = classic raster Leaflet; mapcn = shadcn-patterned map components on MapLibre + Tailwind (copy-paste model)1.8M/wk · ships in 1/34
web: @vis.gl/react-google-maps (1.9)the vis.gl/OpenJS-governed React wrapper for the Google Maps JS API — components + hooks, markers/drawing; the maintained pick when the product is committed to Google's tiles/Places stack (per-load billing applies)1.4M/wk

evidence: npm weekly downloads (signals snapshot) · “ships in n/D” = adoption across the production-app census, honest denominators

npm weekly downloads (from the corpus's last signals run): react-native-maps 806k · expo-maps 103k · @rnmapbox/maps 134k · @maplibre/maplibre-react-native 98k · react-native-better-maps 439 · react-map-gl 1.8M · @vis.gl/react-google-maps 1.4M · react-leaflet 2.5M

Verified notes

The durable selection axis is the TILE/SDK PROVIDER, not the React wrapper: platform-native (Apple/Google — free-ish but Google bills per load and styling is limited) vs Mapbox (powerful, commercial) vs MapLibre + open tiles (free, self-hostable, Mapbox-compatible styles) — wrappers are cheap to swap, the provider commitment (billing, offline rights, style ecosystem) is not. NEW entry (2026-07-06): two independent signals in one week — react-native-better-maps 1.0 (TWiR #288) and mapcn (React Status #481) — exposed that maps, a common hard app need, had no entry. Versions verified vs npm (react-native-maps 1.29, @rnmapbox/maps 10.3, maplibre-react-native 11.3, react-map-gl 8.1, better-maps 1.0.0); expo-maps ALPHA status verified vs the Expo docs. ADDED 2026-07-13: @vis.gl/react-google-maps (1.9.0, verified vs npm) on its 2nd independent signal (TWiR #289 bench → React Status #482) — the Google-committed web lane the web row lacked.

Canonical reading

Editorial annotations on why each piece matters — the articles themselves are the originals; read them there.

react-native-maps vs Mapbox RN vs MapLibre RN (2026)PkgPulse (team-authored)

The concrete three-way comparison behind this entry's axes: per-load pricing math (Google ~$7/1k mobile loads vs Mapbox $0.50/1k after free tier vs MapLibre free-but-BYO-tiles), which libraries actually expose offline region-download APIs (Mapbox/MapLibre yes, react-native-maps no), GL style customization, API-key requirements, and New-Architecture status — with code for each. Team-authored (no individual byline) but sourced and measured; use for the decision table, not authority.

Sources

Depth (in-domain rules) is owned by the react-native-best-practices skill — this entry is selection breadth.

The full explanation

The reviewed long-form essay behind this entry — the why, not a how-to. Also on GitHub.

About maps & geolocation UI

Diataxis: Explanation. This page builds understanding of the maps decision — why the durable axis is the tile/SDK provider, not the React wrapper. It is not a marker-API guide and not a setup tutorial. The candidate list and one-line tradeoffs live in the index entry RB-E-MAPS; marker/cluster render-performance depth is owned by the react-native-best-practices skill. The entry's own confidence is low — its recommendation is lightly vetted and ends with an instruction to prototype clustering + offline on-device before committing — so read this as a map of the territory, then run the prototype.

The one commitment that organises everything: a tile economy, not a widget

A map view looks like a component, but you do not own it the way you own a button. Every option in the entry is a React-shaped door into someone's tile/SDK provider, and the entry's note states the axis outright: the durable selection axis is the provider, not the wrapper — wrappers are cheap to swap; the provider commitment (billing, offline rights, style ecosystem) is not. You are choosing which economy your map lives in:

  • Platform-native (Apple/Google) — free-ish, but Google bills per load on Android (~$7/1k mobile map loads) and style customization is limited.
  • Mapbox — powerful and commercial: custom vector/GL styles, offline region downloads, a navigation stack; usage pricing after the free tier.
  • MapLibre + open tiles — free and self-hostable, Mapbox-compatible styles, works with any tile source; you source (or pay for) tiles yourself.

The entry's one reading is the decision table for exactly this split: per-load pricing math (Google ~$7/1k mobile loads vs Mapbox $0.50/1k after the free tier vs MapLibre free-but-BYO-tiles), which libraries actually expose offline region-download APIs (Mapbox/MapLibre yes, react-native-maps no), GL style customization, API-key requirements, and New-Architecture status. It is team-authored but sourced and measured — the entry's own grading: use it for the decision table, not authority.

The default, and why

React Native → react-native-maps for platform-native basics (markers, regions); switch to MapLibre RN when you need custom vector styles or offline without per-load billing, or @rnmapbox/maps when you want Mapbox's full commercial stack. Web → react-map-gl on MapLibre GL JS (mapcn for ready-made shadcn-style components). Lightly vetted (confidence: low) — prototype clustering + offline on-device before committing.

Read the default as a provider ladder, not a library list. On React Native you start in the platform-native economy — react-native-maps for markers and regions, the long-standing default — and both named escalations change the economy, not the wrapper: MapLibre when the trigger is custom vector styles or offline without per-load billing, Mapbox when you want the turnkey commercial stack. On web the default already sits in the open economy: react-map-gl on MapLibre GL JS, with mapcn when you want ready-made shadcn-patterned components fast. The closing caveat is load-bearing: clustering and offline are exactly the capabilities that differ by provider and by library maturity, which is why the entry says to prototype them on-device before committing.

The landscape, economy by economy

Platform-native (Apple/Google). react-native-maps (1.29) is the long-standing RN default — Apple Maps on iOS / Google Maps on Android, simple markers and polylines — with the provider's costs attached: limited style customization, no programmatic offline-region API, and Google Maps billing on Android. expo-maps is Expo's modern, SDK-versioned module in the same economy, and it is explicitly ALPHA — frequent breaking changes, no Expo Go; the entry's wording is "watch, don't bet yet." react-native-better-maps (1.0) is the new-arch lane: MapKit + Google Maps on Nitro Modules, New-Arch-only (RN 0.78+), native marker clustering and POI taps — and one release old, so prototype first. On web, the Google-committed lane is @vis.gl/react-google-maps (1.9) — the vis.gl/OpenJS-governed React wrapper for the Google Maps JS API (components + hooks, markers/drawing), the maintained pick when the product is committed to Google's tiles/Places stack (per-load billing applies).

Mapbox. @rnmapbox/maps (10.x) is the Mapbox native SDK: custom vector/GL styles, offline region downloads, and a navigation stack — the turnkey commercial stack (style studio, navigation, support) when the pricing is acceptable.

MapLibre + open tiles. @maplibre/maplibre-react-native (11.x) is the open-source Mapbox-SDK fork: Mapbox-compatible GL styles plus offline, any tile source, no token and no per-load pricing — the cost moves to sourcing (or paying for) tiles yourself. On web, react-map-gl (8.x) wraps MapLibre/Mapbox GL JS, and mapcn layers shadcn-patterned map components on MapLibre + Tailwind in the copy-paste model. react-leaflet is the classic raster Leaflet wrapper — listed in the entry's web row without a graded tradeoff, so this page stakes no claim on it beyond its existence.

The entry itself is young: created 2026-07-06 when two independent signals in one week (react-native-better-maps 1.0 and mapcn) exposed that maps — a common hard app need — had no entry. Versions are verified against npm (react-native-maps 1.29, @rnmapbox/maps 10.3, maplibre-react-native 11.3, react-map-gl 8.1, better-maps 1.0.0, @vis.gl/react-google-maps 1.9.0) and the expo-maps alpha status against the Expo docs.

Tradeoffs and failure modes to name out loud

  • Choosing the widget, inheriting the landlord. Comparing wrappers by API ergonomics while ignoring the provider underneath. Wrappers are cheap to swap; billing, offline rights, and the style ecosystem are not.
  • Discovering offline late. react-native-maps has no programmatic offline-region API; per the entry's reading, only Mapbox and MapLibre expose offline region downloads. If offline is a requirement, the provider decision is already made — better to know that before the wrapper is load-bearing.
  • The free wrapper on metered tiles. Every library here is free; the map may not be. Google ~$7/1k mobile loads, Mapbox $0.50/1k after the free tier, MapLibre free but bring-your-own tiles — per-load pricing belongs in the architecture review, not in the invoice surprise.
  • Shipping the alpha. expo-maps is explicit alpha with frequent breaking changes and no Expo Go support. Track it; don't ship it.
  • Betting on one release. react-native-better-maps is 1.0, one release old, and New-Arch-only (RN 0.78+) — simultaneously a maturity bet and an RN-version gate. The entry's when-clause says prototype first.
  • Trusting this page too much. Confidence is low by the entry's own admission, and the pricing/capability table comes from a team-authored comparison the entry grades "decision table, not authority." Prototype clustering + offline on-device; re-verify pricing before committing.

How it interacts with the rest of the stack

  • Render performance (react-native-best-practices). The defer skill: marker and cluster render performance lives there. This page owns which provider and wrapper; that skill owns keeping large marker sets smooth.
  • Component libraries (RB-E-COMPONENT-LIBS). mapcn brings the shadcn copy-paste distribution model to maps — the same ownership tradeoffs as any shadcn-patterned components.
  • RN versions (RB-E-RN-VERSIONS). react-native-better-maps is New-Arch-only (RN 0.78+): a maps pick can be gated by where the app sits in the upgrade lane.
  • Native modules (RB-E-NATIVE). better-maps rides Nitro Modules — a UI-level pick that imports a native-module technology commitment.

In one paragraph

A map view is rented, not owned: every React map library is a wrapper over a tile/SDK provider, and the provider — not the wrapper — is the durable commitment, because billing, offline rights, and the style ecosystem all live there. The three economies are platform-native (Apple/Google: free-ish, Google bills ~$7/1k mobile loads on Android, limited styling), Mapbox (custom GL styles, offline regions, navigation; commercial after the free tier), and MapLibre + open tiles (free, self-hostable, any tile source; you bring the tiles). The default starts platform-native (react-native-maps) and escalates by changing economy — MapLibre for custom styles or offline without per-load billing, Mapbox for the turnkey commercial stack — while web defaults to react-map-gl on MapLibre GL JS, with @vis.gl/react-google-maps as the Google-committed lane. expo-maps is alpha (watch, don't bet), better-maps is a one-release-old New-Arch bet, only Mapbox/MapLibre expose offline region downloads, and the entry's standing order — confidence is low — is to prototype clustering + offline on-device before committing.


See also: RB-E-COMPONENT-LIBS (mapcn's shadcn copy-paste model), RB-E-RN-VERSIONS (New-Arch-only picks gate on the upgrade lane), RB-E-NATIVE (Nitro Modules under better-maps). Marker/cluster render performance: the react-native-best-practices skill. Background reading: PkgPulse's react-native-maps vs Mapbox RN vs MapLibre RN comparison — the entry's decision table for pricing, offline APIs, and New-Architecture status.

Related in ui: styling · component-libs · animation · lists · a11y · i18n · charts · editors · svg · calendars · sheets · polish