Library / SDK
CesiumGS/cesium avatar
CesiumGS/cesium

CesiumJS: A 3D Globe Engine for Web Maps That Stream Real Data

An open-source JavaScript library for world-class 3D globes and maps :earth_americas:

15,787 stars3,879 forksJavaScriptApache-2.0

At a glance

What is it?
CesiumJS is an Apache-2.0 JavaScript library that renders 3D globes and 2D maps in the browser using WebGL and open formats. It is built for streaming large geospatial datasets, not for drawing a static map on a page.
Who is it for?
Adopt CesiumJS when your product needs a globe that streams terrain, imagery and 3D Tiles, and when your team is comfortable with a WebGL renderer and a module bundler. Skip it for a flat 2D map with a handful of markers, where a lighter mapping library will do the job with less code.
Can I use it commercially?
Yes. Apache-2.0 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 JavaScript, according to GitHub's language statistics.

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

Editorial analysis

What CesiumJS solves, and who ends up using it

A web map that shows a city is a solved problem. A web map that shows the whole planet at once, streams terrain and imagery as the camera moves, and layers 3D Tiles on top is not, and that gap is where CesiumJS sits. The README describes it as a JavaScript library for creating 3D globes and 2D maps in a browser without a plugin, using WebGL for hardware-accelerated graphics and tuned for dynamic-data visualization.

The audience is narrow and specific. Developers building flight trackers, satellite and mission-planning views, digital twins of cities, or any interface where the globe itself is the product rather than a background image. The package.json keywords list 3D, webgl, geospatial, map and globe, which is an accurate summary of the scope. If your requirement is a store locator with pins, this library is heavier than the problem, and the rest of this article will not change that.

How the renderer, the packages and the data sources fit together

CesiumJS is not a single file. The repository holds a Source/ directory with the library code, a Specs/ directory, a packages/ directory, and a set of gulpfile.js entry points. The npm package re-exports two scoped packages: @cesium/engine, described in the README as the core, rendering and data APIs, and @cesium/widgets, described as the widgets library. The root cesium package depends on both, plus protobufjs.

That split matters when you bundle. Importing from the root package and letting your bundler tree-shake is the documented path, and the README explicitly recommends importing individual modules to benefit from tree shaking through most build tools. The engine and widgets split exists so dependency management stays separable.

The data flow is the other half. CesiumJS does not ship a world. It streams terrain, imagery and 3D Tiles from a source you choose, and the README names Cesium ion as the commercial platform that hosts that content alongside open standards from other offline or online services. The library is the client; the content is a separate decision. That is the open-core model stated plainly in the README: open source runtime engines, optional commercial subscription for hosted content.

Installing CesiumJS and putting a globe on the page

The README points at the Downloads page for a pre-built copy. If you use a module bundler such as Webpack, Parcel or Rollup, the documented path is the npm package:

bash
npm install cesium --save

After that, the README gives this example: import the Viewer from cesium, import the widgets stylesheet, and construct a viewer against a container element. The stylesheet import is easy to miss and the globe widgets look broken without it.

js
import { Viewer } from "cesium";
import "cesium/Build/Cesium/Widgets/widgets.css";

const viewer = new Viewer("cesiumContainer");

The string passed to the constructor is the id of an existing DOM element, so the page needs an element with that id before this code runs. The README then sends you to the Quickstart Guide for the full setup, and to the Offline Guide in Documentation/OfflineGuide/README.md for instructions on serving local data. Those two documents are where the actual environment configuration lives; the README itself stops at the import.

The content problem the README does not solve for you

The largest practical limitation is not in the code. CesiumJS renders a globe, but a globe with no terrain and no imagery is a smooth sphere with a grid on it. The README is direct that Cesium ion is the quickest option for getting up and running, while also stating you are free to use any combination of content sources. The consequence is that the fast path runs through a commercial signup, and the free path runs through you finding, tiling and hosting your own terrain and imagery.

The Offline Guide exists precisely because that second path is real work. If your deployment cannot reach external tile services, or if licensing of the imagery you want is unclear, you are building a data pipeline before you render anything. Teams that budget for the JavaScript and not for the tiles are the ones that get surprised.

The second limitation is the renderer itself. WebGL means the target device needs a capable GPU and a browser that supports it. The README lists desktop and mobile sharing as a feature, but a heavy 3D Tiles scene on a low-end phone is a different proposition from a 2D map, and the documentation does not promise otherwise. If your users are on constrained hardware, test on that hardware early, not at the end.

Where CesiumJS is the wrong tool

CesiumJS is the wrong choice when the map is decoration. A product page with a single marker, a contact page with an office location, or a dashboard where a small static map sits in a card: all of these are cheaper with a 2D mapping library, and none of them benefit from WebGL or from a WGS84 globe.

It is also the wrong choice when your team has no appetite for a build pipeline. The package is distributed as ES modules with a types entry at Source/Cesium.d.ts, it depends on @cesium/engine and @cesium/widgets, and the documented import path pulls a CSS file out of Build/. That is all normal for a modern front-end project, but it is not a script tag you paste into a template and forget. Projects that need exactly that should look elsewhere.

Finally, it is the wrong choice if your data is fundamentally 2D and your users think in flat coordinates. Forcing a globe onto a floor-plan viewer or a transit diagram adds interaction cost without adding information.

How CesiumJS differs from a 2D tile map library

The obvious alternative is a 2D web mapping library such as Leaflet or MapLibre GL JS, and the difference is architectural rather than cosmetic. A 2D tile map projects the world into a flat plane and serves raster or vector tiles per zoom level. CesiumJS keeps a high-precision WGS84 globe, as the README puts it, and renders it in WebGL, which is what allows terrain to have height and allows 3D Tiles to place geometry in space above the surface.

That difference decides the project. If you need to show a building extruded to its real height, an aircraft at altitude, or a satellite orbit, a 2D library cannot express it without a plugin or a separate 3D view. If you need a fast, small map with markers and popups, CesiumJS carries a rendering engine and a content pipeline you will not use.

There is a middle position worth naming. A 2D library with a 3D mode gives you tilted views of the same tile pyramid, which is enough for some presentations and far less machinery than a globe renderer. The question to ask is whether your data has a real z value. If it does not, the 2D library wins on every axis except appearance.

Maintenance cadence, licence and what upgrading costs

The repository is not archived, and the last push was on 2026-09-18. Releases are frequent and versioned: 1.145 on 2026-09-01, 1.144 on 2026-08-04, and 1.143 on 2026-07-01. That is roughly a monthly cadence, and a CHANGES.md file sits at the top level of the repository, which is where the release notes live. Anyone pinning a version should read that file before moving.

The cost of that cadence is that the version number moves under you. The dependencies are range-pinned in package.json (@cesium/engine ^26.3.0, @cesium/widgets ^16.2.0, protobufjs ^8.8.0), so a fresh install can pick up newer engine and widgets builds than the ones the root package was tested against. Locking your lockfile is the practical mitigation, and it is your responsibility, not the library's.

The licence is Apache-2.0, and the README states CesiumJS is free for both commercial and non-commercial use. That covers the library. It does not cover the content: Cesium ion is a commercial subscription, and the README frames it as the quickest option rather than a requirement. If your legal review cares about where imagery and terrain come from, that question is separate from the Apache-2.0 grant on the code, and it is worth asking before launch rather than after.

Editorial conclusion

Adopt CesiumJS when your product needs a globe that streams terrain, imagery and 3D Tiles, and when your team is comfortable with a WebGL renderer and a module bundler. Skip it for a flat 2D map with a handful of markers, where a lighter mapping library will do the job with less code. Before committing, verify two things in your own build: that the widgets.css import resolves through your bundler, and that your terrain and imagery sources are reachable from wherever the app is served, since the README points at the Offline Guide for local data.

Frequently asked questions

How do I install CesiumJS in a project that uses a bundler?

The README documents installing the cesium npm package with npm install cesium --save, then importing the Viewer and the widgets stylesheet from the package. It is aimed at bundlers such as Webpack, Parcel or Rollup, and the README recommends importing individual modules so tree shaking can drop what you do not use.

How do I use CesiumJS to put a globe on a page?

The README example imports Viewer from cesium, imports cesium/Build/Cesium/Widgets/widgets.css, and calls new Viewer with the id of a container element. The page needs that element to exist before the code runs, and the README points to the Quickstart Guide for the full setup.

How do I use CesiumJS offline?

The README says instructions for serving local data are in the CesiumJS Offline Guide at Documentation/OfflineGuide/README.md. CesiumJS can also stream content from sources other than the Cesium ion platform, so offline deployment is a matter of where you serve terrain and imagery from.

What is Cesium ion, and does CesiumJS require it?

Cesium ion is a commercial platform that hosts 3D content such as terrain, imagery and 3D Tiles. The README describes it as the quickest option for getting up and running but states you are free to use any combination of content sources with CesiumJS.

Official sources

  1. CesiumGS/cesium on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
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/cesiumgs-cesium.svg)](https://hysenlabs.com/projects/cesiumgs-cesium)