Sources
Ops with no upstream input: features bound by the host, synthesized geometry, images, DEM and raster tiles.
10 ops: dem, features, graticule, icon, image, literal-geometry, point-grid, point-scatter, raster, tile-bounds.
Ops with no demo image below produce no visible result on their own — they feed other nodes rather than paint.
Sample a host-bound raster DEM as a ScalarField. source names a dem entry in the document’s sources block; omitting it falls back to the document’s only dem source, with a build warning.
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | no | Name of a dem source in the document’s sources block. Omitting it resolves to the only such source and warns at build time. |
features
Section titled “features”Sample features from a host-bound feature layer. source names an mvt/pmtiles/geojson entry in the document’s sources block (omitting it resolves to the only such source, with a build warning); layer selects a layer within that source (for geojson, the layer name equals the source name).

| Field | Type | Required | Description |
|---|---|---|---|
filter-expr |
— | no | A MapLibre filter expression (JSON array, e.g. [“all”, [“==”, [“get”, “class”], “primary”], [“has”, “name”]]), evaluated per feature. A feature passes only when the expression is truthy. Supports the full expression language (any/has/comparisons/geometry-type). |
layer |
string | yes | Vector tile layer name within source (e.g. earth, roads). |
max-zoom |
integer (0…24) | no | Style-level maximum zoom. Above this zoom the node emits an empty layer. |
min-zoom |
integer (0…24) | no | Style-level minimum zoom. Below this zoom the node emits an empty layer (the asset is not even loaded). |
min-zoom-field |
string | no | Per-feature property name carrying its data-side min_zoom. Features with <field> > z are dropped. |
source |
string | no | Name of an mvt, pmtiles, or geojson entry in the document’s sources. Omitting it resolves to the only such source and warns at build time. |
stitch |
merge | pieces |
no | Join the layer to its 8 neighbouring tiles, for effects that reach further than the tile’s thin buffer: wide strokes along outlines, large buffers, closings. Each tile contributes only the area it owns, so nothing is drawn twice. merge unions polygons with identical properties so no edge remains where tiles meet; pieces keeps every piece as its tile cut it (cheaper, and identical when the layer is only filled). Costs fetching and decoding up to 8 more tiles for this layer only; a neighbour the host cannot provide falls back to this tile’s own buffer data. Omit to read this tile alone. |
graticule
Section titled “graticule”Parallels and meridians crossing the tile, as labelled polylines.

label property (35.68°N), so text can annotate them. style| Field | Type | Required | Description |
|---|---|---|---|
axes |
both | parallels | meridians |
no | Which families to emit: parallels of latitude, meridians of longitude, or both. |
extent |
integer (1…∞) | no | Coordinate extent of the emitted geometry, matching the features it is drawn alongside. |
interval-deg |
number | $param | @node |
no | Spacing in degrees. Omit to pick one from the zoom along the 30/10/5/2/1 ladder. |
Crop one named icon from a sprite source’s atlas. sprite is an @sprite-source ref (or literal atlas key); name is the icon’s index key. Output is a Sprite at the icon’s atlas pixel size.
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | — |
sprite |
string | yes | Asset reference (@name) or literal path. |
Image asset source. src is an @asset ref or a literal path/name resolved by the host’s AssetLoader. Output preserves the source dimensions.
| Field | Type | Required | Description |
|---|---|---|---|
src |
string | yes | Asset reference (@name) or literal path. |
literal-geometry
Section titled “literal-geometry”Literal geometry source. Coordinates are tile-local pixels in [0, extent].
| Field | Type | Required | Description |
|---|---|---|---|
extent |
integer (1…∞) | no | — |
lines |
array of array of array of number | no | — |
points |
array of array of number | no | — |
polygons |
array of object | no | — |
point-grid
Section titled “point-grid”Regular lattice of points covering the tile.

| Field | Type | Required | Description |
|---|---|---|---|
anchor |
tile | world |
no | — |
extent |
integer (1…∞) | no | — |
offset-x |
number | $param | @node |
no | — |
offset-y |
number | $param | @node |
no | — |
spacing |
number (0…∞) | $param | @node |
yes | Grid pitch in extent units, not pixels — extent below is the coordinate space (4096 by default), so a 512 px tile fits 8 points at spacing: 512. Paint ops downstream take pixels, so the two do not match. |
spacing-x |
number (0…∞) | $param | @node |
no | — |
spacing-y |
number (0…∞) | $param | @node |
no | — |
stagger |
number | $param | @node |
no | Shift every other row sideways by this fraction of spacing-x. 0.5 puts each row’s points halfway between the row above’s — the centres of a running brick bond, or a triangular lattice. |
point-scatter
Section titled “point-scatter”Random points at a given mean spacing, covering the tile. Where point-grid puts exactly one point in the middle of every cell, this one draws a count per cell — 0 to 3, averaging 1 — and places each point at a random spot inside it, so the set has the clumps and gaps of a real random scatter and no residual pitch. Reach for point-grid when the regularity is the point (a halftone screen, a tiling of panes to fracture) and for point-scatter when it is the enemy (stipple, foliage, grain, scattered symbols). Jittering a point-grid is not a substitute: one point per cell means an even density, and the lattice frequency stays plainly visible.
| Field | Type | Required | Description |
|---|---|---|---|
anchor |
tile | world |
no | world indexes the cells off global (0, 0), so adjacent tiles agree on the points they share and the scatter is seamless — the usual choice. tile indexes off the tile’s own corner, giving every tile the same point set and a visible seam. |
extent |
integer (1…∞) | no | — |
seed |
integer (0…∞) | no | Optional explicit u32 seed. Change it to get a different scatter at the same spacing, or to keep two point-scatter nodes from landing on each other. Default: a fixed constant, so the pattern is stable across tiles and runs. |
spacing |
number (0…∞) | $param | @node |
yes | Mean spacing in extent units, not pixels — one point per spacing × spacing cell on average. extent below is the coordinate space (4096 by default), so a 512 px tile averages 8 points across at spacing: 512. Paint ops downstream take pixels, so the two do not match. |
spacing-x |
number (0…∞) | $param | @node |
no | — |
spacing-y |
number (0…∞) | $param | @node |
no | — |
raster
Section titled “raster”Sample a host-bound RGBA tile pyramid (satellite imagery, pre-rendered basemaps) as a canvas-padded Raster. source names a raster entry in the document’s sources block; omitting it falls back to the document’s only raster source, with a build warning.
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | no | Name of a raster source in the document’s sources block. Omitting it resolves to the only such source and warns at build time. |
tile-bounds
Section titled “tile-bounds”Tile-filling rectangle polygon source. cover: canvas grows it over the padded canvas, so geometry built from it — Voronoi cells, hatch lines — reaches past the tile’s edge and neighbouring tiles build the same shapes along their shared border.

| Field | Type | Required | Description |
|---|---|---|---|
cover |
tile | canvas |
no | tile is the visible tile exactly; canvas adds the canvas padding on every side. |
extent |
integer (1…∞) | no | — |
Map renders on this site are made fromOpenStreetMap data viaProtomaps (© OpenStreetMap contributors), elevation from Re:Earth Terrain,Mapterhorn andEGM2008 (NGA), and aerial imagery from GSI Japan(© 国土地理院). The painterly styles use CC0 brushes byDavid Revoy.