Agent skill

Cesiumjs Viewer Setup

by CesiumGS in CesiumGS/cesiumjs-skills

CesiumJS viewer setup - Viewer, CesiumWidget, widgets, Ion token, Scene configuration, SceneMode, factory helpers, geocoders, platform services.

Apache-2.0Auto-check passed

Install Cesiumjs Viewer Setup

skills CLI
$ npx skills add CesiumGS/cesiumjs-skills --skill cesiumjs-viewer-setup -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install CesiumGS/cesiumjs-skills cesiumjs-viewer-setup --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/CesiumGS/cesiumjs-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/cesiumjs-viewer-setup .claude/skills/cesiumjs-viewer-setup && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
cesiumjs-viewer-setup
GitHub stars
189
Token cost
~5k tokens
SKILL.md length
1,043 words
Files
1
Skills in repo
14
Repo updated
First seen
Licence
Apache-2.0

At a glance

CesiumJS viewer setup - Viewer, CesiumWidget, widgets, Ion token, Scene configuration, SceneMode, factory helpers, geocoders, platform services.

  • Works in 9 steps: Set requestRenderMode: true for… → Use scene3DOnly: true when 2D/Columbus… → Disable unused widgets (animation:… → …
  • Initializing a CesiumJS application
  • SKILL.md covers Quick Start, Framing Loaded Content…, Ion & Platform Configuration and Viewer Constructor Options, plus 9 more sections
  • Reaches tile.openstreetmap.org

What it does

Cesiumjs Viewer Setup is an agent skill from CesiumGS/cesiumjs-skills. CesiumJS viewer setup - Viewer, CesiumWidget, widgets, Ion token, Scene configuration, SceneMode, factory helpers, geocoders, platform services. Use when initializing a CesiumJS application, configuring viewer widgets, setting Ion access tokens, creating default terrain or imagery, or bootstrapping a 3D globe.

Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: Curated agent skills for CesiumJS development. The licence is Apache-2.0.

When your agent uses it

  • Initializing a CesiumJS application
  • Configuring viewer widgets
  • Setting Ion access tokens
  • Creating default terrain

Example prompts

  • “Use the cesiumjs-viewer-setup skill to cesiumj viewer setup - Viewer, CesiumWidget, widgets, Ion token, Scene configuration, SceneMode, factory…”
  • “/cesiumjs-viewer-setup”

Requirements

  • A credential in YOUR_TOKEN
  • A credential in YOUR_GOOGLE_MAPS_API_KEY

Workflow steps

9 steps, taken from the first numbered list in SKILL.md.

  1. Set requestRenderMode: true for mostly-static apps. Reduces CPU/GPU and battery drain. Call scene.requestRender() after changes.
  2. Use scene3DOnly: true when 2D/Columbus View is not needed. Saves GPU memory per geometry instance. Commonly required alongside…
  3. Disable unused widgets (animation: false, timeline: false) to reduce DOM overhead.
  4. Set msaaSamples: 1 on low-power devices. Default 4 balances quality.
  5. Lower resolutionScale (e.g., 0.75) on HiDPI displays for better frame rates.
  6. Prefer Terrain.fromWorldTerrain() over await createWorldTerrainAsync(); it is non-blocking and exposes error events.
  7. Enable requestVertexNormals: true on terrain for proper lighting at negligible cost.
  8. Call viewer.destroy() when removing from DOM to free WebGL contexts.
  9. Limit imagery layers to 2-3. Each adds a texture lookup per fragment.

What it can do on your machine

Read from SKILL.md and the folder at commit 5f4792c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • tile.openstreetmap.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Cesiumjs Viewer Setup loads about 5k tokens when it runs. Until then it costs about 83 tokens; SKILL.md has 1,043 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~83
When it runs · the whole SKILL.md, loaded when a task matches
~5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from CesiumGS/cesiumjs-skills at commit 5f4792c, republished under its Apache-2.0 licence (© CesiumGS). 1,043 words, ~5,032 tokens.

Download SKILL.mdSave it as .claude/skills/cesiumjs-viewer-setup/SKILL.md (or your agent's skills folder).
name
cesiumjs-viewer-setup
description
CesiumJS viewer setup - Viewer, CesiumWidget, widgets, Ion token, Scene configuration, SceneMode, factory helpers, geocoders, platform services. Use when initializing a CesiumJS application, configuring viewer widgets, setting Ion access tokens, creating default terrain or imagery, or bootstrapping a 3D globe.

CesiumJS Viewer & Scene Setup

Reference for bootstrapping CesiumJS applications: Viewer, CesiumWidget, Ion/GoogleMaps/ITwinPlatform configuration, widgets, factory helpers, geocoder services, viewer mixins, Credits, and related enums.

Quick Start

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

const viewer = new Viewer("cesiumContainer", {
  baseLayer: new ImageryLayer(new OpenStreetMapImageryProvider({
    url: "https://tile.openstreetmap.org/",
    maximumLevel: 18,
  })),
  baseLayerPicker: false,
});

Required HTML: <div id="cesiumContainer" style="width:100%;height:100vh"></div>

Use Cesium ion defaults (Terrain.fromWorldTerrain, ImageryLayer.fromWorldImagery, createOsmBuildingsAsync, Google Photorealistic 3D Tiles) only when the target runtime has the required ion or Google entitlement. For public/no-token examples, choose explicit public providers and URL-backed 3D Tiles.

Framing Loaded Content (Critical)

After adding a tileset, model, or data source, you must explicitly frame it. A Viewer constructed with default options starts the camera at a fixed view of Earth. It does NOT auto-zoom to primitives you add. Forgetting this is the most common cause of "I see only gray surface" or "the asset is a speck in the corner" failures.

js
const tileset = await Cesium3DTileset.fromUrl(url);
viewer.scene.primitives.add(tileset);

// Pick ONE of:
await viewer.zoomTo(tileset);                 // instant fit to bounding sphere
await viewer.flyTo(tileset, { duration: 0 }); // animated; duration 0 = instant

viewer.zoomTo / viewer.flyTo accept Entity, Entity[], EntityCollection, DataSource, ImageryLayer, Cesium3DTileset, VoxelPrimitive, Model, or TimeDynamicPointCloud. They use the target's bounding sphere, which works for tilesets with arbitrary local coordinate systems where computing an ECEF camera position by hand will miss the asset entirely.

When you do need an explicit camera position (e.g., to satisfy a heading/pitch specification), still use viewer.zoomTo(target, headingPitchRange) so the range is derived from the bounding sphere rather than guessed:

js
import { HeadingPitchRange, Math as CesiumMath } from "cesium";

await viewer.zoomTo(tileset, new HeadingPitchRange(
  CesiumMath.toRadians(45),   // heading
  CesiumMath.toRadians(-30),  // pitch
  /* range omitted -> auto-fit */
));

Ion & Platform Configuration

Cesium Ion
js
import { Ion } from "cesium";

Ion.defaultAccessToken = "YOUR_TOKEN";  // required for ion assets
Ion.defaultServer = "https://your-ion-server.example.com/"; // optional: self-hosted
IonResource
js
import { IonResource, Cesium3DTileset } from "cesium";

const resource = await IonResource.fromAssetId(96188);
const tileset = await Cesium3DTileset.fromUrl(resource);
viewer.scene.primitives.add(tileset);
await viewer.zoomTo(tileset);
Google Maps Platform
js
import { GoogleMaps, createGooglePhotorealistic3DTileset, Viewer, IonGeocodeProviderType } from "cesium";

GoogleMaps.defaultApiKey = "YOUR_GOOGLE_MAPS_API_KEY"; // optional: without key, served via ion

const viewer = new Viewer("cesiumContainer", {
  geocoder: IonGeocodeProviderType.GOOGLE, // required with Google 3D Tiles
});

const tileset = await createGooglePhotorealistic3DTileset({
  onlyUsingWithGoogleGeocoder: true,
});
viewer.scene.primitives.add(tileset);
iTwin Platform (experimental)
js
import { ITwinPlatform, ITwinData } from "cesium";

ITwinPlatform.defaultAccessToken = "YOUR_ITWIN_TOKEN";
const tileset = await ITwinData.createTilesetForIModel(viewer, "imodel-id");

// 1.140+ (#13208): Reality Data of type GaussianSplat3DTiles is now supported
const splats = await ITwinData.createTilesetForRealityDataId(
  iTwinId,
  realityDataId,
  ITwinPlatform.RealityDataType.GaussianSplat3DTiles,
);
viewer.scene.primitives.add(splats);

Viewer Constructor Options

new Viewer(container, options?) -- container is a DOM element or its string ID.

Widget Toggles
OptionDefaultPurpose
animationtruePlayback controls
baseLayerPickertrueImagery/terrain switcher
fullscreenButtontrueFullscreen toggle
vrButtonfalseWebVR toggle
geocoderIonGeocodeProviderType.DEFAULTSearch bar (false to hide)
homeButtontrueReset to home view
infoBoxtrueEntity info popup
sceneModePickertrue2D/3D/Columbus toggle
selectionIndicatortrueSelection reticle
timelinetrueTime scrubber
navigationHelpButtontrueMouse/touch help
projectionPickerfalsePerspective/ortho toggle
Scene & Rendering
OptionDefaultPurpose
sceneModeSceneMode.SCENE3DInitial scene mode
scene3DOnlyfalseLock to 3D, saves GPU memory per geometry instance
shadowsfalseShadow casting
terrainShadowsShadowMode.RECEIVE_ONLYTerrain shadow mode
requestRenderModefalseRender only on changes
maximumRenderTimeChange0.0Max sim-time delta for render
msaaSamples4MSAA (1 to disable)
orderIndependentTranslucencytrueTranslucent ordering
mapMode2DMapMode2D.INFINITE_SCROLL2D scroll behavior

Pair requestRenderMode: true with scene3DOnly: true for low-power / dashboard apps; both are commonly required together when the scenario calls for GPU savings.

Layers & Terrain
OptionDefaultPurpose
baseLayerImageryLayer.fromWorldImagery()Base imagery (false for none; needs baseLayerPicker: false)
terrainnoneAsync terrain helper (cannot combine with terrainProvider)
terrainProviderEllipsoidTerrainProviderSync terrain provider
globenew Globe()false for no globe (space scenes)
skyBoxauto (WGS84)false disables sky/sun/moon
skyAtmosphereauto (WGS84)false disables limb glow
Minimal Viewer (No Widgets)
js
import { Viewer, ImageryLayer, OpenStreetMapImageryProvider } from "cesium";

const viewer = new Viewer("cesiumContainer", {
  baseLayer: new ImageryLayer(new OpenStreetMapImageryProvider({
    url: "https://tile.openstreetmap.org/",
    maximumLevel: 18,
  })),
  animation: false, baseLayerPicker: false, fullscreenButton: false,
  geocoder: false, homeButton: false, infoBox: false,
  sceneModePicker: false, selectionIndicator: false,
  timeline: false, navigationHelpButton: false,
});

CesiumWidget (Lightweight Alternative)

No UI widgets, no Knockout dependency. Suitable for custom UIs or embedding.

js
import { CesiumWidget, Ion } from "cesium";
Ion.defaultAccessToken = "YOUR_TOKEN";

const widget = new CesiumWidget("cesiumContainer", { shouldAnimate: true });
// Exposes: widget.scene, widget.camera, widget.entities

SceneMode Enum

ValueDescription
SceneMode.SCENE3DStandard 3D globe (default)
SceneMode.SCENE2DTop-down orthographic map
SceneMode.COLUMBUS_VIEW2.5D flat map with height
SceneMode.MORPHINGTransitioning between modes
js
import { Viewer, SceneMode } from "cesium";

const viewer = new Viewer("cesiumContainer", { sceneMode: SceneMode.SCENE2D });
viewer.scene.morphTo3D(2.0);          // animated transition
viewer.scene.morphToColumbusView(2.0);

Scene Configuration

js
const scene = viewer.scene;
scene.globe.depthTestAgainstTerrain = true; // entities interact with terrain
scene.globe.enableLighting = true;          // sun-based lighting

// Key sub-objects
scene.camera;           // Camera
scene.primitives;       // PrimitiveCollection
scene.groundPrimitives; // PrimitiveCollection (ground-clamped)
scene.imageryLayers;    // ImageryLayerCollection
scene.postProcessStages;

scene.requestRender();  // trigger frame in requestRenderMode

Important: never touch scene.globe.* or scene.skyAtmosphere.* when the matching constructor option was set to false. Disabling these in the Viewer options leaves the corresponding property as undefined on the scene, and accessing .enableLighting, .depthTestAgainstTerrain, .show, or any other field throws TypeError: Cannot set properties of undefined. For space scenes, configure once in the constructor and do not mutate those properties afterward (see "Space Scene" below).

Factory Helpers

createOsmBuildingsAsync
js
import { createOsmBuildingsAsync, Cesium3DTileStyle } from "cesium";

// Default styling (colors from OSM tags)
const tileset = await createOsmBuildingsAsync();
viewer.scene.primitives.add(tileset);

// Custom style
const styled = await createOsmBuildingsAsync({
  style: new Cesium3DTileStyle({
    color: { conditions: [
      ["${feature['building']} === 'hospital'", "color('#0000FF')"],
      [true, "color('#ffffff')"],
    ]},
  }),
});
createGooglePhotorealistic3DTileset
js
import { createGooglePhotorealistic3DTileset, IonGeocodeProviderType } from "cesium";

// Must use Google geocoder
const viewer = new Viewer("cesiumContainer", { geocoder: IonGeocodeProviderType.GOOGLE });
const tileset = await createGooglePhotorealistic3DTileset({ onlyUsingWithGoogleGeocoder: true });
viewer.scene.primitives.add(tileset);
Terrain.fromWorldTerrain / fromWorldBathymetry

Preferred for the terrain constructor option. Non-blocking with error events.

js
import { Viewer, Terrain } from "cesium";

// World terrain with normals and water
const viewer = new Viewer("cesiumContainer", {
  terrain: Terrain.fromWorldTerrain({ requestVertexNormals: true, requestWaterMask: true }),
});

// Bathymetry (ocean floor)
const viewer2 = new Viewer("cesiumContainer", {
  terrain: Terrain.fromWorldBathymetry({ requestVertexNormals: true }),
});
Terrain Event Handling
js
import { Terrain, CesiumTerrainProvider } from "cesium";

const terrain = new Terrain(CesiumTerrainProvider.fromUrl("https://my-terrain.example.com"));
viewer.scene.setTerrain(terrain);

terrain.readyEvent.addEventListener((provider) => {
  viewer.scene.globe.enableLighting = true;
});
terrain.errorEvent.addEventListener((error) => console.error("Terrain failed:", error));
createWorldTerrainAsync / createWorldImageryAsync

Lower-level: return raw providers. Use when you need the provider directly.

js
import { createWorldTerrainAsync, createWorldImageryAsync, IonWorldImageryStyle } from "cesium";

const terrainProvider = await createWorldTerrainAsync({ requestVertexNormals: true });
viewer.terrainProvider = terrainProvider;

const imageryProvider = await createWorldImageryAsync({ style: IonWorldImageryStyle.AERIAL_WITH_LABELS });

IonWorldImageryStyle: AERIAL (default) | AERIAL_WITH_LABELS | ROAD

Geocoder Configuration

The geocoder option accepts false, an IonGeocodeProviderType, or a GeocoderService[].

IonGeocodeProviderType: DEFAULT | GOOGLE (required with Google tiles) | BING

js
import { Viewer, CartographicGeocoderService, IonGeocoderService, OpenCageGeocoderService } from "cesium";

// Multiple services (searched in order)
const viewer = new Viewer("cesiumContainer", {
  geocoder: [
    new CartographicGeocoderService(), // accepts "lat, lon" input
    new IonGeocoderService({ scene: viewer.scene }),
  ],
});
Custom GeocoderService
js
const myGeocoder = {
  async geocode(input, type) {
    // type: GeocodeType.SEARCH or GeocodeType.AUTOCOMPLETE
    const resp = await fetch(`https://api.example.com/search?q=${input}`);
    const data = await resp.json();
    return data.map((item) => ({
      displayName: item.name,
      destination: Cartesian3.fromDegrees(item.lon, item.lat),
    }));
  },
};
const viewer = new Viewer("cesiumContainer", { geocoder: [myGeocoder] });

Viewer Mixins

js
import { Viewer, viewerDragDropMixin, viewerCesium3DTilesInspectorMixin,
  viewerCesiumInspectorMixin, viewerPerformanceWatchdogMixin, viewerVoxelInspectorMixin } from "cesium";

const viewer = new Viewer("cesiumContainer");

// Drag-and-drop CZML/GeoJSON/KML loading
viewer.extend(viewerDragDropMixin, { dropTarget: "cesiumContainer", clearOnDrop: true });
viewer.dropError.addEventListener((handler, name, error) => console.error(error));

viewer.extend(viewerCesium3DTilesInspectorMixin);    // 3D Tiles debug panel
viewer.extend(viewerCesiumInspectorMixin);            // general scene inspector
viewer.extend(viewerPerformanceWatchdogMixin);        // low-FPS warning
viewer.extend(viewerVoxelInspectorMixin);             // voxel debug panel

Key Viewer Properties & Methods

PropertyType
viewer.sceneScene
viewer.cameraCamera
viewer.entitiesEntityCollection
viewer.dataSourcesDataSourceCollection
viewer.imageryLayersImageryLayerCollection
viewer.terrainProviderTerrainProvider
viewer.clock / clockViewModelClock / ClockViewModel
viewer.canvasHTMLCanvasElement
viewer.screenSpaceEventHandlerScreenSpaceEventHandler
viewer.selectedEntity / trackedEntityEntity
viewer.shadowsboolean
viewer.resolutionScalenumber (default 1.0)
js
await viewer.flyTo(entity, { duration: 3.0, offset: headingPitchRange }); // animated
await viewer.zoomTo(tileset);   // instant; uses bounding sphere
viewer.destroy();               // free all resources

Credit & FrameRateMonitor

js
import { Credit, FrameRateMonitor } from "cesium";

// Custom credit (showOnScreen = true)
viewer.creditDisplay.addStaticCredit(new Credit("Data by Example Corp", true));

// Monitor frame rate
const monitor = FrameRateMonitor.fromScene(viewer.scene);
monitor.lowFrameRate.addEventListener(() => console.warn("Low FPS"));
monitor.nominalFrameRate.addEventListener(() => console.log("FPS recovered"));

Common Patterns

Show full SKILL.md (418 more words)Show less
Production Viewer with Terrain and OSM Buildings
js
import { Ion, Viewer, Terrain, createOsmBuildingsAsync, Cartesian3, Math as CesiumMath } from "cesium";

Ion.defaultAccessToken = "YOUR_TOKEN";
const viewer = new Viewer("cesiumContainer", {
  terrain: Terrain.fromWorldTerrain(), animation: false, timeline: false,
});

viewer.scene.primitives.add(await createOsmBuildingsAsync());
viewer.scene.camera.flyTo({
  destination: Cartesian3.fromDegrees(-74.019, 40.6912, 750),
  orientation: { heading: CesiumMath.toRadians(20), pitch: CesiumMath.toRadians(-20) },
});
Loading and Framing a Sample 3D Tileset

When the tileset's local coordinate frame is unknown (sample assets, discrete-LOD demos), do NOT hand-compute an ECEF camera position; you will miss the asset and render a blank gray surface. Use viewer.zoomTo with a HeadingPitchRange to derive a fitted view from the tileset's bounding sphere.

js
import { Cesium3DTileset, HeadingPitchRange, Math as CesiumMath } from "cesium";

const tileset = await Cesium3DTileset.fromUrl(url);
viewer.scene.primitives.add(tileset);

await viewer.zoomTo(
  tileset,
  new HeadingPitchRange(
    CesiumMath.toRadians(45),
    CesiumMath.toRadians(-30),
    // omit range -> Cesium auto-fits the bounding sphere
  ),
);
Space Scene (No Globe)

Disable the globe and atmosphere via constructor options only. The scene's globe and skyAtmosphere properties become undefined, so any later viewer.scene.globe.<anything> = ... or viewer.scene.skyAtmosphere.show = false will throw Cannot set properties of undefined. Configure lighting, depth-test-against-terrain, atmosphere visibility, and similar options in the constructor or skip them entirely for a space scene.

js
const viewer = new Viewer("cesiumContainer", {
  globe: false,           // viewer.scene.globe will be undefined
  skyAtmosphere: false,   // viewer.scene.skyAtmosphere will be undefined
  baseLayerPicker: false,
  baseLayer: false,       // no imagery layer is needed without a globe
});

// Safe post-construction tweaks (skyBox/sun/moon remain defined):
viewer.scene.skyBox.show = true;  // default star field
viewer.scene.sun.show = false;
viewer.scene.moon.show = false;

// DO NOT do this, throws because globe/skyAtmosphere are undefined:
// viewer.scene.globe.enableLighting = true;
// viewer.scene.skyAtmosphere.show = false;
Explicit Render Mode (Low Power Dashboard)

Pair with scene3DOnly: true when 2D/Columbus View is not needed; this is the canonical low-GPU configuration.

js
const viewer = new Viewer("cesiumContainer", {
  requestRenderMode: true,
  maximumRenderTimeChange: Infinity,
  scene3DOnly: true,
  animation: false,
  timeline: false,
});
// Call viewer.scene.requestRender() after programmatic changes
Custom Base Layer
js
import { Viewer, ImageryLayer, OpenStreetMapImageryProvider } from "cesium";

const viewer = new Viewer("cesiumContainer", {
  baseLayerPicker: false,
  baseLayer: new ImageryLayer(new OpenStreetMapImageryProvider({
    url: "https://tile.openstreetmap.org/",
  })),
});
Columbus View with Web Mercator
js
import { Viewer, SceneMode, WebMercatorProjection } from "cesium";

const viewer = new Viewer("cesiumContainer", {
  sceneMode: SceneMode.COLUMBUS_VIEW, mapProjection: new WebMercatorProjection(),
});

Performance Tips

  1. Set requestRenderMode: true for mostly-static apps. Reduces CPU/GPU and battery drain. Call scene.requestRender() after changes.
  2. Use scene3DOnly: true when 2D/Columbus View is not needed. Saves GPU memory per geometry instance. Commonly required alongside requestRenderMode for dashboard/low-power scenarios.
  3. Disable unused widgets (animation: false, timeline: false) to reduce DOM overhead.
  4. Set msaaSamples: 1 on low-power devices. Default 4 balances quality.
  5. Lower resolutionScale (e.g., 0.75) on HiDPI displays for better frame rates.
  6. Prefer Terrain.fromWorldTerrain() over await createWorldTerrainAsync(); it is non-blocking and exposes error events.
  7. Enable requestVertexNormals: true on terrain for proper lighting at negligible cost.
  8. Call viewer.destroy() when removing from DOM to free WebGL contexts.
  9. Limit imagery layers to 2-3. Each adds a texture lookup per fragment.

Framing Checklist (Avoid Blank / Off-Frame Renders)

Before declaring a viewer-setup task complete, verify:

  1. After adding any tileset, model, GeoJSON/KML/CZML data source, or entity collection: await viewer.zoomTo(target) or await viewer.flyTo(target) was called.
  2. For tilesets with unknown local frames, the camera is derived from the bounding sphere (HeadingPitchRange), not a hand-picked Cartesian3.fromDegrees(...).
  3. If the scenario specifies a heading/pitch, those are passed via HeadingPitchRange to zoomTo/flyTo rather than set on camera.flyTo with a guessed destination.
  4. A required base imagery layer is actually present (count == 1) when the scenario expects a visible map under the asset.
  5. When globe: false or skyAtmosphere: false is set in constructor options, no later code accesses viewer.scene.globe.* or viewer.scene.skyAtmosphere.*; both are undefined and will throw.

See Also

  • cesiumjs-camera -- Camera positioning, flyTo, lookAt, navigation constraints
  • cesiumjs-entities -- Entity API, data sources, GeoJSON/KML/CZML loading
  • cesiumjs-imagery -- Imagery providers, layer management, split-screen
  • cesiumjs-terrain-environment -- Terrain providers, Globe, atmosphere, sky, lighting

© CesiumGS, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/cesiumjs-viewer-setup of CesiumGS/cesiumjs-skills.

Open the folder on GitHubat commit 5f4792c

Compare with similar skills

Cesiumjs Viewer Setup next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Cesiumjs Viewer Setup compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Cesiumjs Viewer Setup this skillCesiumGS/cesiumjs-skills189—~5kAutomated safety check: PassApache-2.0
Makepad Widgetssickn33/agentic-awesome-skills47k2 repos~1.7kAutomated safety check: PassMIT
Contact Widgetnexu-io/open-design100k—~1.6kAutomated safety check: PassApache-2.0
WidgetLeoYeAI/openclaw-master-skills2.2k—~1.9kAutomated safety check: PassMIT
Chat Widgetsickn33/agentic-awesome-skills47k2 repos~332Automated safety check: PassMIT
Developing PDF ViewerTriliumNext/Trilium38k—~1.8kAutomated safety check: PassAGPL-3.0

Similar skills

  • Makepad Widgets

    sickn33/agentic-awesome-skills

    Version: makepad-widgets (dev branch) | Last Updated: 2026-01-19 Check for updates: https://crates.io/crates/makepad-widgets

    47k GitHub starsUsed in 2 repos~1.7k tokens
    Auto-check passed
  • Contact Widget

    nexu-io/open-design

    Self-contained floating chat widget with welcome screen, social links, meeting button, and message input.

    100k GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Widget

    LeoYeAI/openclaw-master-skills

    Create, update, hide, show, list, and delete Übersicht desktop widgets on macOS.

    2.2k GitHub stars~1.9k tokensUpdated 2 mo ago
    Auto-check passed
  • Chat Widget

    sickn33/agentic-awesome-skills

    Build a real-time support chat system with a floating widget for users and an admin dashboard for support staff.

    47k GitHub starsUsed in 2 repos~332 tokens
    Sales & SupportAuto-check passed
  • Developing PDF Viewer

    TriliumNext/Trilium

    A skill your agent uses when changing Trilium's built-in PDF viewer — anything under packages/pdfjs-viewer (the code injected into Mozilla's PDF.js viewer: bootstrap.ts, annotations.ts, pages.ts…

    38k GitHub stars~1.8k tokensUpdated today
    Documents & OfficeAuto-check passed
  • Robius Widget Patterns

    sickn33/agentic-awesome-skills

    CRITICAL: Use for Robius widget patterns. An agent skill from sickn33/agentic-awesome-skills.

    47k GitHub starsUsed in 2 repos~3.1k tokens
    Auto-check passed

More from CesiumGS/cesiumjs-skills

All 14 skills in this repo
  • Cesiumjs 3D Tiles

    CesiumGS/cesiumjs-skills

    CesiumJS 3D Tiles - Cesium3DTileset, compressed and CAD-style glTF content, MVTDataProvider, UrlTemplate3DTilesDataProvider, styling, metadata, feature picking, voxels, point clouds, I3S, Gaussian…

    189 GitHub stars~4.7k tokensUpdated 25 days ago
    Auto-check passed
  • Cesiumjs Core Utilities

    CesiumGS/cesiumjs-skills

    CesiumJS core utilities and networking - Resource, Color, Event, Request, RequestScheduler, error handling, helper functions, feature detection.

    189 GitHub stars~3.9k tokensUpdated 25 days ago
    Auto-check passed
  • Cesiumjs Materials Shaders

    CesiumGS/cesiumjs-skills

    CesiumJS materials and post-processing — Material, Fabric JSON, MaterialAppearance, ImageBasedLighting, PostProcessStage, PostProcessStageLibrary, bloom, depth of field, ambient occlusion, FXAA…

    189 GitHub stars~3.6k tokensUpdated 25 days ago
    Auto-check passed
  • Cesiumjs Spatial Math

    CesiumGS/cesiumjs-skills

    CesiumJS spatial math - Cartesian3, Cartographic, Matrix4, Quaternion, Transforms, Ellipsoid, BoundingSphere, projections, coordinate conversions.

    189 GitHub stars~4.6k tokensUpdated 25 days ago
    Auto-check passed
  • Cesiumjs Terrain Environment

    CesiumGS/cesiumjs-skills

    CesiumJS terrain, globe, and environment - TerrainProvider, Globe, sampleTerrain, atmosphere, sky, fog, lighting, shadows, panoramas.

    189 GitHub stars~5k tokensUpdated 25 days ago
    Auto-check passed
  • Cesiumjs Camera

    CesiumGS/cesiumjs-skills

    CesiumJS camera control - Camera, flyTo, lookAt, setView, ScreenSpaceCameraController, composable Controller camera controllers (1.144), CameraEventAggregator, flight animation.

    189 GitHub stars~6.8k tokensUpdated 25 days ago
    Auto-check passed

Questions about Cesiumjs Viewer Setup

What does Cesiumjs Viewer Setup do?

CesiumJS viewer setup - Viewer, CesiumWidget, widgets, Ion token, Scene configuration, SceneMode, factory helpers, geocoders, platform services. Cesiumjs Viewer Setup is an agent skill from CesiumGS/cesiumjs-skills. CesiumJS viewer setup - Viewer, CesiumWidget, widgets, Ion token, Scene configuration, SceneMode, factory helpers, geocoders, platform services.

When should I use Cesiumjs Viewer Setup?

Cesiumjs Viewer Setup fits situations like: initializing a CesiumJS application; configuring viewer widgets; setting Ion access tokens; creating default terrain.

How do I install Cesiumjs Viewer Setup in Claude Code?

Run `npx skills add CesiumGS/cesiumjs-skills --skill cesiumjs-viewer-setup -a claude-code`. Or copy the skill folder (skills/cesiumjs-viewer-setup in CesiumGS/cesiumjs-skills) into .claude/skills/cesiumjs-viewer-setup in your project. Claude Code loads it when a task matches its description.

How do I install Cesiumjs Viewer Setup in Codex?

Run `npx skills add CesiumGS/cesiumjs-skills --skill cesiumjs-viewer-setup -a codex`. Or copy the skill folder (skills/cesiumjs-viewer-setup in CesiumGS/cesiumjs-skills) into .agents/skills/cesiumjs-viewer-setup in your project. Codex loads it when a task matches its description.

Can I use Cesiumjs Viewer Setup in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add CesiumGS/cesiumjs-skills --skill cesiumjs-viewer-setup -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cesiumjs-viewer-setup, .gemini/skills/cesiumjs-viewer-setup, .github/skills/cesiumjs-viewer-setup and .opencode/skills/cesiumjs-viewer-setup in your project.

What does Cesiumjs Viewer Setup need to run?

SKILL.md names no scripts, command-line tools or credentials: Cesiumjs Viewer Setup is instructions for the agent only. Our summary lists: A credential in YOUR_TOKEN; A credential in YOUR_GOOGLE_MAPS_API_KEY.

Does Cesiumjs Viewer Setup access the network?

SKILL.md names 1 domain. In commands or code: tile.openstreetmap.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Cesiumjs Viewer Setup safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Cesiumjs Viewer Setup use?

Cesiumjs Viewer Setup is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Cesiumjs Viewer Setup use?

About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Cesiumjs Viewer Setup?

Skills that share tags, products or a category with Cesiumjs Viewer Setup: Makepad Widgets (sickn33/agentic-awesome-skills, 47k stars), Contact Widget (nexu-io/open-design, 100k stars), Widget (LeoYeAI/openclaw-master-skills, 2.2k stars) and Chat Widget (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Cesiumjs Viewer Setup?

CesiumGS (a GitHub organization) maintains it in CesiumGS/cesiumjs-skills, which has 189 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on September 14, 2026.

Source: CesiumGS/cesiumjs-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.