§ why
Why another maps API?
Fair question. The unflattering version first.
The world does not need another tile server. Vector tiles are a solved problem that Mapbox solved in 2014. Geocoding is solved twice over, differently, by Nominatim and Pelias. Routing was solved by OSRM in 2010 and solved again by Valhalla in 2015. If unmap were a fourth implementation of things that already work, a shrug would be the correct response.
So the question isn't whether the world needs another maps API. It's whether a basemap is the kind of dependency you should be renting.
Every claim below carries a source, because a belief without one is marketing.
A map is a rented opinion
The pricing half of this argument is well told, and it's Cory Doctorow's: platforms are good to users until users are locked in, then good to business customers until they're locked in, then extract from everyone.1 Maps vendors carry the usual ingredients. Proprietary SDKs, per-product pricing, terms that restrict what you may cache, and a migration cost that grows with every feature you ship.
The half that gets less attention is that renting the map means renting what it says.
On 27 August 2026, a US executive order renamed Lake Ontario to "Lake America" and directed the Interior Department to update the federal names database.2 Within days the US Geographic Names Information System carried the new name and Google said it would follow: US users would see "Lake America", Canadian users "Lake Ontario", everyone else both.3 The same sequence had already run once, with the Gulf of Mexico, under Executive Order 14172 in January 2025.4
The next day, Canadian sites started showing it. Hydro One's outage map, the LCBO's store locator, GO Transit's station finder, Infrastructure Ontario's property list, the federal government's housing and infrastructure map.56 Hydro One said the problem "originates from a third-party mapping service" and that it was working with its vendor.6 Metrolinx switched its map off.5
Nobody at any of those organizations typed "Lake America". They embedded a map, the way everyone embeds a map, and the label arrived on its own. Google's consumer app showed Canadians the Canadian name; the embedded API, by default, did not. Google's answer was that developers can localize an embedded map by setting a region, and that "Lake Ontario" shows when it's set to Canada.5 The fix was a configuration flag those teams had never been asked to choose, whose default answered to a different government than their users did.
Which makes this a software problem rather than a naming one. Nothing changed on the customer's side: no deploy, no dependency bump, no lockfile diff, no line in any of those repositories. Every other dependency you ship is pinned to something, a version or a digest or a commit. The basemap is the one whose contents can be replaced remotely while your build output stays byte for byte identical, and the first you hear of it is a screenshot.
So here is ours. Basemap labels come from OpenStreetMap and Natural Earth, and the geocoder's place names from the Canadian Geographical Names Database among other open sources.7 None of those is the US federal names database, which is the path this change travelled. Fetch /tiles/7/36/46 today and the water label reads Lake Ontario, with Lac Ontario beside it in the same tile.
That's a smaller promise than immunity, and we'd rather draw its edges than let you assume them. There's no pinned tile version, and a name here can still move, because OpenStreetMap can be edited. What's different is that the edit has an author, a timestamp and a revert button, that whatever you cached stays yours to serve,8 and that a name changing without a changelog entry is the first item on our own list of ways to catch us.
There is no neutral map, only disclosed and undisclosed
Ontarí'io is Iroquoian, from Wendat, and the sources don't agree on what it says: lake of shining waters, or beautiful lake.9 It has been in use since at least 1641, which puts it ahead of both countries that touch the water. French maps ran Lac de Saint-Louis and Lac Frontenac against it from 1632 to 1712 and lost. In Seneca the lake is sga:nyodai:yoh, beautiful lake, and the Seneca Nation, one of the six nations of the Haudenosaunee, has said the renaming breaches the 1794 Treaty of Canandaigua,10 whose third article fixes the Nation's boundary "beginning on Lake Ontario".11
Four hundred years of disagreement, a live treaty claim, several naming authorities with real standing, and no settled translation of the name everyone is arguing about. That's a completely ordinary place name, and the map has always had to pick one. What's new is that the picking happens inside a vendor's configuration, per viewer, invisibly, and then gets described as neutral.
Nothing is neutral. Things are disclosed or they aren't.
Names are data, not labels
So our geocoder records don't have a name. They have a set of them, in the same row, all queryable. Abridged from the live response for Montreal:
{
"id": "23491400",
"layer": "locality",
"names": {
"en": "Montreal",
"fr": "Montréal",
"iu": "ᒧᕆᐊᓪ"
}
}lang= picks which of those is rendered as the record's name. Same record, same id, same geometry, chosen at request time rather than by building against a different dataset.12
Basemap labels work differently. There, lang= selects among the name:* tags the tiles actually carry, which is a fixed set of supported languages. Indigenous names are not in that set and are not requested that way: they ride on the feature itself as an additional name, so Iqaluit arrives as Iqaluit with ᐃᖃᓗᐃᑦ alongside it and the label renders both lines whichever language you asked for.13 Syllabics never needed enabling. They needed fonts that could draw them.
Search matches names in whatever script you write the query in, because the text index folds every language in the record into one BM25 field:
GET /geocode/search?q=ᐃᖃᓗᐃᑦ
→ Iqaluit · layer: locality · Nunavut
That used to return three unrelated office buildings, whose city was Iqaluit while the syllabics matched nothing at all; an integration test pins top.layer === "locality" now. Montréal and Montreal return the same record, and the accent costs the correct spelling nothing: the index folds accents before scoring.
Those names come from CGNDB, published under the Open Government Licence,7 and from Who's On First, whose records carry the licences of the open sources they came from. Both are redistributable with attribution. Nothing scraped from communities that didn't publish it.
Show the gap
The engine handles syllabics. The data often doesn't have them.
Checked against ten major Nunavut and Nunavik communities on 2026-09-08, a query written in syllabics resolves the community itself for seven of them. ᑲᖏᕿᓂᖅ returns Rankin Inlet. ᐃᓄᒃᔪᐊᒃ returns a street address inside Inukjuak rather than Inukjuak. ᐅᖅᓱᖅᑑᖅ and ᐃᖃᓗᒃᑑᑦᑎᐊᖅ return nothing at all, because those two records carry their Inuktitut name only in Latin transcription. Every one of those is a request you can repeat against the demo key.
It's a sourcing gap rather than a query gap, which is the better problem to have: nothing in the search path has to change, and the moment a row gains an Inuktitut value the next corpus bake picks it up. But seven of ten is not "Inuktitut support", and we're not going to call it that. If a capability page here doesn't tell you what fraction of rows it applies to, that's a defect and you should file it.
Easy to leave is the entire point
Extraction needs captivity. Terms can only get worse than the alternatives if reaching the alternatives is expensive, and exit cost is something a vendor builds on purpose: a proprietary SDK, a tile format only its renderer reads, a UI layer you import at runtime and cannot fork. So the answer isn't to promise we'll stay good, because that promise has no enforcement mechanism. The answer is to keep the exit cheap enough that the promise doesn't matter.
That's why the north star is a working map in under sixty seconds, and why the SDK is two statements after install. Fast to start is the same property as fast to leave; you only notice which one you're using on the way out.
npm i @unmap/sdkStandard formats throughout. Mapbox Vector Tiles on a plain z/x/y URL and style documents any MapLibre-spec renderer reads, so the map you built is a map another vendor's tiles can fill. Routes come back as a GeoJSON LineString and isochrones as a FeatureCollection.14 The renderer is MapLibre GL, not a fork of it, and unmap.map is the MapLibre map object itself rather than a facade, so every MapLibre event, source, layer and control stays available whether or not we thought to expose it. OpenStreetMap and open government data underneath, so the data doesn't leave with us. Cache what you fetch for as long as you want, including after you cancel, which is a term and not a favour.8
The UI is copied rather than imported. unmap add map writes the component into your own components/ui/ as source you can edit, from a flat JSON registry at registry.unmap.dev/r/<item>.json that the shadcn CLI reads, and so can anything else. Code you own can't be made worse by us later, which is the only version of "we won't enshittify" that carries its own enforcement.
What we don't offer is the archive itself. There's no download of the planet tile file, and permissive caching of what you fetch is not the same thing, so we're not going to call it portability. If you decide we've gotten worse, we'd like your migration to be boring.
Depth is proof, not territory
We're built in Calgary and built for Canada in detail. Indigenous place names are in the search index today, and Canadian depth is the kind of work that extends to datasets like legal land descriptions and seasonal road bans rather than to more countries.
That's evidence of method, not a claim of coverage. Canada remains the boundary of our geocoding, routing and detailed datasets; the vector basemap is worldwide, and it's where we're willing to do the unglamorous work global platforms treat as secondary. A flag on the homepage proves nothing. Syllabics in the search index proves something.
How to catch us
Beliefs are cheap. Here's what would show ours were hollow:
- A name changes in your app without a changelog entry
- You learn what your own map says from someone else
- A capability page claims coverage without publishing the denominator
- A format appears that only we can read
- The free tier gets meaner rather than the paid tiers getting better
- Migrating away takes longer than migrating in
Any of those, tell us in public. That's the deal.
Get a key → · Free tier, no card.
Footnotes
-
Cory Doctorow's enshittification thesis, as laid out on CBC's Ideas, "The internet is dying. The internet is dead." (February 2026). ↩
-
The White House, "Honoring the American History of the Great Lakes and Renaming Lake Ontario as Lake America", 27 August 2026. ↩
-
Google, "How the GNIS Lake Ontario/Lake America name change in the U.S. will appear in Maps", 29 August 2026: "People using Maps in the U.S. will see 'Lake America,' those in Canada will continue to see 'Lake Ontario,' and those outside of the U.S. and Canada will see both names." ↩
-
Executive Order 14172, "Restoring Names That Honor American Greatness", Federal Register, 31 January 2025. ↩
-
CBC News, "Google updates maps to show Lake America in the U.S., but Canadians are now seeing it, too", 30 August 2026. Also the source for Metrolinx disabling the GO stations map and for Google's statement that embedded maps localize by region. ↩ ↩2 ↩3
-
Global News, "Some Ontario government, business websites show 'Lake America' on maps", 31 August 2026. Source of the Hydro One statement. ↩ ↩2
-
Natural Resources Canada, Canadian Geographical Names Database, published under the Open Government Licence. ↩ ↩2
-
unmap terms of service, caching section: cached results stay yours to keep and to serve, and that permission survives cancellation. ↩ ↩2
-
The translations are genuinely unsettled across sources; Wikipedia's summary collects the competing readings and the 1641 first attestation, which is the point being made rather than a detail we are relying on. ↩
-
Associated Press, "Seneca Nation calls for reversal of Trump's 'Lake America' executive order", 31 August 2026. ↩
-
Treaty of Canandaigua, 11 November 1794, Article III, via the Avalon Project. ↩