# 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 are delivered via the sister service `tiles.mapterhorn.com`. Powered by MapLibre, hosted in the EU, edge-cached on Cloudflare's 350+ POPs. Maptoolkit.org runs on the same opinionated cartography that powers commercial deployments at Deutsche Bahn, Red Bull Media House and the Austrian and German National Tourism Offices - including outdoor-specific styles (Hiking, Cycling, Winter), global hillshading, contour lines, water depths and 3D terrain out of the box. There's no self-hosting on the Community License, but weekly OSM updates and edge-cached delivery across Cloudflare's 350+ data centers are taken care of for you. Drop one URL into any MapLibre-compatible library and ship: ``` https://styles.maptoolkit.org/summer.json ``` That is the entire setup. The same style URL works in MapLibre GL JS, Leaflet (via the MapLibre plugin), OpenLayers, Deck.gl, CesiumJS, MapLibre Native iOS/Android, Flutter and React Native. ## Endpoints The community service exposes only these origins. Your browser/app connects directly to them - no proxying through Maptoolkit servers is required or allowed. - `https://styles.maptoolkit.org/` - MapLibre style JSONs (entry point for every integration) - `https://tiles.maptoolkit.org/` - vector tiles (`.pbf`), referenced from the style's `sources` - `https://fonts.maptoolkit.org/` - glyph PBFs (fonts), referenced from the style's `glyphs` - `https://tiles.mapterhorn.com/` - terrain RGB tiles (`{z}/{x}/{y}.webp`) for hillshading and 3D terrain No keys, no tokens, no auth headers. CORS is open. Anonymised request logs (truncated IP, timestamp, path, status, size) are retained for max. **15 days**; `Referer` and `User-Agent` are **not** logged. ## Standard map styles All styles serve the same worldwide OpenStreetMap-based vector basemap with weekly data updates; only the cartography differs. Pass any of these URLs to MapLibre as the `style` option. | Style | Style URL | |--------------------|----------------------------------------------------| | Summer (default) | `https://styles.maptoolkit.org/summer.json` | | Light | `https://styles.maptoolkit.org/light.json` | | Hiking | `https://styles.maptoolkit.org/hiking.json` | | Winter | `https://styles.maptoolkit.org/winter.json` | | Dark | `https://styles.maptoolkit.org/dark.json` | | Street | `https://styles.maptoolkit.org/street.json` | | Cycling | `https://styles.maptoolkit.org/cycling.json` | Preview all styles live at . ### Language versions A language version shows labels in one specific language instead of the local language. If a place name has no translation into that language, the label falls back to the local name. Build the URL by adding a language code to the style name: ``` https://styles.maptoolkit.org/
``` NPM: ```bash npm install maplibre-gl ``` ```js import maplibregl from 'maplibre-gl'; import 'maplibre-gl/dist/maplibre-gl.css'; const map = new maplibregl.Map({ container: 'map', style: 'https://styles.maptoolkit.org/summer.json', center: [13.405, 52.52], zoom: 11, }); ``` ## Attribution (mandatory) Every map served by the Community License **must** show two elements at all times, on every screen size, orientation and zoom level - and they must not be hidden, obscured, or removed: 1. **Maptoolkit logo** - minimum height **24 px** on web, **24 pt/dp** on mobile, clearly visible on the map. 2. **Copyright line** in the bottom-right corner: `© Maptoolkit © OSM`, where **both** `Maptoolkit` and `OSM` are active hyperlinks: - `Maptoolkit` → - `OSM` → The easiest path is to use the official packages - they handle sizing, positioning and links for you: - MapLibre: [`@maptoolkit/maplibre-gl-logo`](https://www.npmjs.com/package/@maptoolkit/maplibre-gl-logo) - Leaflet: [`@maptoolkit/leaflet-logo`](https://www.npmjs.com/package/@maptoolkit/leaflet-logo) For native mobile or custom implementations download the logo file: Removing, hiding, or obscuring the attribution is **not allowed** under the Community License. ## Platform integrations Every integration uses the same style URL. Pick the library and follow its setup pattern. ### Leaflet (via `@maplibre/maplibre-gl-leaflet`) Leaflet does not render vector tiles natively. The plugin draws a MapLibre GL layer inside a Leaflet map. ```html ``` ```js const map = L.map('map').setView([48.21, 16.37], 12); L.maplibreGL({ style: 'https://styles.maptoolkit.org/summer.json', attribution: "© Maptoolkit " + "© OSM", }).addTo(map); ``` ### OpenLayers (via `ol-mapbox-style`) ```bash npm install ol ol-mapbox-style ``` ```js import { apply } from 'ol-mapbox-style'; apply('map', 'https://styles.maptoolkit.org/summer.json'); ``` Or with a self-configured `Map`/`View`: ```js import Map from 'ol/Map.js'; import View from 'ol/View.js'; import { fromLonLat } from 'ol/proj.js'; import { apply } from 'ol-mapbox-style'; const map = new Map({ target: 'map', view: new View({ center: fromLonLat([16.37, 48.21]), zoom: 12 }), }); apply(map, 'https://styles.maptoolkit.org/summer.json'); ``` ### Deck.gl (via `MVTLayer`) Deck.gl does not consume MapLibre styles. Read the vector tile source from the style JSON and style features yourself: ```js import { Deck } from '@deck.gl/core'; import { MVTLayer } from '@deck.gl/geo-layers'; const style = await fetch('https://styles.maptoolkit.org/summer.json').then(r => r.json()); const tileSource = style.sources.maptoolkit.url; // TileJSON URL of the vector source new Deck({ initialViewState: { longitude: 13.405, latitude: 52.52, zoom: 11 }, controller: true, layers: [ new MVTLayer({ id: 'maptoolkit', data: tileSource, stroked: true, filled: true, getLineColor: [80, 80, 80], getFillColor: [220, 220, 220], lineWidthMinPixels: 0.5, }), ], }); ``` ### CesiumJS (via `cesium-mvt-imagery-provider`) CesiumJS does not read MapLibre style sheets. Render the vector tiles as a Cesium imagery layer: ```js import { Viewer } from 'cesium'; import { MVTImageryProvider } from 'cesium-mvt-imagery-provider'; const style = await fetch('https://styles.maptoolkit.org/summer.json').then(r => r.json()); const tileUrl = style.sources.maptoolkit.tiles?.[0]; // {z}/{x}/{y}.pbf template const viewer = new Viewer('cesiumContainer'); viewer.imageryLayers.addImageryProvider(new MVTImageryProvider({ urlTemplate: tileUrl, maximumLevel: 18, style: (feature, tileCoords) => ({ fillStyle: '#dcdcdc', strokeStyle: '#808080', lineWidth: 0.5 }), })); ``` If you only need a flat, fully-styled basemap, prefer MapLibre GL JS - it supports a 3D globe projection out of the box. ### 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) ``` Logo minimum size: **24 pt**. ### 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() } ``` Logo minimum size: **24 dp**. ### Flutter Two options: **`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(52.52, 13.405), zoom: 11), ); ``` **`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(52.52, 13.405), initialZoom: 11), 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 ( ); } ``` 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. ### 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 (e.g. proprietary standard 3D style) with MapLibre equivalents. ### 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], // [lng, lat] zoom: 11, }); ``` Watch out for: **coordinate order** (Google `{lat,lng}` ↔ 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 setup; 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. ## 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: ## 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 © OSM + 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/) | - | ## 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** against these limits. In practice, a normal map user rarely generates more than a handful of countable requests per second, if at all. | Tier | Per website - Sustained | Per website - Burst | Per user (per IP) | |----------------------------------------------|--------------------------|-----------------------|----------------------------| | Unregistered (default) | 60 tiles/s | 100 tiles/s | 20 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 contract, no key to manage) raises a website's ceiling 10×. Native apps can instead register for a partner token - one static line in the tile URL, nothing to rotate or bill. Registration is **coming soon** and is not required to use the service. Traffic that exceeds reasonable interactive usage may be delayed or throttled. 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 and 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 operational model. When you embed the service in your application, **you are the controller** for your end users' personal data (GDPR Art. 4(7)); Toursprung GmbH is an independent controller for the operational logging only. A copy-paste privacy-policy text block is provided in the data-privacy doc. ## 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 - see above. - **Backend use is forbidden.** Tiles must be requested by the end-user's browser/device, not pre-fetched, mirrored, or proxied through your server. - **Coordinate order is `[lng, lat]`** everywhere in MapLibre - the opposite of Google Maps' `{lat, lng}`. - **Attribution is enforced.** The Maptoolkit logo (≥ 24 px / 24 pt/dp) and the `© Maptoolkit © OSM` line with two clickable links are non-negotiable. - **Best-effort SLA.** Don't build life-safety, billing-critical or contractually-bound services on the community tier - that's what the Enterprise License is for. - **Hosted on `.org`, not `.net`.** The public community service is `styles.maptoolkit.org` / `tiles.maptoolkit.org` / `fonts.maptoolkit.org`. The `*.maptoolkit.net` domains belong to the commercial product and require an API key - do not mix them. - **Terrain comes from a different origin.** Hillshading / 3D terrain uses `https://tiles.mapterhorn.com/{z}/{x}/{y}.webp`; preconnect to it if you enable terrain in your style. ## Official documentation & links - [Maptoolkit.org landing page](https://www.maptoolkit.org/) - live preview, style switcher, license terms - [Community Documentation](https://docs.maptoolkit.org/) - full developer docs - [Quick Start](https://docs.maptoolkit.org/quick-start/) - [Vector Tiles & styles](https://docs.maptoolkit.org/vector-tiles/) - [SDKs and Libraries](https://docs.maptoolkit.org/platform-libraries/) - [MapLibre GL JS guide](https://docs.maptoolkit.org/platform-libraries/maplibre/) · [Examples gallery](https://docs.maptoolkit.org/platform-libraries/maplibre/examples/) - [Leaflet](https://docs.maptoolkit.org/platform-libraries/leaflet/) · [OpenLayers](https://docs.maptoolkit.org/platform-libraries/openlayers/) · [Deck.gl](https://docs.maptoolkit.org/platform-libraries/deckgl/) · [CesiumJS](https://docs.maptoolkit.org/platform-libraries/cesiumjs/) - [MapLibre Native iOS](https://docs.maptoolkit.org/platform-libraries/maplibre-native-ios/) · [Android](https://docs.maptoolkit.org/platform-libraries/maplibre-native-android/) · [Flutter](https://docs.maptoolkit.org/platform-libraries/flutter/) · [React Native](https://docs.maptoolkit.org/platform-libraries/react-native/) - [Migrate from Mapbox GL JS](https://docs.maptoolkit.org/migration-guides/migrate-from-mapbox-gl-js/) · [from Google Maps](https://docs.maptoolkit.org/migration-guides/migrate-from-google-maps/) · [from the Mapbox Mobile SDK](https://docs.maptoolkit.org/migration-guides/migrate-from-mapbox-sdk/) - [Data Privacy details](https://docs.maptoolkit.org/miscellaneous/data-privacy/) - [Terms of Service / Community License](https://www.maptoolkit.org/tos) - [Privacy Policy](https://www.maptoolkit.org/privacy) - [Service Status](https://www.maptoolkit.org/status) - [Support & Discussions (GitHub)](https://github.com/maptoolkit/maptoolkit.org/discussions) - [Logo NPM package - MapLibre](https://www.npmjs.com/package/@maptoolkit/maplibre-gl-logo) · [Leaflet](https://www.npmjs.com/package/@maptoolkit/leaflet-logo) - [Enterprise (paid) - full API suite, SLA, custom data](https://www.maptoolkit.com)