NIKA

The OnlyMap library developers ever need.

A declarative map SDK for streaming, 3D, and app-native experiences — one API instead of a hand-built stack.

Claude Code
> Map BART lines and stations across the Bay Area, plus SF bike parking, with a legend.
Scaffolding onlymap.config
Rendering layers + legend
Wiring the live preview
bay-area.html
OnlyMap JS Generating…
bay-area.html — preview0/4 layers

Fastest way in

Give your coding agent the OnlyMap skill.

Drop it into Claude Code, Cursor, or any agent that supports skills — it can write OnlyMap manifests straightaway.

Our manifesto

What you write is what you get.

OnlyMap abstracts away the WebGL and state-management barrier of map libraries. The declarative manifest, globe, popup, and widget you write are exactly what renders. No shader code, no imperative glue, no technical experience required.

quakes.globe.html - previewdashboard map
Legend
2.54.46.2+
Magnitude
4.06.2
Earthquake layer37.775, -122.420
North BeachM 6.2 / 2.1km depth
In view7 events / avg M4.6
Magnitude binsM2.5 to M6.5
Last hour+18% event rate
legend.html
<nika-widget type="legend"
  title="Magnitude">
</nika-widget>
filter.html
<nika-layer id="quakes"
  filter-field="magnitude"
  filter-range="[4, 10]">
</nika-layer>
scatter.html
<nika-layer id="quakes"
  type="ScatterplotLayer"
  data="./quakes.json"
  globe-view>
</nika-layer>
overlay.html
<nika-overlay id="detail"
  anchor-from="selection">
  {{place}} - M {{magnitude}}
</nika-overlay>
metrics.html
<nika-widget type="vega-lite"
  layer="quakes">
</nika-widget>
quakes.globe.html - previewdashboard map
Legend
2.54.46.2+
Magnitude
4.06.2
Earthquake layer37.775, -122.420
North BeachM 6.2 / 2.1km depth
In view7 events / avg M4.6
Magnitude binsM2.5 to M6.5
Last hour+18% event rate
Legend
2.54.46.2+
legend.html
<nika-widget type="legend"
  position="top-right"
  title="Magnitude">
</nika-widget>
Magnitude
4.06.2
filter.html
<nika-layer id="quakes"
  filter-field="magnitude"
  filter-range="[4, 10]">
</nika-layer>
<nika-widget type="filter" layer="quakes">
</nika-widget>
In view7 events / avg M4.6
metrics.html
<nika-widget type="vega-lite"
  layer="quakes"
  watch="viewport data:quakes">
  <script type="application/json">
    { "mark": "bar" }
  </script>
</nika-widget>
scatter.html
<nika-layer id="quakes"
  type="ScatterplotLayer"
  data="./quakes.json"
  get-position="[$lon, $lat]"
  globe-view
  pickable>
</nika-layer>
overlay.html
<nika-overlay id="detail" anchor-from="selection">
  <b>{{place}}</b> - M {{magnitude}}
</nika-overlay>

OnlyMap JS features

The map app is authored in the manifest.

OnlyMap JS gives developers the pieces that normally require separate renderers, plugins, widgets, and custom state code. Each feature below shows the rendered preview beside the manifest that drives it. See more in the documentation .

01 / Story maps

Declarative animation

Build fly-throughs, route traces, camera moves, and timed scenes as HTML steps instead of hand-written animation controllers.

Previewstory.html
CodeOnlyMap JS
<nika-story autoplay loop>
  <nika-step trace layer="route"
    duration="3s"></nika-step>
  <nika-step action="fly-to"
    center="[-122.42, 37.78]"
    zoom="14" curve></nika-step>
</nika-story>
02 / Live attributes

Native layer state

The manifest is the state. Change an attribute, bind a filter, or swap data and the rendered map follows without imperative glue.

Previewstate.html
filter score> 0.60
CodeOnlyMap JS
<nika-layer id="risk" data="./risk.json"
  get-fill-color="scale($score,
    sequential, ['#fee','#b00'])">
</nika-layer>
<nika-widget type="filter" layer="risk" />
03 / One camera

3D-native scenes

Terrain, 3D tiles, globe views, and glTF models share one declarative camera so 2D and 3D layers feel like one map.

Preview3d.html
CodeOnlyMap JS
<nika-layer type="Tile3DLayer"
  data="./tileset.json"></nika-layer>
<nika-layer type="ScenegraphLayer"
  scenegraph="./tower.glb"
  lighting="pbr"></nika-layer>
04 / Dashboard ready

Widgets become app UI

Legends, filters, overlays, and your own controls mount beside the map and stay wired to layers through declarative behaviors.

Previewwidget.html
CodeOnlyMap JS
<nika-widget type="filter" layer="risk">
</nika-widget>
<nika-behavior on="click" layer="risk"
  action="show-overlay"
  target="detail"></nika-behavior>
05 / App interactions

Click behaviors without handlers

Selection, overlays, hover state, and camera actions are authored where the layer is defined, so the UI stays readable.

Previewinteraction.html
CodeOnlyMap JS
<nika-layer id="sites" pickable>
</nika-layer>
<nika-overlay id="detail"
  anchor-from="selection">
  {{name}} · {{score}}
</nika-overlay>
06 / Editing tools

Native draw and modify

Sketch, edit, and persist geometries without bolting on a separate drawing library or managing tool state yourself.

Previewdraw.html
CodeOnlyMap JS
<nika-widget type="draw" layer="zones"
  modes="polygon, edit">
</nika-widget>
<nika-layer id="zones" editable />
07 / Layer catalog

Every layer type by name

Scatter, path, polygon, MVT, heatmap, hexbin, trips, terrain, 3D tiles, and more use the same element model.

Previewlayers.html
CodeOnlyMap JS
<nika-layer type="HexagonLayer" ...></nika-layer>
<nika-layer type="TripsLayer" ...></nika-layer>
<nika-layer type="MVTLayer" ...></nika-layer>
08 / No build step

Small by default

Prototype straight from a script tag, then grow into a framework app when you need it. The first integration stays compact.

Previewbundle.html
bundle size<1 MiBscript-tag ready
CodeOnlyMap JS
<script type="module" src="onlymapjs">
</script>
<nika-map center="[-122.42,37.78]"
  basemap="positron"></nika-map>

Every layer, ready today

OnlyMap supports all 33 layer types you need

The examples rotate through common OnlyMap layer families. Click any layer to pause the loop and inspect the OnlyMap preview beside the exact manifest shape.

14 layer examplesAuto cycling

Fake live AIS points update as vessel positions, headings, and status messages arrive.

OnlyMap illustrationStreamingLayer
OnlyMap manifestlooping
<nika-layer id="ais-vessels" type="StreamingLayer"
  data="wss://stream.example.com/ais"
  protocol="websocket"
  get-position="[$lon, $lat]"
  get-orientation="$heading"
  get-icon="'ship'"
  update-key="$mmsi">
</nika-layer>
See the full layer reference

Example Maps

Community-built OnlyMaps

These public NIKA Studio examples show the kind of map applications teams can assemble with OnlyMap-style components, data layers, dashboards, and generated UI.

Global Deforestation thumbnailOpen map Global Deforestation
Land Use GFW thumbnailOpen map Land Use GFW
Earthquake Map thumbnailOpen map Earthquake Map
COG Overlay Example thumbnailOpen map COG Overlay Example
Thailand Flood Map thumbnailOpen map Thailand Flood Map