Unlimited vector map tiles built from OpenStreetMap data, ready to drop into MapLibre GL or Leaflet. No API key, no quota, no surprise invoice.
Most map tile providers welcome you with free credits. Then traffic grows, and usage-based billing turns a small experiment into a real bill — opaque meters, charges that scale with every map load, and pricing pages you need a spreadsheet for. Google Maps and Mapbox both work this way. What felt free becomes a cost your project may not want.
LFMaps is different. Free means free — no surprises, no caps, no invoices.
What you need to ship a map. Nothing you don’t.
Drop the tile URL in and go. No signup, no access token, no dashboard.
No quotas, no soft limits, no per-map-load meter. Use what you need.
Zero cost at any traffic level — ten map views or ten million.
We don’t track your visitors and set no cookies. Your privacy policy stays as short as it was.
Works best with MapLibre GL, and with Leaflet or React too
<script src="https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.js"></script>
<link href="https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.css" rel="stylesheet" />
MapLibre GL v6 is ESM-only, so these examples pin v5 for drop-in script tag use.
npm i maplibre-gl@^5
Then import it in your JavaScript:
import maplibregl from 'maplibre-gl'
import 'maplibre-gl/dist/maplibre-gl.css'
<div id="map" style="width: 100%; height: 500px"></div>
<script>
const map = new maplibregl.Map({
style: 'https://data.lfmaps.fr/styles/bright',
center: [6.1844, 48.6937],
zoom: 12,
container: 'map',
})
</script>
Better Core Web Vitals often mean better search rankings
Use this loader for a leaner first paint:
let maplibrePromise = null;
let cssLoaded = false;
/**
* Lazily loads MapLibre GL and its CSS when needed
* @returns {Promise} The MapLibre GL module
*/
async function loadMapLibre() {
if (!maplibrePromise) {
maplibrePromise = Promise.all([
import('maplibre-gl'),
loadMapLibreCSS()
]).then(([module]) => module.default);
}
return maplibrePromise;
}
/**
* Loads MapLibre GL CSS dynamically
*/
async function loadMapLibreCSS() {
if (!cssLoaded) {
await import('maplibre-gl/dist/maplibre-gl.css');
cssLoaded = true;
}
}
/**
* MapLibre GL Lazy Loader Class
* Provides an API similar to maplibregl but with lazy loading
*/
export class MapLibreLoader {
constructor() {
this.maplibregl = null;
}
/**
* Creates a new map instance, lazily loading MapLibre GL if needed
* @param {Object} options - Map configuration options
* @returns {Promise} A MapLibre GL Map instance
*/
async createMap(options) {
this.maplibregl = await loadMapLibre();
return new this.maplibregl.Map(options);
}
/**
* Gets the MapLibre GL library, lazily loading if needed
* @returns {Promise} The MapLibre GL library
*/
async getLibrary() {
this.maplibregl = await loadMapLibre();
return this.maplibregl;
}
}
export default new MapLibreLoader();
Usage example:
import MapLibreLoader from './maplibre-loader.js';
// Create map only when needed (e.g., on scroll or user interaction)
async function initMap() {
const map = await MapLibreLoader.createMap({
style: 'https://data.lfmaps.fr/styles/bright',
center: [6.1844, 48.6937],
zoom: 12,
container: 'map',
});
// Add controls, markers, etc.
const maplibregl = await MapLibreLoader.getLibrary();
map.addControl(new maplibregl.NavigationControl());
}
For advanced features and the full API, see the MapLibre GL JS documentation
Leaflet can’t read vector tiles on its own, so pair it with the maplibre-gl-leaflet plugin:
<link href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" rel="stylesheet" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.js"></script>
<script src="https://unpkg.com/@maplibre/maplibre-gl-leaflet@0.1.3/leaflet-maplibre-gl.js"></script>
<script>
const map = L.map('map').setView([48.6937, 6.1844], 12)
L.maplibreGL({
style: 'https://data.lfmaps.fr/styles/bright',
}).addTo(map)
</script>
Leaflet 1.x is what the plugin supports — the same free tiles, none of the billing.
npm i react-map-gl maplibre-gl@^5
import Map from 'react-map-gl/maplibre'
import 'maplibre-gl/dist/maplibre-gl.css'
export default function MyMap() {
return (
<Map
initialViewState={{ longitude: 6.1844, latitude: 48.6937, zoom: 12 }}
style={{ width: '100%', height: 500 }}
mapStyle="https://data.lfmaps.fr/styles/bright"
/>
)
}
No mapbox-gl, no access token — react-map-gl talks to MapLibre GL directly.
https://data.lfmaps.fr/styles/bright
https://data.lfmaps.fr/styles/positron
https://data.lfmaps.fr/styles/liberty
Tiles served from a CDN, so maps appear in a blink
99.9% uptime
OpenStreetMap data covering the whole world
A few lines of MapLibre GL or Leaflet and you’re live
Same job — a map on your page. Very different bill at the end of the month.
The honest trade-off: LFMaps gives you map tiles and nothing else. Geocoding, routing and turn-by-turn directions are not part of the service.
Yes. There is no paid tier, no credit card, and no usage bill — whatever your traffic. LFMaps is funded as a side project, the way the other free tools on this page are.
No. There is nothing to sign up for and no token to rotate. Point your map style at a LFMaps URL and it works.
No quotas and no hard rate limit. We only ask that you don’t bulk-scrape the whole tile set — normal map usage on a website or app is fine.
Yes. MapLibre GL renders the vector tiles natively and is what we recommend, but Leaflet works too with the maplibre-gl-leaflet plugin.
From OpenStreetMap, served through OpenFreeMap. The data is community made, which is exactly why it can stay free.
Yes, commercial projects included. Keep the OpenStreetMap attribution visible on the map — that’s the only requirement.
No. We collect no personal data and set no cookies on the tile requests, so adding a map doesn’t add anything to your privacy policy.
Those give you a free tier and then bill per map load once you grow. LFMaps has no meter at all: the price is zero at ten map views and at ten million.
Build harmonious color palettes
Free password generator
Custom URL shortener, free
QR codes you can edit later
Images ready for social posts
Unminify your code
Generate .gitignore files easily
Restaurant booking system
Booking software for hairdressers
Free favicon generator
Free allergen poster for restaurants