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

Three commands to a running map.

Install the library, wire up your editor, and hand the OnlyMap skill to any agent that supports skills — it writes OnlyMap manifests straightaway. No build step? Load esm.sh/@nika-js/onlymap straight into an HTML file.

Install the library — free for non-commercial use

Wire up VS Code — IntelliSense + manifest snippets

Teach your coding agent — Claude Code, Cursor, Codex

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
<om-widget type="legend"
  title="Magnitude">
</om-widget>
filter.html
<om-layer id="quakes"
  filter-field="magnitude"
  filter-range="[4, 10]">
</om-layer>
scatter.html
<om-layer id="quakes"
  type="ScatterplotLayer"
  data="./quakes.json"
  get-position="[$lon, $lat]"
  pickable>
</om-layer>
overlay.html
<om-overlay id="detail"
  anchor-from="selection">
  {{place}} - M {{magnitude}}
</om-overlay>
metrics.html
<om-widget type="vega-lite"
  layer="quakes">
</om-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
<om-widget type="legend"
  position="top-right"
  title="Magnitude">
</om-widget>
Magnitude
4.06.2
filter.html
<om-layer id="quakes"
  filter-field="magnitude"
  filter-range="[4, 10]">
</om-layer>
<om-widget type="filter" layer="quakes">
</om-widget>
In view7 events / avg M4.6
metrics.html
<om-widget type="vega-lite"
  layer="quakes"
  watch="viewport data:quakes">
  <script type="application/json">
    { "mark": "bar" }
  </script>
</om-widget>
scatter.html
<om-layer id="quakes"
  type="ScatterplotLayer"
  data="./quakes.json"
  get-position="[$lon, $lat]"
  pickable>
</om-layer>
overlay.html
<om-overlay id="detail" anchor-from="selection">
  <b>{{place}}</b> - M {{magnitude}}
</om-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
<om-story autoplay loop>
  <om-step trace layer="route"
    duration="3s"></om-step>
  <om-step action="fly-to"
    center="[-122.42, 37.78]"
    zoom="14" curve></om-step>
</om-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
<om-layer id="risk" data="./risk.json"
  get-fill-color="scale($score,
    sequential, ['#fee','#b00'],
    domain=[0, 100])">
</om-layer>
<om-widget type="filter" layer="risk"
  field="score"></om-widget>
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
<om-layer id="city" type="Tile3DLayer"
  data="./tileset.json"></om-layer>
<om-layer id="tower" type="ScenegraphLayer"
  scenegraph="./tower.glb"
  get-orientation="[0, $heading, 90]">
</om-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
<om-widget type="filter" layer="risk">
</om-widget>
<om-behavior on="click" layer="risk"
  action="show-overlay"
  target="detail"></om-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
<om-layer id="sites" pickable>
</om-layer>
<om-overlay id="detail"
  anchor-from="selection">
  {{name}} · {{score}}
</om-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
<om-widget type="draw" target="zones"
  modes="point line polygon"
  save="both">
</om-widget>
<om-layer id="zones" type="GeoJsonLayer"
  data="draw:zones"></om-layer>
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
<om-layer type="HexagonLayer" ...></om-layer>
<om-layer type="TripsLayer" ...></om-layer>
<om-layer type="MVTLayer" ...></om-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>
<om-map center="[-122.42,37.78]"
  basemap="positron"></om-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

Live AIS points update in place as vessel positions arrive — any layer streams by pointing data at a wss:// feed.

OnlyMap illustrationScatterplotLayer
OnlyMap manifestlooping
<om-layer id="ais-vessels" type="ScatterplotLayer"
  data="wss://stream.example.com/ais"
  key="mmsi" flush="250ms"
  label="Live vessels"
  get-position="[$lon, $lat]"
  radius="4" radius-units="pixels"
  pickable>
</om-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