Framework
visgl/deck.gl avatar
visgl/deck.gl

deck.gl: a WebGL2 layer framework for large geospatial datasets

WebGL2 powered visualization framework

14,619 stars2,276 forksTypeScriptMIT

At a glance

What is it?
deck.gl maps arrays of JSON records onto GPU-rendered layers and views, and ships as an npm module, a script tag, or the pydeck Python package. It is the right tool when your data is too large for SVG or Canvas, and the wrong one when you need a full GIS.
Who is it for?
Adopt deck.gl when you already have a basemap and need to draw tens of thousands of points, arcs or polygons on top of it, and when you are willing to keep a WebGL2-capable browser in scope. Do not adopt it as a replacement for a GIS, a tile server, or a 3D globe engine; the README lists deck.gl-native, deck.gl-raster and earthengine-layers as separate third-party projects precisely because those concerns sit outside the core.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 1, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem deck.gl solves: rendering data that outgrows the DOM

Most web mapping stacks were built for a few hundred shapes. The README frames deck.gl as a way to "simplify high-performance, WebGL2/WebGPU based visualization of large data sets", and the mechanism it uses is the GPU. Instead of creating an SVG node or a canvas path per record, deck.gl takes an array of JSON objects and turns it into GPU buffers that a shader draws in one pass. That is the whole reason the project exists, and it is why the pitch is about scale rather than about cartographic correctness.

The audience is narrow but deep. If you are building an internal dashboard over a few thousand rows, Leaflet or MapLibre alone will be simpler and you will not miss deck.gl. If you are plotting a million GPS pings, a few hundred thousand building footprints, or a flow matrix between a thousand origins and destinations, the per-element cost of the DOM becomes the bottleneck and deck.gl's model starts to pay off. The README also notes that users can "quickly get impressive visual results with minimal effort by composing existing layers", which is the other half of the value: the catalog of layers is the product as much as the renderer is.

Layers, views and the data flow from JSON to pixels

The architecture has two nouns. Data, usually an array of JSON objects, is mapped into a stack of visual layers such as icons, polygons and texts. Those layers are then looked at through views: a map view, a first-person view, or an orthographic view. A layer is a declarative description, not an imperative draw call. You hand it a data array and accessor props, and deck.gl decides how to pack that into attributes and how much of it to re-upload when the array changes.

That split is what makes the framework composable. Because views are independent of layers, the same layer stack can be rendered in a map projection, in a non-geographic orthographic view, or from a camera inside the scene, without rewriting the layers. The README lists what deck.gl handles out of the box: performant rendering and updating of large data sets, interactive event handling such as picking, highlighting and filtering, cartographic projections with integration into major basemap providers, and a catalog of layers. Picking deserves attention because it is the part people underestimate. Hit-testing a GPU-rendered scene is not the same problem as hit-testing DOM elements, and deck.gl solves it inside the framework rather than leaving it to the application.

The extension story is real but costs you. The README states that all core classes "are easily extendable by the users to address custom use cases", and that layers expose flexible APIs for programmatic control of each aspect of rendering. Writing a custom layer means writing shaders and understanding the attribute layout, so budget for that if your visualization has no existing layer that fits.

Installing deck.gl and drawing a first layer

There are four documented entry points, and the README treats them as separate paths. The fastest way to see something is the script tag, which loads a prebuilt bundle from unpkg. The README gives this exact snippet:

html
<script src="https://unpkg.com/deck.gl@latest/dist.min.js"></script>

After that script loads, the getting-started document for the scripting API describes how to construct layers and a deck instance against a container element. For anything you intend to ship, the npm path is the one the README documents first:

bash
npm install deck.gl

The package is a meta-package over the individual modules in the monorepo, so installing it pulls in core, layers, aggregation-layers and the rest. From there the README points at two getting-started documents, one for pure JavaScript and one for React, plus full example directories under examples/get-started/pure-js and examples/get-started/react. Those examples are the practical reference: the README does not inline a complete application, it links to working ones.

If your team works in notebooks rather than bundlers, the Python binding is a separate install:

bash
pip install pydeck

The pydeck documentation at deckgl.readthedocs.io covers installation and the layer API. What you should expect in all four cases is the same rendering core with different ergonomics: pydeck is for exploratory work and static output, the React binding is for applications that already have a component tree, and the script tag is for demos and embedded pages where a build step is not available.

Where deck.gl is the wrong tool

deck.gl is a rendering framework, not a geographic information system. It has no data store, no server, no tile pipeline and no query language. If your requirement is "let analysts run spatial SQL and export shapefiles", deck.gl is the wrong layer of the stack and you will end up rebuilding the missing pieces yourself. The README's own framing supports this: cartographic projections and basemap integration are listed as things deck.gl handles, but the basemaps themselves come from providers, and the README shows Mapbox, Carto, Foursquare and Unfolded as supporting organizations rather than as bundled dependencies.

The second boundary is the browser. The project describes itself as WebGL2 and WebGPU based, which means the rendering path depends on GPU access from the page. Environments where WebGL2 is unavailable, blocked by policy, or emulated in software will not behave the way the examples do. The repository reflects this concern in its tooling: the Dockerfile installs xvfb and sets DISPLAY to :99, and the test scripts include separate headless and render targets, with test-webgpu setting RENDER_TEST_DEVICE=webgpu. That is the maintainers' own signal that rendering tests need a display and a device, and that WebGL and WebGPU are exercised as distinct paths.

The third boundary is scope creep into 3D globes and terrain. The README lists deck.gl-native (C++), deck.gl-raster (computation on rasters) and earthengine-layers as third-party goodies, which is a clear statement that those capabilities live outside the core project. If your product is a globe, evaluate those before you assume the core covers it.

deck.gl compared with MapLibre, Mapbox, Leaflet and Cesium

The honest comparison is not feature-by-feature, because these tools do not occupy the same layer. MapLibre and Mapbox GL are basemap renderers: they own the vector tile pipeline, the style spec and the camera, and they draw the map itself. deck.gl is an overlay framework. The README's phrasing is that deck.gl integrates with "major basemap providers", which is the relationship in one sentence: you bring the map, deck.gl draws your data on top of it. In practice the two are often combined, with a deck.gl layer stack positioned over a MapLibre or Mapbox canvas, and the choice is about which library owns the camera and the event loop.

Leaflet and OpenLayers sit at a different point again. They are mature, DOM and canvas based, and they come with the surrounding GIS furniture that deck.gl deliberately omits. Their per-feature cost is higher, which is exactly the trade: you get a complete mapping toolkit and you accept that very large feature counts will be slow. Three.js is a general 3D engine with no cartographic concepts at all; using it for a map means building the projection, the tiling and the picking yourself. Cesium is a globe and terrain engine, so it competes with deck.gl only in the narrow case where the globe is the point.

Kepler.gl is the interesting one, because it is built on deck.gl and packaged as an application rather than a library. If you want a drag-and-drop geospatial analysis tool, that is a different product decision from embedding a renderer in your own code. The README does not compare deck.gl to any of these; the distinctions above come from what each project is and what deck.gl's own documentation says it does and does not cover.

Maintenance, releases and what the MIT licence means here

The repository is not archived, and the last push was on 2026-09-21. Releases are frequent and versioned: v9.4.0 landed on 2026-09-05, preceded by v9.4.0-beta.4 on 2026-09-03 and v9.4.0-beta.3 on 2026-09-03. The presence of a beta line before a stable tag tells you the release process runs through prereleases rather than shipping straight to stable, and the package.json scripts confirm it: publish-beta runs ocular-publish version-only-beta while publish-prod runs version-only-prod.

Upgrade cost is the part worth planning for. This is a monorepo with yarn workspaces over modules/*, and the build script is not a single tsc invocation. It cleans, builds a WebGL variant of a named module list (core, extensions, layers, mesh-layers, aggregation-layers, geo-layers), moves the output, then rebuilds with WebGPU enabled and runs lerna across the workspace. A major-version bump therefore touches the rendering backend, not just types. If you pin deck.gl, pin it deliberately and read the CHANGELOG before moving, because the WebGL and WebGPU paths are built separately and the test scripts treat them as separate targets.

The licence is MIT, which is permissive and places few obligations on how you redistribute the code. The README also notes that deck.gl is part of vis.gl, an OpenJS Foundation project, and points at a CONTRIBUTING.md and CODE_OF_CONDUCT.md. Note the attribution section: the project lists data sources per example and credits supporting organizations. MIT covers the deck.gl code; it does not grant you rights to the basemap tiles, the example datasets or the provider logos, and those carry their own terms.

Editorial conclusion

Adopt deck.gl when you already have a basemap and need to draw tens of thousands of points, arcs or polygons on top of it, and when you are willing to keep a WebGL2-capable browser in scope. Do not adopt it as a replacement for a GIS, a tile server, or a 3D globe engine; the README lists deck.gl-native, deck.gl-raster and earthengine-layers as separate third-party projects precisely because those concerns sit outside the core. Before committing, verify three things on your own data: that your basemap provider's terms allow the overlay you plan, that your target browsers expose WebGL2, and which of the four install paths (script tag, npm, React, pydeck) matches your stack, because the README treats them as separate getting-started documents rather than one flow.

Frequently asked questions

What is deck.gl used for?

It renders large data sets in the browser by mapping arrays of JSON objects into a stack of visual layers (icons, polygons, texts) and viewing them through views such as map, first-person or orthographic. The README lists performant rendering and updating of large data sets, interactive picking and filtering, cartographic projections and basemap integration as the problems it handles out of the box.

Is deck.gl open source?

Yes. The repository is public on GitHub under the MIT licence, and the README states that deck.gl is part of vis.gl, an OpenJS Foundation project.

How do I install deck.gl?

The README documents four paths: a script tag pointing at https://unpkg.com/deck.gl@latest/dist.min.js, npm install deck.gl for the JavaScript and React bindings, and pip install pydeck for the Python binding. Each path links to its own getting-started document and example directory.

Is deck.gl free?

The source is released under the MIT licence, so there is no licence fee for the framework itself. That does not extend to the basemaps, tiles or example datasets, which the README attributes to their own sources and providers.

What are the differences between deck.gl and MapLibre?

MapLibre renders the basemap itself, including the vector tile pipeline and the style spec, while deck.gl is an overlay framework that integrates with major basemap providers and draws your data on top. The README does not compare the two directly; it describes deck.gl as handling cartographic projections and basemap integration rather than supplying the map.

Who made deck.gl?

The README does not name an originating author. It states that deck.gl is part of vis.gl, an OpenJS Foundation project, and credits Unfolded, Foursquare, Carto, Mapbox and Uber among the organizations supporting the project.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. visgl/deck.gl on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/visgl-deck-gl.svg)](https://hysenlabs.com/projects/visgl-deck-gl)