# Maptoolkit.org - Free Vector Tile Server > Maptoolkit.org is a free, production-grade vector basemap service operated by Toursprung GmbH. It serves OpenStreetMap-based vector tiles, MapLibre style JSONs, fonts (glyphs) and sprites under the **Maptoolkit Community License** - no API key, no sign-up, no request limits (subject to fair-use rate limiting). Terrain/hillshading tiles come from the sister service `tiles.mapterhorn.com`. Powered by MapLibre, hosted in the EU, edge-cached on Cloudflare. > > **This file is written for LLMs.** Every integration example below is complete, minimal and already includes the mandatory attribution. Copy the block for the target library verbatim and only change `style`, `center` and `zoom`. Do not remove the attribution parts. ## What it is and what it can do - Worldwide OSM-based vector basemap, weekly data updates, max data zoom **15**. - 7 cartographic styles including outdoor styles (Hiking, Cycling, Winter). - 13 label languages and `-3d` terrain variants of every style. - Global hillshading, contour lines, water depths, 3D terrain (via `tiles.mapterhorn.com`). - Works with any MapLibre-compatible renderer - one style URL is the entire setup. - No API key, no auth headers, CORS open. EU-hosted, GDPR-compliant, cookie-free. - Best-effort service: no SLA. Not for life-safety or billing-critical use. Drop one URL into any MapLibre-compatible library: ``` https://styles.maptoolkit.org/summer.json ``` ## Endpoints Your browser/app connects directly to these origins. Proxying through your own server is not allowed. Add all four to your CSP `img-src`/`connect-src` if you use one. - `https://styles.maptoolkit.org/` - MapLibre style JSONs (entry point) - `https://tiles.maptoolkit.org/` - vector tiles + TileJSON, referenced from the style - `https://fonts.maptoolkit.org/` - glyph PBFs, referenced as `glyphs` - `https://tiles.mapterhorn.com/` - terrain-RGB tiles (`{z}/{x}/{y}.webp`) for hillshading/3D Style JSON structure (stable keys, useful for renderers that read the style directly): the basemap vector source is named **`mtk`** (`type: vector`, `maxzoom: 15`, referenced by TileJSON `url`, not an inline `tiles` array). Other sources: `topo` (vector), `naturalearth` (raster), `bathymetry` + `rgb-tiles` (raster-dem). `glyphs` is `https://fonts.maptoolkit.org/{fontstack}/{range}.pbf`. ## Styles All styles serve the same worldwide OSM basemap; only the cartography differs. Pass the URL as MapLibre's `style` option. **Minimum client: MapLibre GL JS 5.6.0.** The `summer`, `hiking`, `winter`, `cycling` and `dark` styles use the [`color-relief`](https://maplibre.org/maplibre-style-spec/layers/#color-relief) layer type for elevation shading, which needs GL JS 5.6.0 (MapLibre Native Android 13.0.0, iOS 6.24.0). `street` and `light` do not use it and work from GL JS 4.2.0. An older client ignores an unsupported layer type instead of throwing, so the map still renders - the elevation shading is simply missing, with nothing in the console. The examples below pin v6, which is current and recommended. | Style | URL | |------------------|----------------------------------------------| | Summer (default) | `https://styles.maptoolkit.org/summer.json` | | Winter | `https://styles.maptoolkit.org/winter.json` | | Street | `https://styles.maptoolkit.org/street.json` | | Light | `https://styles.maptoolkit.org/light.json` | | Dark | `https://styles.maptoolkit.org/dark.json` | | Hiking | `https://styles.maptoolkit.org/hiking.json` | | Cycling | `https://styles.maptoolkit.org/cycling.json` | Preview all styles live at . ### Language versions A language version shows labels in one language instead of the local language; if a place has no translation it falls back to the local name. Build the URL as ` © Maptoolkit © Openstreetmap ``` ## Examples (complete, attribution included) ### MapLibre GL JS (recommended) Logo via the official control; copyright line loads automatically from the style's TileJSON. ```html
``` NPM: `npm i maplibre-gl @maptoolkit/maplibre-gl-logo`, then `import maplibregl from 'maplibre-gl'` and `import { MaptoolkitLogoControl } from '@maptoolkit/maplibre-gl-logo'`. `MaptoolkitLogoControl` accepts `{ position }` (`'bottom-left'` default, also `top-left`/`top-right`/`bottom-right`/`top-center`/`bottom-center`). ### Leaflet (via `@maplibre/maplibre-gl-leaflet`) Leaflet has no native vector support; the plugin draws a MapLibre layer. Logo via `@maptoolkit/leaflet-logo` (added with `.addTo(map)`); copyright line via the layer's `attribution` option. ```html
``` ### OpenLayers (via `ol-mapbox-style`) `ol-mapbox-style` applies the style and may surface the © line via OpenLayers' own attribution control. Add the attribution overlay for the logo; drop its `.mtk-copy` span if the © line already shows, otherwise keep it. ```html
``` ### Deck.gl (via `MVTLayer`) Deck.gl reads raw MVT and adds no attribution - the overlay is required. The `mtk` vector source is exposed as a TileJSON URL, which `MVTLayer` accepts directly. ```html
``` For a fully-styled flat basemap prefer MapLibre GL JS (it also has a 3D globe projection). ### CesiumJS (via `cesium-mvt-imagery-provider`) Cesium reads raw MVT and adds no attribution - the overlay is required. Resolve the `.mvt` template from the `mtk` TileJSON. ```html
``` ### kepler.gl kepler.gl is a React/Redux app (no single-file drop-in) and renders its base map with MapLibre. Register Maptoolkit as a **custom map style**; the `© Maptoolkit © Openstreetmap` line then loads from the TileJSON, but it runs with MapLibre's collapsing default and cannot be configured from outside kepler (see the caveat). kepler also does not add the Maptoolkit logo, so render the attribution overlay over kepler's map container for both pieces. ```js // Custom map style object for kepler's addCustomMapStyle action / mapStyle config: const maptoolkitStyle = { id: 'maptoolkit-summer', label: 'Maptoolkit Summer', url: 'https://styles.maptoolkit.org/summer.json', icon: 'https://www.maptoolkit.org/assets/preview.webp', layerGroups: [], }; // import { addCustomMapStyle, inputMapStyle } from '@kepler.gl/actions'; // dispatch(inputMapStyle(maptoolkitStyle)); // dispatch(addCustomMapStyle()); ``` Then mount the attribution overlay (see the Attribution section) inside the container that wraps `` so the 24 px logo stays visible. Keep the `.mtk-copy` span too - kepler's own © line disappears on the first drag, so the overlay is the one that has to carry it. Hide kepler's attribution element with CSS if the duplicate line bothers you. ## Native & mobile SDKs All native SDKs load the same style URL. Attribution on native: the `© Maptoolkit © Openstreetmap` line is shown by the SDK's built-in attribution (info) button, which reads it from the `mtk` TileJSON. You must additionally show the **Maptoolkit logo** (>= 24 pt/dp) - there is no logo package for native, so place the downloadable asset () as a fixed overlay on the map view. ### MapLibre Native iOS Swift Package Manager: `https://github.com/maplibre/maplibre-gl-native-distribution` (or the `MapLibre` CocoaPod). ```swift import MapLibre let styleURL = URL(string: "https://styles.maptoolkit.org/summer.json") let mapView = MLNMapView(frame: view.bounds, styleURL: styleURL) mapView.setCenter(CLLocationCoordinate2D(latitude: 48.21, longitude: 16.37), zoomLevel: 12, animated: false) view.addSubview(mapView) // Add the Maptoolkit logo image (>= 24 pt) as a subview pinned bottom-left. ``` ### MapLibre Native Android `build.gradle`: ```groovy implementation 'org.maplibre.gl:android-sdk:13.0.0' ``` ```kotlin MapLibre.getInstance(this) mapView.getMapAsync { map -> map.setStyle(Style.Builder().fromUri("https://styles.maptoolkit.org/summer.json")) map.cameraPosition = CameraPosition.Builder() .target(LatLng(48.21, 16.37)).zoom(12.0).build() } // Add the Maptoolkit logo drawable (>= 24 dp) pinned bottom-left. ``` ### Flutter **`maplibre_gl` (recommended)** - wraps MapLibre Native, full vector rendering: ```yaml dependencies: maplibre_gl: ^0.20.0 ``` ```dart MaplibreMap( styleString: 'https://styles.maptoolkit.org/summer.json', initialCameraPosition: const CameraPosition(target: LatLng(48.21, 16.37), zoom: 12), ); // Overlay the Maptoolkit logo (>= 24 dp), e.g. in a Stack, pinned bottom-left. ``` **`flutter_map` + `vector_map_tiles`** - if you already use `flutter_map`: ```dart final style = await StyleReader(uri: 'https://styles.maptoolkit.org/summer.json').read(); FlutterMap( options: const MapOptions(initialCenter: LatLng(48.21, 16.37), initialZoom: 12), children: [ VectorTileLayer(theme: style.theme, sprites: style.sprites, tileProviders: style.providers), ], ); ``` ### React Native ```bash npm install @maplibre/maplibre-react-native ``` ```jsx import { MapView, Camera } from '@maplibre/maplibre-react-native'; export default function Map() { return ( {/* Overlay the Maptoolkit logo (>= 24 dp) pinned bottom-left. */} ); } ``` Coordinates are `[lng, lat]`, same as MapLibre GL JS. ## Migration guides The community service is a drop-in basemap source for projects coming off paid providers. The pattern is always the same: swap the SDK, drop the access token, point the map at the Maptoolkit style URL - then add the attribution as shown above. ### From Mapbox GL JS -> MapLibre GL JS MapLibre GL JS is a fork of Mapbox GL JS v1 - the API is almost identical. Markers, popups, sources, layers, expressions and events keep their names and signatures. ```js // Before mapboxgl.accessToken = 'pk.your-mapbox-token'; const map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v12', center: [13.405, 52.52], zoom: 11 }); // After const map = new maplibregl.Map({ container: 'map', style: 'https://styles.maptoolkit.org/summer.json', center: [13.405, 52.52], zoom: 11 }); ``` Checklist: delete `mapboxgl.accessToken`; rename `mapboxgl` -> `maplibregl`; replace any `mapbox://` style/sprite/glyph URLs; rebuild Mapbox v2+ only features with MapLibre equivalents; add the Maptoolkit logo control. ### From Google Maps JavaScript API -> MapLibre GL JS ```js // Before (Google Maps) const map = new google.maps.Map(document.getElementById('map'), { center: { lat: 52.52, lng: 13.405 }, zoom: 11 }); // After (MapLibre + Maptoolkit) const map = new maplibregl.Map({ container: 'map', style: 'https://styles.maptoolkit.org/summer.json', center: [13.405, 52.52], zoom: 11 }); ``` Watch out for: **coordinate order** (Google `{lat,lng}` vs MapLibre `[lng,lat]`); replace `new google.maps.Marker` with `new maplibregl.Marker`, `InfoWindow` with `Popup`, `map.addListener('click', …)` with `map.on('click', …)`; remove the Google API key and billing; replace Google controls with `NavigationControl` / `ScaleControl`. ### From the Mapbox Mobile SDK -> MapLibre Native MapLibre Native is a fork of the last open-source Mapbox Maps SDK (iOS v6.x, Android v9.x). Most apps are a prefix swap. - **iOS** - `Mapbox-iOS-SDK` -> `MapLibre`; class prefix `MGL` -> `MLN`; drop `MGLAccountManager.accessToken`. - **Android** - `com.mapbox.mapboxsdk:mapbox-android-sdk` -> `org.maplibre.gl:android-sdk`; package prefix `com.mapbox.mapboxsdk` -> `org.maplibre.android`; replace `Mapbox.getInstance(context, token)` with `MapLibre.getInstance(context)`. The newer proprietary Mapbox SDKs (iOS v10+, Android v10+) use a different API and require more than a prefix swap. ## Maptoolkit.org vs. other free vector basemaps Maptoolkit.org is one of several free, OSM-based vector basemap projects for MapLibre. Detail pages: [OpenMapTiles](https://maptoolkit.org/compare/openmaptiles) · [Protomaps](https://maptoolkit.org/compare/protomaps) · [OpenFreeMap](https://maptoolkit.org/compare/openfreemap) · [VersaTiles](https://maptoolkit.org/compare/versatiles) · full comparison: | Dimension | Maptoolkit.org | OpenMapTiles | Protomaps | OpenFreeMap | VersaTiles | |---|---|---|---|---|---| | Available as | Free tile server | Do-it-yourself toolchain | Limited tile server, data download | Free tile server, data download | Free tile server, data download | | Cost | Free | Free | Free tile server for non-commercial use, free downloads | Free | Free | | Monthly request limits | unlimited | - | 1M tile requests | unlimited | unlimited | | Attribution | © Maptoolkit © Openstreetmap + logo | © OpenMapTiles © OpenStreetMap contributors | © Protomaps © OpenStreetMap | OpenFreeMap © OpenMapTiles – Data from OpenStreetMap | © OpenStreetMap contributors | | API key / sign-up | None | - | API key | None | None | | Commercial use | Yes (< EUR 1M/yr) | Yes | Yes (downloads only) | Yes | Yes | | OSM updates | Weekly | - | Daily (API) | Weekly | Several times per year | | Max data zoom | 15 | 14 | 15 | 14 | 14 | | Tile schema | Maptoolkit | OpenMapTiles | Protomaps | OpenMapTiles | Shortbread | | Standard styles | Summer, Light, Hiking, Winter, Dark, Street, Cycling (7) | OpenMapTiles, Basic, Bright, Positron, Dark Matter, Fiord Color, Toner (7) | Light, Dark, White, Grayscale, Black (5) | Liberty, Positron, Bright, Dark, Fiord (5) | Colorful, Eclipse, Graybeard, Shadow, Neutrino (5) | | Style editor | MapMaker | - | - | - | tiles.versatiles.org | | Hillshading / contour lines | Yes | - | - | - | Just hillshade, download only | | Water depths | Yes | - | - | - | Download only | | 3D terrain | Yes | - | - | - | Download only | | Provider | Maptoolkit.com, Austria & Germany | Maptiler.com, Switzerland | Brandon Liu (individual), USA | Zsolt Ero (individual), Hungary | Michael Kreil (individual), Germany | | Privacy | [Privacy Policy](https://www.maptoolkit.org/privacy) | - | [Privacy info](https://docs.protomaps.com/guide/security-privacy) | [Privacy Policy](https://openfreemap.org/privacy/) | - | ## Community License - what you can and can't do Free of charge under these conditions: **Who may use it** - Non-commercial projects (personal sites, hobby, open-source, academic, educational). - Small commercial projects: **under EUR 1M** annual consolidated revenue **and** fewer than **10 FTE** employees. - Above either threshold -> Enterprise License (). **How it may be used** - **Attribution is mandatory** (see above). - **No** backend-only processing, bulk extraction, offline tile generation or mirroring. - **No** reselling, sublicensing, repackaging, or hosting as part of another SaaS. - **No** print use - use [Printmaps.net](https://www.printmaps.net/) instead. - **No** Adult Content, Gambling/Betting, Get-Rich-Quick, Predatory Lending, Hate Speech / Extremism. **What you get** - Unlimited requests (subject to fair-use and burst protection). - Production-grade vector tiles cached at 350+ Cloudflare edge POPs. - Hosted in the EU; GDPR-compliant; cookie-free; no API keys; no `Referer`/`User-Agent` logs. - Best-effort service: **no** SLA, uptime guarantee or support obligation. Full text: · Privacy: ## Fair use & rate limits To keep the shared infrastructure stable, adaptive rate limiting applies. Tiles/s are counted at Maptoolkit's **origin servers only** - tiles served from Cloudflare's edge cache (typically **90%+** of traffic) **don't count**. A normal interactive map user rarely generates more than a handful of countable requests per second. | Tier | Per website - Sustained | Per website - Burst | Per user (per IP) | |-----------------------------------------|-------------------------|---------------------|-------------------------| | Unregistered (default) | 120 tiles/s | 200 tiles/s | 40 tiles/s fair-use cap | | Registered domain or app (coming soon) | 600 tiles/s | 1,000 tiles/s | - | Registration (a one-minute form - no credit card, no key to manage) raises a website's ceiling 5×. Native apps can register for a partner token instead. Registration is **coming soon** and is not required to use the service. Bulk downloading, scraping and similar automated workloads are not permitted. ## Data privacy summary - No accounts, no API keys, no registration. - No tracking cookies, no fingerprinting, no advertising IDs (no consent banner needed under ePrivacy). - No user profiles, no cross-site identifiers, no data sales, no AI training on request data. - Anonymised logs only: truncated IP (last octet zeroed, never persisted), timestamp, path, HTTP status, response size. `Referer` and `User-Agent` are **not** logged. Retention: **max. 15 days**, then permanently deleted. - Origin in the EU; edge delivery + DDoS protection by Cloudflare (processor). Terrain tiles via `tiles.mapterhorn.com`, same model. - When you embed the service, **you are the controller** for your end users' personal data (GDPR Art. 4(7)); Toursprung GmbH is an independent controller for operational logging only. ## Gotchas - **Vector only.** No raster XYZ endpoint, no static-maps API. Libraries without vector support (Leaflet, OpenLayers) use a plugin to render the MapLibre style. - **Coordinate order is `[lng, lat]`** in MapLibre/Deck.gl/CesiumJS - the opposite of Google Maps' `{lat, lng}`. Leaflet uses `[lat, lng]`. - **The minimum client is GL JS 5.6.0, not v6.** The `color-relief` elevation shading in `summer`, `hiking`, `winter`, `cycling` and `dark` needs GL JS 5.6.0 (Native Android 13.0.0, iOS 6.24.0); `street` and `light` have no such requirement and work from 4.2.0. An older client silently ignores the unsupported layer type rather than throwing, so the symptom is missing shading with no console error - check the SDK version before debugging the tile source. v6 is still the recommended version to start from. - **MapLibre GL JS v6 is ESM only.** There is no UMD bundle and no `maplibregl` global. Load it inside a `