# MapLibre GL JS changelog > Renders interactive vector maps in the browser using WebGL. - Vendor: MapLibre - Category: Frameworks & Libraries - Official site: https://maplibre.org - Tracked by: What's New (https://whatsnew.fyi/product/maplibre-gl-js) - Harvested from: GitHub (maplibre/maplibre-gl-js) - Entries below: 11 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v6.3.0 - Date: 2026-08-10 - Version: v6.3.0 - Original notes: https://github.com/maplibre/maplibre-gl-js/releases/tag/v6.3.0 - Permalink: https://whatsnew.fyi/product/maplibre-gl-js/releases/v6.3.0 - **added** — Make fired/listened map events typed to provide TypeScript error checking and better autocomplete for map.on, once, and listens methods - **added** — Allow StyleImageInterface to provide a renderWithWebGL callback for GPU-based style image rendering instead of CPU pixel transfer - **changed** — Use integer vertex attributes for packed line data instead of float conversion - **changed** — Use integer vertex attributes for packed circle, heatmap, symbol, and fill-extrusion data instead of float conversion - **changed** — Redesign benchmarks to use vitest bench capabilities and remove custom build for benchmarks code - **fixed** — Fix terrain pan/zoom gestures losing the grabbed terrain point by solving gestures against the elevation under the gesture instead of frozen center elevation - **fixed** — Fix ImageSource, VideoSource and CanvasSource leaking a GPU texture on every image update and on removal, and a resized texture losing its wrap and filter settings - **fixed** — Fix map.queryRenderedFeatures sometimes causing Out of bounds error due to race condition while loading tile data - **fixed** — Fix zooming the globe with scroll wheel or two-finger pinch drifting away from the pointer when the globe is small on screen - **fixed** — Fix projective rendering for non-parallelogram image source quads ###### ✨ Features and improvements - Make fired/listened map events typed. This means that `map.on("something", ...)` (and `once`, `listens`) will now give you an typescript error and better autocomplete. If you relied on firing/listening custom events via the map, this still works via the escape hatches `map.fire("something" as any)` -> `map.on("something" as any, ...)` ([#8072](https://github.com/maplibre/maplibre-gl-js/issues/8072)) (by [@CommanderStorm](https://github.com/CommanderStorm)) - Let a `StyleImageInterface` give a `{renderWithWebGL}` callback as its `data`, an escape hatch for plugin developers and advanced users that renders a style image on the GPU instead of moving its pixels through the CPU. Nothing new is possible that pixels could not already express, but an image that changes often, such as an animated icon, gets more performant ([#7954](https://github.com/maplibre/maplibre-gl-js/pull/7954)) (by [@lucaswoj](https://github.com/lucaswoj)) - Use integer vertex attributes for packed line data instead of float conversion ([#7640](https://github.com/maplibre/maplibre-gl-js/issues/7640)) (by [@johncarmack1984](https://github.com/johncarmack1984)) - Use integer vertex attributes for packed circle, heatmap, symbol, and fill-extrusion data instead of float conversion ([#7640](https://github.com/maplibre/maplibre-gl-js/issues/7640), [#8143](https://github.com/maplibre/maplibre-gl-js/pull/8143)) (by [@johncarmack1984](https://github.com/johncarmack1984)) - Redesign benchmarks to use vitest bench capabilities and remove custom build for benchmarks code ([#982](https://github.com/maplibre/maplibre-gl-js/issues/982)) (by [@johncarmack1984](https://github.com/johncarmack1984)) ###### 🐞 Bug fixes - Fix terrain pan/zoom gestures losing the grabbed terrain point: gestures are now solved against the elevation of the terrain under the gesture instead of the frozen center elevation, so terrain under the pointer/fingers no longer slips during moving-centroid pinches and drags ([#8067](https://github.com/maplibre/maplibre-gl-js/pull/8067)) (by [@StrawberryJam22](https://github.com/StrawberryJam22)) - Fix `ImageSource`, `VideoSource` and `CanvasSource` leaking a GPU texture on every image update and on removal, and a resized texture losing its wrap and filter settings ([#8094](https://github.com/maplibre/maplibre-gl-js/pull/8094)) (by [@mondsichtung](https://github.com/mondsichtung)) - Fix `map.queryRenderedFeatures()` sometimes causing "Out of bounds" error due to race condition while loading tile data ([#8064](https://github.com/maplibre/maplibre-gl-js/issues/8064)) (by [@smvjohansenbouvet](https://github.com/smvjohansenbouvet)) - Fix zooming the globe with the scroll wheel or a two-finger pinch drifting away from the pointer while the globe is small on screen, instead of keeping the location under the pointer as it does when zoomed in ([#8095](https://github.com/maplibre/maplibre-gl-js/pull/8095)) (by [@mondsichtung](https://github.com/mondsichtung)) - Fix projective rendering for non-parallelogram image source quads ([#7887](https://github.com/maplibre/maplibre-gl-js/pull/7887)) (by [@i4innovationnet](https://github.com/i4innovationnet)) ### v6.2.0 - Date: 2026-08-06 - Version: v6.2.0 - Original notes: https://github.com/maplibre/maplibre-gl-js/releases/tag/v6.2.0 - Permalink: https://whatsnew.fyi/product/maplibre-gl-js/releases/v6.2.0 - **added** — Add the fill-extrusion-rounded-corner-distance layout property, which replaces each fill-extrusion corner with an arc spanning the given distance in meters along the adjacent edges, clamped to 20% of each adjacent edge's length and leaving near-straight corners untouched - **changed** — Improve Mercator rendering performance by skipping a redundant clipping mask border pass - **added** — Add a docker-compose service to build and serve the examples - **fixed** — Fix rare rendering bug causing two adjacent layers with different data driven property set to render wrong - **changed** — Improve terrain elevation sampling performance by caching DEM tile lookups and coordinate transforms within each render ###### ✨ Features and improvements - Add the `fill-extrusion-rounded-corner-distance` layout property, which replaces each fill-extrusion corner with an arc spanning the given distance (in meters) along the adjacent edges. The distance is clamped to 20% of each adjacent edge's length so that short edges don't collapse, and near-straight corners (turns below 5°) are left untouched. Defaults to `0`, which keeps corners sharp ([#7934](https://github.com/maplibre/maplibre-gl-js/issues/7934)) (by [@CommanderStorm](https://github.com/CommanderStorm)) - Improve Mercator rendering performance by skipping a redundant clipping mask border pass ([#8038](https://github.com/maplibre/maplibre-gl-js/pull/8038)) (by [@DoFabien](https://github.com/DoFabien)) - Add a docker-compose service to build and serve the examples (#57) ([#8026](https://github.com/maplibre/maplibre-gl-js/pull/8026)) (by [@clement-igonet](https://github.com/clement-igonet)) ###### 🐞 Bug fixes - Fix rare rendering bug causing two adjacent layers with different data driven property set to render wrong ([#8068](https://github.com/maplibre/maplibre-gl-js/pull/8068)) (by [@CommanderStorm](https://github.com/CommanderStorm)) - Improve terrain elevation sampling performance by caching DEM tile lookups and coordinate transforms within each render ([#8025](https://github.com/maplibre/maplibre-gl-js/pull/8025)) (by [@DoFabien](https://github.com/DoFabien)) ### v6.1.0 - Date: 2026-07-30 - Version: v6.1.0 - Original notes: https://github.com/maplibre/maplibre-gl-js/releases/tag/v6.1.0 - Permalink: https://whatsnew.fyi/product/maplibre-gl-js/releases/v6.1.0 - **added** — Add support for updating an ImageSource with an already-decoded image (HTMLImageElement, HTMLCanvasElement, ImageBitmap or ImageData) directly via ImageSource.updateImage({image}), skipping the network request - **added** — Add GeoJSONSource.getClusterOptions to get a source's current cluster options (cluster, clusterMaxZoom, clusterRadius) - **added** — Support global-state expressions in sky.*, light.* and projection.type properties - **added** — Add MapOptions.rotateSpeed and MapOptions.pitchSpeed, the degrees the bearing/pitch change per pixel dragged - **changed** — Show a grab cursor over draggable markers, including on non-interactive maps - **fixed** — Use role=img for non-interactive default markers and role=button when they become interactive - **fixed** — Fix an error thrown when a paint property transitions between arrays of different length - **fixed** — Fix renderer crash when RasterTileSource.setTiles/setUrl is called while the source contains errored tiles - **fixed** — Fix 3D buildings disappearing when the camera pitches up to look near the horizon, by growing tile-culling bounds as the frustum's bottom edge approaches horizontal - **fixed** — Fix globe latitude precision on some GPUs by reformulating the mercator-to-sphere Y coordinate algebraically, avoiding float32 cancellation and imprecise hardware transcendentals near the equator - **fixed** — Fix a race in RasterTileSource.loadTile and ImageSource.load where a tile/image aborted during an awaited transformRequest passed an undefined AbortController into the image request queue - **fixed** — Fix setTerrain not destroying the previously active terrain when switching to a new configuration, which leaked its GPU resources and left the old source still configured as a terrain source - **fixed** — Fix fill and line layers being rendered twice near the antimeridian on globe when looking at poles or when zoomed out ###### ✨ Features and improvements - Add support for updating an `ImageSource` with an already-decoded image (`HTMLImageElement`, `HTMLCanvasElement`, `ImageBitmap` or `ImageData`) directly via `ImageSource.updateImage({image})`, skipping the network request ([#7944](https://github.com/maplibre/maplibre-gl-js/pull/7944)) (by [@mondsichtung](https://github.com/mondsichtung)) - Add `GeoJSONSource.getClusterOptions` to get a source's current cluster options (`cluster`, `clusterMaxZoom`, `clusterRadius`) ([#7948](https://github.com/maplibre/maplibre-gl-js/pull/7948)) (by [@lazerg](https://github.com/lazerg)) - Support `global-state` expressions in `sky.*`, `light.*` and `projection.type` properties ([#7966](https://github.com/maplibre/maplibre-gl-js/pull/7966), [#7967](https://github.com/maplibre/maplibre-gl-js/pull/7967), [#7968](https://github.com/maplibre/maplibre-gl-js/pull/7968)) (by [@CommanderStorm](https://github.com/CommanderStorm)) - Add `MapOptions.rotateSpeed` and `MapOptions.pitchSpeed`, the degrees the bearing/pitch change per pixel dragged ([#7949](https://github.com/maplibre/maplibre-gl-js/pull/7949)) (by [@clement-igonet](https://github.com/clement-igonet)) - Show a grab cursor over draggable markers, including on non-interactive maps ([#8019](https://github.com/maplibre/maplibre-gl-js/issues/8019)) (by [@hugosmoreira](https://github.com/hugosmoreira)) ###### 🐞 Bug fixes - Use `role=img` for non-interactive default markers and `role=button` when they become interactive ([#7790](https://github.com/maplibre/maplibre-gl-js/issues/7790)) (by [@cat0825](https://github.com/cat0825)) - Fix an error thrown when a paint property transitions between arrays of different length ([#6606](https://github.com/maplibre/maplibre-gl-js/issues/6606)) (by [@HarelM](https://github.com/HarelM)) - Fix renderer crash when `RasterTileSource.setTiles`/`setUrl` is called while the source contains errored tiles ([#7911](https://github.com/maplibre/maplibre-gl-js/pull/7911)) (by [@lazerg](https://github.com/lazerg)) - Fix 3D buildings disappearing when the camera pitches up to look near the horizon, by growing tile-culling bounds as the frustum's bottom edge (from pitch and FOV) approaches horizontal ([#7633](https://github.com/maplibre/maplibre-gl-js/issues/7633)) (by [@clement-igonet](https://github.com/clement-igonet)) - Fix globe latitude precision on some GPUs (e.g. Mali) by reformulating the mercator-to-sphere Y coordinate algebraically (`exp` + rational arithmetic instead of `atan`/`sin`/`cos`), avoiding float32 cancellation and imprecise hardware transcendentals near the equator; the runtime GPU `atan`-error measurement/correction this superseded has also been removed ([#7419](https://github.com/maplibre/maplibre-gl-js/issues/7419)) (by [@clement-igonet](https://github.com/clement-igonet)) - Fix a race in `RasterTileSource.loadTile` and `ImageSource.load` where a tile/image aborted during an awaited `transformRequest` passed an undefined `AbortController` into the image request queue, crashing it with `TypeError: Cannot read properties of undefined (reading 'signal')` ([#8004](https://github.com/maplibre/maplibre-gl-js/issues/8004)) (by [@jan-grzybek](https://github.com/jan-grzybek)) - Fix `setTerrain` not destroying the previously active terrain when switching to a new configuration, which leaked its GPU resources and left the old source still configured as a terrain source ([#7990](https://github.com/maplibre/maplibre-gl-js/issues/7990)) (by [@lazerg](https://github.com/lazerg)) - Fix fill and line layers being rendered twice near the antimeridian on globe when looking at poles or when zoomed out ([#6248](https://github.com/maplibre/maplibre-gl-js/issues/6248)) (by [@pabueco](https://github.com/pabueco)) ### v6.0.0 - Date: 2026-07-22 - Version: v6.0.0 - Original notes: https://github.com/maplibre/maplibre-gl-js/releases/tag/v6.0.0 - Permalink: https://whatsnew.fyi/product/maplibre-gl-js/releases/v6.0.0 - **removed** — Switch to an ESM-only distribution; UMD bundles (maplibre-gl.js, maplibre-gl-csp.js) are no longer published - **changed** — Interpolate light position in spherical coordinates instead of cartesian coordinates to maintain radial distance during transitions - **changed** — styleimagemissing is now a notify-only event; use Map.setMissingStyleImageResolver to supply images via an async-capable function instead - **changed** — Map now composes a Camera instead of extending it; Map extends Evented directly and forwards the camera API - **removed** — Remove the internal map.transform property; use map's public API instead - **removed** — Remove internal transform.getMatrixForModel helper - **changed** — All map events are now real classes instantiated when fired - **changed** — Rename BoxZoom handler from MapLibreZoomEvent to MapBoxZoomEvent - **added** — Add rollstart, roll, rollend, and style.load (as MapStyleLoadEvent) events to MapEventType - **added** — Add event classes and type-map for Marker, Popup, GeolocateControl, and FullscreenControl - **removed** — Remove MapDataEvent; data, dataloading, and dataabort events are now MapSourceDataEvent or MapStyleDataEvent - **added** — Add MapMovementEvent as the type for all camera-transition events (move, zoom, rotate, pitch, roll, drag and their start/end variants) - **changed** — Make Evented generic over an event-type map and abstract so subclasses get strongly-typed on/once/off - **changed** — Update maplibre-gl-style-spec to version 25, which throws an error with warning severity instead of silently failing on legacy expressions - **changed** — Change pragma mapbox to pragma maplibre in shader code - **changed** — Change zoomLevelsToOverscale default value to 4 to support better handling of high level zoom with dense labels - **removed** — Remove the second parameter (waitForCompletion) from GeoJSONSource.setData and remove its return value of this - **changed** — Update TypeScript target to ES2022 for smaller bundles and improved runtime performance - **removed** — Remove WebGL (v1) support; WebGL2 is now required - **added** — Add ability to listen to webgl errors via .on('error') event The following incorporates all the pre-releases for version 6 changes. Check-out our [migration guide from v5 to v6](./docs/guides/v5-to-v6-migration-guide.md) for more information. ###### ✨ Features and improvements - ⚠️ Switch to an ESM-only distribution (`maplibre-gl.mjs`). The UMD bundles (`maplibre-gl.js`, `maplibre-gl-csp.js`) are no longer published. The CSP-specific bundle is also dropped: the ESM build loads its worker as a real URL, so `worker-src blob:` is no longer required. Consumers using `